diff --git a/.env.template b/.env.template new file mode 100644 index 000000000..7dbc2eb1e --- /dev/null +++ b/.env.template @@ -0,0 +1,20 @@ +# Replace with the relevant values + +## Used at build time + +### Used for downloading the Mapbox Android SDK when building the native parts of the app +MAPBOX_DOWNLOAD_TOKEN= + +## Used at run time + +APP_VARIANT=development +MAPBOX_ACCESS_TOKEN= +COMAPEO_METRICS_URL= +COMAPEO_METRICS_API_KEY= + +## Feature flags (can generally leave these commented out and uncomment when needed) + +# EXPO_PUBLIC_FEATURE_TEST_DATA_UI=true +# EXPO_PUBLIC_FEATURE_MEDIA_MANAGER=true +# EXPO_PUBLIC_FEATURE_TRACKS=true +# EXPO_PUBLIC_FEATURE_AUDIO=true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9423bace9..5609a7f2d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: CI on: push: - branches: [main] + branches: [develop, 'release/**'] pull_request: # By default, a workflow only runs when a pull_request's activity type is # opened, synchronize, or reopened. Adding ready_for_review here ensures @@ -69,3 +69,7 @@ jobs: run: npm run lint:types - name: Run unit tests run: npm test + env: + MAPBOX_ACCESS_TOKEN: ${{ secrets.MAPBOX_ACCESS_TOKEN }} + COMAPEO_METRICS_URL: ${{ secrets.COMAPEO_METRICS_URL }} + COMAPEO_METRICS_API_KEY: ${{ secrets.COMAPEO_METRICS_API_KEY }} diff --git a/.github/workflows/create-release-candidate.yml b/.github/workflows/create-release-candidate.yml new file mode 100644 index 000000000..b0aa29371 --- /dev/null +++ b/.github/workflows/create-release-candidate.yml @@ -0,0 +1,114 @@ +name: Create Release Branch and Build RC + +on: + workflow_dispatch: + +jobs: + create-release-branch: + runs-on: ubuntu-latest + + outputs: + version: ${{ steps.read_version.outputs.VERSION }} + branch_name: ${{ steps.read_version.outputs.BRANCH_NAME }} + commit_sha: ${{ steps.get_commit_sha.outputs.COMMIT_SHA }} + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: develop + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + + - name: Read package.json version + id: read_version + run: | + version=$(node -p "require('./package.json').version") + major=$(echo $version | cut -d. -f1) + minor=$(echo $version | cut -d. -f2) + patch=$(echo $version | cut -d. -f3 | cut -d- -f1) + new_version="${major}.${minor}.${patch}-RC.0" + branch_name="release/v${major}.${minor}.${patch}" + echo "VERSION=$new_version" >> $GITHUB_ENV + echo "BRANCH_NAME=$branch_name" >> $GITHUB_ENV + echo "::set-output name=VERSION::$new_version" + echo "::set-output name=BRANCH_NAME::$branch_name" + + - name: Configure git + run: | + git config --global user.name 'github-actions[bot]' + git config --global user.email 'github-actions[bot]@users.noreply.github.com' + + - name: Create and push new branch + run: | + name=${{ env.BRANCH_NAME }} + echo "Creating and pushing new branch $name" + git checkout -b $name || { echo "ERROR: Branch creation failed"; exit 1; } + git push origin $name --force || { echo "ERROR: Push failed"; exit 1; } + + - name: Get latest commit SHA + id: get_commit_sha + run: | + commit_sha=$(git rev-parse HEAD) + echo "Commit SHA: $commit_sha" + echo "COMMIT_SHA=$commit_sha" >> $GITHUB_ENV + echo "::set-output name=COMMIT_SHA::$commit_sha" + + - name: Check if deploy branch exists + id: check_deploy_branch + run: | + if git ls-remote --exit-code --heads origin deploy; then + echo "Deploy branch exists." + echo "DEPLOY_BRANCH_EXISTS=true" >> $GITHUB_ENV + else + echo "Deploy branch does not exist." + echo "DEPLOY_BRANCH_EXISTS=false" >> $GITHUB_ENV + fi + + - name: Create Pull Request to deploy + if: env.DEPLOY_BRANCH_EXISTS == 'true' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + new_version=${{ env.VERSION }} + branch_name=${{ env.BRANCH_NAME }} + curl -X POST \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Authorization: token $GITHUB_TOKEN" \ + -d "{\"title\":\"$branch_name\",\"body\":\"This PR is for the release of version $new_version\",\"head\":\"$branch_name\",\"base\":\"deploy\"}" \ + https://api.github.com/repos/${{ github.repository }}/pulls + + - name: Notify if deploy branch is missing + if: env.DEPLOY_BRANCH_EXISTS == 'false' + run: echo "The deploy branch does not exist. Please create it manually." + + dispatch-eas-build: + runs-on: ubuntu-latest + needs: create-release-branch + + steps: + - name: 🏗 Setup EAS + uses: expo/expo-github-action@v8 + with: + eas-version: latest + token: ${{ secrets.EXPO }} + + - name: Checkout Release Branch + uses: actions/checkout@v3 + with: + ref: ${{ needs.create-release-branch.outputs.branch_name }} + + - name: 📦 Install dependencies + run: npm install + + - name: Build Release Candidate APK + env: + COMMIT_SHA: ${{ needs.create-release-branch.outputs.commit_sha }} + VERSION: ${{ needs.create-release-branch.outputs.version }} + run: | + echo "VERSION=${VERSION}" >> $GITHUB_ENV + echo "COMMIT_SHA=${COMMIT_SHA}" >> $GITHUB_ENV + eas build --platform android --profile release-candidate diff --git a/README.md b/README.md index 6a0d62c9c..a5015224d 100644 --- a/README.md +++ b/README.md @@ -22,15 +22,14 @@ The next version of Mapeo Mobile - When setting up the Android-specific tooling, you will also need to install the [Android NDK](https://developer.android.com/ndk/). This can be installed using Android Studio by going to the `SDK Tools` tab in the `SDK Manager`. This project uses **NDK 25.1.8937393**. - 3. Create a `.env` file at the root of the project with the following content: + 3. Copy the [`.env.template`](./.env.template) file to a file called `.env`. Replace any placeholder `` values with the relevant ones: - ``` - MAPBOX_DOWNLOAD_TOKEN= - EXPO_PUBLIC_METRICS_URL= - EXPO_PUBLIC_METRICS_API_KEY= - ``` + `MAPBOX_ACCESS_TOKEN`: a [Mapbox access token](https://docs.mapbox.com/android/maps/guides/install/#configure-credentials). If you do not have access to a Mapbox account, reach out to the maintainers about getting access to an access token. + + `MAPBOX_DOWNLOAD_TOKEN`: a [Mapbox secret token](https://docs.mapbox.com/android/maps/guides/install/#configure-credentials). This is unfortunately required to install the necessary Mapbox Android SDK components used by `@rnmapbox/maps@10` when building the app (more info [here](https://github.com/rnmapbox/maps/blob/v10.0/android/install.md#mapbox-maps-sdk-v10)). If you do not have access to a Mapbox account, reach out to the maintainers about getting access to a secret token. - Replace `` with a [Mapbox secret token](https://docs.mapbox.com/android/maps/guides/install/#configure-credentials). This is unfortunately required to install the necessary Mapbox Android SDK components used by `@rnmapbox/maps@10` when building the app (more info [here](https://github.com/rnmapbox/maps/blob/v10.0/android/install.md#mapbox-maps-sdk-v10)). If you do not have access to a Mapbox account, reach out to the maintainers about getting access to a secret token. + `COMAPEO_METRICS_URL`: URL pointing to a hosted CoMapeo metrics server. Reach out to the maintainers about getting access to this credential. + `COMAPEO_METRICS_API_KEY`: API key needed for accessing a CoMapeo metrics server. Reach out to the maintainers about getting access to this credential. 3. Run the app locally diff --git a/app.config.js b/app.config.js index 6f3aca24c..962aacaa4 100644 --- a/app.config.js +++ b/app.config.js @@ -1,12 +1,51 @@ -const SUFFIX = - {development: '.dev', production: '', test: '.test'}[ - process.env.APP_VARIANT - ] ?? ''; +const {execSync} = require('child_process'); -const NAME = - {development: ' (DEV)', production: '', test: ' (TEST)'}[ - process.env.APP_VARIANT - ] ?? ''; +const APP_VARIANT = process.env.APP_VARIANT; + +/** @type {string} */ +const APP_ID_SUFFIX = + { + development: '.dev', + production: '', + releaseCandidate: '.rc', + preRelease: '.pre', + }[APP_VARIANT] ?? '.dev'; + +/** @type {string} */ +const APP_NAME_SUFFIX = + { + development: ' Dev', + production: '', + releaseCandidate: ' RC', + preRelease: ' Pre', + }[APP_VARIANT] ?? ' Dev'; + +const pkgVersion = require('./package.json').version; +const pkgVersionBase = pkgVersion.replace(/-.*/, ''); + +/** @type {string} */ +let appVersionSuffix = + { + development: '-dev', + production: '', + releaseCandidate: '-rc', + preRelease: '-pre', + }[APP_VARIANT] ?? '-dev'; + +if (APP_VARIANT !== 'production') { + try { + // SHA of commit this version was built from + const commitSha = + process.env.EAS_BUILD_GIT_COMMIT_HASH || + execSync('git rev-parse HEAD').toString().trim(); + const commitShaShort = commitSha.slice(0, 7); + appVersionSuffix += `+${commitShaShort}`; + } catch (e) { + // Expo-doctor runs in a temp directory which is not a git repo, so this command will fail. + } +} + +const versionName = `${pkgVersionBase}${appVersionSuffix}`; /** * @param {object} opts @@ -16,20 +55,21 @@ const NAME = */ module.exports = ({config}) => ({ ...config, + version: versionName, extra: { ...config.extra, eas: { projectId: '2d5b8137-12ec-45aa-9c23-56b6a1c522b7', }, }, - name: 'CoMapeo' + NAME, + name: 'CoMapeo' + APP_NAME_SUFFIX, ios: { ...config.ios, - bundleIdentifier: 'com.comapeo' + SUFFIX, + bundleIdentifier: 'com.comapeo' + APP_ID_SUFFIX, }, android: { ...config.android, - package: 'com.comapeo' + SUFFIX, + package: 'com.comapeo' + APP_ID_SUFFIX, googleServicesFile: process.env.GOOGLE_SERVICES_JSON, }, updates: { diff --git a/app.json b/app.json index d791cb41b..2d6d48875 100644 --- a/app.json +++ b/app.json @@ -3,7 +3,6 @@ "jsEngine": "hermes", "name": "CoMapeo", "slug": "comapeo", - "version": "1.0.0", "orientation": "portrait", "icon": "./assets/icon.png", "userInterfaceStyle": "light", @@ -62,7 +61,6 @@ ["./expo-config-plugins/targetArmArchsOnly.js"] ], "android": { - "versionCode": 1, "allowBackup": false, "adaptiveIcon": { "foregroundImage": "./assets/icon.png", @@ -76,7 +74,6 @@ "permissions": [ "android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION", - "android.permission.ACCESS_BACKGROUND_LOCATION", "android.permission.FOREGROUND_SERVICE", "android.permission.FOREGROUND_SERVICE_LOCATION", "android.permission.CAMERA", diff --git a/babel.config.js b/babel.config.js index b887c77d6..d423f1081 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,3 +1,18 @@ +const assert = require('assert'); + +const requiredEnvVars = [ + 'MAPBOX_ACCESS_TOKEN', + 'COMAPEO_METRICS_URL', + 'COMAPEO_METRICS_API_KEY', +]; + +for (const requiredEnvVar of requiredEnvVars) { + assert( + process.env[requiredEnvVar], + `Missing required environment variable: ${requiredEnvVar}`, + ); +} + module.exports = function (api) { api.cache(true); return { @@ -5,7 +20,7 @@ module.exports = function (api) { compact: true, presets: ['babel-preset-expo'], plugins: [ - 'transform-inline-environment-variables', + ['transform-inline-environment-variables', {include: requiredEnvVars}], // react-native-reanimated/plugin has to be last 'react-native-reanimated/plugin', ], diff --git a/docs/BuildAndPublishingFlows.md b/docs/BuildAndPublishingFlows.md new file mode 100644 index 000000000..2db53e417 --- /dev/null +++ b/docs/BuildAndPublishingFlows.md @@ -0,0 +1,31 @@ +# Build And Publishing Flow + +### Background + +This repo follows the develop/deploy git flow, where there are 2 main branches, `develop` and `deploy` which are used for keeping the production ready code and latest code seperate, but integrated. The `deploy` branch always reflects a production ready state, and is the code found in the apps being used by the general public. Any changes made to the `deploy` branch should be pushed out to the publicly released app. The `develop` branch reflects the codebase with the latest delivered development changes which are slated for the upcoming release. Any new features that have not been released but are ready to be QA'd can be found in this branch. More about this flow can be found [here](https://nvie.com/posts/a-successful-git-branching-model/). + +We use [EAS](https://expo.dev/pricing) to build our app. There are different types of builds for several use cases + +- Release Candidate: A Release Candidate is an APK that is used for internal testing and QA purposes. It reflects the next public release, and should be extensively tested. +- Production: A Production build is an .aab that is used by the google play store to distribute CoMapeo. A production build should have been extensively tested and reflects the latest changes found in the `deploy` branch. +- Pre: A pre build is an APK that is used for internal testing. It differs from a release candidate as it is typically not going to be used for a public release. This is most often used when there are features that want to be tested before they are ready to be QA's for an actual release + +This repo uses github actions to dispatch the creation of these builds. See [How To](#how-to) for instruction on building. + +### Versioning + +CoMapeo uses [semantic versioning](https://semver.org/). + +The `develop` branch will always be one `minor` version ahead of the released version and have the suffix "-pre". (eg, if the latest released version is 1.3.2, the `develop` branch version will be 1.4.0-pre). + +### How To + +## Release Candidate + +A Release Candidate can be built directly in the action tab on the the github repo. Click on the action "Create Release Branch and Build RC". This will automatically create a Pull Request from the latest develop, with its base pointing to Deploy. As well, it will dispatch a build with EAS that will build a `Release Candidate` apk. The version of this build will be the version of develop, with `pre` being replaced with `RC.0` plus the SHA number of the latest commit. (Eg. If the develop version is `1.4.0-pre`, this Release Candidate will be `1.4.0-RC+{SHA#OfLatestCommit}'). + +## Production + +A production AAB will automatically be built when a Branch created by the [ReleaseCandidate](#release-candidate) flow is merged into deploy. This will also increase the `minor` version of the develop branch + +## Pre diff --git a/eas.json b/eas.json index ddd64e3cd..773c9f1fa 100644 --- a/eas.json +++ b/eas.json @@ -1,47 +1,51 @@ { "cli": { - "version": ">= 7.8.0" + "version": ">= 7.8.0", + "appVersionSource": "remote", + "requireCommit": true }, "build": { - "development": { - "developmentClient": true, - "distribution": "internal", - "ios": { - "image": "latest", - "simulator": true - }, + "base": { "android": { "image": "latest", - "buildType": "apk" + "node": "20.17.0" }, + "ios": { + "image": "latest", + "node": "20.17.0" + } + }, + "development": { + "extends": "base", + "developmentClient": true, + "distribution": "internal", "env": { "APP_VARIANT": "development" } }, - "test": { + "release-candidate": { + "extends": "base", "distribution": "internal", "channel": "preview", "env": { - "APP_VARIANT": "test" - }, - "android": { - "image": "latest", - "buildType": "apk" - }, - "ios": { - "image": "latest" + "APP_VARIANT": "releaseCandidate" } }, "production": { - "android": { - "image": "latest" - }, - "ios": { - "image": "latest" - }, + "extends": "base", + "distribution": "store", "channel": "production", "env": { "APP_VARIANT": "production" + }, + "autoIncrement": true + }, + "pre-release": { + "extends": "base", + "distribution": "internal", + "channel": "preview", + "env": { + "APP_VARIANT": "preRelease" } } }, diff --git a/messages/de.json b/messages/de.json index acbb43436..364342d26 100644 --- a/messages/de.json +++ b/messages/de.json @@ -25,24 +25,12 @@ "description": "Title of dialog that shows when cancelling a new observation", "message": "Beobachtung verwerfen?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { "message": "Enable" }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" - }, "Modal.GPSDisable.description": { "message": "To create a Track CoMapeo needs access to your location and GPS." }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" - }, "Modal.GPSDisable.title": { "message": "GPS Disabled" }, @@ -58,6 +46,80 @@ "Modal.GPSEnable.trackingDescription": { "message": "You’ve been recording for" }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "Versions- und Build-Nummer" + }, + "Navigation.Drawer.appSettings": { + "message": "App Settings" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Language, Security, Coordinates" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Create or Join Project" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Create a new project or join existing one" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Data & Privacy" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "You are currently mapping on your own" + }, + "Navigation.Drawer.projName": { + "message": "Project {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Project Settings" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categories, Config, Team" + }, + "Navigation.Drawer.security": { + "message": "Security" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "Einstellungen" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Bearbeitung fortsetzen" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Discard changes" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Änderungen verwerfen?" + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Bearbeitung fortsetzen" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Discard Track?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard Track" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Your Track will not be saved. This cannot be undone." + }, "Screens.Settings.AppSettings.coordinateSystem": { "message": "Coordinate System" }, @@ -71,20 +133,51 @@ "message": "Display language for app" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "App Settings" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "Gerätename" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Sync Settings" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Project Settings" }, "Screens.Settings.ProjectSettings.yourTeam": { "message": "Your Team" }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "Abbrechen" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "Ja, löschen" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "Löschen" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Share" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Bearbeitung fortsetzen" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Änderungen verwerfen?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard changes" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { "message": "Coordinator" }, @@ -98,7 +191,7 @@ "message": "Not seeing a Device?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Make sure both devices are on the same version of CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { "message": "Make sure both devices are on the same wifi network" @@ -118,6 +211,38 @@ "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { "message": "Select a Role" }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "CoMapeo build" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "CoMapeo variant" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "CoMapeo version" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Android build number" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Android version" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Phone model" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "About CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Unknown" + }, "screens.AddPhoto.cancel": { "message": "Abbrechen" }, @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "Passcode" + "message": "Passcode: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "Save App Passcode" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Make sure to note your passcode in a secure location before saving." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "App Passcodes can never be recovered if lost or forgotten! Make sure to note your passcode in a secure location before saving." + "message": "App Passcodes can never be recovered if lost or forgotten!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "Please Enter Passcode" @@ -168,7 +296,7 @@ "message": "Incorrect Passcode" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "This passcode will be required to open the Mapeo App" + "message": "This passcode will be required to open the CoMapeo App" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { "message": "Confirm Passcode" @@ -183,10 +311,10 @@ "message": "Was ist ein App-Passwort?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app. You can define your own 5-digit passcode by turning on the feature below." + "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**Please note that forgotten passcodes cannot be recovered!** Once this feature is enabled, if you forget or lose your passcode, you will not be able to open Mapeo and will lose access to any Mapeo data that has not been synced with other project participants." + "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "Abbrechen" @@ -198,7 +326,7 @@ "message": "You are currently using App Passcode. See below to stop using or change your passcode." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app." + "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "App-Passwort" @@ -212,6 +340,26 @@ "screens.AppPasscode.TurnOffPasscode.usePasscode": { "message": "Use App Passcode" }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Allow" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Go to Settings" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Not Now" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "To record audio while using the app and in the background CoMapeo needs to access your microphone. Please enable microphone permissions in your app settings." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Recording Audio with CoMapeo" + }, "screens.CameraScreen.goToSettings": { "message": "Go to Settings" }, @@ -238,12 +386,63 @@ "description": "Universal Transverse Mercator coordinate format", "message": "Universal Transverse Mercator (UTM)" }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "Anonymized information about your device, app crashes, errors and performance helps Awana Digital improve the app and fix errors." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Diagnostic Information" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Data & Privacy" + }, + "screens.DataAndPrivacy.noPII": { + "message": "This never includes any of your data or personal information." + }, + "screens.DataAndPrivacy.optOut": { + "message": "You can opt-out of sharing diagnostic information at any time." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo Respects Your Privacy & Autonomy" + }, + "screens.DataPrivacy.description": { + "message": "CoMapeo allows you and your collaborators to map offline without needing servers." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Private by default — diagnostic information is fully anonymized and you can opt-out any time." + }, + "screens.DataPrivacy.encrypted": { + "message": "All data stays fully encrypted" + }, + "screens.DataPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Easily manage and control sharing and collaboration." + }, + "screens.DataPrivacy.next": { + "message": "Nächste Frage" + }, + "screens.DataPrivacy.stays": { + "message": "Your data stays on your devices." + }, + "screens.DataPrivacy.title": { + "message": "Data & Privacy" + }, "screens.DeviceNaming.Success.description": { "message": "You named your device" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "To find your project settings go to the main menu found on the map screen." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Go to Map" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." + }, "screens.DeviceNaming.Success.success": { "message": "Success!" }, @@ -251,7 +450,7 @@ "message": "Add Name" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." }, "screens.DeviceNaming.header": { "message": "Add a name for your device" @@ -268,23 +467,78 @@ "screens.FatalError.somethingWrong": { "message": "Something Went Wrong" }, + "screens.HowToLeaveProject.goBack": { + "message": "Go back" + }, + "screens.HowToLeaveProject.howTo": { + "message": "How to Leave Project" + }, + "screens.HowToLeaveProject.instructions": { + "message": "To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device." + }, + "screens.HowToLeaveProject.warning": { + "message": "If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!" + }, "screens.IntroToCoMapeo.collaborate": { - "message": "Collaborate on mapping and monitoring projects" + "message": "Collaborate with others" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Designed with and for Indigenous peoples & frontline communities" }, "screens.IntroToCoMapeo.getStarted": { "message": "Get Started" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "is now" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Map anywhere and everywhere" + }, + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Map your world, together" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.ownData": { + "message": "Own and control your data" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", - "message": "Language" + "message": "Sprache" + }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "You are already on a project" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Go Back" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Leave Current Project" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "To join a new project you must leave your current one." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "You are on {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "Abbrechen" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Please check the box to confirm" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "I understand I will be deleting all data from Project {projectName} from my device." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "I understand I will be deleting all data from my device." + }, + "screens.LeaveProject.leaveProj": { + "message": "Leave Project" + }, + "screens.LeaveProject.leavingProject": { + "message": "Leaving Project {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "This will remove all Project {projectName}'s data from your device." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "This will remove all of the data from your device." }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", @@ -437,11 +691,50 @@ "screens.ManualGpsScreen.zoneNumber": { "message": "Zone Number" }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "Abbrechen" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sync Everything" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "Sync Everything?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Your device will sync all content at full size, including photos, audio, and videos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "You are about to sync everything. This may increase the disk space used on your device." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Note: This will use more storage." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "You will no longer sync Audio or Video." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Sync Previews (Photos Only)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Sync Previews" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "Sync Previews?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Photos will sync at a reduced smaller size. Device will not sync audio or video." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Your device will keep all existing data but new observations will sync in a smaller, preview size." + }, + "screens.MediaSyncSettings.title": { + "message": "Sync Settings" + }, "screens.ObscurePasscode.description": { - "message": "Obscure Passcode is a security feature that allows you to open Mapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of Mapeo which allows you to create demonstration observations that are not saved to the Mapeo database." + "message": "Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database." }, "screens.ObscurePasscode.instructions": { - "message": "Enter the code above to hide your data in Mapeo" + "message": "Enter the code above to hide your data in CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Obscure Passcode" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "What is Obscure Passcode?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "Bearbeiten" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "Beobachtung" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "Löschen" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "Beobachtung" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Share" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "Abbrechen" }, + "screens.Observation.comapeoAlert": { + "message": "CoMapeo Alert" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "Ja, löschen" @@ -483,26 +776,83 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "Beobachtung löschen?" }, + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", + "message": "Beobachtung" + }, + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Sharing image" + }, + "screens.Observation.shareMessageFooter": { + "message": "Sent from CoMapeo" + }, + "screens.Observation.shareMessageTitle": { + "message": "CoMapeo Alert" + }, + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Sharing text" + }, "screens.Observation.title": { "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", "message": "Beobachtung" }, + "screens.ObservationCreate.changePreset": { + "message": "Change" + }, + "screens.ObservationCreate.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Was passiert hier?" + }, + "screens.ObservationCreate.keepWaiting": { + "description": "Button to cancel save and continue waiting for GPS", + "message": "Weiter warten" + }, + "screens.ObservationCreate.manualEntry": { + "description": "Button to manually enter GPS coordinates", + "message": "Koordinaten selbst eingeben" + }, + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "New Observation" + }, + "screens.ObservationCreate.noGpsDesc": { + "description": "Description in dialog when trying to save with no GPS coords", + "message": "Diese Beobachtung hat keinen Standort. Du kannst weiter auf ein GPS-Signal warten, die Beobachtung ohne einen Standort speichern oder die Koordinaten manuell eingeben" + }, + "screens.ObservationCreate.noGpsTitle": { + "description": "Title of dialog when trying to save with no GPS coords", + "message": "Kein GPS-Signal" + }, + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "Beobachtung" + }, + "screens.ObservationCreate.saveAnyway": { + "description": "Button to save regardless of GPS state", + "message": "Speichern" + }, + "screens.ObservationCreate.weakGpsDesc": { + "description": "Description in dialog when trying to save with low GPS accuracy.", + "message": "Die GPS-Genauigkeit ist niedrig. Du kannst weiter warten, die Beobachtung mit niedriger Genauigkeit speichern oder die Koordinaten selbst eingeben" + }, + "screens.ObservationCreate.weakGpsTitle": { + "description": "Title of dialog when trying to save with low GPS accuracy.", + "message": "Schwaches GPS-Signal" + }, "screens.ObservationDetails.done": { "description": "Button text when all questions are complete", "message": "Done" }, "screens.ObservationDetails.nextQuestion": { "description": "Button text to navigate to next question", - "message": "Next" + "message": "Nächste Frage" }, "screens.ObservationDetails.title": { "description": "Title of observation details screen showing question number and total", "message": "Question {current} of {total}" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "Anheften…" - }, "screens.ObservationEdit.ObservationEditView.audioButton": { "description": "Button label for adding audio", "message": "Audio" @@ -519,52 +869,30 @@ "description": "Button label for adding photo", "message": "Photo" }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "Suche läuft…" - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { - "description": "Button to cancel save and continue waiting for GPS", - "message": "Weiter warten" - }, - "screens.ObservationEdit.SaveButton.manualEntry": { - "description": "Button to manually enter GPS coordinates", - "message": "Koordinaten selbst eingeben" - }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { - "description": "Description in dialog when trying to save with no GPS coords", - "message": "Diese Beobachtung hat keinen Standort. Du kannst weiter auf ein GPS-Signal warten, die Beobachtung ohne einen Standort speichern oder die Koordinaten manuell eingeben" - }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { - "description": "Title of dialog when trying to save with no GPS coords", - "message": "Kein GPS-Signal" + "screens.ObservationEdit.changePreset": { + "message": "Change" }, - "screens.ObservationEdit.SaveButton.saveAnyway": { - "description": "Button to save regardless of GPS state", - "message": "Speichern" - }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { - "description": "Description in dialog when trying to save with low GPS accuracy.", - "message": "Die GPS-Genauigkeit ist niedrig. Du kannst weiter warten, die Beobachtung mit niedriger Genauigkeit speichern oder die Koordinaten selbst eingeben" + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Was passiert hier?" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { - "description": "Title of dialog when trying to save with low GPS accuracy.", - "message": "Schwaches GPS-Signal" + "screens.ObservationEdit.navTitle": { + "description": "screen title for new observation screen", + "message": "Edit Observation" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", - "message": "Beobachtung bearbeiten" + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "Beobachtung" }, - "screens.ObservationEdit.newTitle": { - "description": "screen title for new observation screen", - "message": "Neue Beobachtung" + "screens.ObservationList.TrackListItem.Track": { + "message": "Track" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "Beobachtungen" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "You are currently mapping on your own." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,32 +907,150 @@ "message": "Beobachtung(en) hinzufügen" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Create or Join a Project" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "Fehler beim Laden der Beobachtungen. Versuche, Mapeo neu zu starten." + "message": "Error loading observations. Try quitting and restarting CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "Laden… Dies kann einige Zeit nach dem synchronisieren mit einem neuen Gerät dauern" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, - "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { - "description": "Placeholder for description/notes field", - "message": "What is happening here?" + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Privacy Policy" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Current Permissions" }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Share Diagnostic Information" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "Abbrechen" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Delete Image" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "Delete this photo?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Delete Photo" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "About Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo is developed by Awana Digital, a 501c3 non-profit organization registered in the United States. Awana Digital works in solidarity with frontline communities to use technology to defend their rights and fight climate change." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "App Errors" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Information about internal errors that result in the app not functioning as expected" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "App Info" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "The version and locale (language) of CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "App Usage" + }, + "screens.PrivacyPolicy.control": { + "message": "You're in control" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "You can opt out of sending any information to Awana Digital. You choose where your data is stored and who it is shared with. You may choose to share anonymized, summarized data about how you use CoMapeo with Awana Digital. We will always be transparent about what information you choose to share for the purposed of improving the app, and this information will never include photos, videos, audio, text, or precise locations that you have entered into CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Crash Data" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Information about what caused the app to close unexpectedly" + }, + "screens.PrivacyPolicy.dataCollection": { + "message": "CoMapeo Data Collection" + }, + "screens.PrivacyPolicy.deviceInfo": { + "message": "Device Info" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Such as model and manufacturer of your device; device operating system; screen size; device locale (language); device memory." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnostics" + }, + "screens.PrivacyPolicy.noPII": { + "message": "No personally identifiable information" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "Using CoMapeo does not require a user account. Awana Digital does not collect your name, email address or any other personal details. No permanent user identifier or device identifier is ever shared with Awana Digital, and we take extra measures to ensure that no information you share can be used to track you: identifiers are randomized and rotated (changed) every month and we do not store IP addresses." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "What is not collected?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "We do not collect any personal data or anything that can be used to identify or track a user or device. Device identifiers used to aggregate information are random, anonymous, and changed every month. Diagnostic information does not include data about how you use the app, and it never includes any of the data you have collected with the app. We do not collect your precise or coarse location, only the country where you are using CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Open Source and the \"Official\" Version" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo is an open-source application. This means that anyone can view the code that makes the app work and can verify the privacy declarations in this document. It also means that anyone can adapt the app to their own needs and release an alternative version. This document refers to data collected by the official releases of CoMapeo, digitally signed by Awana Digital, available from the Google Play Store or the Awana Digital website. Unofficial releases of CoMapeo obtained from other channels are outside our control and may share additional information with other organizations." + }, + "screens.PrivacyPolicy.overview": { + "message": "This document describes what information (\"data\") is sent from CoMapeo to the application developer, Awana Digital, and how that information is used." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Performance Data" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Such as launch time, energy usage, app freezes, and responsiveness" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "CoMapeo Data Privacy" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Private by default" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "The data you collect and create with CoMapeo (locations, photos, video, audio, text) is only stored on your device by default, and is not stored or sent anywhere else. When you share data with collaborators by joining a project with them, it is sent encrypted, directly to your collaborators' device. This means that the data is not sent via Awana Digital, nor anyone else, on its way to your collaborator. Awana Digital never sees nor has access to any of the data you collect with CoMapeo unless you explicitly send it to us." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Third-party access to data" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "A \"third-party\" is an organization other than Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "User Counts" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "The number of users per country and per project. Aggregated and anonymized" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "What is collected?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "By default, anonymized diagnostic information about your device, app crashes, errors and performance is shared with Awana Digital. You can opt-out of sharing this information at any time. This diagnostic information is completely anonymized and it never contains any of your data (the data you have collected with CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "Why is this data collected?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Crash data and app errors together with the device and app info provide Awana Digital with the information we need to fix errors and bugs in the app. The performance data helps us improve the responsiveness of the app and identify errors. User counts, including total users, users per country, and users per project, help justify ongoing investment in the development of CoMapeo." + }, + "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Was passiert hier?" }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", @@ -614,15 +1060,6 @@ "description": "Category title for new track screen", "message": "Track" }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "To use, enable App Passcode" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "Protect your device against seizure" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Obscure Passcode" - }, "screens.Security.passDesriptionPassNotSet": { "message": "Passcode not set" }, @@ -642,7 +1079,7 @@ "message": "Your Device Name" }, "screens.Setting.ProjectSettings.DeviceName.DisplayScreen.title": { - "message": "Device Name" + "message": "Gerätename" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.deviceNameLabel": { "message": "Edit Device Name" @@ -654,10 +1091,10 @@ "message": "Discard Changes" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "Änderungen verwerfen?" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { - "message": "Device Name" + "message": "Gerätename" }, "screens.Setting.ProjectSettings.YourTeam.InviteAccepted.addAnotherDevice": { "message": "Add Another Device" @@ -702,7 +1139,7 @@ "message": "Date Added" }, "screens.Setting.ProjectSettings.YourTeam.deviceName": { - "message": "Device Name" + "message": "Gerätename" }, "screens.Setting.ProjectSettings.YourTeam.inviteDevice": { "message": "Invite Device" @@ -716,6 +1153,21 @@ "screens.Setting.ProjectSettings.YourTeam.title": { "message": "Your Team" }, + "screens.Settings.Config.created": { + "message": "Created {date} at {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Import Config" + }, + "screens.Settings.Config.name": { + "message": "Config Name:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuration" + }, + "screens.Settings.Config.projectName": { + "message": "Project Name:" + }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { "message": "Create a Project" }, @@ -755,14 +1207,17 @@ "screens.Settings.CreateOrJoinProject.importConfig": { "message": "Import Config" }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "File name should end with .comapeocat" + }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Join an existing CoMapeo Project" }, "screens.Settings.CreateOrJoinProject.joinProject": { "message": "Join a Project" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.Settings.CreateOrJoinProject.startProject": { "message": "Start a CoMapeo Project" @@ -788,12 +1243,12 @@ "screens.Settings.YourTeam.unableToCancel": { "message": "Unable to Cancel Invitation" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "Über Mapeo" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "Versions- und Build-Nummer" }, "screens.Settings.appSettings": { @@ -803,6 +1258,10 @@ "description": "list of avaialable app settings", "message": "Language, Security, Coordinates" }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Project Configuration" + }, "screens.Settings.createOrJoin": { "message": "Create or Join Project" }, @@ -820,11 +1279,20 @@ "description": "Title of settings screen", "message": "Einstellungen" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { "message": "Create or Join Project" }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "You will be able to share data with devices that are part of the same project." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Create or join a project to collect data with a team" }, "screens.Sync.HeaderTitle.noWiFi": { "message": "No WiFi" @@ -838,49 +1306,93 @@ "screens.Sync.NoWifiDisplay.title": { "message": "No WiFi" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "You're all caught up!" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "All data synced" + }, + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Devices available" + }, + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Devices found" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "No devices available to sync" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Syncing…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Waiting…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Waiting for other devices" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Start Sync" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Stop" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Complete! Waiting for other devices to join" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "Complete! You're up to date" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "You are syncing with your team" + }, + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Waiting for devices" + }, + "screens.Track.ObservationList.observations": { + "message": "Beobachtungen" + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "Delete track?" + }, + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Track" + }, + "screens.Track.tracks": { + "message": "Tracks" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Edit Track" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Track" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", "message": "Show Options" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Leave Project" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Disconnected" }, "sharedComponents.DeviceIconWithName.thisDevice": { "message": "This Device!" }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "Suche läuft…" + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Change" + }, "sharedComponents.ErrorModal.goBack": { "message": "Go Back" }, @@ -894,31 +1406,40 @@ "message": "No GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "Suche läuft…" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Invite Canceled" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Close" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Your invitation to {projectName} has been canceled." }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { "message": "Accept Invite" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { "message": "Decline Invite" }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "You've been invited to join {projectName}" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Join Project {projectName}" + }, "sharedComponents.ProjectInviteBottomSheet.goToMap": { - "message": "Go To Map" + "message": "Zur Karte" }, "sharedComponents.ProjectInviteBottomSheet.goToSync": { "message": "Go To Sync" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" - }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" - }, "sharedComponents.ProjectInviteBottomSheet.success": { "message": "Success" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "You have joined {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { "message": "Coordinator" diff --git a/messages/en.json b/messages/en.json index 80ce51025..b33d72601 100644 --- a/messages/en.json +++ b/messages/en.json @@ -47,7 +47,7 @@ "message": "You’ve been recording for" }, "Navigation.Drawer.aboutCoMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", + "description": "Primary text for 'About CoMapeo' link (version info)", "message": "About CoMapeo" }, "Navigation.Drawer.aboutCoMapeoDesc": { @@ -67,12 +67,12 @@ "Navigation.Drawer.createOrJoinDesc": { "message": "Create a new project or join existing one" }, - "Navigation.Drawer.createOrJoinToSync": { - "message": "Create or Join a Project to sync with other devices" - }, "Navigation.Drawer.dataAndPrivacy": { "message": "Data & Privacy" }, + "Navigation.Drawer.mappingOnOwn": { + "message": "You are currently mapping on your own" + }, "Navigation.Drawer.projName": { "message": "Project {projectName}" }, @@ -160,6 +160,21 @@ "description": "Button to share an observation", "message": "Share" }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Continue editing" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Discard changes?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard changes" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { "message": "Coordinator" }, @@ -173,7 +188,7 @@ "message": "Not seeing a Device?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Make sure both devices are on the same version of CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { "message": "Make sure both devices are on the same wifi network" @@ -278,7 +293,7 @@ "message": "Incorrect Passcode" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "This passcode will be required to open the Mapeo App" + "message": "This passcode will be required to open the CoMapeo App" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { "message": "Confirm Passcode" @@ -293,10 +308,10 @@ "message": "What is App Passcode?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app. You can define your own 5-digit passcode by turning on the feature below." + "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open Mapeo and will lose access to any Mapeo data that has not been synced with other project participants." + "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "Cancel" @@ -308,7 +323,7 @@ "message": "You are currently using App Passcode. See below to stop using or change your passcode." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app." + "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "App Passcode" @@ -416,9 +431,15 @@ "screens.DeviceNaming.Success.description": { "message": "You named your device" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "To find your project settings go to the main menu found on the map screen." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Go to Map" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." + }, "screens.DeviceNaming.Success.success": { "message": "Success!" }, @@ -426,7 +447,7 @@ "message": "Add Name" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." }, "screens.DeviceNaming.header": { "message": "Add a name for your device" @@ -443,6 +464,18 @@ "screens.FatalError.somethingWrong": { "message": "Something Went Wrong" }, + "screens.HowToLeaveProject.goBack": { + "message": "Go back" + }, + "screens.HowToLeaveProject.howTo": { + "message": "How to Leave Project" + }, + "screens.HowToLeaveProject.instructions": { + "message": "To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device." + }, + "screens.HowToLeaveProject.warning": { + "message": "If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!" + }, "screens.IntroToCoMapeo.collaborate": { "message": "Collaborate with others" }, @@ -656,10 +689,10 @@ "message": "Zone Number" }, "screens.ObscurePasscode.description": { - "message": "Obscure Passcode is a security feature that allows you to open Mapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of Mapeo which allows you to create demonstration observations that are not saved to the Mapeo database." + "message": "Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database." }, "screens.ObscurePasscode.instructions": { - "message": "Enter the code above to hide your data in Mapeo" + "message": "Enter the code above to hide your data in CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Obscure Passcode" @@ -690,6 +723,9 @@ "description": "Button to cancel delete of observation", "message": "Cancel" }, + "screens.Observation.comapeoAlert": { + "message": "CoMapeo Alert" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "Yes, delete" @@ -698,13 +734,19 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "Delete observation?" }, + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", + "message": "Observation" + }, "screens.Observation.shareMediaTitle": { "description": "Title of dialog to share an observation with media", "message": "Sharing image" }, - "screens.Observation.shareMessage": { - "description": "Message that will be shared along with image", - "message": "CoMapeo Alert — _*{category_name}*_ {date, date, full} {time, time, long} {coordinates}" + "screens.Observation.shareMessageFooter": { + "message": "Sent from CoMapeo" + }, + "screens.Observation.shareMessageTitle": { + "message": "CoMapeo Alert" }, "screens.Observation.shareTextTitle": { "description": "Title of dialog to share an observation without media", @@ -721,14 +763,42 @@ "description": "Placeholder for description/notes field", "message": "What is happening here?" }, + "screens.ObservationCreate.keepWaiting": { + "description": "Button to cancel save and continue waiting for GPS", + "message": "Continue waiting" + }, + "screens.ObservationCreate.manualEntry": { + "description": "Button to manually enter GPS coordinates", + "message": "Manual Coords" + }, "screens.ObservationCreate.navTitle": { "description": "screen title for new observation screen", "message": "New Observation" }, + "screens.ObservationCreate.noGpsDesc": { + "description": "Description in dialog when trying to save with no GPS coords", + "message": "This observation does not have a location. You can continue waiting for a GPS signal, save the observation without a location, or enter coordinates manually" + }, + "screens.ObservationCreate.noGpsTitle": { + "description": "Title of dialog when trying to save with no GPS coords", + "message": "No GPS signal" + }, "screens.ObservationCreate.observation": { "description": "Default name of observation with no matching preset", "message": "Observation" }, + "screens.ObservationCreate.saveAnyway": { + "description": "Button to save regardless of GPS state", + "message": "Save" + }, + "screens.ObservationCreate.weakGpsDesc": { + "description": "Description in dialog when trying to save with low GPS accuracy.", + "message": "GPS accuracy is low. You can continue waiting for better accuracy, save the observation with low accuracy, or enter coordinates manually" + }, + "screens.ObservationCreate.weakGpsTitle": { + "description": "Title of dialog when trying to save with low GPS accuracy.", + "message": "Weak GPS signal" + }, "screens.ObservationDetails.done": { "description": "Button text when all questions are complete", "message": "Done" @@ -780,7 +850,7 @@ "message": "Observations" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "You are currently mapping on your own." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -795,20 +865,20 @@ "message": "Add Observations" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Create or Join a Project" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "Error loading observations. Try quitting and restarting Mapeo." + "message": "Error loading observations. Try quitting and restarting CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "Loading… this can take a while after synchronizing with a new device" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.OnboardingPrivacyPolicy.navTitle": { "message": "Privacy Policy" @@ -1041,6 +1111,21 @@ "screens.Setting.ProjectSettings.YourTeam.title": { "message": "Your Team" }, + "screens.Settings.Config.created": { + "message": "Created {date} at {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Import Config" + }, + "screens.Settings.Config.name": { + "message": "Config Name:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuration" + }, + "screens.Settings.Config.projectName": { + "message": "Project Name:" + }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { "message": "Create a Project" }, @@ -1081,16 +1166,16 @@ "message": "Import Config" }, "screens.Settings.CreateOrJoinProject.importConfigFileError": { - "message": "File name should end with .mapeoconfig" + "message": "File name should end with .comapeocat" }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Join an existing CoMapeo Project" }, "screens.Settings.CreateOrJoinProject.joinProject": { "message": "Join a Project" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.Settings.CreateOrJoinProject.startProject": { "message": "Start a CoMapeo Project" @@ -1116,12 +1201,12 @@ "screens.Settings.YourTeam.unableToCancel": { "message": "Unable to Cancel Invitation" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "About Mapeo" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "Version and build number" }, "screens.Settings.appSettings": { @@ -1131,6 +1216,10 @@ "description": "list of avaialable app settings", "message": "Language, Security, Coordinates" }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Project Configuration" + }, "screens.Settings.createOrJoin": { "message": "Create or Join Project" }, @@ -1154,8 +1243,14 @@ "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { "message": "Create or Join Project" }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "You will be able to share data with devices that are part of the same project." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Create or join a project to collect data with a team" }, "screens.Sync.HeaderTitle.noWiFi": { "message": "No WiFi" @@ -1176,17 +1271,14 @@ "message": "All data synced" }, "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { - "message": "{count} {count, plural, one {device} other {devices}} available" + "message": "Devices available" }, "screens.Sync.ProjectSyncDisplay.devicesFound": { - "message": "{count} {count, plural, one {Device} other {Devices}} found" + "message": "Devices found" }, "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { "message": "No devices available to sync" }, - "screens.Sync.ProjectSyncDisplay.progressLabelComplete": { - "message": "{count} out of {count} {count, plural, one {device} other {devices}}" - }, "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { "message": "Syncing…" }, @@ -1194,7 +1286,7 @@ "message": "Waiting…" }, "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { - "message": "{active} out of {total} {total, plural, one {device} other {devices}}…" + "message": "Waiting for other devices" }, "screens.Sync.ProjectSyncDisplay.startSync": { "message": "Start Sync" @@ -1206,13 +1298,13 @@ "message": "{value}%" }, "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { - "message": "Complete! Waiting for {count} {count, plural, one {device} other {devices}}" + "message": "Complete! Waiting for other devices to join" }, "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { "message": "Complete! You're up to date" }, "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { - "message": "Syncing with {active} out of {total} {total, plural, one {device} other {devices}}" + "message": "You are syncing with your team" }, "screens.Sync.ProjectSyncDisplay.waitingForDevices": { "message": "Waiting for devices" @@ -1231,10 +1323,21 @@ "screens.Track.tracks": { "message": "Tracks" }, + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Edit Track" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Track" + }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", "message": "Show Options" }, + "sharedComponents.DeviceCard.leaveProject": { + "message": "Leave Project" + }, "sharedComponents.DeviceIconWithName.Disconnected": { "message": "Disconnected" }, diff --git a/messages/es.json b/messages/es.json index 44ef12a0f..243db064a 100644 --- a/messages/es.json +++ b/messages/es.json @@ -5,10 +5,10 @@ }, "AppContainer.EditHeader.discardChangesButton": { "description": "Title of dialog that shows when cancelling observation edits", - "message": "Discard changes" + "message": "Descartar cambios" }, "AppContainer.EditHeader.discardChangesDescription": { - "message": "Your changes will not be saved. This cannot be undone." + "message": "Tus cambios no se guardarán. Esto no se puede deshacer." }, "AppContainer.EditHeader.discardChangesTitle": { "description": "Title of dialog that shows when cancelling observation edits", @@ -16,107 +16,232 @@ }, "AppContainer.EditHeader.discardObservationButton": { "description": "Title of dialog that shows when cancelling observation edits", - "message": "Discard Observation" + "message": "Descartar observación" }, "AppContainer.EditHeader.discardObservationDescription": { - "message": "Your Observation will not be saved. This cannot be undone." + "message": "Tu observación no se guardará. Esto no se puede deshacer." }, "AppContainer.EditHeader.discardTitle": { "description": "Title of dialog that shows when cancelling a new observation", "message": "¿Quieres descartar la observación?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { - "message": "Enable" - }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" + "message": "Habilitar" }, "Modal.GPSDisable.description": { - "message": "To create a Track CoMapeo needs access to your location and GPS." - }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" + "message": "Para crear un Trayecto, CoMapeo necesita acceso a tu ubicación y GPS." }, "Modal.GPSDisable.title": { - "message": "GPS Disabled" + "message": "GPS desactivado" }, "Modal.GPSEnable.button.default": { - "message": "Start Tracks" + "message": "Iniciar Trayectos" }, "Modal.GPSEnable.button.loading": { - "message": "Loading…" + "message": "Cargando…" }, "Modal.GPSEnable.button.stop": { - "message": "Stop Tracks" + "message": "Detener Tracks" }, "Modal.GPSEnable.trackingDescription": { - "message": "You’ve been recording for" + "message": "Has estado grabando para" + }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "Acerca de CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "Versión y número de compilación" + }, + "Navigation.Drawer.appSettings": { + "message": "Ajustes de la aplicación" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Idioma, seguridad, coordenadas" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Crear o unirse a un proyecto" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Crear un nuevo proyecto o unirse a uno existente" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Datos y privacidad" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "Actualmente estás mapeando por tu cuenta" + }, + "Navigation.Drawer.projName": { + "message": "Proyecto {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Configuración del proyecto" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categorías, configuración, equipo" + }, + "Navigation.Drawer.security": { + "message": "Seguridad" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "Ajustes" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Seguir editando" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Descartar cambios" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Tus cambios no se guardarán. Esto no se puede deshacer." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "¿Descartar cambios?" + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Seguir editando" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "¿Descartar Trayecto?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Descartar Trayecto" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Tu Trayecto no se guardará. Esto no se puede deshacer." }, "Screens.Settings.AppSettings.coordinateSystem": { - "message": "Coordinate System" + "message": "Sistema de coordenadas" }, "Screens.Settings.AppSettings.coordinateSystemDesc": { - "message": "UTM,Lat/Lon,DMS" + "message": "UTM, Lat/Long, DMS" }, "Screens.Settings.AppSettings.language": { "message": "Idioma" }, "Screens.Settings.AppSettings.languageDesc": { - "message": "Display language for app" + "message": "Mostrar idioma para la aplicación" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "Ajustes de la aplicación" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "Nombre del dispositivo" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Ajustes de sincronización" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Configuración del proyecto" }, "Screens.Settings.ProjectSettings.yourTeam": { - "message": "Your Team" + "message": "Tu equipo" + }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "Cancelar" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "Si, borrar" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "Borrar" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Compartir" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Seguir editando" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "¿Descartar cambios?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Descartar cambios" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Tus cambios no se guardarán. Esto no se puede deshacer." }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { - "message": "Coordinator" + "message": "Persona Coordinadora" }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.participant": { - "message": "Participant" + "message": "Participante" }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.sendInvite": { - "message": "Send Invite" + "message": "Enviar invitación" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.notSeeingDevice": { - "message": "Not seeing a Device?" + "message": "¿No ves un dispositivo?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Asegúrate de que ambos dispositivos estén en la misma red Wifi" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { - "message": "Make sure both devices are on the same wifi network" + "message": "Asegúrate de que ambos dispositivos estén en la misma red wifi" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.title": { - "message": "Select Device to Invite" + "message": "Seleccionar dispositivo para invitar" }, "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.coordinatorDescription": { - "message": "As a Coordinator this device can invite and remove users, and manage project details." + "message": "Como persona Coordinadora, este dispositivo puede invitar y quitar dispositivos de este proyecto y administrar los detalles del Proyecto." }, "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.participantDescription": { - "message": "As a Participant this device can take and share observations. They cannot manage users or project details." + "message": "Como Participante, este dispositivo puede crear, editar, sincronizar y compartir observaciones. No puede administrar personas usuarias ni detalles del Proyecto." }, "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.selectingDevice": { - "message": "You are selecting a role for this device:" + "message": "Está seleccionando un rol para este dispositivo:" }, "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { - "message": "Select a Role" + "message": "Seleccionar un rol" + }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "Número de compilación de CoMapeo" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "Variante de CoMapeo" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "Versión de CoMapeo" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Número de compilación de Android" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Versión de Android" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Modelo del teléfono" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "Acerca de CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Desconocido" }, "screens.AddPhoto.cancel": { "message": "Cancelar" @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "Contraseña" + "message": "Contraseña: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "Guardar Contraseña de la aplicación" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Asegúrate de anotar tu código de acceso en algún lugar seguro antes de guardarlo." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "¡Si pierde u olvida la Contraseña de la aplicación, no va a poder recuperarla! Asegúrese de anotar su contraseña en un lugar seguro antes de guardar." + "message": "¡Las contraseñas de la aplicación nunca se pueden recuperar si se pierden o se olvidan!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "Por favor, introduzca su contraseña" @@ -168,13 +296,13 @@ "message": "Contraseña incorrecta" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "Esta contraseña será necesaria para abrir la aplicación de Mapeo" + "message": "Este código de acceso será necesario para abrir la aplicación de Mapeo" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { - "message": "Confirm Passcode" + "message": "Confirmar contraseña" }, "screens.AppPasscode.NewPasscode.SetPasscodeScreen.title": { - "message": "Set Passcode" + "message": "Establecer contraseña" }, "screens.AppPasscode.NewPasscode.Splash.continue": { "message": "Continuar" @@ -183,10 +311,10 @@ "message": "¿Qué es la Contraseña de la aplicación?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "La Contraseña de la aplicación le permite añadir una capa adicional de seguridad, requiriendo introducir una contraseña para abrir la aplicación de Mapeo. Puede definir su propio código de acceso de 5 dígitos activando la siguiente característica." + "message": "La contraseña de la aplicación le permite añadir una capa adicional de seguridad, requiriendo introducir una contraseña para abrir la aplicación de CoMapeo. Puedes definir tu propia contraseña de 5 dígitos activando la siguiente función." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**AVISO: ¡Las contraseñas olvidadas no pueden ser recuperadas!** Una vez que esta funcionalidad está activada, si olvida o pierde su contraseña, no podrá abrir Mapeo y perderá el acceso a cualquier dato de Mapeo que no haya sido sincronizado con otros participantes del proyecto." + "message": "¡Por favor considera que las contraseñas olvidadas no pueden ser recuperadas! Una vez que esta funcionalidad está activada, si olvidas o pierdes tu contraseña, no podrás abrir CoMapeo y perderás el acceso a cualquier dato de CoMapeo que no hayas sido sincronizado con otras personas participantes del proyecto." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "Cancelar" @@ -198,7 +326,7 @@ "message": "Actualmente usted está usando la Contraseña de la aplicación. Consulte abajo para dejar de usar o cambiar la contraseña." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "La Contraseña de la aplicación añade una capa adicional de seguridad, requiriendo que introduzca un código de acceso para abrir la aplicación de Mapeo." + "message": "La contraseña de la aplicación añade una capa adicional de seguridad, requiriendo que introduzcas un código para abrir la aplicación de CoMapeo." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "Contraseña de la aplicación" @@ -210,13 +338,33 @@ "message": "¿Desactivar la Contraseña de la aplicación?" }, "screens.AppPasscode.TurnOffPasscode.usePasscode": { - "message": "Usar la Contraseña de la apliación" + "message": "Usar la Contraseña de la aplicación" + }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Permitir" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Ir a ajustes" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Ahora no" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "Para grabar audio mientras usas la aplicación y en segundo plano, CoMapeo necesita acceder a tu micrófono. Por favor, habilita los permisos de micrófono en los ajustes de tu aplicación." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Grabando audio con CoMapeo" }, "screens.CameraScreen.goToSettings": { - "message": "Go to Settings" + "message": "Ir a ajustes" }, "screens.CameraScreen.noCameraAccess": { - "message": "No access to camera. Please Allow access in setting" + "message": "No hay acceso a la cámara. Por favor permite el acceso en ajustes" }, "screens.CategoryChooser.categoryTitle": { "description": "Title for category chooser screen", @@ -224,26 +372,77 @@ }, "screens.CoordinateFormat.dd": { "description": "Decimal Degrees coordinate format", - "message": "Decimal Degrees (DD)" + "message": "Grados Decimales (DD)" }, "screens.CoordinateFormat.dms": { "description": "Degrees/Minutes/Seconds coordinate format", - "message": "Degrees/Minutes/Seconds (DMS)" + "message": "Grados/Minutos/Segundos (DMS)" }, "screens.CoordinateFormat.title": { "description": "Title coordinate format screen", - "message": "Coordinate Format" + "message": "Formato de las Coordenadas" }, "screens.CoordinateFormat.utm": { "description": "Universal Transverse Mercator coordinate format", - "message": "Universal Transverse Mercator (UTM)" + "message": "Universal Transversal de Mercator (UTM)" + }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "La información anonimizada sobre su dispositivo, los errores de las aplicaciones, los errores y el rendimiento ayuda a Awana Digital a mejorar la aplicación y a corregir errores." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Información de diagnóstico" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Aprende más" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Datos y privacidad" + }, + "screens.DataAndPrivacy.noPII": { + "message": "Esto nunca incluye ninguno de tus datos o datos personales." + }, + "screens.DataAndPrivacy.optOut": { + "message": "Puedes optar por no compartir información de diagnóstico en cualquier momento." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo respeta tu privacidad y autonomía" + }, + "screens.DataPrivacy.description": { + "message": "CoMapeo te permite a ti y a tus colaboradores mapear sin conexión y sin necesitar servidores." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Privado de forma predeterminada — la información de diagnóstico es completamente anónima y puedes optar por no compartirla en cualquier momento." + }, + "screens.DataPrivacy.encrypted": { + "message": "Toda la información permanece completamente cifrada" + }, + "screens.DataPrivacy.learnMore": { + "message": "Aprende más" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Gestiona y controla fácilmente el intercambio y la colaboración." + }, + "screens.DataPrivacy.next": { + "message": "Siguiente" + }, + "screens.DataPrivacy.stays": { + "message": "Tu información permanece en tus dispositivos." + }, + "screens.DataPrivacy.title": { + "message": "Datos y privacidad" }, "screens.DeviceNaming.Success.description": { "message": "Nombraste tu dispositivo" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "Para encontrar la Configuración del Proyecto ve al menú principal que puedes encontrar en la pantalla del mapa." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Ir al mapa" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "Ya puedes empezar a mapear de manera individual o empezar a mapear en equipo. Crea o colabora en un Proyecto para compartir información entre dispositivos que son parte del mismo Proyecto." + }, "screens.DeviceNaming.Success.success": { "message": "¡Éxito!" }, @@ -251,7 +450,7 @@ "message": "Agregar nombre" }, "screens.DeviceNaming.description": { - "message": "Para crear o unirte a un nuevo proyecto tendrás que nombrar tu dispositivo. En una futura versión de CoMapeo, podrás gestionar los proyectos que hayas creado cambiando los roles de los dispositivos, eliminando dispositivos y mucho más." + "message": "Ya puedes empezar a mapear de manera individual o empezar a mapear en equipo. Crea o colabora en un proyecto para compartir información entre dispositivos que son parte del mismo proyecto." }, "screens.DeviceNaming.header": { "message": "Agrega un nombre para tu dispositivo" @@ -263,56 +462,111 @@ "message": "Contraseña incorrecta, inténtelo de nuevo" }, "screens.FatalError.restart": { - "message": "Restart App" + "message": "Reiniciar la aplicación" }, "screens.FatalError.somethingWrong": { - "message": "Something Went Wrong" + "message": "Algo salió mal" + }, + "screens.HowToLeaveProject.goBack": { + "message": "Regresar" + }, + "screens.HowToLeaveProject.howTo": { + "message": "Cómo salir de un Proyecto" + }, + "screens.HowToLeaveProject.instructions": { + "message": "Para salir de un Proyecto desinstala y reinstala CoMapeo. Toda la información del Proyecto será eliminada de este dispositivo." + }, + "screens.HowToLeaveProject.warning": { + "message": "Si eres la única persona Coordinadora en el proyecto, nadie más tendrá acceso a editar los detalles del proyecto o invitar a otros dispositivos!" }, "screens.IntroToCoMapeo.collaborate": { - "message": "Colabora con proyectos de mapeo y monitoreo" + "message": "Colabora con otras personas" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Diseñado con y para pueblos indígenas y comunidades de primera línea" }, "screens.IntroToCoMapeo.getStarted": { "message": "¡Comienza ya!" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "ahora es" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Mapea en cualquier lugar y en todas partes" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Mapea tu mundo, en colectivo" + }, + "screens.IntroToCoMapeo.ownData": { + "message": "Controla tu información y hazla tuya" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", - "message": "Language" + "message": "Idioma" + }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "Ya estás en un Proyecto" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Regresar" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Abandonar el Proyecto actual" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "Para unirte a un nuevo proyecto debes abandonar el actual." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "Estás en {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "Cancelar" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Por favor, marca la casilla para confirmar" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "Entiendo que eliminaré todos los datos del proyecto {projectName} de mi dispositivo." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "Entiendo que eliminaré todos los datos de mi dispositivo." + }, + "screens.LeaveProject.leaveProj": { + "message": "Abandonar proyecto" + }, + "screens.LeaveProject.leavingProject": { + "message": "Abandonando proyecto {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "Esto eliminará todos los datos del Proyecto {projectName} de tu dispositivo." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "Esto eliminará todos los datos de su dispositivo." }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", - "message": "Details" + "message": "Detalles" }, "screens.LocationInfoScreen.gpsHeader": { "description": "Header for GPS screen", - "message": "Current GPS Location" + "message": "Ubicación actual del GPS" }, "screens.LocationInfoScreen.lastUpdate": { "description": "Section title for time of last GPS update", - "message": "Last update" + "message": "Última actualización" }, "screens.LocationInfoScreen.locationDD": { "description": "Section title for DD coordinates", - "message": "Coordinates Decimal Degrees" + "message": "Coordenadas Grados Decimales" }, "screens.LocationInfoScreen.locationDMS": { "description": "Section title for DMS coordinates", - "message": "Coordinates DMS" + "message": "Coordenadas Grados/Minutos/Segundos (DMS)" }, "screens.LocationInfoScreen.locationSensors": { "description": "Heading for section about location sensor status", - "message": "Sensor Status" + "message": "Estatus de sensores" }, "screens.LocationInfoScreen.locationUTM": { "description": "Section title for UTM coordinates", - "message": "Coordinates UTM" + "message": "Coordenadas UTM" }, "screens.LocationInfoScreen.no": { "description": "if a location sensor is active yes/no", @@ -320,128 +574,167 @@ }, "screens.LocationInfoScreen.yes": { "description": "if a location sensor is active yes/no", - "message": "Yes" + "message": "Sí" }, "screens.ManualGpsScreen.DdForm.east": { - "message": "East" + "message": "Este" }, "screens.ManualGpsScreen.DdForm.invalidCoordinates": { - "message": "Invalid coordinates" + "message": "Coordenadas no válidas" }, "screens.ManualGpsScreen.DdForm.latInputLabel": { - "message": "Latitude value" + "message": "Valor de latitud" }, "screens.ManualGpsScreen.DdForm.latitude": { - "message": "Latitude" + "message": "Latitud" }, "screens.ManualGpsScreen.DdForm.lonInputLabel": { - "message": "Longitude value" + "message": "Valor de longitud" }, "screens.ManualGpsScreen.DdForm.longitude": { - "message": "Longitude" + "message": "Longitud" }, "screens.ManualGpsScreen.DdForm.north": { - "message": "North" + "message": "Norte" }, "screens.ManualGpsScreen.DdForm.selectLatCardinality": { - "message": "Select latitude cardinality" + "message": "Selecciona la cardinalidad de la latitud" }, "screens.ManualGpsScreen.DdForm.selectLonCardinality": { - "message": "Select longitude cardinality" + "message": "Selecciona la cardinalidad de la longitud" }, "screens.ManualGpsScreen.DdForm.south": { - "message": "South" + "message": "Sur" }, "screens.ManualGpsScreen.DdForm.west": { - "message": "West" + "message": "Oeste" }, "screens.ManualGpsScreen.DmsForm.DmsInputGroup.MinutesInputLabel": { - "message": "{field} minutes input" + "message": "Minutos" }, "screens.ManualGpsScreen.DmsForm.DmsInputGroup.SecondsInputLabel": { - "message": "{field} seconds input" + "message": "Entrada de segundos" }, "screens.ManualGpsScreen.DmsForm.DmsInputGroup.degrees": { - "message": "Degrees" + "message": "Grados" }, "screens.ManualGpsScreen.DmsForm.DmsInputGroup.degreesInputLabel": { - "message": "{field} degrees input" + "message": "Grados" }, "screens.ManualGpsScreen.DmsForm.DmsInputGroup.direction": { - "message": "Direction" + "message": "Dirección" }, "screens.ManualGpsScreen.DmsForm.DmsInputGroup.minutes": { - "message": "Minutes" + "message": "Minutos" }, "screens.ManualGpsScreen.DmsForm.DmsInputGroup.seconds": { - "message": "Seconds" + "message": "Segundos" }, "screens.ManualGpsScreen.DmsForm.east": { - "message": "East" + "message": "Este" }, "screens.ManualGpsScreen.DmsForm.invalidCoordinates": { - "message": "Invalid coordinates" + "message": "Coordenadas no válidas" }, "screens.ManualGpsScreen.DmsForm.latitude": { - "message": "Latitude" + "message": "Latitud" }, "screens.ManualGpsScreen.DmsForm.longitude": { - "message": "Longitude" + "message": "Longitud" }, "screens.ManualGpsScreen.DmsForm.north": { - "message": "North" + "message": "Norte" }, "screens.ManualGpsScreen.DmsForm.selectLatCardinality": { - "message": "Select latitude cardinality" + "message": "Selecciona la cardinalidad de la latitud" }, "screens.ManualGpsScreen.DmsForm.south": { - "message": "South" + "message": "Sur" }, "screens.ManualGpsScreen.DmsForm.west": { - "message": "West" + "message": "Oeste" }, "screens.ManualGpsScreen.coordinateFormat": { - "message": "Coordinate Format" + "message": "Formato de las Coordenadas" }, "screens.ManualGpsScreen.decimalDegrees": { - "message": "Decimal Degrees (DD)" + "message": "Grados Decimales (DD)" }, "screens.ManualGpsScreen.degreesMinutesSeconds": { - "message": "Degrees/Minutes/Seconds (DMS)" + "message": "Grados/Minutos/Segundos (DMS)" }, "screens.ManualGpsScreen.easting": { - "message": "East" + "message": "Este" }, "screens.ManualGpsScreen.eastingSuffix": { "message": "mE" }, "screens.ManualGpsScreen.invalidCoordinates": { - "message": "Invalid coordinates. Latitude must be between -90 and 90. Longitude must be between -180 and 180" + "message": "Coordenadas no válidas. Latitud debe estar entre -90 y 90. La longitud debe estar entre -180 y 180" }, "screens.ManualGpsScreen.northing": { - "message": "North" + "message": "Norte" }, "screens.ManualGpsScreen.northingSuffix": { "message": "mN" }, "screens.ManualGpsScreen.title": { "description": "title of manual GPS screen", - "message": "Enter coordinates" + "message": "Ingresar coordenadas" }, "screens.ManualGpsScreen.universalTransverseMercator": { - "message": "Universal Transverse Mercator (UTM)" + "message": "Universal Transversal de Mercator (UTM)" }, "screens.ManualGpsScreen.zoneLetter": { - "message": "Zone Letter" + "message": "Letra de zona" }, "screens.ManualGpsScreen.zoneNumber": { - "message": "Zone Number" + "message": "Número de zona" + }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "Cancelar" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sincronizar todo" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "¿Sincronizar todo?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Tu dispositivo sincronizará todo el contenido en tamaño completo incluyendo fotos, audio y vídeos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "Está a punto de sincronizar todo. Esto puede aumentar el espacio de disco usado en su dispositivo." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Nota: Esto utilizará más almacenamiento." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "Ya no sincronizarás Audio o Video." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Sincronizar vistas previas (sólo fotos)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Sincronizar vistas previas" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "¿Sincronizar vistas previas?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Las fotos se van a sincronizar en un tamaño reducido. Tu dispositivo no sincronizará audio y video." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Tu dispositivo mantendrá todos los datos existentes, pero las nuevas observaciones se sincronizarán en un tamaño más pequeño, de vista previa." + }, + "screens.MediaSyncSettings.title": { + "message": "Ajustes de sincronización" }, "screens.ObscurePasscode.description": { - "message": "La Contraseña oscura es una funcionalidad de seguridad que le permite abrir Mapeo en un modo que oculta todos sus datos. Introduciendo la Constraseña oscura en la pantalla de introducción se mostrará una versión vacía de Mapeo que le permite crear observaciones de demostración que no se guardan en la base de datos de Mapeo." + "message": "La Contraseña Oscura es una funcionalidad de seguridad que te permite abrir CoMapeo en un modo que oculta toda tu información. Al introducir la Constraseña Oscura en la pantalla de inicio, se mostrará una versión vacía de CoMapeo que te permite crear observaciones de demostración que no se guardan en la base de datos de CoMapeo." }, "screens.ObscurePasscode.instructions": { - "message": "Introduzca la constraseña anterior para ocultar sus datos en Mapeo" + "message": "Introduce el código anterior para ocultar tus datos en CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Contraseña oscura" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "¿Qué es la Contraseña oscura?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "Cambiar" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "Observación" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "Borrar" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "Observación" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Enviar" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "Cancelar" }, + "screens.Observation.comapeoAlert": { + "message": "Alerta de CoMapeo" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "Si, borrar" @@ -483,88 +776,123 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "¿Quieres borrar la observación?" }, - "screens.Observation.title": { - "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", "message": "Observación" }, - "screens.ObservationDetails.done": { - "description": "Button text when all questions are complete", - "message": "Done" + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Compartiendo imagen" }, - "screens.ObservationDetails.nextQuestion": { - "description": "Button text to navigate to next question", - "message": "Next" + "screens.Observation.shareMessageFooter": { + "message": "Enviado desde CoMapeo" }, - "screens.ObservationDetails.title": { - "description": "Title of observation details screen showing question number and total", - "message": "Question {current} of {total}" + "screens.Observation.shareMessageTitle": { + "message": "Alerta de CoMapeo" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "Agregar…" + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Compartiendo texto" }, - "screens.ObservationEdit.ObservationEditView.audioButton": { - "description": "Button label for adding audio", - "message": "Audio" + "screens.Observation.title": { + "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", + "message": "Observación" }, - "screens.ObservationEdit.ObservationEditView.descriptionPlaceholder": { + "screens.ObservationCreate.changePreset": { + "message": "Cambiar" + }, + "screens.ObservationCreate.descriptionPlaceholder": { "description": "Placeholder for description/notes field", "message": "¿Qué está pasando aquí?" }, - "screens.ObservationEdit.ObservationEditView.detailsButton": { - "description": "Button label to add details", - "message": "Details" - }, - "screens.ObservationEdit.ObservationEditView.photoButton": { - "description": "Button label for adding photo", - "message": "Photo" - }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "Buscando…" - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { + "screens.ObservationCreate.keepWaiting": { "description": "Button to cancel save and continue waiting for GPS", "message": "Seguir esperando" }, - "screens.ObservationEdit.SaveButton.manualEntry": { + "screens.ObservationCreate.manualEntry": { "description": "Button to manually enter GPS coordinates", "message": "Ingresar manualmente" }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "Observación nueva" + }, + "screens.ObservationCreate.noGpsDesc": { "description": "Description in dialog when trying to save with no GPS coords", "message": "Esta observación no tiene ubicación. Puedes seguir esperando el GPS, o guardarlo sin ubicación o ingresar las coordenadas manualmente" }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { + "screens.ObservationCreate.noGpsTitle": { "description": "Title of dialog when trying to save with no GPS coords", "message": "Sin señal del GPS" }, - "screens.ObservationEdit.SaveButton.saveAnyway": { + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "Observación" + }, + "screens.ObservationCreate.saveAnyway": { "description": "Button to save regardless of GPS state", "message": "Guardar" }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { + "screens.ObservationCreate.weakGpsDesc": { "description": "Description in dialog when trying to save with low GPS accuracy.", "message": "La precisión del GPS está baja. Puedes seguir esperando que la precisión mejore, o guardar como está o ingresar las coordenadas manualmente" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { + "screens.ObservationCreate.weakGpsTitle": { "description": "Title of dialog when trying to save with low GPS accuracy.", "message": "Señal débil del GPS" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", - "message": "Editar observación" + "screens.ObservationDetails.done": { + "description": "Button text when all questions are complete", + "message": "Listo" + }, + "screens.ObservationDetails.nextQuestion": { + "description": "Button text to navigate to next question", + "message": "Siguiente" + }, + "screens.ObservationDetails.title": { + "description": "Title of observation details screen showing question number and total", + "message": "Pregunta {current} de {total}" }, - "screens.ObservationEdit.newTitle": { + "screens.ObservationEdit.ObservationEditView.audioButton": { + "description": "Button label for adding audio", + "message": "Audio" + }, + "screens.ObservationEdit.ObservationEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "¿Qué está pasando aquí?" + }, + "screens.ObservationEdit.ObservationEditView.detailsButton": { + "description": "Button label to add details", + "message": "Detalles" + }, + "screens.ObservationEdit.ObservationEditView.photoButton": { + "description": "Button label for adding photo", + "message": "Foto" + }, + "screens.ObservationEdit.changePreset": { + "message": "Cambiar" + }, + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "¿Qué está pasando aquí?" + }, + "screens.ObservationEdit.navTitle": { "description": "screen title for new observation screen", - "message": "Observación nueva" + "message": "Editar observación" + }, + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "Observación" + }, + "screens.ObservationList.TrackListItem.Track": { + "message": "Trayecto" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "Observaciones" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "Actualmente estás mapeando por tu cuenta." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,49 +907,158 @@ "message": "Añadir observaciones" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Crea o únete a un Proyecto" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "Error a cargar observaciones, volver a abrir Mapeo para ver si lo corrige." + "message": "Error al cargar observaciones. Intenta salir y reiniciar CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "Cargando… esto puede tomar un tiempo después de sincronizar con un nuevo dispositivo" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "para recolectar información con un equipo. Esta acción eliminará las observaciones que has recolectado hasta ahora. Considera compartir observaciones importantes {icon} a tu correo electrónico antes de continuar." }, - "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { - "description": "Placeholder for description/notes field", - "message": "What is happening here?" + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Política de privacidad" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Permisos actuales" + }, + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Compartir información de diagnóstico" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "Cancelar" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Eliminar imagen" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "¿Eliminar esta foto?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Eliminar foto" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "Acerca de Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo es desarrollado por Awana Digital, una organización sin fines de lucro 501c3 registrada en los Estados Unidos. Awana Digital trabaja en solidaridad con las comunidades de primera línea para utilizar la tecnología para defender sus derechos y luchar contra el cambio climático." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "Error de aplicación" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Información sobre errores internos que hacen que la aplicación no funcione como se espera" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "Información de aplicación" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "La versión y la configuración regional (idioma) de CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "Uso de la aplicación" + }, + "screens.PrivacyPolicy.control": { + "message": "Tú tienes el control" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "Tú puedes optar por no enviar cualquier información a Awana Digital. Tu eliges dónde se almacenan tus datos y con quién los compartes. Puedes elegir compartir datos anónimos y resumidos sobre cómo usas CoMapeo con Awana Digital. Siempre seremos transparentes sobre la información que elijas compartir con el propósito de mejorar la aplicación, y esta información nunca incluirá fotos, vídeos, audio, texto o ubicaciones precisas que hayas introducido en CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Datos de error" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Información sobre qué causó que la aplicación se cerrara inesperadamente" }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" + "screens.PrivacyPolicy.dataCollection": { + "message": "Recopilación de datos de CoMapeo" + }, + "screens.PrivacyPolicy.deviceInfo": { + "message": "Información del dispositivo" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Como modelo y fabricante de tu dispositivo; sistema operativo de dispositivo; tamaño de pantalla; configuración regional del dispositivo (idioma); memoria del dispositivo." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnósticos" + }, + "screens.PrivacyPolicy.noPII": { + "message": "No hay información personal identificable" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "El uso de CoMapeo no requiere una cuenta de usuario. Awana Digital no recopila tu nombre, dirección de correo electrónico o ningún otro dato personal. Ningún identificador de usuario permanente o identificador de dispositivo es compartido con Awana Digital, y tomamos medidas adicionales para asegurar que ninguna información que tu compartes pueda ser usada para rastrearte: los identificadores son aleatorizados y rotados (cambiados) cada mes y no almacenamos direcciones IP." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "¿Qué no se recopila?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "No recopilamos ningún dato personal ni ningún dato que pueda ser utilizado para identificar o rastrear a una persona usuaria o un dispositivo. Los identificadores de dispositivo utilizados para agregar información son aleatorios, anónimos, y cambian cada mes. La información de diagnóstico no incluye datos sobre cómo usas la aplicación, y nunca incluye ninguno de los datos que has recopilado con la aplicación. No recolectamos tu ubicación precisa o gruesa, sólo el país donde estás utilizando CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Código abierto y la versión \"oficial\"" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo es una aplicación de código abierto. Esto significa que cualquiera puede ver el código que hace que la aplicación funcione y puede verificar las declaraciones de privacidad en este documento. También significa que cualquiera puede adaptar la aplicación a sus propias necesidades y lanzar una versión alternativa. Este documento se refiere a los datos recogidos por los lanzamientos oficiales de CoMapeo, firmada digitalmente por Awana Digital, disponible en Google Play Store o en el sitio web de Awana Digital. Las liberaciones no oficiales de CoMapeo obtenidas de otros canales están fuera de nuestro control y pueden compartir información adicional con otras organizaciones." + }, + "screens.PrivacyPolicy.overview": { + "message": "Este documento describe qué información (\"datos\") se envía desde CoMapeo al desarrollador de aplicaciones, Awana Digital, y cómo se utiliza esa información." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Datos de rendimiento" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Como tiempo de lanzamiento, consumo de energía, aplicaciones congeladas y capacidad de respuesta" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "Privacidad de datos de CoMapeo" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Privado por defecto" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "La información (datos) que tu recopilas y creas con CoMapeo (ubicaciones, fotos, video, audio, texto) sólo se almacena en tu dispositivo por defecto y no se almacena ni se envía a ningún otro lugar. Cuando compartes información con personas colaboradoras uniéndote a un proyecto con ellas, se envía cifrado, directamente a sus dispositivos. Esto significa que los datos no se envían a través de Awana Digital, ni a nadie más, en su camino hacia tu colaborador. Awana Digital nunca ve ni tiene acceso a ninguno de los datos que recopilas con CoMapeo a menos que nos los envíes explícitamente." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Acceso de terceros a los datos" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "Un \"tercero\" es una organización distinta a Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "Conteo de personas usuarias" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "El número de usuarios por país y por proyecto. Agregado y anonimizado" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "¿Qué no se recopila?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "De forma predeterminada, la información de diagnóstico anonimizada sobre tu dispositivo, los bloqueos de aplicaciones, los errores y el rendimiento se comparten con Awana Digital. Puedes optar por no compartir esta información en cualquier momento. Esta información de diagnóstico es completamente anónima y nunca contiene ninguno de tus datos (los datos que has recopilado con CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "¿Por qué se recolectan estos datos?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Los datos de error y los errores de la aplicación junto con el dispositivo y la información de la aplicación proporcionan a Awana Digital la información que necesitamos para corregir errores y errores en la aplicación. Los datos de rendimiento nos ayudan a mejorar la capacidad de respuesta de la aplicación e identificar errores. Las cuentas de personas usuarias, incluyendo el total de personas usuarias, usuarias por país y usuarias por proyecto, ayudan a justificar la inversión continua en el desarrollo de CoMapeo." + }, + "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "¿Qué está pasando aquí?" }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", - "message": "New Track" + "message": "Nuevo trayecto" }, "screens.SaveTrack.track": { "description": "Category title for new track screen", - "message": "Track" - }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "Para usarla, active la Contraseña de la aplicación" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "Proteja su dispositivo contra la incautación" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Contraseña oscura" + "message": "Trayecto" }, "screens.Security.passDesriptionPassNotSet": { "message": "Contraseña no establecida" @@ -639,292 +1076,376 @@ "message": "Seguridad" }, "screens.Setting.ProjectSettings.DeviceName.DisplayScreen.deviceNameLabel": { - "message": "Your Device Name" + "message": "El nombre de tu dispositivo" }, "screens.Setting.ProjectSettings.DeviceName.DisplayScreen.title": { - "message": "Device Name" + "message": "Nombre del dispositivo" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.deviceNameLabel": { - "message": "Edit Device Name" + "message": "Editar nombre de dispositivo" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertCancelText": { - "message": "Continue Editing" + "message": "Seguir editando" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertConfirmText": { - "message": "Discard Changes" + "message": "Descartar cambios" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "¿Descartar cambios?" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { - "message": "Device Name" + "message": "Nombre del dispositivo" }, "screens.Setting.ProjectSettings.YourTeam.InviteAccepted.addAnotherDevice": { - "message": "Add Another Device" + "message": "Añadir otro dispositivo" }, "screens.Setting.ProjectSettings.YourTeam.InviteAccepted.close": { - "message": "Close" + "message": "Cerrar" }, "screens.Setting.ProjectSettings.YourTeam.InviteAccepted.inviteAccepted": { - "message": "Invite Accepted" + "message": "Invitación aceptada" }, "screens.Setting.ProjectSettings.YourTeam.NotOnProject.createOrJoin": { - "message": "Create or Join Project" + "message": "Crear o unirse a un proyecto" }, "screens.Setting.ProjectSettings.YourTeam.NotOnProject.projectNecessary": { - "message": "Create or Join a Project to invite devices" + "message": "Crear o Unirse a un Proyecto para invitar dispositivos" }, "screens.Setting.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.title": { - "message": "Review Invitation" + "message": "Revisar invitación" }, "screens.Setting.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.youAreInviting": { - "message": "You are inviting:" + "message": "Estás invitando:" }, "screens.Setting.ProjectSettings.YourTeam.ReviewAndInvite.title": { - "message": "Review Invitation" + "message": "Revisar invitación" }, "screens.Setting.ProjectSettings.YourTeam.WaitingForInviteAccept.cancelInvite": { - "message": "Cancel Invite" + "message": "Cancelar invitación" }, "screens.Setting.ProjectSettings.YourTeam.WaitingForInviteAccept.timerMessage": { - "message": "Invite sent {seconds}s ago" + "message": "Invitación enviada hace {seconds}s" }, "screens.Setting.ProjectSettings.YourTeam.WaitingForInviteAccept.waitingMessage": { - "message": "Waiting for Device to Accept Invite" + "message": "Esperando a que el dispositivo acepte la invitación" }, "screens.Setting.ProjectSettings.YourTeam.coordinatorDescription": { - "message": "Coordinators can invite devices, edit and delete data, and manage project details." + "message": "Las personas Coordinadoras pueden invitar dispositivos, editar y eliminar datos y administrar los detalles del proyecto." }, "screens.Setting.ProjectSettings.YourTeam.coordinators": { - "message": "Coordinators" + "message": "Persona Coordinadora" }, "screens.Setting.ProjectSettings.YourTeam.dateAdded": { - "message": "Date Added" + "message": "Fecha agregada" }, "screens.Setting.ProjectSettings.YourTeam.deviceName": { - "message": "Device Name" + "message": "Nombre del dispositivo" }, "screens.Setting.ProjectSettings.YourTeam.inviteDevice": { - "message": "Invite Device" + "message": "Invitar dispositivo" }, "screens.Setting.ProjectSettings.YourTeam.participantDescription": { - "message": "Participants can take and share observations. They cannot manage users or project details." + "message": "Como Participante, este dispositivo puede crear, editar, sincronizar y compartir observaciones. No puede administrar personas usuarias ni detalles del proyecto." }, "screens.Setting.ProjectSettings.YourTeam.participants": { - "message": "Participants" + "message": "Participantes" }, "screens.Setting.ProjectSettings.YourTeam.title": { - "message": "Your Team" + "message": "Tu equipo" + }, + "screens.Settings.Config.created": { + "message": "Creado el {date} a las {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Importar categorías" + }, + "screens.Settings.Config.name": { + "message": "Nombre de categorías:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuración" + }, + "screens.Settings.Config.projectName": { + "message": "Nombre del Proyecto:" }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { - "message": "Create a Project" + "message": "Crear un Proyecto" }, "screens.Settings.CreateOrJoinProject.JoinExistingProject.goBack": { - "message": "Go back" + "message": "Regresar" }, "screens.Settings.CreateOrJoinProject.JoinExistingProject.howTo": { - "message": "How to Join a Project" + "message": "Cómo unirse a un Proyecto" }, "screens.Settings.CreateOrJoinProject.JoinExistingProject.instructions": { - "message": "To join a project find a Coordinator of the project you wish to join. Tell them your device name and the Coordinator will send you an invite." + "message": "Para unirte a un Proyecto encuentra una persona coordinadora del proyecto al que deseas unirte. Dile el nombre de tu dispositivo y la persona Coordinadora te enviará una invitación." }, "screens.Settings.CreateOrJoinProject.ProjectCreated.goToMap": { "message": "Ir al mapa" }, "screens.Settings.CreateOrJoinProject.ProjectCreated.invitedDevice": { - "message": "Invite Device" + "message": "Invitar dispositivo" }, "screens.Settings.CreateOrJoinProject.ProjectCreated.projectCreated": { - "message": "{projectName} Created!" + "message": "{projectName} Creado!" }, "screens.Settings.CreateOrJoinProject.advancedSettings": { - "message": "Advanced Project Settings" + "message": "Ajustes avanzados del Proyecto" }, "screens.Settings.CreateOrJoinProject.alreadyOnProject": { - "message": "You are already on a project. To create a new Project you must uninstall and reininstall CoMapeo." + "message": "Ya estás en un Proyecto. Para crear un nuevo proyecto debes desinstalar y volver a instalar CoMapeo." }, "screens.Settings.CreateOrJoinProject.createProject": { - "message": "Create a Project" + "message": "Crear un Proyecto" }, "screens.Settings.CreateOrJoinProject.createProjectButton": { - "message": "Create Project" + "message": "Crear proyecto" }, "screens.Settings.CreateOrJoinProject.enterName": { - "message": "Enter a name for the Project" + "message": "Introduce un nombre para el Proyecto" }, "screens.Settings.CreateOrJoinProject.importConfig": { - "message": "Import Config" + "message": "Importar categorías" + }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "El nombre del archivo debe terminar en .comapeocat" }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Unirse a un Proyecto de CoMapeo existente" }, "screens.Settings.CreateOrJoinProject.joinProject": { - "message": "Join a Project" + "message": "Unirse a un proyecto" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "Un proyecto es un contenedor seguro para tu información. Sólo los dispositivos que invites pueden ingresar y compartir información contigo. Crea o Únete a un proyecto para compartir información con otros dispositivos. Esta acción eliminará las observaciones que has recopilado hasta ahora. Considera compartir observaciones importantes {icon} a tu correo electrónico antes de continuar." }, "screens.Settings.CreateOrJoinProject.startProject": { - "message": "Start a CoMapeo Project" + "message": "Iniciar un nuevo Proyecto en CoMapeo" }, "screens.Settings.CreateOrJoinProject.title": { - "message": "Create or Join" + "message": "Crear o Unirse" }, "screens.Settings.CreateOrJoinProject.whatIsAProject": { - "message": "What is a Project" + "message": "Qué es un Proyecto" }, "screens.Settings.YourTeam.InviteDeclined": { - "message": "Invitation Declined" + "message": "Invitación rechazada" }, "screens.Settings.YourTeam.close": { - "message": "Close" + "message": "Cerrar" }, "screens.Settings.YourTeam.deviceHasJoined": { - "message": "Device Has Joined {projectName}" + "message": "Este dispositivo ha unido a {projectName}" }, "screens.Settings.YourTeam.inviteDeclinedDes": { - "message": "This device has declined your invitation. They have not joined the project." + "message": "Este dispositivo ha rechazado tu invitación. No se ha unido al Proyecto." }, "screens.Settings.YourTeam.unableToCancel": { - "message": "Unable to Cancel Invitation" + "message": "No se puede Cancelar la invitación" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "Acerca de Mapeo" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "Acerca de CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "Versión y número de compilación" }, "screens.Settings.appSettings": { - "message": "App Settings" + "message": "Ajustes de la aplicación" }, "screens.Settings.appSettingsDesc": { "description": "list of avaialable app settings", - "message": "Language, Security, Coordinates" + "message": "Idioma, seguridad, coordenadas" + }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Configuración del Proyecto" }, "screens.Settings.createOrJoin": { - "message": "Create or Join Project" + "message": "Crear o unirse a un proyecto" }, "screens.Settings.createOrJoinDesc": { - "message": "Create a new project or join existing one" + "message": "Crear un nuevo proyecto o unirse a uno existente" }, "screens.Settings.projectSettings": { - "message": "Project Settings" + "message": "Configuración del proyecto" }, "screens.Settings.projectSettingsDesc": { "description": "list of avaialable project settings", - "message": "Categories, Config, Team" + "message": "Categorías, configuración, equipo" }, "screens.Settings.title": { "description": "Title of settings screen", "message": "Ajustes" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Política de privacidad" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { - "message": "Create or Join Project" + "message": "Crear o unirse a un proyecto" + }, + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "Esta acción eliminará las observaciones que has recopilado hasta ahora. Considera compartir observaciones importantes {icon} a tu correo electrónico antes de continuar." }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "Podrás compartir información con dispositivos que forman parte del mismo Proyecto." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Crear o unirse a un Proyecto para recopilar datos con un equipo" }, "screens.Sync.HeaderTitle.noWiFi": { - "message": "No WiFi" + "message": "Sin WiFi" }, "screens.Sync.NoWifiDisplay.buttonText": { - "message": "Open Settings" + "message": "Abrir ajustes" }, "screens.Sync.NoWifiDisplay.description": { - "message": "Open your phone settings and connect to a WiFi network to synchronize" + "message": "Abre los ajustes de tu teléfono y conéctate a una red WiFi para sincronizar" }, "screens.Sync.NoWifiDisplay.title": { - "message": "No WiFi" + "message": "Sin WiFi" + }, + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "¡Estás al día!" + }, + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "Todos los datos están sincronizados" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Devices available" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Devices found" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "No hay dispositivos disponibles para sincronizar" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Sincronizando…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Esperando…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Waiting for other devices" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Iniciar Sincronización" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Detener" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Complete! Waiting for other devices to join" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "¡Listo! Ya te actualizaste" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "You are syncing with your team" + }, + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Esperando a los dispositivos" + }, + "screens.Track.ObservationList.observations": { + "message": "Observaciones" + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "¿Eliminar trayecto?" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Trayecto" + }, + "screens.Track.tracks": { + "message": "Trayectos" + }, + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Editar Trayecto" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Trayecto" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", - "message": "Show Options" + "message": "Mostrar opciones" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Abandonar proyecto" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Desconectado" }, "sharedComponents.DeviceIconWithName.thisDevice": { - "message": "This Device!" + "message": "¡Este dispositivo!" + }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "Buscando…" + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Cambiar" }, "sharedComponents.ErrorModal.goBack": { - "message": "Go Back" + "message": "Regresar" }, "sharedComponents.ErrorModal.somethingWrong": { - "message": "Something Went Wrong" + "message": "Algo salió mal" }, "sharedComponents.ErrorModal.tryAgain": { - "message": "Try Again" + "message": "Inténtalo de nuevo" }, "sharedComponents.GpsPill.noGps": { - "message": "No GPS" + "message": "Sin GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "Buscando…" }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { - "message": "Accept Invite" + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Invitación cancelada" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { - "message": "Decline Invite" + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Cerrar" }, - "sharedComponents.ProjectInviteBottomSheet.goToMap": { - "message": "Go To Map" + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Tu invitación a {projectName} ha sido cancelada" }, - "sharedComponents.ProjectInviteBottomSheet.goToSync": { - "message": "Go To Sync" + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { + "message": "Aceptar invitación" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { + "message": "Rechazar invitación" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "Te invitaron a unirte a {projectName}" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Unirse al Proyecto {projectName}" }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" + "sharedComponents.ProjectInviteBottomSheet.goToMap": { + "message": "Ir al mapa" + }, + "sharedComponents.ProjectInviteBottomSheet.goToSync": { + "message": "Ir a Sincronización" }, "sharedComponents.ProjectInviteBottomSheet.success": { - "message": "Success" + "message": "Éxito" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "Te uniste a {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { - "message": "Coordinator" + "message": "Persona coordinadora" }, "sharedComponents.RoleWithIcon.participant": { - "message": "Participant" + "message": "Participante" }, "sharedComponents.WifiBar.noWifi": { "message": "Sin internet" diff --git a/messages/fr.json b/messages/fr.json index 13e1d26d9..23d0a1502 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -25,24 +25,12 @@ "description": "Title of dialog that shows when cancelling a new observation", "message": "Ignorer l'observation ?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { "message": "Enable" }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" - }, "Modal.GPSDisable.description": { "message": "To create a Track CoMapeo needs access to your location and GPS." }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" - }, "Modal.GPSDisable.title": { "message": "GPS Disabled" }, @@ -58,6 +46,80 @@ "Modal.GPSEnable.trackingDescription": { "message": "You’ve been recording for" }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "Version et numéro de version" + }, + "Navigation.Drawer.appSettings": { + "message": "App Settings" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Language, Security, Coordinates" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Create or Join Project" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Create a new project or join existing one" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Data & Privacy" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "You are currently mapping on your own" + }, + "Navigation.Drawer.projName": { + "message": "Project {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Project Settings" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categories, Config, Team" + }, + "Navigation.Drawer.security": { + "message": "Sécurité" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "Paramètres" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Continuer la modification" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Discard changes" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Annuler les modifications ?" + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Continuer la modification" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Discard Track?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard Track" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Your Track will not be saved. This cannot be undone." + }, "Screens.Settings.AppSettings.coordinateSystem": { "message": "Coordinate System" }, @@ -71,20 +133,51 @@ "message": "Display language for app" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "App Settings" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "Nom de l'appareil" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Sync Settings" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Project Settings" }, "Screens.Settings.ProjectSettings.yourTeam": { "message": "Your Team" }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "Annuler" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "Oui, supprimer" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "Effacer" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Share" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Continuer la modification" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Annuler les modifications ?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard changes" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { "message": "Coordinator" }, @@ -98,7 +191,7 @@ "message": "Not seeing a Device?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Make sure both devices are on the same version of CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { "message": "Make sure both devices are on the same wifi network" @@ -118,6 +211,38 @@ "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { "message": "Select a Role" }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "CoMapeo build" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "CoMapeo variant" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "CoMapeo version" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Android build number" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Android version" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Phone model" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "About CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Unknown" + }, "screens.AddPhoto.cancel": { "message": "Annuler" }, @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "Passcode" + "message": "Passcode: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "Save App Passcode" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Make sure to note your passcode in a secure location before saving." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "App Passcodes can never be recovered if lost or forgotten! Make sure to note your passcode in a secure location before saving." + "message": "App Passcodes can never be recovered if lost or forgotten!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "Please Enter Passcode" @@ -168,7 +296,7 @@ "message": "Incorrect Passcode" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "This passcode will be required to open the Mapeo App" + "message": "This passcode will be required to open the CoMapeo App" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { "message": "Confirm Passcode" @@ -183,10 +311,10 @@ "message": "Quel est le code d'accès à l'application ?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app. You can define your own 5-digit passcode by turning on the feature below." + "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**Please note that forgotten passcodes cannot be recovered!** Once this feature is enabled, if you forget or lose your passcode, you will not be able to open Mapeo and will lose access to any Mapeo data that has not been synced with other project participants." + "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "Annuler" @@ -198,7 +326,7 @@ "message": "You are currently using App Passcode. See below to stop using or change your passcode." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app." + "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "Code d'accès de l'application" @@ -212,6 +340,26 @@ "screens.AppPasscode.TurnOffPasscode.usePasscode": { "message": "Use App Passcode" }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Allow" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Go to Settings" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Not Now" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "To record audio while using the app and in the background CoMapeo needs to access your microphone. Please enable microphone permissions in your app settings." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Recording Audio with CoMapeo" + }, "screens.CameraScreen.goToSettings": { "message": "Go to Settings" }, @@ -238,12 +386,63 @@ "description": "Universal Transverse Mercator coordinate format", "message": "Universal Transverse Mercator (UTM)" }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "Anonymized information about your device, app crashes, errors and performance helps Awana Digital improve the app and fix errors." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Diagnostic Information" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Data & Privacy" + }, + "screens.DataAndPrivacy.noPII": { + "message": "This never includes any of your data or personal information." + }, + "screens.DataAndPrivacy.optOut": { + "message": "You can opt-out of sharing diagnostic information at any time." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo Respects Your Privacy & Autonomy" + }, + "screens.DataPrivacy.description": { + "message": "CoMapeo allows you and your collaborators to map offline without needing servers." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Private by default — diagnostic information is fully anonymized and you can opt-out any time." + }, + "screens.DataPrivacy.encrypted": { + "message": "All data stays fully encrypted" + }, + "screens.DataPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Easily manage and control sharing and collaboration." + }, + "screens.DataPrivacy.next": { + "message": "Suivant" + }, + "screens.DataPrivacy.stays": { + "message": "Your data stays on your devices." + }, + "screens.DataPrivacy.title": { + "message": "Data & Privacy" + }, "screens.DeviceNaming.Success.description": { "message": "You named your device" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "To find your project settings go to the main menu found on the map screen." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Go to Map" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." + }, "screens.DeviceNaming.Success.success": { "message": "Success!" }, @@ -251,7 +450,7 @@ "message": "Add Name" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." }, "screens.DeviceNaming.header": { "message": "Add a name for your device" @@ -268,23 +467,78 @@ "screens.FatalError.somethingWrong": { "message": "Something Went Wrong" }, + "screens.HowToLeaveProject.goBack": { + "message": "Go back" + }, + "screens.HowToLeaveProject.howTo": { + "message": "How to Leave Project" + }, + "screens.HowToLeaveProject.instructions": { + "message": "To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device." + }, + "screens.HowToLeaveProject.warning": { + "message": "If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!" + }, "screens.IntroToCoMapeo.collaborate": { - "message": "Collaborate on mapping and monitoring projects" + "message": "Collaborate with others" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Designed with and for Indigenous peoples & frontline communities" }, "screens.IntroToCoMapeo.getStarted": { "message": "Get Started" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "is now" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Map anywhere and everywhere" + }, + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Map your world, together" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.ownData": { + "message": "Own and control your data" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", - "message": "Language" + "message": "Langage" + }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "You are already on a project" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Go Back" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Leave Current Project" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "To join a new project you must leave your current one." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "You are on {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "Annuler" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Please check the box to confirm" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "I understand I will be deleting all data from Project {projectName} from my device." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "I understand I will be deleting all data from my device." + }, + "screens.LeaveProject.leaveProj": { + "message": "Leave Project" + }, + "screens.LeaveProject.leavingProject": { + "message": "Leaving Project {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "This will remove all Project {projectName}'s data from your device." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "This will remove all of the data from your device." }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", @@ -437,11 +691,50 @@ "screens.ManualGpsScreen.zoneNumber": { "message": "Zone Number" }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "Annuler" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sync Everything" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "Sync Everything?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Your device will sync all content at full size, including photos, audio, and videos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "You are about to sync everything. This may increase the disk space used on your device." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Note: This will use more storage." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "You will no longer sync Audio or Video." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Sync Previews (Photos Only)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Sync Previews" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "Sync Previews?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Photos will sync at a reduced smaller size. Device will not sync audio or video." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Your device will keep all existing data but new observations will sync in a smaller, preview size." + }, + "screens.MediaSyncSettings.title": { + "message": "Sync Settings" + }, "screens.ObscurePasscode.description": { - "message": "Obscure Passcode is a security feature that allows you to open Mapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of Mapeo which allows you to create demonstration observations that are not saved to the Mapeo database." + "message": "Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database." }, "screens.ObscurePasscode.instructions": { - "message": "Enter the code above to hide your data in Mapeo" + "message": "Enter the code above to hide your data in CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Obscure Passcode" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "What is Obscure Passcode?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "Modifier" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "Observation" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "Effacer" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "Observation" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Share" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "Annuler" }, + "screens.Observation.comapeoAlert": { + "message": "CoMapeo Alert" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "Oui, supprimer" @@ -483,26 +776,83 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "Supprimer l'observation?" }, + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", + "message": "Observation" + }, + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Sharing image" + }, + "screens.Observation.shareMessageFooter": { + "message": "Sent from CoMapeo" + }, + "screens.Observation.shareMessageTitle": { + "message": "CoMapeo Alert" + }, + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Sharing text" + }, "screens.Observation.title": { "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", "message": "Observation" }, + "screens.ObservationCreate.changePreset": { + "message": "Change" + }, + "screens.ObservationCreate.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Que se passe-t-il ici?" + }, + "screens.ObservationCreate.keepWaiting": { + "description": "Button to cancel save and continue waiting for GPS", + "message": "Continuer d'attendre" + }, + "screens.ObservationCreate.manualEntry": { + "description": "Button to manually enter GPS coordinates", + "message": "Coordonnées manuelles" + }, + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "New Observation" + }, + "screens.ObservationCreate.noGpsDesc": { + "description": "Description in dialog when trying to save with no GPS coords", + "message": "Cette observation n'a pas d'emplacement. Vous pouvez continuer d'attendre un signal GPS, sauvegarder l'observation sans localisation, ou entrer les coordonnées manuellement" + }, + "screens.ObservationCreate.noGpsTitle": { + "description": "Title of dialog when trying to save with no GPS coords", + "message": "Aucun signal GPS" + }, + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "Observation" + }, + "screens.ObservationCreate.saveAnyway": { + "description": "Button to save regardless of GPS state", + "message": "Enregistrer" + }, + "screens.ObservationCreate.weakGpsDesc": { + "description": "Description in dialog when trying to save with low GPS accuracy.", + "message": "La précision du GPS est faible. Vous pouvez continuer à attendre une meilleure précision, enregistrer l'observation avec une faible précision, ou entrer les coordonnées manuellement" + }, + "screens.ObservationCreate.weakGpsTitle": { + "description": "Title of dialog when trying to save with low GPS accuracy.", + "message": "Signal GPS faible" + }, "screens.ObservationDetails.done": { "description": "Button text when all questions are complete", "message": "Done" }, "screens.ObservationDetails.nextQuestion": { "description": "Button text to navigate to next question", - "message": "Next" + "message": "Suivant" }, "screens.ObservationDetails.title": { "description": "Title of observation details screen showing question number and total", "message": "Question {current} of {total}" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "Ajouter…" - }, "screens.ObservationEdit.ObservationEditView.audioButton": { "description": "Button label for adding audio", "message": "Audio" @@ -519,52 +869,30 @@ "description": "Button label for adding photo", "message": "Photo" }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "Recherche…" - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { - "description": "Button to cancel save and continue waiting for GPS", - "message": "Continuer d'attendre" - }, - "screens.ObservationEdit.SaveButton.manualEntry": { - "description": "Button to manually enter GPS coordinates", - "message": "Coordonnées manuelles" - }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { - "description": "Description in dialog when trying to save with no GPS coords", - "message": "Cette observation n'a pas d'emplacement. Vous pouvez continuer d'attendre un signal GPS, sauvegarder l'observation sans localisation, ou entrer les coordonnées manuellement" - }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { - "description": "Title of dialog when trying to save with no GPS coords", - "message": "Aucun signal GPS" + "screens.ObservationEdit.changePreset": { + "message": "Change" }, - "screens.ObservationEdit.SaveButton.saveAnyway": { - "description": "Button to save regardless of GPS state", - "message": "Enregistrer" - }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { - "description": "Description in dialog when trying to save with low GPS accuracy.", - "message": "La précision du GPS est faible. Vous pouvez continuer à attendre une meilleure précision, enregistrer l'observation avec une faible précision, ou entrer les coordonnées manuellement" + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Que se passe-t-il ici?" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { - "description": "Title of dialog when trying to save with low GPS accuracy.", - "message": "Signal GPS faible" + "screens.ObservationEdit.navTitle": { + "description": "screen title for new observation screen", + "message": "Edit Observation" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", - "message": "Modifier l'observation" + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "Observation" }, - "screens.ObservationEdit.newTitle": { - "description": "screen title for new observation screen", - "message": "Nouvelle observation" + "screens.ObservationList.TrackListItem.Track": { + "message": "Track" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "Observations" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "You are currently mapping on your own." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,32 +907,150 @@ "message": "Ajouter des observations" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Create or Join a Project" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "Erreur lors du chargement des observations. Essayez de quitter et de redémarrer Mapeo." + "message": "Error loading observations. Try quitting and restarting CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "Chargement… cela peut prendre un certain temps après la synchronisation avec un nouvel appareil" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, - "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { - "description": "Placeholder for description/notes field", - "message": "What is happening here?" + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Privacy Policy" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Current Permissions" }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Share Diagnostic Information" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "Annuler" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Delete Image" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "Delete this photo?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Delete Photo" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "About Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo is developed by Awana Digital, a 501c3 non-profit organization registered in the United States. Awana Digital works in solidarity with frontline communities to use technology to defend their rights and fight climate change." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "App Errors" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Information about internal errors that result in the app not functioning as expected" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "App Info" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "The version and locale (language) of CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "App Usage" + }, + "screens.PrivacyPolicy.control": { + "message": "You're in control" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "You can opt out of sending any information to Awana Digital. You choose where your data is stored and who it is shared with. You may choose to share anonymized, summarized data about how you use CoMapeo with Awana Digital. We will always be transparent about what information you choose to share for the purposed of improving the app, and this information will never include photos, videos, audio, text, or precise locations that you have entered into CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Crash Data" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Information about what caused the app to close unexpectedly" + }, + "screens.PrivacyPolicy.dataCollection": { + "message": "CoMapeo Data Collection" + }, + "screens.PrivacyPolicy.deviceInfo": { + "message": "Device Info" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Such as model and manufacturer of your device; device operating system; screen size; device locale (language); device memory." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnostics" + }, + "screens.PrivacyPolicy.noPII": { + "message": "No personally identifiable information" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "Using CoMapeo does not require a user account. Awana Digital does not collect your name, email address or any other personal details. No permanent user identifier or device identifier is ever shared with Awana Digital, and we take extra measures to ensure that no information you share can be used to track you: identifiers are randomized and rotated (changed) every month and we do not store IP addresses." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "What is not collected?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "We do not collect any personal data or anything that can be used to identify or track a user or device. Device identifiers used to aggregate information are random, anonymous, and changed every month. Diagnostic information does not include data about how you use the app, and it never includes any of the data you have collected with the app. We do not collect your precise or coarse location, only the country where you are using CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Open Source and the \"Official\" Version" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo is an open-source application. This means that anyone can view the code that makes the app work and can verify the privacy declarations in this document. It also means that anyone can adapt the app to their own needs and release an alternative version. This document refers to data collected by the official releases of CoMapeo, digitally signed by Awana Digital, available from the Google Play Store or the Awana Digital website. Unofficial releases of CoMapeo obtained from other channels are outside our control and may share additional information with other organizations." + }, + "screens.PrivacyPolicy.overview": { + "message": "This document describes what information (\"data\") is sent from CoMapeo to the application developer, Awana Digital, and how that information is used." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Performance Data" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Such as launch time, energy usage, app freezes, and responsiveness" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "CoMapeo Data Privacy" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Private by default" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "The data you collect and create with CoMapeo (locations, photos, video, audio, text) is only stored on your device by default, and is not stored or sent anywhere else. When you share data with collaborators by joining a project with them, it is sent encrypted, directly to your collaborators' device. This means that the data is not sent via Awana Digital, nor anyone else, on its way to your collaborator. Awana Digital never sees nor has access to any of the data you collect with CoMapeo unless you explicitly send it to us." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Third-party access to data" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "A \"third-party\" is an organization other than Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "User Counts" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "The number of users per country and per project. Aggregated and anonymized" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "What is collected?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "By default, anonymized diagnostic information about your device, app crashes, errors and performance is shared with Awana Digital. You can opt-out of sharing this information at any time. This diagnostic information is completely anonymized and it never contains any of your data (the data you have collected with CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "Why is this data collected?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Crash data and app errors together with the device and app info provide Awana Digital with the information we need to fix errors and bugs in the app. The performance data helps us improve the responsiveness of the app and identify errors. User counts, including total users, users per country, and users per project, help justify ongoing investment in the development of CoMapeo." + }, + "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Que se passe-t-il ici?" }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", @@ -614,15 +1060,6 @@ "description": "Category title for new track screen", "message": "Track" }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "Pour utiliser, activez le code d'accès à l'application" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "Protégez votre appareil contre la saisie" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Obscure Passcode" - }, "screens.Security.passDesriptionPassNotSet": { "message": "Code d'accès non défini" }, @@ -642,7 +1079,7 @@ "message": "Your Device Name" }, "screens.Setting.ProjectSettings.DeviceName.DisplayScreen.title": { - "message": "Device Name" + "message": "Nom de l'appareil" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.deviceNameLabel": { "message": "Edit Device Name" @@ -654,10 +1091,10 @@ "message": "Discard Changes" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "Annuler les modifications ?" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { - "message": "Device Name" + "message": "Nom de l'appareil" }, "screens.Setting.ProjectSettings.YourTeam.InviteAccepted.addAnotherDevice": { "message": "Add Another Device" @@ -702,7 +1139,7 @@ "message": "Date Added" }, "screens.Setting.ProjectSettings.YourTeam.deviceName": { - "message": "Device Name" + "message": "Nom de l'appareil" }, "screens.Setting.ProjectSettings.YourTeam.inviteDevice": { "message": "Invite Device" @@ -716,6 +1153,21 @@ "screens.Setting.ProjectSettings.YourTeam.title": { "message": "Your Team" }, + "screens.Settings.Config.created": { + "message": "Created {date} at {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Import Config" + }, + "screens.Settings.Config.name": { + "message": "Config Name:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuration" + }, + "screens.Settings.Config.projectName": { + "message": "Project Name:" + }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { "message": "Create a Project" }, @@ -755,14 +1207,17 @@ "screens.Settings.CreateOrJoinProject.importConfig": { "message": "Import Config" }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "File name should end with .comapeocat" + }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Join an existing CoMapeo Project" }, "screens.Settings.CreateOrJoinProject.joinProject": { "message": "Join a Project" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.Settings.CreateOrJoinProject.startProject": { "message": "Start a CoMapeo Project" @@ -788,12 +1243,12 @@ "screens.Settings.YourTeam.unableToCancel": { "message": "Unable to Cancel Invitation" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "À propos de Mapeo" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "Version et numéro de version" }, "screens.Settings.appSettings": { @@ -803,6 +1258,10 @@ "description": "list of avaialable app settings", "message": "Language, Security, Coordinates" }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Project Configuration" + }, "screens.Settings.createOrJoin": { "message": "Create or Join Project" }, @@ -820,11 +1279,20 @@ "description": "Title of settings screen", "message": "Paramètres" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { "message": "Create or Join Project" }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "You will be able to share data with devices that are part of the same project." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Create or join a project to collect data with a team" }, "screens.Sync.HeaderTitle.noWiFi": { "message": "No WiFi" @@ -838,49 +1306,93 @@ "screens.Sync.NoWifiDisplay.title": { "message": "No WiFi" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "You're all caught up!" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "All data synced" + }, + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Devices available" + }, + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Devices found" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "No devices available to sync" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Syncing…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Waiting…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Waiting for other devices" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Start Sync" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Stop" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Complete! Waiting for other devices to join" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "Complete! You're up to date" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "You are syncing with your team" + }, + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Waiting for devices" + }, + "screens.Track.ObservationList.observations": { + "message": "Observations" + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "Delete track?" + }, + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Track" + }, + "screens.Track.tracks": { + "message": "Tracks" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Edit Track" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Track" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", "message": "Show Options" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Leave Project" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Disconnected" }, "sharedComponents.DeviceIconWithName.thisDevice": { "message": "This Device!" }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "Recherche…" + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Change" + }, "sharedComponents.ErrorModal.goBack": { "message": "Go Back" }, @@ -894,31 +1406,40 @@ "message": "No GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "Recherche…" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Invite Canceled" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Close" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Your invitation to {projectName} has been canceled." }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { "message": "Accept Invite" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { "message": "Decline Invite" }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "You've been invited to join {projectName}" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Join Project {projectName}" + }, "sharedComponents.ProjectInviteBottomSheet.goToMap": { - "message": "Go To Map" + "message": "Aller à la carte" }, "sharedComponents.ProjectInviteBottomSheet.goToSync": { "message": "Go To Sync" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" - }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" - }, "sharedComponents.ProjectInviteBottomSheet.success": { "message": "Success" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "You have joined {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { "message": "Coordinator" diff --git a/messages/id.json b/messages/id.json index 7cb2c21b2..c970b316f 100644 --- a/messages/id.json +++ b/messages/id.json @@ -25,24 +25,12 @@ "description": "Title of dialog that shows when cancelling a new observation", "message": "Hapus pengamatan?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { "message": "Enable" }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" - }, "Modal.GPSDisable.description": { "message": "To create a Track CoMapeo needs access to your location and GPS." }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" - }, "Modal.GPSDisable.title": { "message": "GPS Disabled" }, @@ -58,6 +46,80 @@ "Modal.GPSEnable.trackingDescription": { "message": "You’ve been recording for" }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "Versi dan nomor pembuatan" + }, + "Navigation.Drawer.appSettings": { + "message": "App Settings" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Language, Security, Coordinates" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Create or Join Project" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Create a new project or join existing one" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Data & Privacy" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "You are currently mapping on your own" + }, + "Navigation.Drawer.projName": { + "message": "Project {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Project Settings" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categories, Config, Team" + }, + "Navigation.Drawer.security": { + "message": "Security" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "Pengaturan" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Lanjutkan menyunting" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Discard changes" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Batalkan perubahan?" + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Lanjutkan menyunting" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Discard Track?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard Track" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Your Track will not be saved. This cannot be undone." + }, "Screens.Settings.AppSettings.coordinateSystem": { "message": "Coordinate System" }, @@ -71,20 +133,51 @@ "message": "Display language for app" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "App Settings" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "Nama Perangkat" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Sync Settings" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Project Settings" }, "Screens.Settings.ProjectSettings.yourTeam": { "message": "Your Team" }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "Batal" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "Ya, hapus" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "Hapus" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Share" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Lanjutkan menyunting" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Batalkan perubahan?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard changes" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { "message": "Coordinator" }, @@ -98,7 +191,7 @@ "message": "Not seeing a Device?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Make sure both devices are on the same version of CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { "message": "Make sure both devices are on the same wifi network" @@ -118,6 +211,38 @@ "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { "message": "Select a Role" }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "CoMapeo build" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "CoMapeo variant" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "CoMapeo version" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Android build number" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Android version" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Phone model" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "About CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Unknown" + }, "screens.AddPhoto.cancel": { "message": "Batal" }, @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "Passcode" + "message": "Passcode: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "Save App Passcode" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Make sure to note your passcode in a secure location before saving." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "App Passcodes can never be recovered if lost or forgotten! Make sure to note your passcode in a secure location before saving." + "message": "App Passcodes can never be recovered if lost or forgotten!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "Please Enter Passcode" @@ -168,7 +296,7 @@ "message": "Incorrect Passcode" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "This passcode will be required to open the Mapeo App" + "message": "This passcode will be required to open the CoMapeo App" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { "message": "Confirm Passcode" @@ -183,10 +311,10 @@ "message": "What is App Passcode?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app. You can define your own 5-digit passcode by turning on the feature below." + "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**Please note that forgotten passcodes cannot be recovered!** Once this feature is enabled, if you forget or lose your passcode, you will not be able to open Mapeo and will lose access to any Mapeo data that has not been synced with other project participants." + "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "Batal" @@ -198,7 +326,7 @@ "message": "You are currently using App Passcode. See below to stop using or change your passcode." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app." + "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "App Passcode" @@ -212,6 +340,26 @@ "screens.AppPasscode.TurnOffPasscode.usePasscode": { "message": "Use App Passcode" }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Allow" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Go to Settings" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Not Now" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "To record audio while using the app and in the background CoMapeo needs to access your microphone. Please enable microphone permissions in your app settings." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Recording Audio with CoMapeo" + }, "screens.CameraScreen.goToSettings": { "message": "Go to Settings" }, @@ -238,12 +386,63 @@ "description": "Universal Transverse Mercator coordinate format", "message": "Universal Transverse Mercator (UTM)" }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "Anonymized information about your device, app crashes, errors and performance helps Awana Digital improve the app and fix errors." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Diagnostic Information" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Data & Privacy" + }, + "screens.DataAndPrivacy.noPII": { + "message": "This never includes any of your data or personal information." + }, + "screens.DataAndPrivacy.optOut": { + "message": "You can opt-out of sharing diagnostic information at any time." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo Respects Your Privacy & Autonomy" + }, + "screens.DataPrivacy.description": { + "message": "CoMapeo allows you and your collaborators to map offline without needing servers." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Private by default — diagnostic information is fully anonymized and you can opt-out any time." + }, + "screens.DataPrivacy.encrypted": { + "message": "All data stays fully encrypted" + }, + "screens.DataPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Easily manage and control sharing and collaboration." + }, + "screens.DataPrivacy.next": { + "message": "Lanjut" + }, + "screens.DataPrivacy.stays": { + "message": "Your data stays on your devices." + }, + "screens.DataPrivacy.title": { + "message": "Data & Privacy" + }, "screens.DeviceNaming.Success.description": { "message": "You named your device" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "To find your project settings go to the main menu found on the map screen." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Go to Map" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." + }, "screens.DeviceNaming.Success.success": { "message": "Success!" }, @@ -251,7 +450,7 @@ "message": "Add Name" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." }, "screens.DeviceNaming.header": { "message": "Add a name for your device" @@ -268,23 +467,78 @@ "screens.FatalError.somethingWrong": { "message": "Something Went Wrong" }, + "screens.HowToLeaveProject.goBack": { + "message": "Go back" + }, + "screens.HowToLeaveProject.howTo": { + "message": "How to Leave Project" + }, + "screens.HowToLeaveProject.instructions": { + "message": "To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device." + }, + "screens.HowToLeaveProject.warning": { + "message": "If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!" + }, "screens.IntroToCoMapeo.collaborate": { - "message": "Collaborate on mapping and monitoring projects" + "message": "Collaborate with others" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Designed with and for Indigenous peoples & frontline communities" }, "screens.IntroToCoMapeo.getStarted": { "message": "Get Started" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "is now" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Map anywhere and everywhere" + }, + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Map your world, together" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.ownData": { + "message": "Own and control your data" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", - "message": "Language" + "message": "Bahasa" + }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "You are already on a project" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Go Back" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Leave Current Project" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "To join a new project you must leave your current one." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "You are on {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "Batal" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Please check the box to confirm" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "I understand I will be deleting all data from Project {projectName} from my device." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "I understand I will be deleting all data from my device." + }, + "screens.LeaveProject.leaveProj": { + "message": "Leave Project" + }, + "screens.LeaveProject.leavingProject": { + "message": "Leaving Project {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "This will remove all Project {projectName}'s data from your device." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "This will remove all of the data from your device." }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", @@ -437,11 +691,50 @@ "screens.ManualGpsScreen.zoneNumber": { "message": "Zone Number" }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "Batal" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sync Everything" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "Sync Everything?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Your device will sync all content at full size, including photos, audio, and videos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "You are about to sync everything. This may increase the disk space used on your device." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Note: This will use more storage." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "You will no longer sync Audio or Video." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Sync Previews (Photos Only)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Sync Previews" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "Sync Previews?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Photos will sync at a reduced smaller size. Device will not sync audio or video." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Your device will keep all existing data but new observations will sync in a smaller, preview size." + }, + "screens.MediaSyncSettings.title": { + "message": "Sync Settings" + }, "screens.ObscurePasscode.description": { - "message": "Obscure Passcode is a security feature that allows you to open Mapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of Mapeo which allows you to create demonstration observations that are not saved to the Mapeo database." + "message": "Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database." }, "screens.ObscurePasscode.instructions": { - "message": "Enter the code above to hide your data in Mapeo" + "message": "Enter the code above to hide your data in CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Obscure Passcode" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "What is Obscure Passcode?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "Ubah" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "Pengamatan" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "Hapus" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "Pengamatan" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Share" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "Batal" }, + "screens.Observation.comapeoAlert": { + "message": "CoMapeo Alert" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "Ya, hapus" @@ -483,26 +776,83 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "Menghapus pengamatan?" }, + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", + "message": "Pengamatan" + }, + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Sharing image" + }, + "screens.Observation.shareMessageFooter": { + "message": "Sent from CoMapeo" + }, + "screens.Observation.shareMessageTitle": { + "message": "CoMapeo Alert" + }, + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Sharing text" + }, "screens.Observation.title": { "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", "message": "Pengamatan" }, + "screens.ObservationCreate.changePreset": { + "message": "Change" + }, + "screens.ObservationCreate.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Apa yang terjadi di sini?" + }, + "screens.ObservationCreate.keepWaiting": { + "description": "Button to cancel save and continue waiting for GPS", + "message": "Terus menunggu" + }, + "screens.ObservationCreate.manualEntry": { + "description": "Button to manually enter GPS coordinates", + "message": "Koordinat Manual" + }, + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "New Observation" + }, + "screens.ObservationCreate.noGpsDesc": { + "description": "Description in dialog when trying to save with no GPS coords", + "message": "Pengamatan ini tidak memiliki lokasi. Anda dapat terus menunggu sinyal GPS, menyimpan pengamatan tanpa lokasi, atau memasukkan koordinat secara manual" + }, + "screens.ObservationCreate.noGpsTitle": { + "description": "Title of dialog when trying to save with no GPS coords", + "message": "Tidak ada sinyal GPS" + }, + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "Pengamatan" + }, + "screens.ObservationCreate.saveAnyway": { + "description": "Button to save regardless of GPS state", + "message": "Simpan" + }, + "screens.ObservationCreate.weakGpsDesc": { + "description": "Description in dialog when trying to save with low GPS accuracy.", + "message": "Akurasi GPS rendah. Anda dapat terus menunggu akurasi yang lebih baik, menyimpan pengamatan dengan akurasi rendah, atau memasukkan koordinat secara manual" + }, + "screens.ObservationCreate.weakGpsTitle": { + "description": "Title of dialog when trying to save with low GPS accuracy.", + "message": "Sinyal GPS lemah" + }, "screens.ObservationDetails.done": { "description": "Button text when all questions are complete", "message": "Done" }, "screens.ObservationDetails.nextQuestion": { "description": "Button text to navigate to next question", - "message": "Next" + "message": "Lanjut" }, "screens.ObservationDetails.title": { "description": "Title of observation details screen showing question number and total", "message": "Question {current} of {total}" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "Tambah…" - }, "screens.ObservationEdit.ObservationEditView.audioButton": { "description": "Button label for adding audio", "message": "Audio" @@ -519,52 +869,30 @@ "description": "Button label for adding photo", "message": "Photo" }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "Mencari…" - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { - "description": "Button to cancel save and continue waiting for GPS", - "message": "Terus menunggu" - }, - "screens.ObservationEdit.SaveButton.manualEntry": { - "description": "Button to manually enter GPS coordinates", - "message": "Koordinat Manual" - }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { - "description": "Description in dialog when trying to save with no GPS coords", - "message": "Pengamatan ini tidak memiliki lokasi. Anda dapat terus menunggu sinyal GPS, menyimpan pengamatan tanpa lokasi, atau memasukkan koordinat secara manual" - }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { - "description": "Title of dialog when trying to save with no GPS coords", - "message": "Tidak ada sinyal GPS" + "screens.ObservationEdit.changePreset": { + "message": "Change" }, - "screens.ObservationEdit.SaveButton.saveAnyway": { - "description": "Button to save regardless of GPS state", - "message": "Simpan" - }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { - "description": "Description in dialog when trying to save with low GPS accuracy.", - "message": "Akurasi GPS rendah. Anda dapat terus menunggu akurasi yang lebih baik, menyimpan pengamatan dengan akurasi rendah, atau memasukkan koordinat secara manual" + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Apa yang terjadi di sini?" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { - "description": "Title of dialog when trying to save with low GPS accuracy.", - "message": "Sinyal GPS lemah" + "screens.ObservationEdit.navTitle": { + "description": "screen title for new observation screen", + "message": "Edit Observation" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", - "message": "Sunting Pengamatan" + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "Pengamatan" }, - "screens.ObservationEdit.newTitle": { - "description": "screen title for new observation screen", - "message": "Pengamatan Baru" + "screens.ObservationList.TrackListItem.Track": { + "message": "Track" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "Pengamatan" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "You are currently mapping on your own." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,32 +907,150 @@ "message": "Tambahkan Pengamatan" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Create or Join a Project" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "Terjadi kesalahan saat memuat pengamatan. Coba keluar dan mulai ulang Mapeo." + "message": "Error loading observations. Try quitting and restarting CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "Memuat… ini bisa memakan waktu cukup lama setelah menyinkronkan perangkat baru" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, - "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { - "description": "Placeholder for description/notes field", - "message": "What is happening here?" + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Privacy Policy" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Current Permissions" }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Share Diagnostic Information" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "Batal" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Delete Image" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "Delete this photo?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Delete Photo" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "About Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo is developed by Awana Digital, a 501c3 non-profit organization registered in the United States. Awana Digital works in solidarity with frontline communities to use technology to defend their rights and fight climate change." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "App Errors" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Information about internal errors that result in the app not functioning as expected" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "App Info" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "The version and locale (language) of CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "App Usage" + }, + "screens.PrivacyPolicy.control": { + "message": "You're in control" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "You can opt out of sending any information to Awana Digital. You choose where your data is stored and who it is shared with. You may choose to share anonymized, summarized data about how you use CoMapeo with Awana Digital. We will always be transparent about what information you choose to share for the purposed of improving the app, and this information will never include photos, videos, audio, text, or precise locations that you have entered into CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Crash Data" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Information about what caused the app to close unexpectedly" + }, + "screens.PrivacyPolicy.dataCollection": { + "message": "CoMapeo Data Collection" + }, + "screens.PrivacyPolicy.deviceInfo": { + "message": "Device Info" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Such as model and manufacturer of your device; device operating system; screen size; device locale (language); device memory." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnostics" + }, + "screens.PrivacyPolicy.noPII": { + "message": "No personally identifiable information" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "Using CoMapeo does not require a user account. Awana Digital does not collect your name, email address or any other personal details. No permanent user identifier or device identifier is ever shared with Awana Digital, and we take extra measures to ensure that no information you share can be used to track you: identifiers are randomized and rotated (changed) every month and we do not store IP addresses." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "What is not collected?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "We do not collect any personal data or anything that can be used to identify or track a user or device. Device identifiers used to aggregate information are random, anonymous, and changed every month. Diagnostic information does not include data about how you use the app, and it never includes any of the data you have collected with the app. We do not collect your precise or coarse location, only the country where you are using CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Open Source and the \"Official\" Version" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo is an open-source application. This means that anyone can view the code that makes the app work and can verify the privacy declarations in this document. It also means that anyone can adapt the app to their own needs and release an alternative version. This document refers to data collected by the official releases of CoMapeo, digitally signed by Awana Digital, available from the Google Play Store or the Awana Digital website. Unofficial releases of CoMapeo obtained from other channels are outside our control and may share additional information with other organizations." + }, + "screens.PrivacyPolicy.overview": { + "message": "This document describes what information (\"data\") is sent from CoMapeo to the application developer, Awana Digital, and how that information is used." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Performance Data" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Such as launch time, energy usage, app freezes, and responsiveness" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "CoMapeo Data Privacy" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Private by default" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "The data you collect and create with CoMapeo (locations, photos, video, audio, text) is only stored on your device by default, and is not stored or sent anywhere else. When you share data with collaborators by joining a project with them, it is sent encrypted, directly to your collaborators' device. This means that the data is not sent via Awana Digital, nor anyone else, on its way to your collaborator. Awana Digital never sees nor has access to any of the data you collect with CoMapeo unless you explicitly send it to us." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Third-party access to data" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "A \"third-party\" is an organization other than Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "User Counts" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "The number of users per country and per project. Aggregated and anonymized" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "What is collected?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "By default, anonymized diagnostic information about your device, app crashes, errors and performance is shared with Awana Digital. You can opt-out of sharing this information at any time. This diagnostic information is completely anonymized and it never contains any of your data (the data you have collected with CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "Why is this data collected?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Crash data and app errors together with the device and app info provide Awana Digital with the information we need to fix errors and bugs in the app. The performance data helps us improve the responsiveness of the app and identify errors. User counts, including total users, users per country, and users per project, help justify ongoing investment in the development of CoMapeo." + }, + "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Apa yang terjadi di sini?" }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", @@ -614,15 +1060,6 @@ "description": "Category title for new track screen", "message": "Track" }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "To use, enable App Passcode" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "Protect your device against seizure" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Obscure Passcode" - }, "screens.Security.passDesriptionPassNotSet": { "message": "Passcode not set" }, @@ -642,7 +1079,7 @@ "message": "Your Device Name" }, "screens.Setting.ProjectSettings.DeviceName.DisplayScreen.title": { - "message": "Device Name" + "message": "Nama Perangkat" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.deviceNameLabel": { "message": "Edit Device Name" @@ -654,10 +1091,10 @@ "message": "Discard Changes" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "Batalkan perubahan?" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { - "message": "Device Name" + "message": "Nama Perangkat" }, "screens.Setting.ProjectSettings.YourTeam.InviteAccepted.addAnotherDevice": { "message": "Add Another Device" @@ -702,7 +1139,7 @@ "message": "Date Added" }, "screens.Setting.ProjectSettings.YourTeam.deviceName": { - "message": "Device Name" + "message": "Nama Perangkat" }, "screens.Setting.ProjectSettings.YourTeam.inviteDevice": { "message": "Invite Device" @@ -716,6 +1153,21 @@ "screens.Setting.ProjectSettings.YourTeam.title": { "message": "Your Team" }, + "screens.Settings.Config.created": { + "message": "Created {date} at {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Import Config" + }, + "screens.Settings.Config.name": { + "message": "Config Name:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuration" + }, + "screens.Settings.Config.projectName": { + "message": "Project Name:" + }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { "message": "Create a Project" }, @@ -755,14 +1207,17 @@ "screens.Settings.CreateOrJoinProject.importConfig": { "message": "Import Config" }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "File name should end with .comapeocat" + }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Join an existing CoMapeo Project" }, "screens.Settings.CreateOrJoinProject.joinProject": { "message": "Join a Project" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.Settings.CreateOrJoinProject.startProject": { "message": "Start a CoMapeo Project" @@ -788,12 +1243,12 @@ "screens.Settings.YourTeam.unableToCancel": { "message": "Unable to Cancel Invitation" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "Tentang Mapeo" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "Versi dan nomor pembuatan" }, "screens.Settings.appSettings": { @@ -803,6 +1258,10 @@ "description": "list of avaialable app settings", "message": "Language, Security, Coordinates" }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Project Configuration" + }, "screens.Settings.createOrJoin": { "message": "Create or Join Project" }, @@ -820,11 +1279,20 @@ "description": "Title of settings screen", "message": "Pengaturan" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { "message": "Create or Join Project" }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "You will be able to share data with devices that are part of the same project." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Create or join a project to collect data with a team" }, "screens.Sync.HeaderTitle.noWiFi": { "message": "No WiFi" @@ -838,49 +1306,93 @@ "screens.Sync.NoWifiDisplay.title": { "message": "No WiFi" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "You're all caught up!" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "All data synced" + }, + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Devices available" + }, + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Devices found" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "No devices available to sync" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Syncing…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Waiting…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Waiting for other devices" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Start Sync" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Stop" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Complete! Waiting for other devices to join" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "Complete! You're up to date" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "You are syncing with your team" + }, + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Waiting for devices" + }, + "screens.Track.ObservationList.observations": { + "message": "Pengamatan" + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "Delete track?" + }, + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Track" + }, + "screens.Track.tracks": { + "message": "Tracks" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Edit Track" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Track" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", "message": "Show Options" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Leave Project" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Disconnected" }, "sharedComponents.DeviceIconWithName.thisDevice": { "message": "This Device!" }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "Mencari…" + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Change" + }, "sharedComponents.ErrorModal.goBack": { "message": "Go Back" }, @@ -894,31 +1406,40 @@ "message": "No GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "Mencari…" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Invite Canceled" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Close" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Your invitation to {projectName} has been canceled." }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { "message": "Accept Invite" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { "message": "Decline Invite" }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "You've been invited to join {projectName}" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Join Project {projectName}" + }, "sharedComponents.ProjectInviteBottomSheet.goToMap": { - "message": "Go To Map" + "message": "Pergi ke Peta" }, "sharedComponents.ProjectInviteBottomSheet.goToSync": { "message": "Go To Sync" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" - }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" - }, "sharedComponents.ProjectInviteBottomSheet.success": { "message": "Success" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "You have joined {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { "message": "Coordinator" diff --git a/messages/ja.json b/messages/ja.json index a5c71f8ea..0688f1847 100644 --- a/messages/ja.json +++ b/messages/ja.json @@ -25,24 +25,12 @@ "description": "Title of dialog that shows when cancelling a new observation", "message": "Discard observation?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { "message": "Enable" }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" - }, "Modal.GPSDisable.description": { "message": "To create a Track CoMapeo needs access to your location and GPS." }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" - }, "Modal.GPSDisable.title": { "message": "GPS Disabled" }, @@ -58,6 +46,80 @@ "Modal.GPSEnable.trackingDescription": { "message": "You’ve been recording for" }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "バージョンとビルド番号" + }, + "Navigation.Drawer.appSettings": { + "message": "App Settings" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Language, Security, Coordinates" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Create or Join Project" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Create a new project or join existing one" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Data & Privacy" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "You are currently mapping on your own" + }, + "Navigation.Drawer.projName": { + "message": "Project {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Project Settings" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categories, Config, Team" + }, + "Navigation.Drawer.security": { + "message": "Security" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "設定" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "編集を続ける" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Discard changes" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "変更を破棄してよろしいですか?" + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "編集を続ける" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Discard Track?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard Track" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Your Track will not be saved. This cannot be undone." + }, "Screens.Settings.AppSettings.coordinateSystem": { "message": "Coordinate System" }, @@ -71,20 +133,51 @@ "message": "Display language for app" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "App Settings" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "Device Name" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Sync Settings" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Project Settings" }, "Screens.Settings.ProjectSettings.yourTeam": { "message": "Your Team" }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "取消" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "はい、削除します" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "削除" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Share" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "編集を続ける" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "変更を破棄してよろしいですか?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard changes" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { "message": "Coordinator" }, @@ -98,7 +191,7 @@ "message": "Not seeing a Device?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Make sure both devices are on the same version of CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { "message": "Make sure both devices are on the same wifi network" @@ -118,6 +211,38 @@ "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { "message": "Select a Role" }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "CoMapeo build" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "CoMapeo variant" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "CoMapeo version" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Android build number" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Android version" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Phone model" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "About CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Unknown" + }, "screens.AddPhoto.cancel": { "message": "取消" }, @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "Passcode" + "message": "Passcode: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "Save App Passcode" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Make sure to note your passcode in a secure location before saving." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "App Passcodes can never be recovered if lost or forgotten! Make sure to note your passcode in a secure location before saving." + "message": "App Passcodes can never be recovered if lost or forgotten!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "Please Enter Passcode" @@ -168,7 +296,7 @@ "message": "Incorrect Passcode" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "This passcode will be required to open the Mapeo App" + "message": "This passcode will be required to open the CoMapeo App" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { "message": "Confirm Passcode" @@ -183,10 +311,10 @@ "message": "What is App Passcode?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app. You can define your own 5-digit passcode by turning on the feature below." + "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**Please note that forgotten passcodes cannot be recovered!** Once this feature is enabled, if you forget or lose your passcode, you will not be able to open Mapeo and will lose access to any Mapeo data that has not been synced with other project participants." + "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "取消" @@ -198,7 +326,7 @@ "message": "You are currently using App Passcode. See below to stop using or change your passcode." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app." + "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "App Passcode" @@ -212,6 +340,26 @@ "screens.AppPasscode.TurnOffPasscode.usePasscode": { "message": "Use App Passcode" }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Allow" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Go to Settings" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Not Now" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "To record audio while using the app and in the background CoMapeo needs to access your microphone. Please enable microphone permissions in your app settings." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Recording Audio with CoMapeo" + }, "screens.CameraScreen.goToSettings": { "message": "Go to Settings" }, @@ -238,12 +386,63 @@ "description": "Universal Transverse Mercator coordinate format", "message": "Universal Transverse Mercator (UTM)" }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "Anonymized information about your device, app crashes, errors and performance helps Awana Digital improve the app and fix errors." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Diagnostic Information" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Data & Privacy" + }, + "screens.DataAndPrivacy.noPII": { + "message": "This never includes any of your data or personal information." + }, + "screens.DataAndPrivacy.optOut": { + "message": "You can opt-out of sharing diagnostic information at any time." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo Respects Your Privacy & Autonomy" + }, + "screens.DataPrivacy.description": { + "message": "CoMapeo allows you and your collaborators to map offline without needing servers." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Private by default — diagnostic information is fully anonymized and you can opt-out any time." + }, + "screens.DataPrivacy.encrypted": { + "message": "All data stays fully encrypted" + }, + "screens.DataPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Easily manage and control sharing and collaboration." + }, + "screens.DataPrivacy.next": { + "message": "Next" + }, + "screens.DataPrivacy.stays": { + "message": "Your data stays on your devices." + }, + "screens.DataPrivacy.title": { + "message": "Data & Privacy" + }, "screens.DeviceNaming.Success.description": { "message": "You named your device" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "To find your project settings go to the main menu found on the map screen." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Go to Map" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." + }, "screens.DeviceNaming.Success.success": { "message": "Success!" }, @@ -251,7 +450,7 @@ "message": "Add Name" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." }, "screens.DeviceNaming.header": { "message": "Add a name for your device" @@ -268,23 +467,78 @@ "screens.FatalError.somethingWrong": { "message": "Something Went Wrong" }, + "screens.HowToLeaveProject.goBack": { + "message": "Go back" + }, + "screens.HowToLeaveProject.howTo": { + "message": "How to Leave Project" + }, + "screens.HowToLeaveProject.instructions": { + "message": "To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device." + }, + "screens.HowToLeaveProject.warning": { + "message": "If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!" + }, "screens.IntroToCoMapeo.collaborate": { - "message": "Collaborate on mapping and monitoring projects" + "message": "Collaborate with others" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Designed with and for Indigenous peoples & frontline communities" }, "screens.IntroToCoMapeo.getStarted": { "message": "Get Started" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "is now" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Map anywhere and everywhere" + }, + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Map your world, together" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.ownData": { + "message": "Own and control your data" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", - "message": "Language" + "message": "言語" + }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "You are already on a project" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Go Back" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Leave Current Project" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "To join a new project you must leave your current one." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "You are on {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "取消" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Please check the box to confirm" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "I understand I will be deleting all data from Project {projectName} from my device." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "I understand I will be deleting all data from my device." + }, + "screens.LeaveProject.leaveProj": { + "message": "Leave Project" + }, + "screens.LeaveProject.leavingProject": { + "message": "Leaving Project {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "This will remove all Project {projectName}'s data from your device." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "This will remove all of the data from your device." }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", @@ -437,11 +691,50 @@ "screens.ManualGpsScreen.zoneNumber": { "message": "Zone Number" }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "取消" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sync Everything" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "Sync Everything?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Your device will sync all content at full size, including photos, audio, and videos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "You are about to sync everything. This may increase the disk space used on your device." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Note: This will use more storage." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "You will no longer sync Audio or Video." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Sync Previews (Photos Only)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Sync Previews" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "Sync Previews?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Photos will sync at a reduced smaller size. Device will not sync audio or video." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Your device will keep all existing data but new observations will sync in a smaller, preview size." + }, + "screens.MediaSyncSettings.title": { + "message": "Sync Settings" + }, "screens.ObscurePasscode.description": { - "message": "Obscure Passcode is a security feature that allows you to open Mapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of Mapeo which allows you to create demonstration observations that are not saved to the Mapeo database." + "message": "Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database." }, "screens.ObscurePasscode.instructions": { - "message": "Enter the code above to hide your data in Mapeo" + "message": "Enter the code above to hide your data in CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Obscure Passcode" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "What is Obscure Passcode?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "Change" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "Observation" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "削除" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "Observation" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Share" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "取消" }, + "screens.Observation.comapeoAlert": { + "message": "CoMapeo Alert" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "はい、削除します" @@ -483,10 +776,71 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "Delete observation?" }, + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", + "message": "Observation" + }, + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Sharing image" + }, + "screens.Observation.shareMessageFooter": { + "message": "Sent from CoMapeo" + }, + "screens.Observation.shareMessageTitle": { + "message": "CoMapeo Alert" + }, + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Sharing text" + }, "screens.Observation.title": { "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", "message": "Observation" }, + "screens.ObservationCreate.changePreset": { + "message": "Change" + }, + "screens.ObservationCreate.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "What is happening here?" + }, + "screens.ObservationCreate.keepWaiting": { + "description": "Button to cancel save and continue waiting for GPS", + "message": "Continue waiting" + }, + "screens.ObservationCreate.manualEntry": { + "description": "Button to manually enter GPS coordinates", + "message": "Manual Coords" + }, + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "New Observation" + }, + "screens.ObservationCreate.noGpsDesc": { + "description": "Description in dialog when trying to save with no GPS coords", + "message": "This observation does not have a location. You can continue waiting for a GPS signal, save the observation without a location, or enter coordinates manually" + }, + "screens.ObservationCreate.noGpsTitle": { + "description": "Title of dialog when trying to save with no GPS coords", + "message": "GPS信号がありません" + }, + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "Observation" + }, + "screens.ObservationCreate.saveAnyway": { + "description": "Button to save regardless of GPS state", + "message": "保存" + }, + "screens.ObservationCreate.weakGpsDesc": { + "description": "Description in dialog when trying to save with low GPS accuracy.", + "message": "GPSの精度が低くなっています。精度改善を待つか、低い精度で観察を保存するか、手動で座標を入力することができます。" + }, + "screens.ObservationCreate.weakGpsTitle": { + "description": "Title of dialog when trying to save with low GPS accuracy.", + "message": "GPS信号が弱い" + }, "screens.ObservationDetails.done": { "description": "Button text when all questions are complete", "message": "Done" @@ -499,10 +853,6 @@ "description": "Title of observation details screen showing question number and total", "message": "Question {current} of {total}" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "Add…" - }, "screens.ObservationEdit.ObservationEditView.audioButton": { "description": "Button label for adding audio", "message": "Audio" @@ -519,52 +869,30 @@ "description": "Button label for adding photo", "message": "Photo" }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "検索中…" - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { - "description": "Button to cancel save and continue waiting for GPS", - "message": "Continue waiting" - }, - "screens.ObservationEdit.SaveButton.manualEntry": { - "description": "Button to manually enter GPS coordinates", - "message": "Manual Coords" - }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { - "description": "Description in dialog when trying to save with no GPS coords", - "message": "This observation does not have a location. You can continue waiting for a GPS signal, save the observation without a location, or enter coordinates manually" - }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { - "description": "Title of dialog when trying to save with no GPS coords", - "message": "GPS信号がありません" - }, - "screens.ObservationEdit.SaveButton.saveAnyway": { - "description": "Button to save regardless of GPS state", - "message": "保存" - }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { - "description": "Description in dialog when trying to save with low GPS accuracy.", - "message": "GPSの精度が低くなっています。精度改善を待つか、低い精度で観察を保存するか、手動で座標を入力することができます。" + "screens.ObservationEdit.changePreset": { + "message": "Change" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { - "description": "Title of dialog when trying to save with low GPS accuracy.", - "message": "GPS信号が弱い" + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "What is happening here?" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", + "screens.ObservationEdit.navTitle": { + "description": "screen title for new observation screen", "message": "Edit Observation" }, - "screens.ObservationEdit.newTitle": { - "description": "screen title for new observation screen", - "message": "New Observation" + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "Observation" + }, + "screens.ObservationList.TrackListItem.Track": { + "message": "Track" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "Observations" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "You are currently mapping on your own." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,33 +907,151 @@ "message": "Add Observations" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Create or Join a Project" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "Error loading observations. Try quitting and restarting Mapeo." + "message": "Error loading observations. Try quitting and restarting CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "Loading… this can take a while after synchronizing with a new device" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Current Permissions" + }, + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Share Diagnostic Information" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "取消" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Delete Image" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "Delete this photo?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Delete Photo" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "About Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo is developed by Awana Digital, a 501c3 non-profit organization registered in the United States. Awana Digital works in solidarity with frontline communities to use technology to defend their rights and fight climate change." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "App Errors" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Information about internal errors that result in the app not functioning as expected" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "App Info" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "The version and locale (language) of CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "App Usage" + }, + "screens.PrivacyPolicy.control": { + "message": "You're in control" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "You can opt out of sending any information to Awana Digital. You choose where your data is stored and who it is shared with. You may choose to share anonymized, summarized data about how you use CoMapeo with Awana Digital. We will always be transparent about what information you choose to share for the purposed of improving the app, and this information will never include photos, videos, audio, text, or precise locations that you have entered into CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Crash Data" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Information about what caused the app to close unexpectedly" + }, + "screens.PrivacyPolicy.dataCollection": { + "message": "CoMapeo Data Collection" + }, + "screens.PrivacyPolicy.deviceInfo": { + "message": "Device Info" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Such as model and manufacturer of your device; device operating system; screen size; device locale (language); device memory." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnostics" + }, + "screens.PrivacyPolicy.noPII": { + "message": "No personally identifiable information" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "Using CoMapeo does not require a user account. Awana Digital does not collect your name, email address or any other personal details. No permanent user identifier or device identifier is ever shared with Awana Digital, and we take extra measures to ensure that no information you share can be used to track you: identifiers are randomized and rotated (changed) every month and we do not store IP addresses." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "What is not collected?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "We do not collect any personal data or anything that can be used to identify or track a user or device. Device identifiers used to aggregate information are random, anonymous, and changed every month. Diagnostic information does not include data about how you use the app, and it never includes any of the data you have collected with the app. We do not collect your precise or coarse location, only the country where you are using CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Open Source and the \"Official\" Version" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo is an open-source application. This means that anyone can view the code that makes the app work and can verify the privacy declarations in this document. It also means that anyone can adapt the app to their own needs and release an alternative version. This document refers to data collected by the official releases of CoMapeo, digitally signed by Awana Digital, available from the Google Play Store or the Awana Digital website. Unofficial releases of CoMapeo obtained from other channels are outside our control and may share additional information with other organizations." + }, + "screens.PrivacyPolicy.overview": { + "message": "This document describes what information (\"data\") is sent from CoMapeo to the application developer, Awana Digital, and how that information is used." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Performance Data" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Such as launch time, energy usage, app freezes, and responsiveness" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "CoMapeo Data Privacy" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Private by default" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "The data you collect and create with CoMapeo (locations, photos, video, audio, text) is only stored on your device by default, and is not stored or sent anywhere else. When you share data with collaborators by joining a project with them, it is sent encrypted, directly to your collaborators' device. This means that the data is not sent via Awana Digital, nor anyone else, on its way to your collaborator. Awana Digital never sees nor has access to any of the data you collect with CoMapeo unless you explicitly send it to us." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Third-party access to data" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "A \"third-party\" is an organization other than Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "User Counts" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "The number of users per country and per project. Aggregated and anonymized" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "What is collected?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "By default, anonymized diagnostic information about your device, app crashes, errors and performance is shared with Awana Digital. You can opt-out of sharing this information at any time. This diagnostic information is completely anonymized and it never contains any of your data (the data you have collected with CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "Why is this data collected?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Crash data and app errors together with the device and app info provide Awana Digital with the information we need to fix errors and bugs in the app. The performance data helps us improve the responsiveness of the app and identify errors. User counts, including total users, users per country, and users per project, help justify ongoing investment in the development of CoMapeo." }, "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { "description": "Placeholder for description/notes field", "message": "What is happening here?" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" - }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" - }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", "message": "New Track" @@ -614,15 +1060,6 @@ "description": "Category title for new track screen", "message": "Track" }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "To use, enable App Passcode" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "Protect your device against seizure" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Obscure Passcode" - }, "screens.Security.passDesriptionPassNotSet": { "message": "Passcode not set" }, @@ -654,7 +1091,7 @@ "message": "Discard Changes" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "変更を破棄してよろしいですか?" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { "message": "Device Name" @@ -716,6 +1153,21 @@ "screens.Setting.ProjectSettings.YourTeam.title": { "message": "Your Team" }, + "screens.Settings.Config.created": { + "message": "Created {date} at {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Import Config" + }, + "screens.Settings.Config.name": { + "message": "Config Name:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuration" + }, + "screens.Settings.Config.projectName": { + "message": "Project Name:" + }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { "message": "Create a Project" }, @@ -755,14 +1207,17 @@ "screens.Settings.CreateOrJoinProject.importConfig": { "message": "Import Config" }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "File name should end with .comapeocat" + }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Join an existing CoMapeo Project" }, "screens.Settings.CreateOrJoinProject.joinProject": { "message": "Join a Project" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.Settings.CreateOrJoinProject.startProject": { "message": "Start a CoMapeo Project" @@ -788,12 +1243,12 @@ "screens.Settings.YourTeam.unableToCancel": { "message": "Unable to Cancel Invitation" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "Mapeoについて" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "バージョンとビルド番号" }, "screens.Settings.appSettings": { @@ -803,6 +1258,10 @@ "description": "list of avaialable app settings", "message": "Language, Security, Coordinates" }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Project Configuration" + }, "screens.Settings.createOrJoin": { "message": "Create or Join Project" }, @@ -820,11 +1279,20 @@ "description": "Title of settings screen", "message": "設定" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { "message": "Create or Join Project" }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "You will be able to share data with devices that are part of the same project." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Create or join a project to collect data with a team" }, "screens.Sync.HeaderTitle.noWiFi": { "message": "No WiFi" @@ -838,49 +1306,93 @@ "screens.Sync.NoWifiDisplay.title": { "message": "No WiFi" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "You're all caught up!" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "All data synced" + }, + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Devices available" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Devices found" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "No devices available to sync" + }, + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Syncing…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Waiting…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Waiting for other devices" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Start Sync" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Stop" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Complete! Waiting for other devices to join" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "Complete! You're up to date" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "You are syncing with your team" + }, + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Waiting for devices" + }, + "screens.Track.ObservationList.observations": { + "message": "Observations" + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "Delete track?" + }, + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Track" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.Track.tracks": { + "message": "Tracks" + }, + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Edit Track" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Track" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", "message": "Show Options" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Leave Project" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Disconnected" }, "sharedComponents.DeviceIconWithName.thisDevice": { "message": "This Device!" }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "検索中…" + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Change" + }, "sharedComponents.ErrorModal.goBack": { "message": "Go Back" }, @@ -894,31 +1406,40 @@ "message": "No GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "検索中…" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Invite Canceled" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Close" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Your invitation to {projectName} has been canceled." }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { "message": "Accept Invite" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { "message": "Decline Invite" }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "You've been invited to join {projectName}" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Join Project {projectName}" + }, "sharedComponents.ProjectInviteBottomSheet.goToMap": { - "message": "Go To Map" + "message": "マップに移動" }, "sharedComponents.ProjectInviteBottomSheet.goToSync": { "message": "Go To Sync" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" - }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" - }, "sharedComponents.ProjectInviteBottomSheet.success": { "message": "Success" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "You have joined {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { "message": "Coordinator" diff --git a/messages/km.json b/messages/km.json index 671d6d496..560c260ca 100644 --- a/messages/km.json +++ b/messages/km.json @@ -25,24 +25,12 @@ "description": "Title of dialog that shows when cancelling a new observation", "message": "បោះបង់ការសង្កេត?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { "message": "Enable" }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" - }, "Modal.GPSDisable.description": { "message": "To create a Track CoMapeo needs access to your location and GPS." }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" - }, "Modal.GPSDisable.title": { "message": "GPS Disabled" }, @@ -58,6 +46,80 @@ "Modal.GPSEnable.trackingDescription": { "message": "You’ve been recording for" }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "លេខសេរ៊ីនិងកំណែរ" + }, + "Navigation.Drawer.appSettings": { + "message": "App Settings" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Language, Security, Coordinates" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Create or Join Project" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Create a new project or join existing one" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Data & Privacy" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "You are currently mapping on your own" + }, + "Navigation.Drawer.projName": { + "message": "Project {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Project Settings" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categories, Config, Team" + }, + "Navigation.Drawer.security": { + "message": "Security" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "ការកំណត់" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "បន្តកែសម្រួល" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Discard changes" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "តើ​អ្នក​ចង់​រក្សា​ទុក​មុន​ពេល​ចាកចេញទេ?" + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "បន្តកែសម្រួល" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Discard Track?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard Track" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Your Track will not be saved. This cannot be undone." + }, "Screens.Settings.AppSettings.coordinateSystem": { "message": "Coordinate System" }, @@ -71,20 +133,51 @@ "message": "Display language for app" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "App Settings" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "Device Name" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Sync Settings" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Project Settings" }, "Screens.Settings.ProjectSettings.yourTeam": { "message": "Your Team" }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "បោះបង់" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "បាទ/ចាស លុបចោល" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "លុប" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Share" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "បន្តកែសម្រួល" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "តើ​អ្នក​ចង់​រក្សា​ទុក​មុន​ពេល​ចាកចេញទេ?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard changes" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { "message": "Coordinator" }, @@ -98,7 +191,7 @@ "message": "Not seeing a Device?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Make sure both devices are on the same version of CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { "message": "Make sure both devices are on the same wifi network" @@ -118,6 +211,38 @@ "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { "message": "Select a Role" }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "CoMapeo build" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "CoMapeo variant" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "CoMapeo version" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Android build number" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Android version" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Phone model" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "About CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Unknown" + }, "screens.AddPhoto.cancel": { "message": "បោះបង់" }, @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "Passcode" + "message": "Passcode: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "Save App Passcode" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Make sure to note your passcode in a secure location before saving." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "App Passcodes can never be recovered if lost or forgotten! Make sure to note your passcode in a secure location before saving." + "message": "App Passcodes can never be recovered if lost or forgotten!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "Please Enter Passcode" @@ -168,7 +296,7 @@ "message": "Incorrect Passcode" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "This passcode will be required to open the Mapeo App" + "message": "This passcode will be required to open the CoMapeo App" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { "message": "Confirm Passcode" @@ -183,10 +311,10 @@ "message": "What is App Passcode?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app. You can define your own 5-digit passcode by turning on the feature below." + "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**Please note that forgotten passcodes cannot be recovered!** Once this feature is enabled, if you forget or lose your passcode, you will not be able to open Mapeo and will lose access to any Mapeo data that has not been synced with other project participants." + "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "បោះបង់" @@ -198,7 +326,7 @@ "message": "You are currently using App Passcode. See below to stop using or change your passcode." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app." + "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "App Passcode" @@ -212,6 +340,26 @@ "screens.AppPasscode.TurnOffPasscode.usePasscode": { "message": "Use App Passcode" }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Allow" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Go to Settings" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Not Now" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "To record audio while using the app and in the background CoMapeo needs to access your microphone. Please enable microphone permissions in your app settings." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Recording Audio with CoMapeo" + }, "screens.CameraScreen.goToSettings": { "message": "Go to Settings" }, @@ -238,12 +386,63 @@ "description": "Universal Transverse Mercator coordinate format", "message": "Universal Transverse Mercator (UTM)" }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "Anonymized information about your device, app crashes, errors and performance helps Awana Digital improve the app and fix errors." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Diagnostic Information" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Data & Privacy" + }, + "screens.DataAndPrivacy.noPII": { + "message": "This never includes any of your data or personal information." + }, + "screens.DataAndPrivacy.optOut": { + "message": "You can opt-out of sharing diagnostic information at any time." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo Respects Your Privacy & Autonomy" + }, + "screens.DataPrivacy.description": { + "message": "CoMapeo allows you and your collaborators to map offline without needing servers." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Private by default — diagnostic information is fully anonymized and you can opt-out any time." + }, + "screens.DataPrivacy.encrypted": { + "message": "All data stays fully encrypted" + }, + "screens.DataPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Easily manage and control sharing and collaboration." + }, + "screens.DataPrivacy.next": { + "message": "បន្ទាប់" + }, + "screens.DataPrivacy.stays": { + "message": "Your data stays on your devices." + }, + "screens.DataPrivacy.title": { + "message": "Data & Privacy" + }, "screens.DeviceNaming.Success.description": { "message": "You named your device" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "To find your project settings go to the main menu found on the map screen." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Go to Map" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." + }, "screens.DeviceNaming.Success.success": { "message": "Success!" }, @@ -251,7 +450,7 @@ "message": "Add Name" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." }, "screens.DeviceNaming.header": { "message": "Add a name for your device" @@ -268,23 +467,78 @@ "screens.FatalError.somethingWrong": { "message": "Something Went Wrong" }, + "screens.HowToLeaveProject.goBack": { + "message": "Go back" + }, + "screens.HowToLeaveProject.howTo": { + "message": "How to Leave Project" + }, + "screens.HowToLeaveProject.instructions": { + "message": "To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device." + }, + "screens.HowToLeaveProject.warning": { + "message": "If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!" + }, "screens.IntroToCoMapeo.collaborate": { - "message": "Collaborate on mapping and monitoring projects" + "message": "Collaborate with others" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Designed with and for Indigenous peoples & frontline communities" }, "screens.IntroToCoMapeo.getStarted": { "message": "Get Started" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "is now" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Map anywhere and everywhere" + }, + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Map your world, together" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.ownData": { + "message": "Own and control your data" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", - "message": "Language" + "message": "ភាសា" + }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "You are already on a project" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Go Back" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Leave Current Project" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "To join a new project you must leave your current one." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "You are on {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "បោះបង់" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Please check the box to confirm" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "I understand I will be deleting all data from Project {projectName} from my device." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "I understand I will be deleting all data from my device." + }, + "screens.LeaveProject.leaveProj": { + "message": "Leave Project" + }, + "screens.LeaveProject.leavingProject": { + "message": "Leaving Project {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "This will remove all Project {projectName}'s data from your device." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "This will remove all of the data from your device." }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", @@ -437,11 +691,50 @@ "screens.ManualGpsScreen.zoneNumber": { "message": "Zone Number" }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "បោះបង់" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sync Everything" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "Sync Everything?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Your device will sync all content at full size, including photos, audio, and videos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "You are about to sync everything. This may increase the disk space used on your device." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Note: This will use more storage." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "You will no longer sync Audio or Video." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Sync Previews (Photos Only)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Sync Previews" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "Sync Previews?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Photos will sync at a reduced smaller size. Device will not sync audio or video." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Your device will keep all existing data but new observations will sync in a smaller, preview size." + }, + "screens.MediaSyncSettings.title": { + "message": "Sync Settings" + }, "screens.ObscurePasscode.description": { - "message": "Obscure Passcode is a security feature that allows you to open Mapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of Mapeo which allows you to create demonstration observations that are not saved to the Mapeo database." + "message": "Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database." }, "screens.ObscurePasscode.instructions": { - "message": "Enter the code above to hide your data in Mapeo" + "message": "Enter the code above to hide your data in CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Obscure Passcode" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "What is Obscure Passcode?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "ផ្លាស់ប្តូរ" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "ការសង្កេត" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "លុប" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "ការសង្កេត" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Share" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "បោះបង់" }, + "screens.Observation.comapeoAlert": { + "message": "CoMapeo Alert" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "បាទ/ចាស លុបចោល" @@ -483,26 +776,83 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "លុបការសង្កេត?" }, + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", + "message": "ការសង្កេត" + }, + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Sharing image" + }, + "screens.Observation.shareMessageFooter": { + "message": "Sent from CoMapeo" + }, + "screens.Observation.shareMessageTitle": { + "message": "CoMapeo Alert" + }, + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Sharing text" + }, "screens.Observation.title": { "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", "message": "ការតាមដាន" }, + "screens.ObservationCreate.changePreset": { + "message": "Change" + }, + "screens.ObservationCreate.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "តើមានអ្វីកំពុងកើតឡើងនៅទីនេះ?" + }, + "screens.ObservationCreate.keepWaiting": { + "description": "Button to cancel save and continue waiting for GPS", + "message": "បន្តរង់ចាំ" + }, + "screens.ObservationCreate.manualEntry": { + "description": "Button to manually enter GPS coordinates", + "message": "បញ្ចូលលេខនិយាមកាដោយដៃ" + }, + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "New Observation" + }, + "screens.ObservationCreate.noGpsDesc": { + "description": "Description in dialog when trying to save with no GPS coords", + "message": "ការសង្កេតនេះមិនមានទីតាំងទេ។ អ្នកអាចបន្តរង់ចាំសញ្ញាGPS រក្សាទុកការសង្កេតដោយគ្មានទីតាំង ឬបញ្ចូលលេខនិយាមកាដោយដៃ" + }, + "screens.ObservationCreate.noGpsTitle": { + "description": "Title of dialog when trying to save with no GPS coords", + "message": "គ្មានសញ្ញាGPS ទេ" + }, + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "ការសង្កេត" + }, + "screens.ObservationCreate.saveAnyway": { + "description": "Button to save regardless of GPS state", + "message": "រក្សាទុក" + }, + "screens.ObservationCreate.weakGpsDesc": { + "description": "Description in dialog when trying to save with low GPS accuracy.", + "message": "សុក្រឹត្យភាពនៃប្រព័ន្ធ GPS គឺទាប។ អ្នកអាចបន្តរង់ចាំនូវសុក្រឹត្យភាពដែលប្រសើរជាងមុន រក្សាទុកការសង្កេតដោយសុក្រឹត្យភាពទាបឬបញ្ចូលលេខនិយាមកាដោយដៃ" + }, + "screens.ObservationCreate.weakGpsTitle": { + "description": "Title of dialog when trying to save with low GPS accuracy.", + "message": "សញ្ញា GPS ខ្សោយ" + }, "screens.ObservationDetails.done": { "description": "Button text when all questions are complete", "message": "Done" }, "screens.ObservationDetails.nextQuestion": { "description": "Button text to navigate to next question", - "message": "Next" + "message": "បន្ទាប់" }, "screens.ObservationDetails.title": { "description": "Title of observation details screen showing question number and total", "message": "Question {current} of {total}" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "បន្ថែម…" - }, "screens.ObservationEdit.ObservationEditView.audioButton": { "description": "Button label for adding audio", "message": "Audio" @@ -519,52 +869,30 @@ "description": "Button label for adding photo", "message": "Photo" }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "កំពុងស្វែងរក…" - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { - "description": "Button to cancel save and continue waiting for GPS", - "message": "បន្តរង់ចាំ" - }, - "screens.ObservationEdit.SaveButton.manualEntry": { - "description": "Button to manually enter GPS coordinates", - "message": "បញ្ចូលលេខនិយាមកាដោយដៃ" + "screens.ObservationEdit.changePreset": { + "message": "Change" }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { - "description": "Description in dialog when trying to save with no GPS coords", - "message": "ការសង្កេតនេះមិនមានទីតាំងទេ។ អ្នកអាចបន្តរង់ចាំសញ្ញាGPS រក្សាទុកការសង្កេតដោយគ្មានទីតាំង ឬបញ្ចូលលេខនិយាមកាដោយដៃ" - }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { - "description": "Title of dialog when trying to save with no GPS coords", - "message": "គ្មានសញ្ញាGPS ទេ" - }, - "screens.ObservationEdit.SaveButton.saveAnyway": { - "description": "Button to save regardless of GPS state", - "message": "រក្សាទុក" - }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { - "description": "Description in dialog when trying to save with low GPS accuracy.", - "message": "សុក្រឹត្យភាពនៃប្រព័ន្ធ GPS គឺទាប។ អ្នកអាចបន្តរង់ចាំនូវសុក្រឹត្យភាពដែលប្រសើរជាងមុន រក្សាទុកការសង្កេតដោយសុក្រឹត្យភាពទាបឬបញ្ចូលលេខនិយាមកាដោយដៃ" + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "តើមានអ្វីកំពុងកើតឡើងនៅទីនេះ?" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { - "description": "Title of dialog when trying to save with low GPS accuracy.", - "message": "សញ្ញា GPS ខ្សោយ" + "screens.ObservationEdit.navTitle": { + "description": "screen title for new observation screen", + "message": "Edit Observation" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", - "message": "កែសម្រួលការសង្កេត" + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "ការសង្កេត" }, - "screens.ObservationEdit.newTitle": { - "description": "screen title for new observation screen", - "message": "ការសង្កេតថ្មី" + "screens.ObservationList.TrackListItem.Track": { + "message": "Track" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "ការសង្កេត" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "You are currently mapping on your own." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,32 +907,150 @@ "message": "បន្ថែមការសង្កេត" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Create or Join a Project" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "មានបញ្ហាពេលកំពុងធ្វើការ។ សូមសាកល្បងចាកចេញសិន ហើយសឹមចាប់ផ្តើម Mapeo ជាថ្មីឡើងវិញ ។" + "message": "Error loading observations. Try quitting and restarting CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "កំពុងធ្វើការ ... វាត្រូវការពេលមួយរយៈ បន្ទាប់ពីធ្វើសមកាលកម្មជាមួយឧបករណ៍ថ្មីរួចរាល់" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, - "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { - "description": "Placeholder for description/notes field", - "message": "What is happening here?" + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Privacy Policy" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Current Permissions" }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Share Diagnostic Information" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "បោះបង់" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Delete Image" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "Delete this photo?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Delete Photo" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "About Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo is developed by Awana Digital, a 501c3 non-profit organization registered in the United States. Awana Digital works in solidarity with frontline communities to use technology to defend their rights and fight climate change." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "App Errors" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Information about internal errors that result in the app not functioning as expected" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "App Info" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "The version and locale (language) of CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "App Usage" + }, + "screens.PrivacyPolicy.control": { + "message": "You're in control" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "You can opt out of sending any information to Awana Digital. You choose where your data is stored and who it is shared with. You may choose to share anonymized, summarized data about how you use CoMapeo with Awana Digital. We will always be transparent about what information you choose to share for the purposed of improving the app, and this information will never include photos, videos, audio, text, or precise locations that you have entered into CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Crash Data" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Information about what caused the app to close unexpectedly" + }, + "screens.PrivacyPolicy.dataCollection": { + "message": "CoMapeo Data Collection" + }, + "screens.PrivacyPolicy.deviceInfo": { + "message": "Device Info" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Such as model and manufacturer of your device; device operating system; screen size; device locale (language); device memory." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnostics" + }, + "screens.PrivacyPolicy.noPII": { + "message": "No personally identifiable information" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "Using CoMapeo does not require a user account. Awana Digital does not collect your name, email address or any other personal details. No permanent user identifier or device identifier is ever shared with Awana Digital, and we take extra measures to ensure that no information you share can be used to track you: identifiers are randomized and rotated (changed) every month and we do not store IP addresses." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "What is not collected?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "We do not collect any personal data or anything that can be used to identify or track a user or device. Device identifiers used to aggregate information are random, anonymous, and changed every month. Diagnostic information does not include data about how you use the app, and it never includes any of the data you have collected with the app. We do not collect your precise or coarse location, only the country where you are using CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Open Source and the \"Official\" Version" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo is an open-source application. This means that anyone can view the code that makes the app work and can verify the privacy declarations in this document. It also means that anyone can adapt the app to their own needs and release an alternative version. This document refers to data collected by the official releases of CoMapeo, digitally signed by Awana Digital, available from the Google Play Store or the Awana Digital website. Unofficial releases of CoMapeo obtained from other channels are outside our control and may share additional information with other organizations." + }, + "screens.PrivacyPolicy.overview": { + "message": "This document describes what information (\"data\") is sent from CoMapeo to the application developer, Awana Digital, and how that information is used." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Performance Data" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Such as launch time, energy usage, app freezes, and responsiveness" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "CoMapeo Data Privacy" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Private by default" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "The data you collect and create with CoMapeo (locations, photos, video, audio, text) is only stored on your device by default, and is not stored or sent anywhere else. When you share data with collaborators by joining a project with them, it is sent encrypted, directly to your collaborators' device. This means that the data is not sent via Awana Digital, nor anyone else, on its way to your collaborator. Awana Digital never sees nor has access to any of the data you collect with CoMapeo unless you explicitly send it to us." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Third-party access to data" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "A \"third-party\" is an organization other than Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "User Counts" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "The number of users per country and per project. Aggregated and anonymized" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "What is collected?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "By default, anonymized diagnostic information about your device, app crashes, errors and performance is shared with Awana Digital. You can opt-out of sharing this information at any time. This diagnostic information is completely anonymized and it never contains any of your data (the data you have collected with CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "Why is this data collected?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Crash data and app errors together with the device and app info provide Awana Digital with the information we need to fix errors and bugs in the app. The performance data helps us improve the responsiveness of the app and identify errors. User counts, including total users, users per country, and users per project, help justify ongoing investment in the development of CoMapeo." + }, + "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "តើមានអ្វីកំពុងកើតឡើងនៅទីនេះ?" }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", @@ -614,15 +1060,6 @@ "description": "Category title for new track screen", "message": "Track" }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "To use, enable App Passcode" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "Protect your device against seizure" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Obscure Passcode" - }, "screens.Security.passDesriptionPassNotSet": { "message": "Passcode not set" }, @@ -654,7 +1091,7 @@ "message": "Discard Changes" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "តើ​អ្នក​ចង់​រក្សា​ទុក​មុន​ពេល​ចាកចេញទេ?" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { "message": "Device Name" @@ -716,6 +1153,21 @@ "screens.Setting.ProjectSettings.YourTeam.title": { "message": "Your Team" }, + "screens.Settings.Config.created": { + "message": "Created {date} at {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Import Config" + }, + "screens.Settings.Config.name": { + "message": "Config Name:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuration" + }, + "screens.Settings.Config.projectName": { + "message": "Project Name:" + }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { "message": "Create a Project" }, @@ -755,14 +1207,17 @@ "screens.Settings.CreateOrJoinProject.importConfig": { "message": "Import Config" }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "File name should end with .comapeocat" + }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Join an existing CoMapeo Project" }, "screens.Settings.CreateOrJoinProject.joinProject": { "message": "Join a Project" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.Settings.CreateOrJoinProject.startProject": { "message": "Start a CoMapeo Project" @@ -788,12 +1243,12 @@ "screens.Settings.YourTeam.unableToCancel": { "message": "Unable to Cancel Invitation" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "អំពីមែបភីអូ" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "លេខសេរ៊ីនិងកំណែរ" }, "screens.Settings.appSettings": { @@ -803,6 +1258,10 @@ "description": "list of avaialable app settings", "message": "Language, Security, Coordinates" }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Project Configuration" + }, "screens.Settings.createOrJoin": { "message": "Create or Join Project" }, @@ -820,11 +1279,20 @@ "description": "Title of settings screen", "message": "ការកំណត់" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { "message": "Create or Join Project" }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "You will be able to share data with devices that are part of the same project." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Create or join a project to collect data with a team" }, "screens.Sync.HeaderTitle.noWiFi": { "message": "No WiFi" @@ -838,49 +1306,93 @@ "screens.Sync.NoWifiDisplay.title": { "message": "No WiFi" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "You're all caught up!" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "All data synced" + }, + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Devices available" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Devices found" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "No devices available to sync" + }, + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Syncing…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Waiting…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Waiting for other devices" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Start Sync" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Stop" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Complete! Waiting for other devices to join" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "Complete! You're up to date" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "You are syncing with your team" + }, + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Waiting for devices" + }, + "screens.Track.ObservationList.observations": { + "message": "ការសង្កេត" + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "Delete track?" + }, + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Track" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.Track.tracks": { + "message": "Tracks" + }, + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Edit Track" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Track" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", "message": "Show Options" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Leave Project" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Disconnected" }, "sharedComponents.DeviceIconWithName.thisDevice": { "message": "This Device!" }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "កំពុងស្វែងរក…" + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Change" + }, "sharedComponents.ErrorModal.goBack": { "message": "Go Back" }, @@ -894,31 +1406,40 @@ "message": "No GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "កំពុងស្វែងរក…" }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Invite Canceled" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Close" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Your invitation to {projectName} has been canceled." + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { "message": "Accept Invite" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { "message": "Decline Invite" }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "You've been invited to join {projectName}" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Join Project {projectName}" + }, "sharedComponents.ProjectInviteBottomSheet.goToMap": { - "message": "Go To Map" + "message": "ចូលទៅផែនទី" }, "sharedComponents.ProjectInviteBottomSheet.goToSync": { "message": "Go To Sync" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" - }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" - }, "sharedComponents.ProjectInviteBottomSheet.success": { "message": "Success" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "You have joined {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { "message": "Coordinator" diff --git a/messages/mn.json b/messages/mn.json index aa55384c1..70a0fb247 100644 --- a/messages/mn.json +++ b/messages/mn.json @@ -25,24 +25,12 @@ "description": "Title of dialog that shows when cancelling a new observation", "message": "Сануулгаас татгалзах уу?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { "message": "Enable" }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" - }, "Modal.GPSDisable.description": { "message": "To create a Track CoMapeo needs access to your location and GPS." }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" - }, "Modal.GPSDisable.title": { "message": "GPS Disabled" }, @@ -58,6 +46,80 @@ "Modal.GPSEnable.trackingDescription": { "message": "You’ve been recording for" }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "Хувилбар ба барилгын дугаар" + }, + "Navigation.Drawer.appSettings": { + "message": "App Settings" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Language, Security, Coordinates" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Create or Join Project" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Create a new project or join existing one" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Data & Privacy" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "You are currently mapping on your own" + }, + "Navigation.Drawer.projName": { + "message": "Project {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Project Settings" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categories, Config, Team" + }, + "Navigation.Drawer.security": { + "message": "Аюулгүй байдал" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "Тохиргоо" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Үргэлжлүүлэн засварлах" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Discard changes" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Өөрчлөлтийг цуцлах уу? " + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Үргэлжлүүлэн засварлах" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Discard Track?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard Track" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Your Track will not be saved. This cannot be undone." + }, "Screens.Settings.AppSettings.coordinateSystem": { "message": "Coordinate System" }, @@ -71,20 +133,51 @@ "message": "Display language for app" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "App Settings" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "Төхөөрөмжний нэр" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Sync Settings" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Project Settings" }, "Screens.Settings.ProjectSettings.yourTeam": { "message": "Your Team" }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "Цуцлах" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "Тийм, устгах" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "Устгах" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Share" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Үргэлжлүүлэн засварлах" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Өөрчлөлтийг цуцлах уу? " + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard changes" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { "message": "Coordinator" }, @@ -98,7 +191,7 @@ "message": "Not seeing a Device?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Make sure both devices are on the same version of CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { "message": "Make sure both devices are on the same wifi network" @@ -118,6 +211,38 @@ "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { "message": "Select a Role" }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "CoMapeo build" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "CoMapeo variant" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "CoMapeo version" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Android build number" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Android version" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Phone model" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "About CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Unknown" + }, "screens.AddPhoto.cancel": { "message": "Цуцлах" }, @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "Нууц үг" + "message": "Passcode: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "Аппликэйшний нууц үгийг хадгалах" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Make sure to note your passcode in a secure location before saving." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "Аппликэйшний нууц үгийг алдсан эсвэл мартсан тохиолдолд хэзээ ч сэргээх боломжгүй! Хадгалахаасаа өмнө нууц үгээ аюулгүй газар тэмдэглэнэ үү." + "message": "App Passcodes can never be recovered if lost or forgotten!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "Нууц үгийг оруулна уу" @@ -168,7 +296,7 @@ "message": "Нууц үг буруу" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "Mapeo програмыг нээхэд энэ нууц үг шаардлагатай болно" + "message": "This passcode will be required to open the CoMapeo App" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { "message": "Confirm Passcode" @@ -183,10 +311,10 @@ "message": "Аппликэйшний нууц үг гэж юу вэ?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "Аппликэйшний нууц үг нь Mapeo програмыг нээхийн тулд нууц үг оруулах шаардлагатай тул хамгаалалтын нэмэлт давхарга нэмэх боломжийг танд олгоно. Та доорх функцийг идэвхжүүлснээр өөрийн 5 оронтой нууц үгийг тодорхойлж болно." + "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**Мартагдсан нууц үгийг сэргээх боломжгүй гэдгийг анхаарна уу!** Энэ функцийг идэвхжүүлсний дараа, хэрэв та нууц үгээ мартсан эсвэл алдсан тохиолдолд Mapeo-г нээх боломжгүй бөгөөд бусад төсөлд оролцогчидтой синк хийгээгүй Mapeo өгөгдөлд хандах эрхээ алдах болно. " + "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "Цуцлах" @@ -198,7 +326,7 @@ "message": "Та одоогоор Аппликэйшний нууц үгийг ашиглаж байна. Нууц үгээ ашиглахаа зогсоох эсвэл өөрчлөхийн тулд доороос үзнэ үү." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "Аппликэйшний нууц үг нь Mapeo програмыг нээхийн тулд нууц үг оруулах шаардлагатай тул аюулгүй байдлын нэмэлт давхаргыг нэмдэг." + "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "Аппликэшний нууц үг" @@ -212,6 +340,26 @@ "screens.AppPasscode.TurnOffPasscode.usePasscode": { "message": "Аппликэйшний нууц үгийг ашиглах" }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Allow" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Go to Settings" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Not Now" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "To record audio while using the app and in the background CoMapeo needs to access your microphone. Please enable microphone permissions in your app settings." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Recording Audio with CoMapeo" + }, "screens.CameraScreen.goToSettings": { "message": "Go to Settings" }, @@ -238,12 +386,63 @@ "description": "Universal Transverse Mercator coordinate format", "message": "Universal Transverse Mercator (UTM)" }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "Anonymized information about your device, app crashes, errors and performance helps Awana Digital improve the app and fix errors." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Diagnostic Information" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Data & Privacy" + }, + "screens.DataAndPrivacy.noPII": { + "message": "This never includes any of your data or personal information." + }, + "screens.DataAndPrivacy.optOut": { + "message": "You can opt-out of sharing diagnostic information at any time." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo Respects Your Privacy & Autonomy" + }, + "screens.DataPrivacy.description": { + "message": "CoMapeo allows you and your collaborators to map offline without needing servers." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Private by default — diagnostic information is fully anonymized and you can opt-out any time." + }, + "screens.DataPrivacy.encrypted": { + "message": "All data stays fully encrypted" + }, + "screens.DataPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Easily manage and control sharing and collaboration." + }, + "screens.DataPrivacy.next": { + "message": "Дараагийнх" + }, + "screens.DataPrivacy.stays": { + "message": "Your data stays on your devices." + }, + "screens.DataPrivacy.title": { + "message": "Data & Privacy" + }, "screens.DeviceNaming.Success.description": { "message": "You named your device" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "To find your project settings go to the main menu found on the map screen." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Go to Map" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." + }, "screens.DeviceNaming.Success.success": { "message": "Success!" }, @@ -251,7 +450,7 @@ "message": "Add Name" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." }, "screens.DeviceNaming.header": { "message": "Add a name for your device" @@ -268,23 +467,78 @@ "screens.FatalError.somethingWrong": { "message": "Something Went Wrong" }, + "screens.HowToLeaveProject.goBack": { + "message": "Go back" + }, + "screens.HowToLeaveProject.howTo": { + "message": "How to Leave Project" + }, + "screens.HowToLeaveProject.instructions": { + "message": "To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device." + }, + "screens.HowToLeaveProject.warning": { + "message": "If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!" + }, "screens.IntroToCoMapeo.collaborate": { - "message": "Collaborate on mapping and monitoring projects" + "message": "Collaborate with others" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Designed with and for Indigenous peoples & frontline communities" }, "screens.IntroToCoMapeo.getStarted": { "message": "Get Started" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "is now" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Map anywhere and everywhere" + }, + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Map your world, together" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.ownData": { + "message": "Own and control your data" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", - "message": "Language" + "message": "Хэл" + }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "You are already on a project" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Go Back" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Leave Current Project" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "To join a new project you must leave your current one." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "You are on {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "Цуцлах" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Please check the box to confirm" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "I understand I will be deleting all data from Project {projectName} from my device." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "I understand I will be deleting all data from my device." + }, + "screens.LeaveProject.leaveProj": { + "message": "Leave Project" + }, + "screens.LeaveProject.leavingProject": { + "message": "Leaving Project {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "This will remove all Project {projectName}'s data from your device." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "This will remove all of the data from your device." }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", @@ -437,11 +691,50 @@ "screens.ManualGpsScreen.zoneNumber": { "message": "Zone Number" }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "Цуцлах" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sync Everything" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "Sync Everything?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Your device will sync all content at full size, including photos, audio, and videos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "You are about to sync everything. This may increase the disk space used on your device." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Note: This will use more storage." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "You will no longer sync Audio or Video." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Sync Previews (Photos Only)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Sync Previews" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "Sync Previews?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Photos will sync at a reduced smaller size. Device will not sync audio or video." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Your device will keep all existing data but new observations will sync in a smaller, preview size." + }, + "screens.MediaSyncSettings.title": { + "message": "Sync Settings" + }, "screens.ObscurePasscode.description": { - "message": "Бүрхэг нууц үг нь Mapeo-г төөрөгдүүлэх горимд нээх боломжийг олгодог хамгаалалтын функц бөгөөд таны бүх өгөгдлийг нуудаг. Танилцуулгын дэлгэцэн дээр тодорхойгүй нууц үгийг оруулснаар Mapeo-ийн хоосон хувилбар гарч ирэх бөгөөд энэ нь танд Mapeo мэдээллийн санд хадгалагдаагүй үзүүлэх ажиглалт үүсгэх боломжийг олгоно." + "message": "Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database." }, "screens.ObscurePasscode.instructions": { - "message": "Mapeo дээрх өгөгдлөө нуухын тулд дээрх кодыг оруулна уу" + "message": "Enter the code above to hide your data in CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Тодорхой бус нууц үг" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "Тодорхой бус нууц үг юу вэ?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "Өөрчлөх" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "Сануулга" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "Устгах" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "Сануулга" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Share" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "Цуцлах" }, + "screens.Observation.comapeoAlert": { + "message": "CoMapeo Alert" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "Тийм, устгах" @@ -483,26 +776,83 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "Сануулгыг устгах уу?" }, + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", + "message": "Сануулга" + }, + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Sharing image" + }, + "screens.Observation.shareMessageFooter": { + "message": "Sent from CoMapeo" + }, + "screens.Observation.shareMessageTitle": { + "message": "CoMapeo Alert" + }, + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Sharing text" + }, "screens.Observation.title": { "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", "message": "Сануулга" }, + "screens.ObservationCreate.changePreset": { + "message": "Change" + }, + "screens.ObservationCreate.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Энд юу болоод байгаа юм бэ?" + }, + "screens.ObservationCreate.keepWaiting": { + "description": "Button to cancel save and continue waiting for GPS", + "message": "Үргэлжлүүлэн хүлээж байна" + }, + "screens.ObservationCreate.manualEntry": { + "description": "Button to manually enter GPS coordinates", + "message": "Гар ажиллагаатай солбицолууд" + }, + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "New Observation" + }, + "screens.ObservationCreate.noGpsDesc": { + "description": "Description in dialog when trying to save with no GPS coords", + "message": "Энэ сануулга нь байршилгүй. Та GPS дохиог үргэлжлүүлэн хүлээх, сануулгыг байршилгүйгээр хадгалах эсвэл солбицолуудыг гараар оруулах боломжтой" + }, + "screens.ObservationCreate.noGpsTitle": { + "description": "Title of dialog when trying to save with no GPS coords", + "message": "GPS-ийн дохио байхгүй" + }, + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "Сануулга" + }, + "screens.ObservationCreate.saveAnyway": { + "description": "Button to save regardless of GPS state", + "message": "Хадгалах" + }, + "screens.ObservationCreate.weakGpsDesc": { + "description": "Description in dialog when trying to save with low GPS accuracy.", + "message": "GPS-ийн нарийвчлал бага байна. Та илүү нарийвчлалтай байхыг үргэлжлүүлэн хүлээх, ажиглалтыг бага нарийвчлалтайгаар хадгалах эсвэл солбицолыг гараар оруулах боломжтой." + }, + "screens.ObservationCreate.weakGpsTitle": { + "description": "Title of dialog when trying to save with low GPS accuracy.", + "message": "GPS-ийн дохио сул байна" + }, "screens.ObservationDetails.done": { "description": "Button text when all questions are complete", "message": "Done" }, "screens.ObservationDetails.nextQuestion": { "description": "Button text to navigate to next question", - "message": "Next" + "message": "Дараагийнх" }, "screens.ObservationDetails.title": { "description": "Title of observation details screen showing question number and total", "message": "Question {current} of {total}" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "Нэмэх…" - }, "screens.ObservationEdit.ObservationEditView.audioButton": { "description": "Button label for adding audio", "message": "Audio" @@ -519,52 +869,30 @@ "description": "Button label for adding photo", "message": "Photo" }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "Хайлт хийж байна..." - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { - "description": "Button to cancel save and continue waiting for GPS", - "message": "Үргэлжлүүлэн хүлээж байна" - }, - "screens.ObservationEdit.SaveButton.manualEntry": { - "description": "Button to manually enter GPS coordinates", - "message": "Гар ажиллагаатай солбицолууд" - }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { - "description": "Description in dialog when trying to save with no GPS coords", - "message": "Энэ сануулга нь байршилгүй. Та GPS дохиог үргэлжлүүлэн хүлээх, сануулгыг байршилгүйгээр хадгалах эсвэл солбицолуудыг гараар оруулах боломжтой" - }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { - "description": "Title of dialog when trying to save with no GPS coords", - "message": "GPS-ийн дохио байхгүй" + "screens.ObservationEdit.changePreset": { + "message": "Change" }, - "screens.ObservationEdit.SaveButton.saveAnyway": { - "description": "Button to save regardless of GPS state", - "message": "Хадгалах" - }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { - "description": "Description in dialog when trying to save with low GPS accuracy.", - "message": "GPS-ийн нарийвчлал бага байна. Та илүү нарийвчлалтай байхыг үргэлжлүүлэн хүлээх, ажиглалтыг бага нарийвчлалтайгаар хадгалах эсвэл солбицолыг гараар оруулах боломжтой." + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Энд юу болоод байгаа юм бэ?" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { - "description": "Title of dialog when trying to save with low GPS accuracy.", - "message": "GPS-ийн дохио сул байна" + "screens.ObservationEdit.navTitle": { + "description": "screen title for new observation screen", + "message": "Edit Observation" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", - "message": "Сануулга засах" + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "Сануулга" }, - "screens.ObservationEdit.newTitle": { - "description": "screen title for new observation screen", - "message": "Шинэ сануулга" + "screens.ObservationList.TrackListItem.Track": { + "message": "Track" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "Сануулгууд" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "You are currently mapping on your own." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,32 +907,150 @@ "message": "Сануулгууд нэмэх" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Create or Join a Project" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "Сануулгыг ачаалахад алдаа гарлаа. Mapeo-г орхиж, дахин эхлүүлээд үзээрэй." + "message": "Error loading observations. Try quitting and restarting CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "Ачаалж байна... шинэ төхөөрөмжтэй зэрэгцүүлэлт хийсний дараа хэсэг хугацаа шаардагдах болно" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, - "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { - "description": "Placeholder for description/notes field", - "message": "What is happening here?" + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Privacy Policy" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Current Permissions" }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Share Diagnostic Information" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "Цуцлах" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Delete Image" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "Delete this photo?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Delete Photo" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "About Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo is developed by Awana Digital, a 501c3 non-profit organization registered in the United States. Awana Digital works in solidarity with frontline communities to use technology to defend their rights and fight climate change." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "App Errors" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Information about internal errors that result in the app not functioning as expected" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "App Info" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "The version and locale (language) of CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "App Usage" + }, + "screens.PrivacyPolicy.control": { + "message": "You're in control" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "You can opt out of sending any information to Awana Digital. You choose where your data is stored and who it is shared with. You may choose to share anonymized, summarized data about how you use CoMapeo with Awana Digital. We will always be transparent about what information you choose to share for the purposed of improving the app, and this information will never include photos, videos, audio, text, or precise locations that you have entered into CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Crash Data" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Information about what caused the app to close unexpectedly" + }, + "screens.PrivacyPolicy.dataCollection": { + "message": "CoMapeo Data Collection" + }, + "screens.PrivacyPolicy.deviceInfo": { + "message": "Device Info" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Such as model and manufacturer of your device; device operating system; screen size; device locale (language); device memory." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnostics" + }, + "screens.PrivacyPolicy.noPII": { + "message": "No personally identifiable information" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "Using CoMapeo does not require a user account. Awana Digital does not collect your name, email address or any other personal details. No permanent user identifier or device identifier is ever shared with Awana Digital, and we take extra measures to ensure that no information you share can be used to track you: identifiers are randomized and rotated (changed) every month and we do not store IP addresses." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "What is not collected?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "We do not collect any personal data or anything that can be used to identify or track a user or device. Device identifiers used to aggregate information are random, anonymous, and changed every month. Diagnostic information does not include data about how you use the app, and it never includes any of the data you have collected with the app. We do not collect your precise or coarse location, only the country where you are using CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Open Source and the \"Official\" Version" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo is an open-source application. This means that anyone can view the code that makes the app work and can verify the privacy declarations in this document. It also means that anyone can adapt the app to their own needs and release an alternative version. This document refers to data collected by the official releases of CoMapeo, digitally signed by Awana Digital, available from the Google Play Store or the Awana Digital website. Unofficial releases of CoMapeo obtained from other channels are outside our control and may share additional information with other organizations." + }, + "screens.PrivacyPolicy.overview": { + "message": "This document describes what information (\"data\") is sent from CoMapeo to the application developer, Awana Digital, and how that information is used." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Performance Data" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Such as launch time, energy usage, app freezes, and responsiveness" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "CoMapeo Data Privacy" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Private by default" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "The data you collect and create with CoMapeo (locations, photos, video, audio, text) is only stored on your device by default, and is not stored or sent anywhere else. When you share data with collaborators by joining a project with them, it is sent encrypted, directly to your collaborators' device. This means that the data is not sent via Awana Digital, nor anyone else, on its way to your collaborator. Awana Digital never sees nor has access to any of the data you collect with CoMapeo unless you explicitly send it to us." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Third-party access to data" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "A \"third-party\" is an organization other than Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "User Counts" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "The number of users per country and per project. Aggregated and anonymized" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "What is collected?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "By default, anonymized diagnostic information about your device, app crashes, errors and performance is shared with Awana Digital. You can opt-out of sharing this information at any time. This diagnostic information is completely anonymized and it never contains any of your data (the data you have collected with CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "Why is this data collected?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Crash data and app errors together with the device and app info provide Awana Digital with the information we need to fix errors and bugs in the app. The performance data helps us improve the responsiveness of the app and identify errors. User counts, including total users, users per country, and users per project, help justify ongoing investment in the development of CoMapeo." + }, + "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Энд юу болоод байгаа юм бэ?" }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", @@ -614,15 +1060,6 @@ "description": "Category title for new track screen", "message": "Track" }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "Ашиглахын тулд Аппликэшний нууц үгийг тааруулах" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "Төхөөрөмжөө хураахаас хамгаалаарай" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Тодорхой бус нууц үг" - }, "screens.Security.passDesriptionPassNotSet": { "message": "Нууц үгийг тохируулаагүй байна" }, @@ -642,7 +1079,7 @@ "message": "Your Device Name" }, "screens.Setting.ProjectSettings.DeviceName.DisplayScreen.title": { - "message": "Device Name" + "message": "Төхөөрөмжний нэр" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.deviceNameLabel": { "message": "Edit Device Name" @@ -654,10 +1091,10 @@ "message": "Discard Changes" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "Өөрчлөлтийг цуцлах уу? " }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { - "message": "Device Name" + "message": "Төхөөрөмжний нэр" }, "screens.Setting.ProjectSettings.YourTeam.InviteAccepted.addAnotherDevice": { "message": "Add Another Device" @@ -702,7 +1139,7 @@ "message": "Date Added" }, "screens.Setting.ProjectSettings.YourTeam.deviceName": { - "message": "Device Name" + "message": "Төхөөрөмжний нэр" }, "screens.Setting.ProjectSettings.YourTeam.inviteDevice": { "message": "Invite Device" @@ -716,6 +1153,21 @@ "screens.Setting.ProjectSettings.YourTeam.title": { "message": "Your Team" }, + "screens.Settings.Config.created": { + "message": "Created {date} at {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Import Config" + }, + "screens.Settings.Config.name": { + "message": "Config Name:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuration" + }, + "screens.Settings.Config.projectName": { + "message": "Project Name:" + }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { "message": "Create a Project" }, @@ -755,14 +1207,17 @@ "screens.Settings.CreateOrJoinProject.importConfig": { "message": "Import Config" }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "File name should end with .comapeocat" + }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Join an existing CoMapeo Project" }, "screens.Settings.CreateOrJoinProject.joinProject": { "message": "Join a Project" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.Settings.CreateOrJoinProject.startProject": { "message": "Start a CoMapeo Project" @@ -788,12 +1243,12 @@ "screens.Settings.YourTeam.unableToCancel": { "message": "Unable to Cancel Invitation" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "Mapeo-гийн тухай" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "Хувилбар ба барилгын дугаар" }, "screens.Settings.appSettings": { @@ -803,6 +1258,10 @@ "description": "list of avaialable app settings", "message": "Language, Security, Coordinates" }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Project Configuration" + }, "screens.Settings.createOrJoin": { "message": "Create or Join Project" }, @@ -820,11 +1279,20 @@ "description": "Title of settings screen", "message": "Тохиргоо" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { "message": "Create or Join Project" }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "You will be able to share data with devices that are part of the same project." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Create or join a project to collect data with a team" }, "screens.Sync.HeaderTitle.noWiFi": { "message": "No WiFi" @@ -838,49 +1306,93 @@ "screens.Sync.NoWifiDisplay.title": { "message": "No WiFi" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "You're all caught up!" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "All data synced" + }, + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Devices available" + }, + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Devices found" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "No devices available to sync" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Syncing…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Waiting…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Waiting for other devices" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Start Sync" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Stop" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Complete! Waiting for other devices to join" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "Complete! You're up to date" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "You are syncing with your team" + }, + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Waiting for devices" + }, + "screens.Track.ObservationList.observations": { + "message": "Сануулгууд" + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "Delete track?" + }, + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Track" + }, + "screens.Track.tracks": { + "message": "Tracks" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Edit Track" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Track" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", "message": "Show Options" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Leave Project" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Disconnected" }, "sharedComponents.DeviceIconWithName.thisDevice": { "message": "This Device!" }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "Хайлт хийж байна..." + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Change" + }, "sharedComponents.ErrorModal.goBack": { "message": "Go Back" }, @@ -894,31 +1406,40 @@ "message": "No GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "Хайлт хийж байна..." + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Invite Canceled" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Close" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Your invitation to {projectName} has been canceled." }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { "message": "Accept Invite" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { "message": "Decline Invite" }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "You've been invited to join {projectName}" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Join Project {projectName}" + }, "sharedComponents.ProjectInviteBottomSheet.goToMap": { - "message": "Go To Map" + "message": "Газрын зураг руу очих" }, "sharedComponents.ProjectInviteBottomSheet.goToSync": { "message": "Go To Sync" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" - }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" - }, "sharedComponents.ProjectInviteBottomSheet.success": { "message": "Success" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "You have joined {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { "message": "Coordinator" diff --git a/messages/my.json b/messages/my.json index f4e947542..262a49686 100644 --- a/messages/my.json +++ b/messages/my.json @@ -25,24 +25,12 @@ "description": "Title of dialog that shows when cancelling a new observation", "message": "လေ့လာထားရှိမှုများကို ဖျက်ပစ်မှာလား?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { "message": "Enable" }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" - }, "Modal.GPSDisable.description": { "message": "To create a Track CoMapeo needs access to your location and GPS." }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" - }, "Modal.GPSDisable.title": { "message": "GPS Disabled" }, @@ -58,6 +46,80 @@ "Modal.GPSEnable.trackingDescription": { "message": "You’ve been recording for" }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "Version and build number" + }, + "Navigation.Drawer.appSettings": { + "message": "App Settings" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Language, Security, Coordinates" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Create or Join Project" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Create a new project or join existing one" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Data & Privacy" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "You are currently mapping on your own" + }, + "Navigation.Drawer.projName": { + "message": "Project {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Project Settings" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categories, Config, Team" + }, + "Navigation.Drawer.security": { + "message": "Security" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "Settings" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "ဆက်လက်ပြင်ဆင်ခြင်း" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Discard changes" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "ပြောင်းလဲမှုများကို ဖျက်ပစ်မှာလား?" + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "ဆက်လက်ပြင်ဆင်ခြင်း" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Discard Track?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard Track" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Your Track will not be saved. This cannot be undone." + }, "Screens.Settings.AppSettings.coordinateSystem": { "message": "Coordinate System" }, @@ -71,20 +133,51 @@ "message": "Display language for app" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "App Settings" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "Device Name" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Sync Settings" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Project Settings" }, "Screens.Settings.ProjectSettings.yourTeam": { "message": "Your Team" }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "ပယ်ဖျက်သည်" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "ဟုတ်ကဲ့၊ ပယ်ဖျက်မည်" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "ပယ်ဖျက်သည်" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Share" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "ဆက်လက်ပြင်ဆင်ခြင်း" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "ပြောင်းလဲမှုများကို ဖျက်ပစ်မှာလား?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard changes" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { "message": "Coordinator" }, @@ -98,7 +191,7 @@ "message": "Not seeing a Device?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Make sure both devices are on the same version of CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { "message": "Make sure both devices are on the same wifi network" @@ -118,6 +211,38 @@ "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { "message": "Select a Role" }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "CoMapeo build" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "CoMapeo variant" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "CoMapeo version" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Android build number" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Android version" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Phone model" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "About CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Unknown" + }, "screens.AddPhoto.cancel": { "message": "ပယ်ဖျက်သည်" }, @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "Passcode" + "message": "Passcode: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "Save App Passcode" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Make sure to note your passcode in a secure location before saving." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "App Passcodes can never be recovered if lost or forgotten! Make sure to note your passcode in a secure location before saving." + "message": "App Passcodes can never be recovered if lost or forgotten!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "Please Enter Passcode" @@ -168,7 +296,7 @@ "message": "Incorrect Passcode" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "This passcode will be required to open the Mapeo App" + "message": "This passcode will be required to open the CoMapeo App" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { "message": "Confirm Passcode" @@ -183,10 +311,10 @@ "message": "What is App Passcode?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app. You can define your own 5-digit passcode by turning on the feature below." + "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**Please note that forgotten passcodes cannot be recovered!** Once this feature is enabled, if you forget or lose your passcode, you will not be able to open Mapeo and will lose access to any Mapeo data that has not been synced with other project participants." + "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "ပယ်ဖျက်သည်" @@ -198,7 +326,7 @@ "message": "You are currently using App Passcode. See below to stop using or change your passcode." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app." + "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "App Passcode" @@ -212,6 +340,26 @@ "screens.AppPasscode.TurnOffPasscode.usePasscode": { "message": "Use App Passcode" }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Allow" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Go to Settings" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Not Now" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "To record audio while using the app and in the background CoMapeo needs to access your microphone. Please enable microphone permissions in your app settings." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Recording Audio with CoMapeo" + }, "screens.CameraScreen.goToSettings": { "message": "Go to Settings" }, @@ -238,12 +386,63 @@ "description": "Universal Transverse Mercator coordinate format", "message": "Universal Transverse Mercator (UTM)" }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "Anonymized information about your device, app crashes, errors and performance helps Awana Digital improve the app and fix errors." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Diagnostic Information" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Data & Privacy" + }, + "screens.DataAndPrivacy.noPII": { + "message": "This never includes any of your data or personal information." + }, + "screens.DataAndPrivacy.optOut": { + "message": "You can opt-out of sharing diagnostic information at any time." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo Respects Your Privacy & Autonomy" + }, + "screens.DataPrivacy.description": { + "message": "CoMapeo allows you and your collaborators to map offline without needing servers." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Private by default — diagnostic information is fully anonymized and you can opt-out any time." + }, + "screens.DataPrivacy.encrypted": { + "message": "All data stays fully encrypted" + }, + "screens.DataPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Easily manage and control sharing and collaboration." + }, + "screens.DataPrivacy.next": { + "message": "နောက်ထပ်" + }, + "screens.DataPrivacy.stays": { + "message": "Your data stays on your devices." + }, + "screens.DataPrivacy.title": { + "message": "Data & Privacy" + }, "screens.DeviceNaming.Success.description": { "message": "You named your device" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "To find your project settings go to the main menu found on the map screen." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Go to Map" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." + }, "screens.DeviceNaming.Success.success": { "message": "Success!" }, @@ -251,7 +450,7 @@ "message": "Add Name" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." }, "screens.DeviceNaming.header": { "message": "Add a name for your device" @@ -268,24 +467,79 @@ "screens.FatalError.somethingWrong": { "message": "Something Went Wrong" }, + "screens.HowToLeaveProject.goBack": { + "message": "Go back" + }, + "screens.HowToLeaveProject.howTo": { + "message": "How to Leave Project" + }, + "screens.HowToLeaveProject.instructions": { + "message": "To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device." + }, + "screens.HowToLeaveProject.warning": { + "message": "If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!" + }, "screens.IntroToCoMapeo.collaborate": { - "message": "Collaborate on mapping and monitoring projects" + "message": "Collaborate with others" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Designed with and for Indigenous peoples & frontline communities" }, "screens.IntroToCoMapeo.getStarted": { "message": "Get Started" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "is now" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Map anywhere and everywhere" + }, + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Map your world, together" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.ownData": { + "message": "Own and control your data" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", "message": "Language" }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "You are already on a project" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Go Back" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Leave Current Project" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "To join a new project you must leave your current one." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "You are on {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "ပယ်ဖျက်သည်" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Please check the box to confirm" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "I understand I will be deleting all data from Project {projectName} from my device." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "I understand I will be deleting all data from my device." + }, + "screens.LeaveProject.leaveProj": { + "message": "Leave Project" + }, + "screens.LeaveProject.leavingProject": { + "message": "Leaving Project {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "This will remove all Project {projectName}'s data from your device." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "This will remove all of the data from your device." + }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", "message": "Details" @@ -437,11 +691,50 @@ "screens.ManualGpsScreen.zoneNumber": { "message": "Zone Number" }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "ပယ်ဖျက်သည်" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sync Everything" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "Sync Everything?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Your device will sync all content at full size, including photos, audio, and videos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "You are about to sync everything. This may increase the disk space used on your device." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Note: This will use more storage." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "You will no longer sync Audio or Video." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Sync Previews (Photos Only)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Sync Previews" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "Sync Previews?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Photos will sync at a reduced smaller size. Device will not sync audio or video." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Your device will keep all existing data but new observations will sync in a smaller, preview size." + }, + "screens.MediaSyncSettings.title": { + "message": "Sync Settings" + }, "screens.ObscurePasscode.description": { - "message": "Obscure Passcode is a security feature that allows you to open Mapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of Mapeo which allows you to create demonstration observations that are not saved to the Mapeo database." + "message": "Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database." }, "screens.ObscurePasscode.instructions": { - "message": "Enter the code above to hide your data in Mapeo" + "message": "Enter the code above to hide your data in CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Obscure Passcode" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "What is Obscure Passcode?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "ပြောင်းလဲသည်" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "လေ့လာတွေ့ရှိချက်များ" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "ပယ်ဖျက်သည်" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "လေ့လာတွေ့ရှိချက်များ" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Share" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "ပယ်ဖျက်သည်" }, + "screens.Observation.comapeoAlert": { + "message": "CoMapeo Alert" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "ဟုတ်ကဲ့၊ ပယ်ဖျက်မည်" @@ -483,26 +776,83 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "လေ့လာထားရှိမှုများကို ဖျက်ပစ်မှာလား?" }, + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", + "message": "လေ့လာတွေ့ရှိချက်များ" + }, + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Sharing image" + }, + "screens.Observation.shareMessageFooter": { + "message": "Sent from CoMapeo" + }, + "screens.Observation.shareMessageTitle": { + "message": "CoMapeo Alert" + }, + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Sharing text" + }, "screens.Observation.title": { "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", "message": "လေ့လာတွေ့ရှိချက်များ" }, + "screens.ObservationCreate.changePreset": { + "message": "Change" + }, + "screens.ObservationCreate.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "ဒီမှာ ဘာဖြစ်နေတာလဲ?" + }, + "screens.ObservationCreate.keepWaiting": { + "description": "Button to cancel save and continue waiting for GPS", + "message": "ဆက်လက် စောင့်နေခြင်း" + }, + "screens.ObservationCreate.manualEntry": { + "description": "Button to manually enter GPS coordinates", + "message": "Manual Coords" + }, + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "New Observation" + }, + "screens.ObservationCreate.noGpsDesc": { + "description": "Description in dialog when trying to save with no GPS coords", + "message": "This observation does not have a location. You can continue waiting for a GPS signal, save the observation without a location, or enter coordinates manually" + }, + "screens.ObservationCreate.noGpsTitle": { + "description": "Title of dialog when trying to save with no GPS coords", + "message": "No GPS signal" + }, + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "လေ့လာတွေ့ရှိချက်များ" + }, + "screens.ObservationCreate.saveAnyway": { + "description": "Button to save regardless of GPS state", + "message": "Save" + }, + "screens.ObservationCreate.weakGpsDesc": { + "description": "Description in dialog when trying to save with low GPS accuracy.", + "message": "GPS accuracy is low. You can continue waiting for better accuracy, save the observation with low accuracy, or enter coordinates manually" + }, + "screens.ObservationCreate.weakGpsTitle": { + "description": "Title of dialog when trying to save with low GPS accuracy.", + "message": "Weak GPS signal" + }, "screens.ObservationDetails.done": { "description": "Button text when all questions are complete", "message": "Done" }, "screens.ObservationDetails.nextQuestion": { "description": "Button text to navigate to next question", - "message": "Next" + "message": "နောက်ထပ်" }, "screens.ObservationDetails.title": { "description": "Title of observation details screen showing question number and total", "message": "Question {current} of {total}" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "ပေါင်းထည့်သည်…" - }, "screens.ObservationEdit.ObservationEditView.audioButton": { "description": "Button label for adding audio", "message": "Audio" @@ -519,52 +869,30 @@ "description": "Button label for adding photo", "message": "Photo" }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "ရှာဖွေခြင်း…" - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { - "description": "Button to cancel save and continue waiting for GPS", - "message": "ဆက်လက် စောင့်နေခြင်း" - }, - "screens.ObservationEdit.SaveButton.manualEntry": { - "description": "Button to manually enter GPS coordinates", - "message": "Manual Coords" - }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { - "description": "Description in dialog when trying to save with no GPS coords", - "message": "This observation does not have a location. You can continue waiting for a GPS signal, save the observation without a location, or enter coordinates manually" - }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { - "description": "Title of dialog when trying to save with no GPS coords", - "message": "No GPS signal" - }, - "screens.ObservationEdit.SaveButton.saveAnyway": { - "description": "Button to save regardless of GPS state", - "message": "Save" - }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { - "description": "Description in dialog when trying to save with low GPS accuracy.", - "message": "GPS accuracy is low. You can continue waiting for better accuracy, save the observation with low accuracy, or enter coordinates manually" + "screens.ObservationEdit.changePreset": { + "message": "Change" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { - "description": "Title of dialog when trying to save with low GPS accuracy.", - "message": "Weak GPS signal" + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "ဒီမှာ ဘာဖြစ်နေတာလဲ?" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", + "screens.ObservationEdit.navTitle": { + "description": "screen title for new observation screen", "message": "Edit Observation" }, - "screens.ObservationEdit.newTitle": { - "description": "screen title for new observation screen", - "message": "New Observation" + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "လေ့လာတွေ့ရှိချက်များ" + }, + "screens.ObservationList.TrackListItem.Track": { + "message": "Track" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "Observations" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "You are currently mapping on your own." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,32 +907,150 @@ "message": "Add Observations" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Create or Join a Project" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "Error loading observations. Try quitting and restarting Mapeo." + "message": "Error loading observations. Try quitting and restarting CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "Loading… this can take a while after synchronizing with a new device" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, - "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { - "description": "Placeholder for description/notes field", - "message": "What is happening here?" + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Privacy Policy" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Current Permissions" }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Share Diagnostic Information" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "ပယ်ဖျက်သည်" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Delete Image" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "Delete this photo?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Delete Photo" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "About Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo is developed by Awana Digital, a 501c3 non-profit organization registered in the United States. Awana Digital works in solidarity with frontline communities to use technology to defend their rights and fight climate change." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "App Errors" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Information about internal errors that result in the app not functioning as expected" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "App Info" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "The version and locale (language) of CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "App Usage" + }, + "screens.PrivacyPolicy.control": { + "message": "You're in control" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "You can opt out of sending any information to Awana Digital. You choose where your data is stored and who it is shared with. You may choose to share anonymized, summarized data about how you use CoMapeo with Awana Digital. We will always be transparent about what information you choose to share for the purposed of improving the app, and this information will never include photos, videos, audio, text, or precise locations that you have entered into CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Crash Data" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Information about what caused the app to close unexpectedly" + }, + "screens.PrivacyPolicy.dataCollection": { + "message": "CoMapeo Data Collection" + }, + "screens.PrivacyPolicy.deviceInfo": { + "message": "Device Info" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Such as model and manufacturer of your device; device operating system; screen size; device locale (language); device memory." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnostics" + }, + "screens.PrivacyPolicy.noPII": { + "message": "No personally identifiable information" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "Using CoMapeo does not require a user account. Awana Digital does not collect your name, email address or any other personal details. No permanent user identifier or device identifier is ever shared with Awana Digital, and we take extra measures to ensure that no information you share can be used to track you: identifiers are randomized and rotated (changed) every month and we do not store IP addresses." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "What is not collected?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "We do not collect any personal data or anything that can be used to identify or track a user or device. Device identifiers used to aggregate information are random, anonymous, and changed every month. Diagnostic information does not include data about how you use the app, and it never includes any of the data you have collected with the app. We do not collect your precise or coarse location, only the country where you are using CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Open Source and the \"Official\" Version" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo is an open-source application. This means that anyone can view the code that makes the app work and can verify the privacy declarations in this document. It also means that anyone can adapt the app to their own needs and release an alternative version. This document refers to data collected by the official releases of CoMapeo, digitally signed by Awana Digital, available from the Google Play Store or the Awana Digital website. Unofficial releases of CoMapeo obtained from other channels are outside our control and may share additional information with other organizations." + }, + "screens.PrivacyPolicy.overview": { + "message": "This document describes what information (\"data\") is sent from CoMapeo to the application developer, Awana Digital, and how that information is used." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Performance Data" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Such as launch time, energy usage, app freezes, and responsiveness" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "CoMapeo Data Privacy" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Private by default" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "The data you collect and create with CoMapeo (locations, photos, video, audio, text) is only stored on your device by default, and is not stored or sent anywhere else. When you share data with collaborators by joining a project with them, it is sent encrypted, directly to your collaborators' device. This means that the data is not sent via Awana Digital, nor anyone else, on its way to your collaborator. Awana Digital never sees nor has access to any of the data you collect with CoMapeo unless you explicitly send it to us." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Third-party access to data" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "A \"third-party\" is an organization other than Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "User Counts" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "The number of users per country and per project. Aggregated and anonymized" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "What is collected?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "By default, anonymized diagnostic information about your device, app crashes, errors and performance is shared with Awana Digital. You can opt-out of sharing this information at any time. This diagnostic information is completely anonymized and it never contains any of your data (the data you have collected with CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "Why is this data collected?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Crash data and app errors together with the device and app info provide Awana Digital with the information we need to fix errors and bugs in the app. The performance data helps us improve the responsiveness of the app and identify errors. User counts, including total users, users per country, and users per project, help justify ongoing investment in the development of CoMapeo." + }, + "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "ဒီမှာ ဘာဖြစ်နေတာလဲ?" }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", @@ -614,15 +1060,6 @@ "description": "Category title for new track screen", "message": "Track" }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "To use, enable App Passcode" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "Protect your device against seizure" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Obscure Passcode" - }, "screens.Security.passDesriptionPassNotSet": { "message": "Passcode not set" }, @@ -654,7 +1091,7 @@ "message": "Discard Changes" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "ပြောင်းလဲမှုများကို ဖျက်ပစ်မှာလား?" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { "message": "Device Name" @@ -716,6 +1153,21 @@ "screens.Setting.ProjectSettings.YourTeam.title": { "message": "Your Team" }, + "screens.Settings.Config.created": { + "message": "Created {date} at {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Import Config" + }, + "screens.Settings.Config.name": { + "message": "Config Name:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuration" + }, + "screens.Settings.Config.projectName": { + "message": "Project Name:" + }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { "message": "Create a Project" }, @@ -755,14 +1207,17 @@ "screens.Settings.CreateOrJoinProject.importConfig": { "message": "Import Config" }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "File name should end with .comapeocat" + }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Join an existing CoMapeo Project" }, "screens.Settings.CreateOrJoinProject.joinProject": { "message": "Join a Project" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.Settings.CreateOrJoinProject.startProject": { "message": "Start a CoMapeo Project" @@ -788,12 +1243,12 @@ "screens.Settings.YourTeam.unableToCancel": { "message": "Unable to Cancel Invitation" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "မက်ပီယိုအကြောင်း" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "Version and build number" }, "screens.Settings.appSettings": { @@ -803,6 +1258,10 @@ "description": "list of avaialable app settings", "message": "Language, Security, Coordinates" }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Project Configuration" + }, "screens.Settings.createOrJoin": { "message": "Create or Join Project" }, @@ -820,11 +1279,20 @@ "description": "Title of settings screen", "message": "Settings" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { "message": "Create or Join Project" }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "You will be able to share data with devices that are part of the same project." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Create or join a project to collect data with a team" }, "screens.Sync.HeaderTitle.noWiFi": { "message": "No WiFi" @@ -838,49 +1306,93 @@ "screens.Sync.NoWifiDisplay.title": { "message": "No WiFi" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "You're all caught up!" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "All data synced" + }, + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Devices available" + }, + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Devices found" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "No devices available to sync" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Syncing…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Waiting…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Waiting for other devices" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Start Sync" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Stop" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Complete! Waiting for other devices to join" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "Complete! You're up to date" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "You are syncing with your team" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Waiting for devices" + }, + "screens.Track.ObservationList.observations": { + "message": "Observations" + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "Delete track?" + }, + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Track" + }, + "screens.Track.tracks": { + "message": "Tracks" + }, + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Edit Track" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Track" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", "message": "Show Options" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Leave Project" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Disconnected" }, "sharedComponents.DeviceIconWithName.thisDevice": { "message": "This Device!" }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "ရှာဖွေခြင်း…" + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Change" + }, "sharedComponents.ErrorModal.goBack": { "message": "Go Back" }, @@ -894,31 +1406,40 @@ "message": "No GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "ရှာဖွေခြင်း…" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Invite Canceled" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Close" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Your invitation to {projectName} has been canceled." }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { "message": "Accept Invite" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { "message": "Decline Invite" }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "You've been invited to join {projectName}" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Join Project {projectName}" + }, "sharedComponents.ProjectInviteBottomSheet.goToMap": { "message": "Go To Map" }, "sharedComponents.ProjectInviteBottomSheet.goToSync": { "message": "Go To Sync" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" - }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" - }, "sharedComponents.ProjectInviteBottomSheet.success": { "message": "Success" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "You have joined {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { "message": "Coordinator" diff --git a/messages/ne.json b/messages/ne.json index 2684bff0f..71b3b21d3 100644 --- a/messages/ne.json +++ b/messages/ne.json @@ -25,24 +25,12 @@ "description": "Title of dialog that shows when cancelling a new observation", "message": "अवलाेकन हटाउने?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { "message": "Enable" }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" - }, "Modal.GPSDisable.description": { "message": "To create a Track CoMapeo needs access to your location and GPS." }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" - }, "Modal.GPSDisable.title": { "message": "GPS Disabled" }, @@ -58,6 +46,80 @@ "Modal.GPSEnable.trackingDescription": { "message": "You’ve been recording for" }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "Version and build number" + }, + "Navigation.Drawer.appSettings": { + "message": "App Settings" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Language, Security, Coordinates" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Create or Join Project" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Create a new project or join existing one" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Data & Privacy" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "You are currently mapping on your own" + }, + "Navigation.Drawer.projName": { + "message": "Project {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Project Settings" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categories, Config, Team" + }, + "Navigation.Drawer.security": { + "message": "Security" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "सेटिङ" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "निरन्तर सम्पादन" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Discard changes" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "परिवर्तन रद्द?" + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "निरन्तर सम्पादन" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Discard Track?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard Track" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Your Track will not be saved. This cannot be undone." + }, "Screens.Settings.AppSettings.coordinateSystem": { "message": "Coordinate System" }, @@ -71,20 +133,51 @@ "message": "Display language for app" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "App Settings" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "Device Name" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Sync Settings" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Project Settings" }, "Screens.Settings.ProjectSettings.yourTeam": { "message": "Your Team" }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "रद्द" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "हुन्छ, मेट्नु" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "मेटाउने" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Share" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "निरन्तर सम्पादन" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "परिवर्तन रद्द?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard changes" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { "message": "Coordinator" }, @@ -98,7 +191,7 @@ "message": "Not seeing a Device?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Make sure both devices are on the same version of CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { "message": "Make sure both devices are on the same wifi network" @@ -118,6 +211,38 @@ "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { "message": "Select a Role" }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "CoMapeo build" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "CoMapeo variant" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "CoMapeo version" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Android build number" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Android version" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Phone model" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "About CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Unknown" + }, "screens.AddPhoto.cancel": { "message": "रद्द" }, @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "पासकाेड" + "message": "Passcode: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "एपकाे पासकाेड संग्रह गर्नुहाेस" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Make sure to note your passcode in a secure location before saving." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "एपकाे पासकाेड हराएकाे वा बिर्सिएकाे खण्डमा पछि रिकभर गर्न सकिन्दैन । तपाइकाे पासकाेड सुरक्षित रूपले नाेट गरेर संग्रह गर्नु हाेला." + "message": "App Passcodes can never be recovered if lost or forgotten!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "Please Enter Passcode" @@ -168,7 +296,7 @@ "message": "Incorrect Passcode" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "याे पासकाेड Mapeo App खाेल्न चाहिन्छ" + "message": "This passcode will be required to open the CoMapeo App" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { "message": "Confirm Passcode" @@ -183,10 +311,10 @@ "message": "एपकाे पासकोड के हाे?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app. You can define your own 5-digit passcode by turning on the feature below." + "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**Please note that forgotten passcodes cannot be recovered!** Once this feature is enabled, if you forget or lose your passcode, you will not be able to open Mapeo and will lose access to any Mapeo data that has not been synced with other project participants." + "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "रद्द" @@ -198,7 +326,7 @@ "message": "You are currently using App Passcode. See below to stop using or change your passcode." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app." + "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "एपकाे पासकाेड प्रयाेग गर्नु" @@ -212,6 +340,26 @@ "screens.AppPasscode.TurnOffPasscode.usePasscode": { "message": "एपकाे पासकाेड प्रयाेग गर्नु" }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Allow" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Go to Settings" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Not Now" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "To record audio while using the app and in the background CoMapeo needs to access your microphone. Please enable microphone permissions in your app settings." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Recording Audio with CoMapeo" + }, "screens.CameraScreen.goToSettings": { "message": "Go to Settings" }, @@ -238,12 +386,63 @@ "description": "Universal Transverse Mercator coordinate format", "message": "Universal Transverse Mercator (UTM)" }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "Anonymized information about your device, app crashes, errors and performance helps Awana Digital improve the app and fix errors." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Diagnostic Information" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Data & Privacy" + }, + "screens.DataAndPrivacy.noPII": { + "message": "This never includes any of your data or personal information." + }, + "screens.DataAndPrivacy.optOut": { + "message": "You can opt-out of sharing diagnostic information at any time." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo Respects Your Privacy & Autonomy" + }, + "screens.DataPrivacy.description": { + "message": "CoMapeo allows you and your collaborators to map offline without needing servers." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Private by default — diagnostic information is fully anonymized and you can opt-out any time." + }, + "screens.DataPrivacy.encrypted": { + "message": "All data stays fully encrypted" + }, + "screens.DataPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Easily manage and control sharing and collaboration." + }, + "screens.DataPrivacy.next": { + "message": "अर्काे" + }, + "screens.DataPrivacy.stays": { + "message": "Your data stays on your devices." + }, + "screens.DataPrivacy.title": { + "message": "Data & Privacy" + }, "screens.DeviceNaming.Success.description": { "message": "You named your device" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "To find your project settings go to the main menu found on the map screen." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Go to Map" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." + }, "screens.DeviceNaming.Success.success": { "message": "Success!" }, @@ -251,7 +450,7 @@ "message": "Add Name" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." }, "screens.DeviceNaming.header": { "message": "Add a name for your device" @@ -268,23 +467,78 @@ "screens.FatalError.somethingWrong": { "message": "Something Went Wrong" }, + "screens.HowToLeaveProject.goBack": { + "message": "Go back" + }, + "screens.HowToLeaveProject.howTo": { + "message": "How to Leave Project" + }, + "screens.HowToLeaveProject.instructions": { + "message": "To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device." + }, + "screens.HowToLeaveProject.warning": { + "message": "If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!" + }, "screens.IntroToCoMapeo.collaborate": { - "message": "Collaborate on mapping and monitoring projects" + "message": "Collaborate with others" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Designed with and for Indigenous peoples & frontline communities" }, "screens.IntroToCoMapeo.getStarted": { "message": "Get Started" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "is now" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Map anywhere and everywhere" + }, + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Map your world, together" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.ownData": { + "message": "Own and control your data" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", - "message": "Language" + "message": "भाषा" + }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "You are already on a project" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Go Back" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Leave Current Project" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "To join a new project you must leave your current one." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "You are on {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "रद्द" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Please check the box to confirm" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "I understand I will be deleting all data from Project {projectName} from my device." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "I understand I will be deleting all data from my device." + }, + "screens.LeaveProject.leaveProj": { + "message": "Leave Project" + }, + "screens.LeaveProject.leavingProject": { + "message": "Leaving Project {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "This will remove all Project {projectName}'s data from your device." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "This will remove all of the data from your device." }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", @@ -437,11 +691,50 @@ "screens.ManualGpsScreen.zoneNumber": { "message": "Zone Number" }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "रद्द" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sync Everything" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "Sync Everything?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Your device will sync all content at full size, including photos, audio, and videos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "You are about to sync everything. This may increase the disk space used on your device." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Note: This will use more storage." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "You will no longer sync Audio or Video." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Sync Previews (Photos Only)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Sync Previews" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "Sync Previews?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Photos will sync at a reduced smaller size. Device will not sync audio or video." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Your device will keep all existing data but new observations will sync in a smaller, preview size." + }, + "screens.MediaSyncSettings.title": { + "message": "Sync Settings" + }, "screens.ObscurePasscode.description": { - "message": "Obscure Passcode is a security feature that allows you to open Mapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of Mapeo which allows you to create demonstration observations that are not saved to the Mapeo database." + "message": "Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database." }, "screens.ObscurePasscode.instructions": { - "message": "Enter the code above to hide your data in Mapeo" + "message": "Enter the code above to hide your data in CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Obscure Passcode" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "What is Obscure Passcode?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "परिवर्तन" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "अवलाेकन" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "मेटाउने" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "अवलाेकन" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Share" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "रद्द" }, + "screens.Observation.comapeoAlert": { + "message": "CoMapeo Alert" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "हुन्छ, मेट्नु" @@ -483,26 +776,83 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "अवलाेकन हटाउने?" }, + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", + "message": "अवलाेकन" + }, + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Sharing image" + }, + "screens.Observation.shareMessageFooter": { + "message": "Sent from CoMapeo" + }, + "screens.Observation.shareMessageTitle": { + "message": "CoMapeo Alert" + }, + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Sharing text" + }, "screens.Observation.title": { "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", "message": "अवलाेकन" }, + "screens.ObservationCreate.changePreset": { + "message": "Change" + }, + "screens.ObservationCreate.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "यहाँ के भइ राखेकाे छ?" + }, + "screens.ObservationCreate.keepWaiting": { + "description": "Button to cancel save and continue waiting for GPS", + "message": "पर्खाइ निरन्तर" + }, + "screens.ObservationCreate.manualEntry": { + "description": "Button to manually enter GPS coordinates", + "message": "म्यानुअल काेर्डस्" + }, + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "New Observation" + }, + "screens.ObservationCreate.noGpsDesc": { + "description": "Description in dialog when trying to save with no GPS coords", + "message": "याे अवलाेकनकाे लाेकेसन छैन । तपाइले GPS संकेत निरन्तर कुर्न सक्नु हुनेछ, अवलाेकनलाइ लाेकेसन बेगर संग्रह गर्न सक्नुहुन्छ, वा निर्देशलाइ अाफैले राख्नु" + }, + "screens.ObservationCreate.noGpsTitle": { + "description": "Title of dialog when trying to save with no GPS coords", + "message": "GPS संकेत छैन" + }, + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "अवलाेकन" + }, + "screens.ObservationCreate.saveAnyway": { + "description": "Button to save regardless of GPS state", + "message": "संग्रह" + }, + "screens.ObservationCreate.weakGpsDesc": { + "description": "Description in dialog when trying to save with low GPS accuracy.", + "message": "GPS यथार्थता न्यून छ, दुरूस्त GPS काे लागि कुर्न सक्नु हुन्छ, न्यून GPS यथार्थतामा संग्रह गर्न सक्नु हुन्छ, वा अाफैले निर्देश गर्न सक्नुहुन्छ" + }, + "screens.ObservationCreate.weakGpsTitle": { + "description": "Title of dialog when trying to save with low GPS accuracy.", + "message": "कमजाेर GPS संकेत" + }, "screens.ObservationDetails.done": { "description": "Button text when all questions are complete", "message": "Done" }, "screens.ObservationDetails.nextQuestion": { "description": "Button text to navigate to next question", - "message": "Next" + "message": "अर्काे" }, "screens.ObservationDetails.title": { "description": "Title of observation details screen showing question number and total", "message": "Question {current} of {total}" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "थप…" - }, "screens.ObservationEdit.ObservationEditView.audioButton": { "description": "Button label for adding audio", "message": "Audio" @@ -519,52 +869,30 @@ "description": "Button label for adding photo", "message": "Photo" }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "खाेजी जारी …" - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { - "description": "Button to cancel save and continue waiting for GPS", - "message": "पर्खाइ निरन्तर" - }, - "screens.ObservationEdit.SaveButton.manualEntry": { - "description": "Button to manually enter GPS coordinates", - "message": "म्यानुअल काेर्डस्" + "screens.ObservationEdit.changePreset": { + "message": "Change" }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { - "description": "Description in dialog when trying to save with no GPS coords", - "message": "याे अवलाेकनकाे लाेकेसन छैन । तपाइले GPS संकेत निरन्तर कुर्न सक्नु हुनेछ, अवलाेकनलाइ लाेकेसन बेगर संग्रह गर्न सक्नुहुन्छ, वा निर्देशलाइ अाफैले राख्नु" - }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { - "description": "Title of dialog when trying to save with no GPS coords", - "message": "GPS संकेत छैन" - }, - "screens.ObservationEdit.SaveButton.saveAnyway": { - "description": "Button to save regardless of GPS state", - "message": "संग्रह" - }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { - "description": "Description in dialog when trying to save with low GPS accuracy.", - "message": "GPS यथार्थता न्यून छ, दुरूस्त GPS काे लागि कुर्न सक्नु हुन्छ, न्यून GPS यथार्थतामा संग्रह गर्न सक्नु हुन्छ, वा अाफैले निर्देश गर्न सक्नुहुन्छ" + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "यहाँ के भइ राखेकाे छ?" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { - "description": "Title of dialog when trying to save with low GPS accuracy.", - "message": "कमजाेर GPS संकेत" + "screens.ObservationEdit.navTitle": { + "description": "screen title for new observation screen", + "message": "Edit Observation" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", - "message": "अवलाेकन सम्पादन" + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "अवलाेकन" }, - "screens.ObservationEdit.newTitle": { - "description": "screen title for new observation screen", - "message": "नया अवलाेकन" + "screens.ObservationList.TrackListItem.Track": { + "message": "Track" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "अवलाेकनहरू" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "You are currently mapping on your own." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,32 +907,150 @@ "message": "अवलोकन थप्नुहोस" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Create or Join a Project" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "अवलाेकन लाेड गर्नमा समस्या । Mapeo बाट बाहिरिने र पुन शुरू गर्ने." + "message": "Error loading observations. Try quitting and restarting CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "लाेड हुँदै... नयाँ उपकरणसँग सिंक्राेनाइज हुन केहि समय लाग्न सक्छ" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, - "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { - "description": "Placeholder for description/notes field", - "message": "What is happening here?" + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Privacy Policy" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Current Permissions" }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Share Diagnostic Information" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "रद्द" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Delete Image" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "Delete this photo?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Delete Photo" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "About Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo is developed by Awana Digital, a 501c3 non-profit organization registered in the United States. Awana Digital works in solidarity with frontline communities to use technology to defend their rights and fight climate change." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "App Errors" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Information about internal errors that result in the app not functioning as expected" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "App Info" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "The version and locale (language) of CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "App Usage" + }, + "screens.PrivacyPolicy.control": { + "message": "You're in control" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "You can opt out of sending any information to Awana Digital. You choose where your data is stored and who it is shared with. You may choose to share anonymized, summarized data about how you use CoMapeo with Awana Digital. We will always be transparent about what information you choose to share for the purposed of improving the app, and this information will never include photos, videos, audio, text, or precise locations that you have entered into CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Crash Data" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Information about what caused the app to close unexpectedly" + }, + "screens.PrivacyPolicy.dataCollection": { + "message": "CoMapeo Data Collection" + }, + "screens.PrivacyPolicy.deviceInfo": { + "message": "Device Info" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Such as model and manufacturer of your device; device operating system; screen size; device locale (language); device memory." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnostics" + }, + "screens.PrivacyPolicy.noPII": { + "message": "No personally identifiable information" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "Using CoMapeo does not require a user account. Awana Digital does not collect your name, email address or any other personal details. No permanent user identifier or device identifier is ever shared with Awana Digital, and we take extra measures to ensure that no information you share can be used to track you: identifiers are randomized and rotated (changed) every month and we do not store IP addresses." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "What is not collected?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "We do not collect any personal data or anything that can be used to identify or track a user or device. Device identifiers used to aggregate information are random, anonymous, and changed every month. Diagnostic information does not include data about how you use the app, and it never includes any of the data you have collected with the app. We do not collect your precise or coarse location, only the country where you are using CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Open Source and the \"Official\" Version" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo is an open-source application. This means that anyone can view the code that makes the app work and can verify the privacy declarations in this document. It also means that anyone can adapt the app to their own needs and release an alternative version. This document refers to data collected by the official releases of CoMapeo, digitally signed by Awana Digital, available from the Google Play Store or the Awana Digital website. Unofficial releases of CoMapeo obtained from other channels are outside our control and may share additional information with other organizations." + }, + "screens.PrivacyPolicy.overview": { + "message": "This document describes what information (\"data\") is sent from CoMapeo to the application developer, Awana Digital, and how that information is used." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Performance Data" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Such as launch time, energy usage, app freezes, and responsiveness" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "CoMapeo Data Privacy" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Private by default" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "The data you collect and create with CoMapeo (locations, photos, video, audio, text) is only stored on your device by default, and is not stored or sent anywhere else. When you share data with collaborators by joining a project with them, it is sent encrypted, directly to your collaborators' device. This means that the data is not sent via Awana Digital, nor anyone else, on its way to your collaborator. Awana Digital never sees nor has access to any of the data you collect with CoMapeo unless you explicitly send it to us." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Third-party access to data" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "A \"third-party\" is an organization other than Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "User Counts" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "The number of users per country and per project. Aggregated and anonymized" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "What is collected?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "By default, anonymized diagnostic information about your device, app crashes, errors and performance is shared with Awana Digital. You can opt-out of sharing this information at any time. This diagnostic information is completely anonymized and it never contains any of your data (the data you have collected with CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "Why is this data collected?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Crash data and app errors together with the device and app info provide Awana Digital with the information we need to fix errors and bugs in the app. The performance data helps us improve the responsiveness of the app and identify errors. User counts, including total users, users per country, and users per project, help justify ongoing investment in the development of CoMapeo." + }, + "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "यहाँ के भइ राखेकाे छ?" }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", @@ -614,15 +1060,6 @@ "description": "Category title for new track screen", "message": "Track" }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "प्रयोग गर्न, एप पासकोड सक्षम गर्नुहोस्" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "आफ्नो यन्त्रलाई आक्रमणबाट सुरक्षित गर्नुहोस्" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Obscure Passcode" - }, "screens.Security.passDesriptionPassNotSet": { "message": "Passcode not set" }, @@ -654,7 +1091,7 @@ "message": "Discard Changes" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "परिवर्तन रद्द?" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { "message": "Device Name" @@ -716,6 +1153,21 @@ "screens.Setting.ProjectSettings.YourTeam.title": { "message": "Your Team" }, + "screens.Settings.Config.created": { + "message": "Created {date} at {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Import Config" + }, + "screens.Settings.Config.name": { + "message": "Config Name:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuration" + }, + "screens.Settings.Config.projectName": { + "message": "Project Name:" + }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { "message": "Create a Project" }, @@ -755,14 +1207,17 @@ "screens.Settings.CreateOrJoinProject.importConfig": { "message": "Import Config" }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "File name should end with .comapeocat" + }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Join an existing CoMapeo Project" }, "screens.Settings.CreateOrJoinProject.joinProject": { "message": "Join a Project" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.Settings.CreateOrJoinProject.startProject": { "message": "Start a CoMapeo Project" @@ -788,12 +1243,12 @@ "screens.Settings.YourTeam.unableToCancel": { "message": "Unable to Cancel Invitation" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "Mapeo काे बारेमा" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "Version and build number" }, "screens.Settings.appSettings": { @@ -803,6 +1258,10 @@ "description": "list of avaialable app settings", "message": "Language, Security, Coordinates" }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Project Configuration" + }, "screens.Settings.createOrJoin": { "message": "Create or Join Project" }, @@ -820,11 +1279,20 @@ "description": "Title of settings screen", "message": "सेटिङ" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { "message": "Create or Join Project" }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "You will be able to share data with devices that are part of the same project." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Create or join a project to collect data with a team" }, "screens.Sync.HeaderTitle.noWiFi": { "message": "No WiFi" @@ -838,49 +1306,93 @@ "screens.Sync.NoWifiDisplay.title": { "message": "No WiFi" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "You're all caught up!" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "All data synced" + }, + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Devices available" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Devices found" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "No devices available to sync" + }, + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Syncing…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Waiting…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Waiting for other devices" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Start Sync" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Stop" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Complete! Waiting for other devices to join" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "Complete! You're up to date" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "You are syncing with your team" + }, + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Waiting for devices" + }, + "screens.Track.ObservationList.observations": { + "message": "अवलाेकनहरू" + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "Delete track?" + }, + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Track" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.Track.tracks": { + "message": "Tracks" + }, + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Edit Track" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Track" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", "message": "Show Options" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Leave Project" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Disconnected" }, "sharedComponents.DeviceIconWithName.thisDevice": { "message": "This Device!" }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "खाेजी जारी …" + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Change" + }, "sharedComponents.ErrorModal.goBack": { "message": "Go Back" }, @@ -894,31 +1406,40 @@ "message": "No GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "खाेजी जारी …" }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Invite Canceled" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Close" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Your invitation to {projectName} has been canceled." + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { "message": "Accept Invite" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { "message": "Decline Invite" }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "You've been invited to join {projectName}" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Join Project {projectName}" + }, "sharedComponents.ProjectInviteBottomSheet.goToMap": { - "message": "Go To Map" + "message": "नक्सामा जानु हाेला" }, "sharedComponents.ProjectInviteBottomSheet.goToSync": { "message": "Go To Sync" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" - }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" - }, "sharedComponents.ProjectInviteBottomSheet.success": { "message": "Success" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "You have joined {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { "message": "Coordinator" diff --git a/messages/nl.json b/messages/nl.json index 148ce8d27..44b29c66e 100644 --- a/messages/nl.json +++ b/messages/nl.json @@ -25,24 +25,12 @@ "description": "Title of dialog that shows when cancelling a new observation", "message": "Waarneming annuleren?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { "message": "Enable" }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" - }, "Modal.GPSDisable.description": { "message": "To create a Track CoMapeo needs access to your location and GPS." }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" - }, "Modal.GPSDisable.title": { "message": "GPS Disabled" }, @@ -58,6 +46,80 @@ "Modal.GPSEnable.trackingDescription": { "message": "You’ve been recording for" }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "Versie en build nummer" + }, + "Navigation.Drawer.appSettings": { + "message": "App Settings" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Language, Security, Coordinates" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Create or Join Project" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Create a new project or join existing one" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Data & Privacy" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "You are currently mapping on your own" + }, + "Navigation.Drawer.projName": { + "message": "Project {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Project Settings" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categories, Config, Team" + }, + "Navigation.Drawer.security": { + "message": "Security" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "Instellingen" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Doorgaan met bewerken" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Discard changes" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Wijzigingen annuleren?" + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Doorgaan met bewerken" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Discard Track?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard Track" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Your Track will not be saved. This cannot be undone." + }, "Screens.Settings.AppSettings.coordinateSystem": { "message": "Coordinate System" }, @@ -71,20 +133,51 @@ "message": "Display language for app" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "App Settings" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "Device Name" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Sync Settings" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Project Settings" }, "Screens.Settings.ProjectSettings.yourTeam": { "message": "Your Team" }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "Annuleren" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "Ja, verwijderen" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "Verwijderen" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Share" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Doorgaan met bewerken" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Wijzigingen annuleren?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard changes" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { "message": "Coordinator" }, @@ -98,7 +191,7 @@ "message": "Not seeing a Device?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Make sure both devices are on the same version of CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { "message": "Make sure both devices are on the same wifi network" @@ -118,6 +211,38 @@ "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { "message": "Select a Role" }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "CoMapeo build" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "CoMapeo variant" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "CoMapeo version" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Android build number" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Android version" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Phone model" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "About CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Unknown" + }, "screens.AddPhoto.cancel": { "message": "Annuleren" }, @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "Passcode" + "message": "Passcode: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "Save App Passcode" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Make sure to note your passcode in a secure location before saving." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "App Passcodes can never be recovered if lost or forgotten! Make sure to note your passcode in a secure location before saving." + "message": "App Passcodes can never be recovered if lost or forgotten!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "Please Enter Passcode" @@ -168,7 +296,7 @@ "message": "Incorrect Passcode" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "This passcode will be required to open the Mapeo App" + "message": "This passcode will be required to open the CoMapeo App" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { "message": "Confirm Passcode" @@ -183,10 +311,10 @@ "message": "What is App Passcode?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app. You can define your own 5-digit passcode by turning on the feature below." + "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**Please note that forgotten passcodes cannot be recovered!** Once this feature is enabled, if you forget or lose your passcode, you will not be able to open Mapeo and will lose access to any Mapeo data that has not been synced with other project participants." + "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "Annuleren" @@ -198,7 +326,7 @@ "message": "You are currently using App Passcode. See below to stop using or change your passcode." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app." + "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "App Passcode" @@ -212,6 +340,26 @@ "screens.AppPasscode.TurnOffPasscode.usePasscode": { "message": "Use App Passcode" }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Allow" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Go to Settings" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Not Now" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "To record audio while using the app and in the background CoMapeo needs to access your microphone. Please enable microphone permissions in your app settings." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Recording Audio with CoMapeo" + }, "screens.CameraScreen.goToSettings": { "message": "Go to Settings" }, @@ -238,12 +386,63 @@ "description": "Universal Transverse Mercator coordinate format", "message": "Universal Transverse Mercator (UTM)" }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "Anonymized information about your device, app crashes, errors and performance helps Awana Digital improve the app and fix errors." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Diagnostic Information" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Data & Privacy" + }, + "screens.DataAndPrivacy.noPII": { + "message": "This never includes any of your data or personal information." + }, + "screens.DataAndPrivacy.optOut": { + "message": "You can opt-out of sharing diagnostic information at any time." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo Respects Your Privacy & Autonomy" + }, + "screens.DataPrivacy.description": { + "message": "CoMapeo allows you and your collaborators to map offline without needing servers." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Private by default — diagnostic information is fully anonymized and you can opt-out any time." + }, + "screens.DataPrivacy.encrypted": { + "message": "All data stays fully encrypted" + }, + "screens.DataPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Easily manage and control sharing and collaboration." + }, + "screens.DataPrivacy.next": { + "message": "Volgende" + }, + "screens.DataPrivacy.stays": { + "message": "Your data stays on your devices." + }, + "screens.DataPrivacy.title": { + "message": "Data & Privacy" + }, "screens.DeviceNaming.Success.description": { "message": "You named your device" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "To find your project settings go to the main menu found on the map screen." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Go to Map" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." + }, "screens.DeviceNaming.Success.success": { "message": "Success!" }, @@ -251,7 +450,7 @@ "message": "Add Name" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." }, "screens.DeviceNaming.header": { "message": "Add a name for your device" @@ -268,23 +467,78 @@ "screens.FatalError.somethingWrong": { "message": "Something Went Wrong" }, + "screens.HowToLeaveProject.goBack": { + "message": "Go back" + }, + "screens.HowToLeaveProject.howTo": { + "message": "How to Leave Project" + }, + "screens.HowToLeaveProject.instructions": { + "message": "To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device." + }, + "screens.HowToLeaveProject.warning": { + "message": "If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!" + }, "screens.IntroToCoMapeo.collaborate": { - "message": "Collaborate on mapping and monitoring projects" + "message": "Collaborate with others" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Designed with and for Indigenous peoples & frontline communities" }, "screens.IntroToCoMapeo.getStarted": { "message": "Get Started" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "is now" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Map anywhere and everywhere" + }, + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Map your world, together" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.ownData": { + "message": "Own and control your data" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", - "message": "Language" + "message": "Taal" + }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "You are already on a project" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Go Back" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Leave Current Project" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "To join a new project you must leave your current one." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "You are on {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "Annuleren" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Please check the box to confirm" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "I understand I will be deleting all data from Project {projectName} from my device." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "I understand I will be deleting all data from my device." + }, + "screens.LeaveProject.leaveProj": { + "message": "Leave Project" + }, + "screens.LeaveProject.leavingProject": { + "message": "Leaving Project {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "This will remove all Project {projectName}'s data from your device." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "This will remove all of the data from your device." }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", @@ -437,11 +691,50 @@ "screens.ManualGpsScreen.zoneNumber": { "message": "Zone Number" }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "Annuleren" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sync Everything" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "Sync Everything?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Your device will sync all content at full size, including photos, audio, and videos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "You are about to sync everything. This may increase the disk space used on your device." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Note: This will use more storage." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "You will no longer sync Audio or Video." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Sync Previews (Photos Only)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Sync Previews" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "Sync Previews?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Photos will sync at a reduced smaller size. Device will not sync audio or video." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Your device will keep all existing data but new observations will sync in a smaller, preview size." + }, + "screens.MediaSyncSettings.title": { + "message": "Sync Settings" + }, "screens.ObscurePasscode.description": { - "message": "Obscure Passcode is a security feature that allows you to open Mapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of Mapeo which allows you to create demonstration observations that are not saved to the Mapeo database." + "message": "Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database." }, "screens.ObscurePasscode.instructions": { - "message": "Enter the code above to hide your data in Mapeo" + "message": "Enter the code above to hide your data in CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Obscure Passcode" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "What is Obscure Passcode?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "Wijzigen" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "Waarneming" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "Verwijderen" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "Waarneming" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Share" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "Annuleren" }, + "screens.Observation.comapeoAlert": { + "message": "CoMapeo Alert" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "Ja, verwijderen" @@ -483,26 +776,83 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "Waarneming verwijderen?" }, + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", + "message": "Waarneming" + }, + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Sharing image" + }, + "screens.Observation.shareMessageFooter": { + "message": "Sent from CoMapeo" + }, + "screens.Observation.shareMessageTitle": { + "message": "CoMapeo Alert" + }, + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Sharing text" + }, "screens.Observation.title": { "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", "message": "Waarneming" }, + "screens.ObservationCreate.changePreset": { + "message": "Change" + }, + "screens.ObservationCreate.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Wat gebeurt er hier?" + }, + "screens.ObservationCreate.keepWaiting": { + "description": "Button to cancel save and continue waiting for GPS", + "message": "Blijven wachten" + }, + "screens.ObservationCreate.manualEntry": { + "description": "Button to manually enter GPS coordinates", + "message": "Handmatige Coördinaten" + }, + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "New Observation" + }, + "screens.ObservationCreate.noGpsDesc": { + "description": "Description in dialog when trying to save with no GPS coords", + "message": "Deze waarneming heeft geen locatie. U kunt doorgaan met wachten op een GPS signaal, de waarneming opslaan zonder een locatie, of de coördinaten handmatig invoeren" + }, + "screens.ObservationCreate.noGpsTitle": { + "description": "Title of dialog when trying to save with no GPS coords", + "message": "Geen GPS signaal" + }, + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "Waarneming" + }, + "screens.ObservationCreate.saveAnyway": { + "description": "Button to save regardless of GPS state", + "message": "Opslaan" + }, + "screens.ObservationCreate.weakGpsDesc": { + "description": "Description in dialog when trying to save with low GPS accuracy.", + "message": "GPS nauwkeurigheid is laag. U kunt blijven wachten op betere nauwkeurigheid, de waarneming opslaan met lage nauwkeurigheid, of handmatig de coördinaten invoeren" + }, + "screens.ObservationCreate.weakGpsTitle": { + "description": "Title of dialog when trying to save with low GPS accuracy.", + "message": "Zwak GPS signaal" + }, "screens.ObservationDetails.done": { "description": "Button text when all questions are complete", "message": "Done" }, "screens.ObservationDetails.nextQuestion": { "description": "Button text to navigate to next question", - "message": "Next" + "message": "Volgende" }, "screens.ObservationDetails.title": { "description": "Title of observation details screen showing question number and total", "message": "Question {current} of {total}" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "Toevoegen…" - }, "screens.ObservationEdit.ObservationEditView.audioButton": { "description": "Button label for adding audio", "message": "Audio" @@ -519,52 +869,30 @@ "description": "Button label for adding photo", "message": "Photo" }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "Bezig te zoeken…" - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { - "description": "Button to cancel save and continue waiting for GPS", - "message": "Blijven wachten" - }, - "screens.ObservationEdit.SaveButton.manualEntry": { - "description": "Button to manually enter GPS coordinates", - "message": "Handmatige Coördinaten" + "screens.ObservationEdit.changePreset": { + "message": "Change" }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { - "description": "Description in dialog when trying to save with no GPS coords", - "message": "Deze waarneming heeft geen locatie. U kunt doorgaan met wachten op een GPS signaal, de waarneming opslaan zonder een locatie, of de coördinaten handmatig invoeren" - }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { - "description": "Title of dialog when trying to save with no GPS coords", - "message": "Geen GPS signaal" - }, - "screens.ObservationEdit.SaveButton.saveAnyway": { - "description": "Button to save regardless of GPS state", - "message": "Opslaan" - }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { - "description": "Description in dialog when trying to save with low GPS accuracy.", - "message": "GPS nauwkeurigheid is laag. U kunt blijven wachten op betere nauwkeurigheid, de waarneming opslaan met lage nauwkeurigheid, of handmatig de coördinaten invoeren" + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Wat gebeurt er hier?" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { - "description": "Title of dialog when trying to save with low GPS accuracy.", - "message": "Zwak GPS signaal" + "screens.ObservationEdit.navTitle": { + "description": "screen title for new observation screen", + "message": "Edit Observation" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", - "message": "Waarneming wijzigen" + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "Waarneming" }, - "screens.ObservationEdit.newTitle": { - "description": "screen title for new observation screen", - "message": "Nieuwe waarneming" + "screens.ObservationList.TrackListItem.Track": { + "message": "Track" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "Waarnemingen" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "You are currently mapping on your own." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,32 +907,150 @@ "message": "Waarnemingen toevoegen" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Create or Join a Project" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "Er is een fout bij het laden van de waarnemingen. Probeer Mapeo te sluiten en opnieuw te starten." + "message": "Error loading observations. Try quitting and restarting CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "Bezig te laden… dit kan even duren na het synchroniseren met een nieuw apparaat" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, - "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { - "description": "Placeholder for description/notes field", - "message": "What is happening here?" + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Privacy Policy" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Current Permissions" }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Share Diagnostic Information" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "Annuleren" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Delete Image" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "Delete this photo?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Delete Photo" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "About Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo is developed by Awana Digital, a 501c3 non-profit organization registered in the United States. Awana Digital works in solidarity with frontline communities to use technology to defend their rights and fight climate change." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "App Errors" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Information about internal errors that result in the app not functioning as expected" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "App Info" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "The version and locale (language) of CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "App Usage" + }, + "screens.PrivacyPolicy.control": { + "message": "You're in control" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "You can opt out of sending any information to Awana Digital. You choose where your data is stored and who it is shared with. You may choose to share anonymized, summarized data about how you use CoMapeo with Awana Digital. We will always be transparent about what information you choose to share for the purposed of improving the app, and this information will never include photos, videos, audio, text, or precise locations that you have entered into CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Crash Data" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Information about what caused the app to close unexpectedly" + }, + "screens.PrivacyPolicy.dataCollection": { + "message": "CoMapeo Data Collection" + }, + "screens.PrivacyPolicy.deviceInfo": { + "message": "Device Info" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Such as model and manufacturer of your device; device operating system; screen size; device locale (language); device memory." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnostics" + }, + "screens.PrivacyPolicy.noPII": { + "message": "No personally identifiable information" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "Using CoMapeo does not require a user account. Awana Digital does not collect your name, email address or any other personal details. No permanent user identifier or device identifier is ever shared with Awana Digital, and we take extra measures to ensure that no information you share can be used to track you: identifiers are randomized and rotated (changed) every month and we do not store IP addresses." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "What is not collected?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "We do not collect any personal data or anything that can be used to identify or track a user or device. Device identifiers used to aggregate information are random, anonymous, and changed every month. Diagnostic information does not include data about how you use the app, and it never includes any of the data you have collected with the app. We do not collect your precise or coarse location, only the country where you are using CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Open Source and the \"Official\" Version" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo is an open-source application. This means that anyone can view the code that makes the app work and can verify the privacy declarations in this document. It also means that anyone can adapt the app to their own needs and release an alternative version. This document refers to data collected by the official releases of CoMapeo, digitally signed by Awana Digital, available from the Google Play Store or the Awana Digital website. Unofficial releases of CoMapeo obtained from other channels are outside our control and may share additional information with other organizations." + }, + "screens.PrivacyPolicy.overview": { + "message": "This document describes what information (\"data\") is sent from CoMapeo to the application developer, Awana Digital, and how that information is used." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Performance Data" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Such as launch time, energy usage, app freezes, and responsiveness" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "CoMapeo Data Privacy" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Private by default" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "The data you collect and create with CoMapeo (locations, photos, video, audio, text) is only stored on your device by default, and is not stored or sent anywhere else. When you share data with collaborators by joining a project with them, it is sent encrypted, directly to your collaborators' device. This means that the data is not sent via Awana Digital, nor anyone else, on its way to your collaborator. Awana Digital never sees nor has access to any of the data you collect with CoMapeo unless you explicitly send it to us." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Third-party access to data" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "A \"third-party\" is an organization other than Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "User Counts" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "The number of users per country and per project. Aggregated and anonymized" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "What is collected?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "By default, anonymized diagnostic information about your device, app crashes, errors and performance is shared with Awana Digital. You can opt-out of sharing this information at any time. This diagnostic information is completely anonymized and it never contains any of your data (the data you have collected with CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "Why is this data collected?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Crash data and app errors together with the device and app info provide Awana Digital with the information we need to fix errors and bugs in the app. The performance data helps us improve the responsiveness of the app and identify errors. User counts, including total users, users per country, and users per project, help justify ongoing investment in the development of CoMapeo." + }, + "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Wat gebeurt er hier?" }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", @@ -614,15 +1060,6 @@ "description": "Category title for new track screen", "message": "Track" }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "To use, enable App Passcode" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "Protect your device against seizure" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Obscure Passcode" - }, "screens.Security.passDesriptionPassNotSet": { "message": "Passcode not set" }, @@ -654,7 +1091,7 @@ "message": "Discard Changes" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "Wijzigingen annuleren?" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { "message": "Device Name" @@ -716,6 +1153,21 @@ "screens.Setting.ProjectSettings.YourTeam.title": { "message": "Your Team" }, + "screens.Settings.Config.created": { + "message": "Created {date} at {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Import Config" + }, + "screens.Settings.Config.name": { + "message": "Config Name:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuration" + }, + "screens.Settings.Config.projectName": { + "message": "Project Name:" + }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { "message": "Create a Project" }, @@ -755,14 +1207,17 @@ "screens.Settings.CreateOrJoinProject.importConfig": { "message": "Import Config" }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "File name should end with .comapeocat" + }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Join an existing CoMapeo Project" }, "screens.Settings.CreateOrJoinProject.joinProject": { "message": "Join a Project" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.Settings.CreateOrJoinProject.startProject": { "message": "Start a CoMapeo Project" @@ -788,12 +1243,12 @@ "screens.Settings.YourTeam.unableToCancel": { "message": "Unable to Cancel Invitation" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "Over Mapeo" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "Versie en build nummer" }, "screens.Settings.appSettings": { @@ -803,6 +1258,10 @@ "description": "list of avaialable app settings", "message": "Language, Security, Coordinates" }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Project Configuration" + }, "screens.Settings.createOrJoin": { "message": "Create or Join Project" }, @@ -820,11 +1279,20 @@ "description": "Title of settings screen", "message": "Instellingen" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { "message": "Create or Join Project" }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "You will be able to share data with devices that are part of the same project." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Create or join a project to collect data with a team" }, "screens.Sync.HeaderTitle.noWiFi": { "message": "No WiFi" @@ -838,49 +1306,93 @@ "screens.Sync.NoWifiDisplay.title": { "message": "No WiFi" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "You're all caught up!" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "All data synced" + }, + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Devices available" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Devices found" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "No devices available to sync" + }, + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Syncing…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Waiting…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Waiting for other devices" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Start Sync" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Stop" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Complete! Waiting for other devices to join" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "Complete! You're up to date" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "You are syncing with your team" + }, + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Waiting for devices" + }, + "screens.Track.ObservationList.observations": { + "message": "Waarnemingen" + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "Delete track?" + }, + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Track" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.Track.tracks": { + "message": "Tracks" + }, + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Edit Track" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Track" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", "message": "Show Options" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Leave Project" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Disconnected" }, "sharedComponents.DeviceIconWithName.thisDevice": { "message": "This Device!" }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "Bezig te zoeken…" + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Change" + }, "sharedComponents.ErrorModal.goBack": { "message": "Go Back" }, @@ -894,31 +1406,40 @@ "message": "No GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "Bezig te zoeken…" }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Invite Canceled" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Close" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Your invitation to {projectName} has been canceled." + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { "message": "Accept Invite" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { "message": "Decline Invite" }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "You've been invited to join {projectName}" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Join Project {projectName}" + }, "sharedComponents.ProjectInviteBottomSheet.goToMap": { - "message": "Go To Map" + "message": "Ga naar de kaart" }, "sharedComponents.ProjectInviteBottomSheet.goToSync": { "message": "Go To Sync" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" - }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" - }, "sharedComponents.ProjectInviteBottomSheet.success": { "message": "Success" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "You have joined {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { "message": "Coordinator" diff --git a/messages/oki.json b/messages/oki.json index c43772f58..296dc3711 100644 --- a/messages/oki.json +++ b/messages/oki.json @@ -25,24 +25,12 @@ "description": "Title of dialog that shows when cancelling a new observation", "message": "Toochinee observation?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { "message": "Enable" }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" - }, "Modal.GPSDisable.description": { "message": "To create a Track CoMapeo needs access to your location and GPS." }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" - }, "Modal.GPSDisable.title": { "message": "GPS Disabled" }, @@ -58,6 +46,80 @@ "Modal.GPSEnable.trackingDescription": { "message": "You’ve been recording for" }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "Version and build number" + }, + "Navigation.Drawer.appSettings": { + "message": "App Settings" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Language, Security, Coordinates" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Create or Join Project" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Create a new project or join existing one" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Data & Privacy" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "You are currently mapping on your own" + }, + "Navigation.Drawer.projName": { + "message": "Project {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Project Settings" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categories, Config, Team" + }, + "Navigation.Drawer.security": { + "message": "Security" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "Settings" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Taastay iweechweech" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Discard changes" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Toochinee weecheet?" + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Taastay iweechweech" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Discard Track?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard Track" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Your Track will not be saved. This cannot be undone." + }, "Screens.Settings.AppSettings.coordinateSystem": { "message": "Coordinate System" }, @@ -71,20 +133,51 @@ "message": "Display language for app" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "App Settings" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "Device Name" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Sync Settings" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Project Settings" }, "Screens.Settings.ProjectSettings.yourTeam": { "message": "Your Team" }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "Noomtee" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "Yes, delete" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "Delete" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Share" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Taastay iweechweech" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Toochinee weecheet?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard changes" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { "message": "Coordinator" }, @@ -98,7 +191,7 @@ "message": "Not seeing a Device?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Make sure both devices are on the same version of CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { "message": "Make sure both devices are on the same wifi network" @@ -118,6 +211,38 @@ "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { "message": "Select a Role" }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "CoMapeo build" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "CoMapeo variant" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "CoMapeo version" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Android build number" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Android version" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Phone model" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "About CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Unknown" + }, "screens.AddPhoto.cancel": { "message": "Noomtee" }, @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "Passcode" + "message": "Passcode: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "Save App Passcode" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Make sure to note your passcode in a secure location before saving." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "App Passcodes can never be recovered if lost or forgotten! Make sure to note your passcode in a secure location before saving." + "message": "App Passcodes can never be recovered if lost or forgotten!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "Please Enter Passcode" @@ -168,7 +296,7 @@ "message": "Incorrect Passcode" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "This passcode will be required to open the Mapeo App" + "message": "This passcode will be required to open the CoMapeo App" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { "message": "Confirm Passcode" @@ -183,10 +311,10 @@ "message": "What is App Passcode?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app. You can define your own 5-digit passcode by turning on the feature below." + "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**Please note that forgotten passcodes cannot be recovered!** Once this feature is enabled, if you forget or lose your passcode, you will not be able to open Mapeo and will lose access to any Mapeo data that has not been synced with other project participants." + "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "Noomtee" @@ -198,7 +326,7 @@ "message": "You are currently using App Passcode. See below to stop using or change your passcode." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app." + "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "App Passcode" @@ -212,6 +340,26 @@ "screens.AppPasscode.TurnOffPasscode.usePasscode": { "message": "Use App Passcode" }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Allow" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Go to Settings" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Not Now" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "To record audio while using the app and in the background CoMapeo needs to access your microphone. Please enable microphone permissions in your app settings." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Recording Audio with CoMapeo" + }, "screens.CameraScreen.goToSettings": { "message": "Go to Settings" }, @@ -238,12 +386,63 @@ "description": "Universal Transverse Mercator coordinate format", "message": "Universal Transverse Mercator (UTM)" }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "Anonymized information about your device, app crashes, errors and performance helps Awana Digital improve the app and fix errors." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Diagnostic Information" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Data & Privacy" + }, + "screens.DataAndPrivacy.noPII": { + "message": "This never includes any of your data or personal information." + }, + "screens.DataAndPrivacy.optOut": { + "message": "You can opt-out of sharing diagnostic information at any time." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo Respects Your Privacy & Autonomy" + }, + "screens.DataPrivacy.description": { + "message": "CoMapeo allows you and your collaborators to map offline without needing servers." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Private by default — diagnostic information is fully anonymized and you can opt-out any time." + }, + "screens.DataPrivacy.encrypted": { + "message": "All data stays fully encrypted" + }, + "screens.DataPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Easily manage and control sharing and collaboration." + }, + "screens.DataPrivacy.next": { + "message": "Next" + }, + "screens.DataPrivacy.stays": { + "message": "Your data stays on your devices." + }, + "screens.DataPrivacy.title": { + "message": "Data & Privacy" + }, "screens.DeviceNaming.Success.description": { "message": "You named your device" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "To find your project settings go to the main menu found on the map screen." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Go to Map" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." + }, "screens.DeviceNaming.Success.success": { "message": "Success!" }, @@ -251,7 +450,7 @@ "message": "Add Name" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." }, "screens.DeviceNaming.header": { "message": "Add a name for your device" @@ -268,24 +467,79 @@ "screens.FatalError.somethingWrong": { "message": "Something Went Wrong" }, + "screens.HowToLeaveProject.goBack": { + "message": "Go back" + }, + "screens.HowToLeaveProject.howTo": { + "message": "How to Leave Project" + }, + "screens.HowToLeaveProject.instructions": { + "message": "To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device." + }, + "screens.HowToLeaveProject.warning": { + "message": "If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!" + }, "screens.IntroToCoMapeo.collaborate": { - "message": "Collaborate on mapping and monitoring projects" + "message": "Collaborate with others" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Designed with and for Indigenous peoples & frontline communities" }, "screens.IntroToCoMapeo.getStarted": { "message": "Get Started" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "is now" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Map anywhere and everywhere" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Map your world, together" + }, + "screens.IntroToCoMapeo.ownData": { + "message": "Own and control your data" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", "message": "Language" }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "You are already on a project" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Go Back" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Leave Current Project" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "To join a new project you must leave your current one." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "You are on {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "Noomtee" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Please check the box to confirm" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "I understand I will be deleting all data from Project {projectName} from my device." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "I understand I will be deleting all data from my device." + }, + "screens.LeaveProject.leaveProj": { + "message": "Leave Project" + }, + "screens.LeaveProject.leavingProject": { + "message": "Leaving Project {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "This will remove all Project {projectName}'s data from your device." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "This will remove all of the data from your device." + }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", "message": "Details" @@ -437,11 +691,50 @@ "screens.ManualGpsScreen.zoneNumber": { "message": "Zone Number" }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "Noomtee" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sync Everything" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "Sync Everything?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Your device will sync all content at full size, including photos, audio, and videos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "You are about to sync everything. This may increase the disk space used on your device." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Note: This will use more storage." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "You will no longer sync Audio or Video." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Sync Previews (Photos Only)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Sync Previews" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "Sync Previews?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Photos will sync at a reduced smaller size. Device will not sync audio or video." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Your device will keep all existing data but new observations will sync in a smaller, preview size." + }, + "screens.MediaSyncSettings.title": { + "message": "Sync Settings" + }, "screens.ObscurePasscode.description": { - "message": "Obscure Passcode is a security feature that allows you to open Mapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of Mapeo which allows you to create demonstration observations that are not saved to the Mapeo database." + "message": "Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database." }, "screens.ObscurePasscode.instructions": { - "message": "Enter the code above to hide your data in Mapeo" + "message": "Enter the code above to hide your data in CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Obscure Passcode" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "What is Obscure Passcode?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "Change" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "Observation" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "Delete" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "Observation" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Share" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "Noomtee" }, + "screens.Observation.comapeoAlert": { + "message": "CoMapeo Alert" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "Yes, delete" @@ -483,10 +776,71 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "Delete observation?" }, + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", + "message": "Observation" + }, + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Sharing image" + }, + "screens.Observation.shareMessageFooter": { + "message": "Sent from CoMapeo" + }, + "screens.Observation.shareMessageTitle": { + "message": "CoMapeo Alert" + }, + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Sharing text" + }, "screens.Observation.title": { "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", "message": "Observation" }, + "screens.ObservationCreate.changePreset": { + "message": "Change" + }, + "screens.ObservationCreate.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "What is happening here?" + }, + "screens.ObservationCreate.keepWaiting": { + "description": "Button to cancel save and continue waiting for GPS", + "message": "Continue waiting" + }, + "screens.ObservationCreate.manualEntry": { + "description": "Button to manually enter GPS coordinates", + "message": "Manual Coords" + }, + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "New Observation" + }, + "screens.ObservationCreate.noGpsDesc": { + "description": "Description in dialog when trying to save with no GPS coords", + "message": "This observation does not have a location. You can continue waiting for a GPS signal, save the observation without a location, or enter coordinates manually" + }, + "screens.ObservationCreate.noGpsTitle": { + "description": "Title of dialog when trying to save with no GPS coords", + "message": "No GPS signal" + }, + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "Observation" + }, + "screens.ObservationCreate.saveAnyway": { + "description": "Button to save regardless of GPS state", + "message": "Save" + }, + "screens.ObservationCreate.weakGpsDesc": { + "description": "Description in dialog when trying to save with low GPS accuracy.", + "message": "GPS accuracy is low. You can continue waiting for better accuracy, save the observation with low accuracy, or enter coordinates manually" + }, + "screens.ObservationCreate.weakGpsTitle": { + "description": "Title of dialog when trying to save with low GPS accuracy.", + "message": "Weak GPS signal" + }, "screens.ObservationDetails.done": { "description": "Button text when all questions are complete", "message": "Done" @@ -499,10 +853,6 @@ "description": "Title of observation details screen showing question number and total", "message": "Question {current} of {total}" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "Add…" - }, "screens.ObservationEdit.ObservationEditView.audioButton": { "description": "Button label for adding audio", "message": "Audio" @@ -519,52 +869,30 @@ "description": "Button label for adding photo", "message": "Photo" }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "Cheeng'…" - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { - "description": "Button to cancel save and continue waiting for GPS", - "message": "Continue waiting" - }, - "screens.ObservationEdit.SaveButton.manualEntry": { - "description": "Button to manually enter GPS coordinates", - "message": "Manual Coords" - }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { - "description": "Description in dialog when trying to save with no GPS coords", - "message": "This observation does not have a location. You can continue waiting for a GPS signal, save the observation without a location, or enter coordinates manually" - }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { - "description": "Title of dialog when trying to save with no GPS coords", - "message": "No GPS signal" - }, - "screens.ObservationEdit.SaveButton.saveAnyway": { - "description": "Button to save regardless of GPS state", - "message": "Save" - }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { - "description": "Description in dialog when trying to save with low GPS accuracy.", - "message": "GPS accuracy is low. You can continue waiting for better accuracy, save the observation with low accuracy, or enter coordinates manually" + "screens.ObservationEdit.changePreset": { + "message": "Change" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { - "description": "Title of dialog when trying to save with low GPS accuracy.", - "message": "Weak GPS signal" + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "What is happening here?" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", + "screens.ObservationEdit.navTitle": { + "description": "screen title for new observation screen", "message": "Edit Observation" }, - "screens.ObservationEdit.newTitle": { - "description": "screen title for new observation screen", - "message": "New Observation" + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "Observation" + }, + "screens.ObservationList.TrackListItem.Track": { + "message": "Track" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "Observations" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "You are currently mapping on your own." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,33 +907,151 @@ "message": "Add Observations" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Create or Join a Project" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "Error loading observations. Try quitting and restarting Mapeo." + "message": "Error loading observations. Try quitting and restarting CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "Loading… this can take a while after synchronizing with a new device" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Current Permissions" + }, + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Share Diagnostic Information" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "Noomtee" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Delete Image" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "Delete this photo?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Delete Photo" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "About Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo is developed by Awana Digital, a 501c3 non-profit organization registered in the United States. Awana Digital works in solidarity with frontline communities to use technology to defend their rights and fight climate change." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "App Errors" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Information about internal errors that result in the app not functioning as expected" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "App Info" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "The version and locale (language) of CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "App Usage" + }, + "screens.PrivacyPolicy.control": { + "message": "You're in control" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "You can opt out of sending any information to Awana Digital. You choose where your data is stored and who it is shared with. You may choose to share anonymized, summarized data about how you use CoMapeo with Awana Digital. We will always be transparent about what information you choose to share for the purposed of improving the app, and this information will never include photos, videos, audio, text, or precise locations that you have entered into CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Crash Data" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Information about what caused the app to close unexpectedly" + }, + "screens.PrivacyPolicy.dataCollection": { + "message": "CoMapeo Data Collection" + }, + "screens.PrivacyPolicy.deviceInfo": { + "message": "Device Info" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Such as model and manufacturer of your device; device operating system; screen size; device locale (language); device memory." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnostics" + }, + "screens.PrivacyPolicy.noPII": { + "message": "No personally identifiable information" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "Using CoMapeo does not require a user account. Awana Digital does not collect your name, email address or any other personal details. No permanent user identifier or device identifier is ever shared with Awana Digital, and we take extra measures to ensure that no information you share can be used to track you: identifiers are randomized and rotated (changed) every month and we do not store IP addresses." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "What is not collected?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "We do not collect any personal data or anything that can be used to identify or track a user or device. Device identifiers used to aggregate information are random, anonymous, and changed every month. Diagnostic information does not include data about how you use the app, and it never includes any of the data you have collected with the app. We do not collect your precise or coarse location, only the country where you are using CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Open Source and the \"Official\" Version" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo is an open-source application. This means that anyone can view the code that makes the app work and can verify the privacy declarations in this document. It also means that anyone can adapt the app to their own needs and release an alternative version. This document refers to data collected by the official releases of CoMapeo, digitally signed by Awana Digital, available from the Google Play Store or the Awana Digital website. Unofficial releases of CoMapeo obtained from other channels are outside our control and may share additional information with other organizations." + }, + "screens.PrivacyPolicy.overview": { + "message": "This document describes what information (\"data\") is sent from CoMapeo to the application developer, Awana Digital, and how that information is used." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Performance Data" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Such as launch time, energy usage, app freezes, and responsiveness" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "CoMapeo Data Privacy" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Private by default" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "The data you collect and create with CoMapeo (locations, photos, video, audio, text) is only stored on your device by default, and is not stored or sent anywhere else. When you share data with collaborators by joining a project with them, it is sent encrypted, directly to your collaborators' device. This means that the data is not sent via Awana Digital, nor anyone else, on its way to your collaborator. Awana Digital never sees nor has access to any of the data you collect with CoMapeo unless you explicitly send it to us." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Third-party access to data" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "A \"third-party\" is an organization other than Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "User Counts" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "The number of users per country and per project. Aggregated and anonymized" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "What is collected?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "By default, anonymized diagnostic information about your device, app crashes, errors and performance is shared with Awana Digital. You can opt-out of sharing this information at any time. This diagnostic information is completely anonymized and it never contains any of your data (the data you have collected with CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "Why is this data collected?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Crash data and app errors together with the device and app info provide Awana Digital with the information we need to fix errors and bugs in the app. The performance data helps us improve the responsiveness of the app and identify errors. User counts, including total users, users per country, and users per project, help justify ongoing investment in the development of CoMapeo." }, "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { "description": "Placeholder for description/notes field", "message": "What is happening here?" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" - }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" - }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", "message": "New Track" @@ -614,15 +1060,6 @@ "description": "Category title for new track screen", "message": "Track" }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "To use, enable App Passcode" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "Protect your device against seizure" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Obscure Passcode" - }, "screens.Security.passDesriptionPassNotSet": { "message": "Passcode not set" }, @@ -654,7 +1091,7 @@ "message": "Discard Changes" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "Toochinee weecheet?" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { "message": "Device Name" @@ -716,6 +1153,21 @@ "screens.Setting.ProjectSettings.YourTeam.title": { "message": "Your Team" }, + "screens.Settings.Config.created": { + "message": "Created {date} at {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Import Config" + }, + "screens.Settings.Config.name": { + "message": "Config Name:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuration" + }, + "screens.Settings.Config.projectName": { + "message": "Project Name:" + }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { "message": "Create a Project" }, @@ -755,14 +1207,17 @@ "screens.Settings.CreateOrJoinProject.importConfig": { "message": "Import Config" }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "File name should end with .comapeocat" + }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Join an existing CoMapeo Project" }, "screens.Settings.CreateOrJoinProject.joinProject": { "message": "Join a Project" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.Settings.CreateOrJoinProject.startProject": { "message": "Start a CoMapeo Project" @@ -788,12 +1243,12 @@ "screens.Settings.YourTeam.unableToCancel": { "message": "Unable to Cancel Invitation" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "Wunee Mapeo" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "Version and build number" }, "screens.Settings.appSettings": { @@ -803,6 +1258,10 @@ "description": "list of avaialable app settings", "message": "Language, Security, Coordinates" }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Project Configuration" + }, "screens.Settings.createOrJoin": { "message": "Create or Join Project" }, @@ -820,11 +1279,20 @@ "description": "Title of settings screen", "message": "Settings" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { "message": "Create or Join Project" }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "You will be able to share data with devices that are part of the same project." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Create or join a project to collect data with a team" }, "screens.Sync.HeaderTitle.noWiFi": { "message": "No WiFi" @@ -838,49 +1306,93 @@ "screens.Sync.NoWifiDisplay.title": { "message": "No WiFi" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "You're all caught up!" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "All data synced" + }, + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Devices available" + }, + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Devices found" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "No devices available to sync" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Syncing…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Waiting…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Waiting for other devices" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Start Sync" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Stop" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Complete! Waiting for other devices to join" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "Complete! You're up to date" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "You are syncing with your team" + }, + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Waiting for devices" + }, + "screens.Track.ObservationList.observations": { + "message": "Observations" + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "Delete track?" + }, + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Track" + }, + "screens.Track.tracks": { + "message": "Tracks" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Edit Track" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Track" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", "message": "Show Options" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Leave Project" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Disconnected" }, "sharedComponents.DeviceIconWithName.thisDevice": { "message": "This Device!" }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "Cheeng'…" + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Change" + }, "sharedComponents.ErrorModal.goBack": { "message": "Go Back" }, @@ -894,31 +1406,40 @@ "message": "No GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "Cheeng'…" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Invite Canceled" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Close" }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Your invitation to {projectName} has been canceled." + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { "message": "Accept Invite" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { "message": "Decline Invite" }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "You've been invited to join {projectName}" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Join Project {projectName}" + }, "sharedComponents.ProjectInviteBottomSheet.goToMap": { "message": "Go To Map" }, "sharedComponents.ProjectInviteBottomSheet.goToSync": { "message": "Go To Sync" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" - }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" - }, "sharedComponents.ProjectInviteBottomSheet.success": { "message": "Success" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "You have joined {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { "message": "Coordinator" diff --git a/messages/pt.json b/messages/pt.json index c5dc86224..0d283c302 100644 --- a/messages/pt.json +++ b/messages/pt.json @@ -5,10 +5,10 @@ }, "AppContainer.EditHeader.discardChangesButton": { "description": "Title of dialog that shows when cancelling observation edits", - "message": "Discard changes" + "message": "Descartar alterações" }, "AppContainer.EditHeader.discardChangesDescription": { - "message": "Your changes will not be saved. This cannot be undone." + "message": "Suas alterações não serão salvas. Isso não poderá ser desfeito." }, "AppContainer.EditHeader.discardChangesTitle": { "description": "Title of dialog that shows when cancelling observation edits", @@ -16,50 +16,112 @@ }, "AppContainer.EditHeader.discardObservationButton": { "description": "Title of dialog that shows when cancelling observation edits", - "message": "Discard Observation" + "message": "Excluir observação" }, "AppContainer.EditHeader.discardObservationDescription": { - "message": "Your Observation will not be saved. This cannot be undone." + "message": "Suas observações não serão salvas. Isso não poderá ser desfeito." }, "AppContainer.EditHeader.discardTitle": { "description": "Title of dialog that shows when cancelling a new observation", "message": "Excluir observação?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { - "message": "Enable" - }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" + "message": "Habilitado" }, "Modal.GPSDisable.description": { - "message": "To create a Track CoMapeo needs access to your location and GPS." - }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" + "message": "Para criar uma nova trilha, CoMapeo precisa acessar sua localização e GPS." }, "Modal.GPSDisable.title": { - "message": "GPS Disabled" + "message": "GPS desativado" }, "Modal.GPSEnable.button.default": { - "message": "Start Tracks" + "message": "Iniciar trilha" }, "Modal.GPSEnable.button.loading": { - "message": "Loading…" + "message": "Carregando…" }, "Modal.GPSEnable.button.stop": { - "message": "Stop Tracks" + "message": "Parar trilha" }, "Modal.GPSEnable.trackingDescription": { - "message": "You’ve been recording for" + "message": "Você está gravando há" + }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "Sobre CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "Versão e número do build" + }, + "Navigation.Drawer.appSettings": { + "message": "Configurações do Aplicativo" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Idioma, Segurança, Coordenadas" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Criar ou Juntar-se a um Projeto" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Criar um novo projeto ou se juntar a um já existente" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Dados & Privacidade" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "Agora você está mapeando por contra própria" + }, + "Navigation.Drawer.projName": { + "message": "Projeto {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Configurações do Projeto" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categorias, Configurações, Equipe" + }, + "Navigation.Drawer.security": { + "message": "Segurança" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "Ajustes" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Continuar editando" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Descartar alterações" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Suas alterações não serão salvas. Isso não poderá ser desfeito." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Descartar alterações?" + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Continuar editando" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Excluir trilha?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Excluir trilha" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Sua trilha não será salva. Isso não poderá ser desfeito." }, "Screens.Settings.AppSettings.coordinateSystem": { - "message": "Coordinate System" + "message": "Sistema de Coordenadas" }, "Screens.Settings.AppSettings.coordinateSystemDesc": { "message": "UTM,Lat/Lon,DMS" @@ -68,55 +130,118 @@ "message": "Idioma" }, "Screens.Settings.AppSettings.languageDesc": { - "message": "Display language for app" + "message": "Idioma de exibição do aplicativo" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "Configurações do Aplicativo" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "Nome do dispositivo" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Configurações de Sincronização" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Configurações do Projeto" }, "Screens.Settings.ProjectSettings.yourTeam": { - "message": "Your Team" + "message": "Sua equipe" + }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "Cancelar" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "Sim, excluir" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "Excluir" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Compartilhar" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Continuar editando" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Descartar alterações?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Descartar alterações" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Suas alterações não serão salvas. Isso não poderá ser desfeito." }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { - "message": "Coordinator" + "message": "Coordenador" }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.participant": { - "message": "Participant" + "message": "Participante" }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.sendInvite": { - "message": "Send Invite" + "message": "Enviar convite" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.notSeeingDevice": { - "message": "Not seeing a Device?" + "message": "Não está vendo um dispositivo?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Certifique-se de que os dois dispositivos possuem a mesma versão do CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { - "message": "Make sure both devices are on the same wifi network" + "message": "Certifique-se de que os dois dispositivos estão conectados a mesma rede wifi" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.title": { - "message": "Select Device to Invite" + "message": "Selecione um dispositivo para convidar" }, "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.coordinatorDescription": { - "message": "As a Coordinator this device can invite and remove users, and manage project details." + "message": "Sendo um Coordenador, este dispositivo pode convidar e remover usuários e também gerenciar detalhes do projeto." }, "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.participantDescription": { - "message": "As a Participant this device can take and share observations. They cannot manage users or project details." + "message": "Sendo um Participante, este dispositivo pode fazer e compartilhar observações, mas não pode gerenciar os usuários e os detalhes do projeto." }, "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.selectingDevice": { - "message": "You are selecting a role for this device:" + "message": "Você está selecionando uma função para este dispositivo:" }, "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { - "message": "Select a Role" + "message": "Selecione uma função" + }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "Compilação do CoMapeo" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "Variante do CoMapeo" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "Versão do CoMapeo" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Número de compilação do Android" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Versão do Android" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Modelo do telefone" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "Sobre CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Desconhecido" }, "screens.AddPhoto.cancel": { "message": "Cancelar" @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "Senha" + "message": "Senha: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "Salvar Senha do aplicativo" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Lembre-se de anotar sua senha em um local seguro antes de salvar." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "Se perder ou esquecer a Senha do aplicativo, ela nunca pode ser recuperada! Certifique-se de anotar sua senha em um local seguro antes de salvar." + "message": "As senhas do aplicativo não poderão ser recuperadas se forem perdidas ou esquecidas!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "Por favor insira sua senha" @@ -168,13 +296,13 @@ "message": "Senha incorreta" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "Esta senha será necessária para abrir o Mapeo" + "message": "Esta senha será necessária para abrir o aplicativo CoMapeo" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { - "message": "Confirm Passcode" + "message": "Confirme sua senha" }, "screens.AppPasscode.NewPasscode.SetPasscodeScreen.title": { - "message": "Set Passcode" + "message": "Definir senha" }, "screens.AppPasscode.NewPasscode.Splash.continue": { "message": "Continue" @@ -183,10 +311,10 @@ "message": "O que é Senha do aplicativo?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "A Senha do aplicativo permite que você adicione uma camada adicional de segurança, exigindo que você insira uma senha para abrir o aplicativo Mapeo. Você pode definir sua própria senha de 5 dígitos ativando o recurso abaixo." + "message": "Criar uma senha para utilizar o CoMapeo te oferece mais uma camada de segurança, exigindo que você a insira para abrir o aplicativo. Você pode definir sua própria senha de 5 dígitos ativando o recurso abaixo." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**AVISO: Senhas esquecidas não podem ser recuperadas!** Quando esse recurso estiver ativado, se você esquecer ou perder sua senha, não será capaz de abrir o Mapeo e perderá o acesso a quaisquer dados do Mapeo que não foram sincronizados com outros participantes do projeto." + "message": "Observe que senhas as esquecidas não podem ser recuperadas! Depois que esse recurso estiver habilitado, se você esquecer ou perder sua senha, não poderá abrir o CoMapeo e perderá o acesso a quaisquer dados que não tenham sido sincronizados com outros participantes do mesmo projeto." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "Cancelar" @@ -198,7 +326,7 @@ "message": "Atualmente você está usando a Senha do aplicativo. Veja abaixo para desativar ou alterar sua senha." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "A Senha do aplicativo adiciona uma camada adicional de segurança, exigindo que você insira uma senha para abrir o aplicativo Mapeo." + "message": "A senha do aplicativo adiciona uma camada de segurança ao exigir que você insira sua senha para abrir o aplicativo." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "Senha do aplicativo" @@ -212,11 +340,31 @@ "screens.AppPasscode.TurnOffPasscode.usePasscode": { "message": "Usar Senha do aplicativo" }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Permitir" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Ir para Configurações" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Agora não" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "Para gravar áudio enquanto usa o aplicativo, CoMapeo precisa acessar o seu microfone. Por favor, ative as permissões do microfone nas configurações do seu aplicativo." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Gravando Áudio com CoMapeo" + }, "screens.CameraScreen.goToSettings": { - "message": "Go to Settings" + "message": "Ir para Configurações" }, "screens.CameraScreen.noCameraAccess": { - "message": "No access to camera. Please Allow access in setting" + "message": "Sem acesso à câmera. Por favor, permita o acesso em Configurações" }, "screens.CategoryChooser.categoryTitle": { "description": "Title for category chooser screen", @@ -224,37 +372,88 @@ }, "screens.CoordinateFormat.dd": { "description": "Decimal Degrees coordinate format", - "message": "Decimal Degrees (DD)" + "message": "Graus decimais (DD)" }, "screens.CoordinateFormat.dms": { "description": "Degrees/Minutes/Seconds coordinate format", - "message": "Degrees/Minutes/Seconds (DMS)" + "message": "Graus/Minutos/Segundos (DMS)" }, "screens.CoordinateFormat.title": { "description": "Title coordinate format screen", - "message": "Coordinate Format" + "message": "Formato das coordenadas" }, "screens.CoordinateFormat.utm": { "description": "Universal Transverse Mercator coordinate format", - "message": "Universal Transverse Mercator (UTM)" + "message": "Universal Transversal de Mercator (UTM)" + }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "Informações anônimas sobre seu dispositivo, falhas no aplicativo, erros e desempenho ajudam Awana Digital a melhorar o aplicativo e corrigir erros." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Informação de diagnóstico" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Saiba mais" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Dados & Privacidade" + }, + "screens.DataAndPrivacy.noPII": { + "message": "Isso nunca inclui nenhum de seus dados ou informações pessoais." + }, + "screens.DataAndPrivacy.optOut": { + "message": "Você pode optar por não compartilhar informações de diagnóstico a qualquer momento." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo respeita suas privacidade e autonomia" + }, + "screens.DataPrivacy.description": { + "message": "O CoMapeo permite que você e seus colaboradores mapeiem offline sem precisar de servidores." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Privado por padrão — informações de diagnóstico são totalmente anônimas e você pode optar por sair a qualquer momento." + }, + "screens.DataPrivacy.encrypted": { + "message": "Todos os dados permanecem totalmente criptografados" + }, + "screens.DataPrivacy.learnMore": { + "message": "Saiba mais" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Gerencie e controle facilmente o compartilhamento e a colaboração dos participantes." + }, + "screens.DataPrivacy.next": { + "message": "Próximo" + }, + "screens.DataPrivacy.stays": { + "message": "Seus dados permanecem no seu dispositivo." + }, + "screens.DataPrivacy.title": { + "message": "Dados & Privacidade" }, "screens.DeviceNaming.Success.description": { - "message": "You named your device" + "message": "Você nomeou seu dispositivo" + }, + "screens.DeviceNaming.Success.findSettings": { + "message": "Para encontrar as configurações do seu projeto, vá até o menu principal localizado na tela do mapa." }, "screens.DeviceNaming.Success.goToMap": { - "message": "Go to Map" + "message": "Ir para Mapas" + }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "Você pode começar a mapear sozinho ou com uma equipe. Crie ou junte-se a um projeto para compartilhar dados com outros dispositivos que fazem parte do mesmo projeto." }, "screens.DeviceNaming.Success.success": { - "message": "Success!" + "message": "Sucesso!" }, "screens.DeviceNaming.addName": { - "message": "Add Name" + "message": "Adicionar Nome" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "Você pode começar a mapear sozinho ou com uma equipe. Compartilhe dados com outros dispositivos, criando um novo ou juntando-se ao mesmo projeto." }, "screens.DeviceNaming.header": { - "message": "Add a name for your device" + "message": "Adicione um nome para o seu dispositivo" }, "screens.EnterPassword.enterPass": { "message": "Insira sua senha" @@ -263,124 +462,179 @@ "message": "Senha incorreta. Por favor, tente novamente." }, "screens.FatalError.restart": { - "message": "Restart App" + "message": "Reiniciar aplicativo" }, "screens.FatalError.somethingWrong": { - "message": "Something Went Wrong" + "message": "Ocorreu um erro" + }, + "screens.HowToLeaveProject.goBack": { + "message": "Voltar" + }, + "screens.HowToLeaveProject.howTo": { + "message": "Como sair do projeto" + }, + "screens.HowToLeaveProject.instructions": { + "message": "Para sair deste projeto, desinstale e reinstale o CoMapeo. Todos os dados do projeto serão removidos deste dispositivo." + }, + "screens.HowToLeaveProject.warning": { + "message": "Se você é o único Coordenador no projeto, ninguém mais poderá editar os detalhes do projeto ou convidar outros dispositivos!" }, "screens.IntroToCoMapeo.collaborate": { - "message": "Collaborate on mapping and monitoring projects" + "message": "Colaborar com outros" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Desenvolvido com e para povos indígenas e comunidades que estão na linha de frente" }, "screens.IntroToCoMapeo.getStarted": { - "message": "Get Started" + "message": "Vamos Começar" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "is now" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Mapeie em qualquer lugar e em todos os lugares" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Mapeie o seu mundo de forma colaborativa" + }, + "screens.IntroToCoMapeo.ownData": { + "message": "Controle e seja o dono dos seus dados" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", - "message": "Language" + "message": "Idioma" + }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "Você já está em um projeto" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Voltar" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Sair do projeto atual" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "Para participar de um novo projeto, você deve sair do seu atual." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "Você está no projeto {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "Cancelar" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Por favor, selecione a caixa para confirmar" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "Eu entendo que irei excluir todos os dados do projeto {projectName} do meu dispositivo." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "Eu entendo que irei excluir todos os dados do projeto do meu dispositivo." + }, + "screens.LeaveProject.leaveProj": { + "message": "Sair do Projeto" + }, + "screens.LeaveProject.leavingProject": { + "message": "Saindo do projeto {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "Isso excluirá todos os dados do projeto {projectName} do seu dispositivo." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "Isto removerá todos os dados do seu dispositivo." }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", - "message": "Details" + "message": "Detalhes" }, "screens.LocationInfoScreen.gpsHeader": { "description": "Header for GPS screen", - "message": "Current GPS Location" + "message": "Localização GPS atual" }, "screens.LocationInfoScreen.lastUpdate": { "description": "Section title for time of last GPS update", - "message": "Last update" + "message": "Última atualização" }, "screens.LocationInfoScreen.locationDD": { "description": "Section title for DD coordinates", - "message": "Coordinates Decimal Degrees" + "message": "Coordenadas Graus Decimais" }, "screens.LocationInfoScreen.locationDMS": { "description": "Section title for DMS coordinates", - "message": "Coordinates DMS" + "message": "Coordenadas DMS" }, "screens.LocationInfoScreen.locationSensors": { "description": "Heading for section about location sensor status", - "message": "Sensor Status" + "message": "Status dos sensores" }, "screens.LocationInfoScreen.locationUTM": { "description": "Section title for UTM coordinates", - "message": "Coordinates UTM" + "message": "Coordenadas UTM" }, "screens.LocationInfoScreen.no": { "description": "if a location sensor is active yes/no", - "message": "No" + "message": "Não" }, "screens.LocationInfoScreen.yes": { "description": "if a location sensor is active yes/no", - "message": "Yes" + "message": "Sim" }, "screens.ManualGpsScreen.DdForm.east": { - "message": "East" + "message": "Leste" }, "screens.ManualGpsScreen.DdForm.invalidCoordinates": { - "message": "Invalid coordinates" + "message": "Coordenadas inválidas" }, "screens.ManualGpsScreen.DdForm.latInputLabel": { - "message": "Latitude value" + "message": "Valor da latitude" }, "screens.ManualGpsScreen.DdForm.latitude": { "message": "Latitude" }, "screens.ManualGpsScreen.DdForm.lonInputLabel": { - "message": "Longitude value" + "message": "Valor da longitude" }, "screens.ManualGpsScreen.DdForm.longitude": { "message": "Longitude" }, "screens.ManualGpsScreen.DdForm.north": { - "message": "North" + "message": "Norte" }, "screens.ManualGpsScreen.DdForm.selectLatCardinality": { - "message": "Select latitude cardinality" + "message": "Selecionar cardinalidade de latitude" }, "screens.ManualGpsScreen.DdForm.selectLonCardinality": { - "message": "Select longitude cardinality" + "message": "Selecionar cardinalidade de longitude" }, "screens.ManualGpsScreen.DdForm.south": { - "message": "South" + "message": "Sul" }, "screens.ManualGpsScreen.DdForm.west": { - "message": "West" + "message": "Oeste" }, "screens.ManualGpsScreen.DmsForm.DmsInputGroup.MinutesInputLabel": { - "message": "{field} minutes input" + "message": "Entrada de {field} minutos" }, "screens.ManualGpsScreen.DmsForm.DmsInputGroup.SecondsInputLabel": { - "message": "{field} seconds input" + "message": "Entrada em {field} segundos" }, "screens.ManualGpsScreen.DmsForm.DmsInputGroup.degrees": { - "message": "Degrees" + "message": "Graus" }, "screens.ManualGpsScreen.DmsForm.DmsInputGroup.degreesInputLabel": { - "message": "{field} degrees input" + "message": "Entrada de {field} graus" }, "screens.ManualGpsScreen.DmsForm.DmsInputGroup.direction": { - "message": "Direction" + "message": "Direção" }, "screens.ManualGpsScreen.DmsForm.DmsInputGroup.minutes": { - "message": "Minutes" + "message": "Minutos" }, "screens.ManualGpsScreen.DmsForm.DmsInputGroup.seconds": { - "message": "Seconds" + "message": "Segundos" }, "screens.ManualGpsScreen.DmsForm.east": { - "message": "East" + "message": "Leste" }, "screens.ManualGpsScreen.DmsForm.invalidCoordinates": { - "message": "Invalid coordinates" + "message": "Coordenadas inválidas" }, "screens.ManualGpsScreen.DmsForm.latitude": { "message": "Latitude" @@ -389,59 +643,98 @@ "message": "Longitude" }, "screens.ManualGpsScreen.DmsForm.north": { - "message": "North" + "message": "Norte" }, "screens.ManualGpsScreen.DmsForm.selectLatCardinality": { - "message": "Select latitude cardinality" + "message": "Selecionar cardinalidade de latitude" }, "screens.ManualGpsScreen.DmsForm.south": { - "message": "South" + "message": "Sul" }, "screens.ManualGpsScreen.DmsForm.west": { - "message": "West" + "message": "Oeste" }, "screens.ManualGpsScreen.coordinateFormat": { - "message": "Coordinate Format" + "message": "Formato das coordenadas" }, "screens.ManualGpsScreen.decimalDegrees": { - "message": "Decimal Degrees (DD)" + "message": "Graus decimais (DD)" }, "screens.ManualGpsScreen.degreesMinutesSeconds": { - "message": "Degrees/Minutes/Seconds (DMS)" + "message": "Graus/Minutos/Segundos (DMS)" }, "screens.ManualGpsScreen.easting": { - "message": "East" + "message": "Leste" }, "screens.ManualGpsScreen.eastingSuffix": { "message": "mE" }, "screens.ManualGpsScreen.invalidCoordinates": { - "message": "Invalid coordinates. Latitude must be between -90 and 90. Longitude must be between -180 and 180" + "message": "Coordenadas inválidas. A Latitude deve estar entre -90 e 90. A Longitude deve estar entre -180 e 180" }, "screens.ManualGpsScreen.northing": { - "message": "North" + "message": "Norte" }, "screens.ManualGpsScreen.northingSuffix": { "message": "mN" }, "screens.ManualGpsScreen.title": { "description": "title of manual GPS screen", - "message": "Enter coordinates" + "message": "Inserir coordenadas" }, "screens.ManualGpsScreen.universalTransverseMercator": { - "message": "Universal Transverse Mercator (UTM)" + "message": "Universal Transversal de Mercator (UTM)" }, "screens.ManualGpsScreen.zoneLetter": { - "message": "Zone Letter" + "message": "Letra da zona" }, "screens.ManualGpsScreen.zoneNumber": { - "message": "Zone Number" + "message": "Número do fuso" + }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "Cancelar" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sincronizar tudo" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "Sincronizar tudo?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Seu dispositivo irá sincronizar todos os conteúdos, incluindo fotos, áudio e vídeos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "Você está prestes a sincronizar todas as informações. Isso pode aumentar o espaço ocupado na memória do seu dispositivo." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Nota: Isso usará mais armazenamento do seu dispositivo." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "Você não sincronizará mais áudios ou vídeos." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Pré-visualizações de Sincronização (Apenas Fotos)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Pré-visualizações de Sincronização" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "Pré-visualizações de Sincronização?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Fotos serão sincronizadas em um tamanho menor. Dispositivo não sincronizará áudio ou vídeo." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Seu dispositivo manterá todos os dados já existentes, mas as novas observações serão sincronizadas em uma visualização menor." + }, + "screens.MediaSyncSettings.title": { + "message": "Configurações de Sincronização" }, "screens.ObscurePasscode.description": { - "message": "A Senha obscura é um recurso de segurança que permite abrir o Mapeo em um modo que oculta todos os seus dados. Inserindo a Senha obscura na tela inicial exibirá uma versão vazia do Mapeo que permite que você crie observações de demonstração que não são salvas no banco de dados do Mapeo." + "message": "A senha secreta é um recurso de segurança que permite abrir o CoMapeo em um modo que oculta todos os seus dados. Digitar essa senha secreta na tela de início do app exibirá uma versão vazia do CoMapeo, permitindo que você crie observações de demonstração que não são salvas no banco de dados do CoMapeo." }, "screens.ObscurePasscode.instructions": { - "message": "Insira a senha acima para ocultar seus dados no Mapeo" + "message": "Insira o código acima para ocultar seus dados no CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Senha obscura" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "O que é Senha obscura?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "Mudar" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "Observação" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "Excluir" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "Observação" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Compartilhar" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "Cancelar" }, + "screens.Observation.comapeoAlert": { + "message": "Alerta CoMapeo" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "Sim, excluir" @@ -483,88 +776,123 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "Excluir observação?" }, - "screens.Observation.title": { - "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", "message": "Observação" }, - "screens.ObservationDetails.done": { - "description": "Button text when all questions are complete", - "message": "Done" + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Compartilhando imagem" }, - "screens.ObservationDetails.nextQuestion": { - "description": "Button text to navigate to next question", - "message": "Next" + "screens.Observation.shareMessageFooter": { + "message": "Enviado pelo CoMapeo" }, - "screens.ObservationDetails.title": { - "description": "Title of observation details screen showing question number and total", - "message": "Question {current} of {total}" + "screens.Observation.shareMessageTitle": { + "message": "Alerta CoMapeo" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "Adicionar…" + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Compartilhando texto" }, - "screens.ObservationEdit.ObservationEditView.audioButton": { - "description": "Button label for adding audio", - "message": "Audio" + "screens.Observation.title": { + "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", + "message": "Observação" }, - "screens.ObservationEdit.ObservationEditView.descriptionPlaceholder": { + "screens.ObservationCreate.changePreset": { + "message": "Alterar" + }, + "screens.ObservationCreate.descriptionPlaceholder": { "description": "Placeholder for description/notes field", "message": "O que está acontecendo aqui?" }, - "screens.ObservationEdit.ObservationEditView.detailsButton": { - "description": "Button label to add details", - "message": "Details" - }, - "screens.ObservationEdit.ObservationEditView.photoButton": { - "description": "Button label for adding photo", - "message": "Photo" - }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "Procurando…" - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { + "screens.ObservationCreate.keepWaiting": { "description": "Button to cancel save and continue waiting for GPS", "message": "Continuar aguardando" }, - "screens.ObservationEdit.SaveButton.manualEntry": { + "screens.ObservationCreate.manualEntry": { "description": "Button to manually enter GPS coordinates", "message": "Inserir manualmente" }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "Nova observação" + }, + "screens.ObservationCreate.noGpsDesc": { "description": "Description in dialog when trying to save with no GPS coords", "message": "Esta observação não tem localização. Você pode continuar esperando um sinal GPS, salvar a observação sem localização, ou inserir coordenadas manualmente" }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { + "screens.ObservationCreate.noGpsTitle": { "description": "Title of dialog when trying to save with no GPS coords", "message": "Sem sinal GPS" }, - "screens.ObservationEdit.SaveButton.saveAnyway": { + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "Observação" + }, + "screens.ObservationCreate.saveAnyway": { "description": "Button to save regardless of GPS state", "message": "Salvar" }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { + "screens.ObservationCreate.weakGpsDesc": { "description": "Description in dialog when trying to save with low GPS accuracy.", "message": "A precisão do GPS está baixa. Você pode continuar esperando uma melhor precisão, salvar a observação com baixa precisão ou inserir coordenadas manualmente" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { + "screens.ObservationCreate.weakGpsTitle": { "description": "Title of dialog when trying to save with low GPS accuracy.", "message": "Sinal GPS fraco" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", - "message": "Editar observação" + "screens.ObservationDetails.done": { + "description": "Button text when all questions are complete", + "message": "Concluído" + }, + "screens.ObservationDetails.nextQuestion": { + "description": "Button text to navigate to next question", + "message": "Próximo" + }, + "screens.ObservationDetails.title": { + "description": "Title of observation details screen showing question number and total", + "message": "Pergunta {current} de {total}" + }, + "screens.ObservationEdit.ObservationEditView.audioButton": { + "description": "Button label for adding audio", + "message": "Áudio" }, - "screens.ObservationEdit.newTitle": { + "screens.ObservationEdit.ObservationEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "O que está acontecendo aqui?" + }, + "screens.ObservationEdit.ObservationEditView.detailsButton": { + "description": "Button label to add details", + "message": "Detalhes" + }, + "screens.ObservationEdit.ObservationEditView.photoButton": { + "description": "Button label for adding photo", + "message": "Foto" + }, + "screens.ObservationEdit.changePreset": { + "message": "Alterar" + }, + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "O que está acontecendo aqui?" + }, + "screens.ObservationEdit.navTitle": { "description": "screen title for new observation screen", - "message": "Nova observação" + "message": "Editar Observação" + }, + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "Observação" + }, + "screens.ObservationList.TrackListItem.Track": { + "message": "Trilha" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "Observações" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "Agora você está mapeando por contra própria." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,49 +907,158 @@ "message": "Adicionar observações" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Criar ou Participar de um Projeto" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "Erro ao carregar observações. Tente sair e reiniciar o Mapeo." + "message": "Erro ao carregar observações. Tente sair e reiniciar o CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "Carregando... pode demorar um pouco após a sincronização com um novo dispositivo" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "para coletar dados com uma equipe. Esta ação apagará todas as observações que você coletou até agora. Considere compartilhar {icon} observações importantes em seu e-mail antes de continuar." }, - "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { - "description": "Placeholder for description/notes field", - "message": "What is happening here?" + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Política de Privacidade" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Permissões atuais" + }, + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Compartilhar Informações de Diagnóstico" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "Cancelar" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Excluir imagem" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "Excluir esta foto?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Excluir Foto" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "Sobre Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo é desenvolvido por Awana Digital, uma organização sem fins lucrativos registrada conforme lei 501c3 nos Estados Unidos. Awana Digital trabalha em conjunto com as comunidades que estão na linha de frente, para que utilizem a tecnologia na defesa dos seus direitos e na luta contra as mudanças climáticas." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "Erros do aplicativo" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Informações sobre erros internos que fazem com que o aplicativo não funcione conforme o esperado" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "Informações do aplicativo" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "A versão e idioma do CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "Uso do aplicativo" + }, + "screens.PrivacyPolicy.control": { + "message": "Você está no controle" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "Você pode optar por não enviar nenhuma informação para a Awana Digital. Você escolhe onde seus dados são armazenados e com quem eles são compartilhados. Você pode escolher compartilhar dados anônimos sobre como você usa o CoMapeo com a Awana Digital. Nós sempre seremos transparentes sobre quais informações você escolhe compartilhar, com o propósito de melhorar o aplicativo, e essas informações nunca incluirão fotos, vídeos, áudio, texto ou localizações precisas que você inseriu no CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Dados quebrados" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Informações sobre o que fez o aplicativo fechar inesperadamente" + }, + "screens.PrivacyPolicy.dataCollection": { + "message": "Coleta de dados do CoMapeo" }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" + "screens.PrivacyPolicy.deviceInfo": { + "message": "Informações do Dispositivo" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Como modelo e fabricante do seu dispositivo; sistema operacional do dispositivo; tamanho da tela; localidade do dispositivo (idioma); memória do dispositivo." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnósticos" + }, + "screens.PrivacyPolicy.noPII": { + "message": "Nenhuma informação pessoal identificada" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "Para usar o CoMapeo não é necessário criar uma conta de usuário. A Awana Digital não coleta seu nome, e-mail ou quaisquer outros dados pessoais. Nenhuma chave de usuário ou chave de dispositivo é compartilhada com Awana Digital, e tomamos medidas adicionais para garantir que nenhuma informação compartilhada possa ser usada para rastrear você: as chaves são aleatórios e alteradas a cada mês e nós não armazenamos endereços IP." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "O que não é coletado?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "Nós não coletamos nenhum dado pessoal ou nada que possa ser usado para identificar ou rastrear um usuário ou dispositivo. As chaves de dispositivos utilizadas para agregar informações, são aleatórias anônimas e modificadas todo mês. Informações de diagnóstico não incluem dados sobre como você usa o aplicativo e nem outros dados coletados durante seu uso. Também não coletamos informações sobre sua localização exata, apenas o país onde você usa o CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Código Aberto e a Versão \"Oficial\"" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo é um aplicativo de código aberto. Isso significa que qualquer pessoa pode ver o código que faz o aplicativo funcionar e pode verificar as declarações de privacidade neste documento. Isso também significa que qualquer pessoa pode adaptar o aplicativo às suas próprias necessidades e lançar uma versão alternativa. Este documento refere-se aos dados coletados pelos lançamentos oficiais do CoMapeo, assinado digitalmente pela Awana Digital, disponível na Google Play Store ou no site da Awana Digital. As versões não-oficiais do CoMapeo obtidas de outros canais estão fora do nosso controle e podem compartilhar informações adicionais com outras organizações." + }, + "screens.PrivacyPolicy.overview": { + "message": "Este documento descreve quais informações (\"dados\") são enviadas do CoMapeo para o desenvolvedor do aplicativo, Awana Digital, e como essas informações são usadas." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Dados de desempenho" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Como o tempo de inicialização, uso de energia, congelamento de aplicativos e capacidade de resposta" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "Privacidade de dados do CoMapeo" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Privado por padrão" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "Os dados que você coleta e cria com o CoMapeo (localizações, fotos, vídeo, áudio, texto) são armazenados apenas no seu dispositivo por padrão e não são armazenados ou enviados para nenhum outro lugar. Quando você compartilha dados com colaboradores ao ingressar em um projeto com eles, eles são enviados criptografados, diretamente para o dispositivo do seu colaborador. Isso significa que os dados não são enviados pela Awana Digital, nem por ninguém mais, a caminho do seu colaborador. A Awana Digital nunca vê nem tem acesso a nenhum dos dados que você coleta com o CoMapeo, a menos que você os envie explicitamente para nós." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Acesso de terceiros aos dados" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "Uma \"organização de terceiros\" é uma que não Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "Contagem de usuários" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "O número de usuários por país e por projeto. Agregado e anônimo" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "O que é coletado?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "Por padrão, informações de diagnóstico anônimas sobre o seu dispositivo, falhas de aplicativos, erros e desempenho são compartilhadas com Awana Digital. Você pode optar por não compartilhar a qualquer momento. Esta informação de diagnóstico é completamente anônima e não contém nenhum de seus dados (aqueles que você coletou no CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "Por que esses dados são coletados?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Dados sobre erros do aplicativo, juntamente com as informações do dispositivo, fornecem à Awana Digital as informações necessárias para corrigir bugs no aplicativo. Os dados de desempenho nos ajudam a melhorar a capacidade de resposta do aplicativo e a identificar erros. A contagem de usuários, incluindo o total de usuários, usuários por país e usuários por projeto, ajuda a justificar o investimento contínuo no desenvolvimento do CoMapeo." + }, + "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "O que está acontecendo aqui?" }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", - "message": "New Track" + "message": "Nova trilha" }, "screens.SaveTrack.track": { "description": "Category title for new track screen", - "message": "Track" - }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "Para usar, ative a Senha do aplicativo" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "Proteja seu dispositivo contra apreensão" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Senha obscura" + "message": "Trilha" }, "screens.Security.passDesriptionPassNotSet": { "message": "Senha não definida" @@ -639,292 +1076,376 @@ "message": "Segurança" }, "screens.Setting.ProjectSettings.DeviceName.DisplayScreen.deviceNameLabel": { - "message": "Your Device Name" + "message": "Nome do seu dispositivo" }, "screens.Setting.ProjectSettings.DeviceName.DisplayScreen.title": { - "message": "Device Name" + "message": "Nome do dispositivo" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.deviceNameLabel": { - "message": "Edit Device Name" + "message": "Editar nome do dispositivo" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertCancelText": { - "message": "Continue Editing" + "message": "Continuar editando" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertConfirmText": { - "message": "Discard Changes" + "message": "Descartar alterações" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "Descartar alterações?" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { - "message": "Device Name" + "message": "Nome do dispositivo" }, "screens.Setting.ProjectSettings.YourTeam.InviteAccepted.addAnotherDevice": { - "message": "Add Another Device" + "message": "Adicionar outro dispositivo" }, "screens.Setting.ProjectSettings.YourTeam.InviteAccepted.close": { - "message": "Close" + "message": "Fechar" }, "screens.Setting.ProjectSettings.YourTeam.InviteAccepted.inviteAccepted": { - "message": "Invite Accepted" + "message": "Convite aceito" }, "screens.Setting.ProjectSettings.YourTeam.NotOnProject.createOrJoin": { - "message": "Create or Join Project" + "message": "Criar ou Juntar-se a um Projeto" }, "screens.Setting.ProjectSettings.YourTeam.NotOnProject.projectNecessary": { - "message": "Create or Join a Project to invite devices" + "message": "Crie ou Participe de um projeto para convidar dispositivos" }, "screens.Setting.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.title": { - "message": "Review Invitation" + "message": "Revisar convite" }, "screens.Setting.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.youAreInviting": { - "message": "You are inviting:" + "message": "Você está convidando:" }, "screens.Setting.ProjectSettings.YourTeam.ReviewAndInvite.title": { - "message": "Review Invitation" + "message": "Revisar convite" }, "screens.Setting.ProjectSettings.YourTeam.WaitingForInviteAccept.cancelInvite": { - "message": "Cancel Invite" + "message": "Cancelar convite" }, "screens.Setting.ProjectSettings.YourTeam.WaitingForInviteAccept.timerMessage": { - "message": "Invite sent {seconds}s ago" + "message": "Convite enviado há {seconds}s" }, "screens.Setting.ProjectSettings.YourTeam.WaitingForInviteAccept.waitingMessage": { - "message": "Waiting for Device to Accept Invite" + "message": "Aguardando o dispositivo aceitar o convite" }, "screens.Setting.ProjectSettings.YourTeam.coordinatorDescription": { - "message": "Coordinators can invite devices, edit and delete data, and manage project details." + "message": "Os coordenadores podem convidar dispositivos, editar e excluir dados e gerenciar detalhes do projeto." }, "screens.Setting.ProjectSettings.YourTeam.coordinators": { - "message": "Coordinators" + "message": "Coordenadores" }, "screens.Setting.ProjectSettings.YourTeam.dateAdded": { - "message": "Date Added" + "message": "Data de inclusão" }, "screens.Setting.ProjectSettings.YourTeam.deviceName": { - "message": "Device Name" + "message": "Nome do dispositivo" }, "screens.Setting.ProjectSettings.YourTeam.inviteDevice": { - "message": "Invite Device" + "message": "Convidar dispositivo" }, "screens.Setting.ProjectSettings.YourTeam.participantDescription": { - "message": "Participants can take and share observations. They cannot manage users or project details." + "message": "Sendo um Participante, este dispositivo pode fazer e compartilhar observações, mas não pode gerenciar os usuários e os detalhes do projeto." }, "screens.Setting.ProjectSettings.YourTeam.participants": { - "message": "Participants" + "message": "Participantes" }, "screens.Setting.ProjectSettings.YourTeam.title": { - "message": "Your Team" + "message": "Sua equipe" + }, + "screens.Settings.Config.created": { + "message": "Criado em {date} {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Importar configuração" + }, + "screens.Settings.Config.name": { + "message": "Nome da configuração:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configurações" + }, + "screens.Settings.Config.projectName": { + "message": "Nome do projeto:" }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { - "message": "Create a Project" + "message": "Criar um Projeto" }, "screens.Settings.CreateOrJoinProject.JoinExistingProject.goBack": { - "message": "Go back" + "message": "Voltar" }, "screens.Settings.CreateOrJoinProject.JoinExistingProject.howTo": { - "message": "How to Join a Project" + "message": "Como participar de um projeto" }, "screens.Settings.CreateOrJoinProject.JoinExistingProject.instructions": { - "message": "To join a project find a Coordinator of the project you wish to join. Tell them your device name and the Coordinator will send you an invite." + "message": "Para participar de um projeto, encontre o Coordenador do projeto que você deseja participar. Diga a eles o nome do seu dispositivo e o Coordenador lhe enviará um convite." }, "screens.Settings.CreateOrJoinProject.ProjectCreated.goToMap": { - "message": "Go to Map" + "message": "Ir para Mapas" }, "screens.Settings.CreateOrJoinProject.ProjectCreated.invitedDevice": { - "message": "Invite Device" + "message": "Convidar dispositivo" }, "screens.Settings.CreateOrJoinProject.ProjectCreated.projectCreated": { - "message": "{projectName} Created!" + "message": "{projectName} criado!" }, "screens.Settings.CreateOrJoinProject.advancedSettings": { - "message": "Advanced Project Settings" + "message": "Configurações Avançadas do Projeto" }, "screens.Settings.CreateOrJoinProject.alreadyOnProject": { - "message": "You are already on a project. To create a new Project you must uninstall and reininstall CoMapeo." + "message": "Você já está em um projeto. Para criar um novo projeto, você deve desinstalar e reinstalar o CoMapeo." }, "screens.Settings.CreateOrJoinProject.createProject": { - "message": "Create a Project" + "message": "Criar um Projeto" }, "screens.Settings.CreateOrJoinProject.createProjectButton": { - "message": "Create Project" + "message": "Criar Projeto" }, "screens.Settings.CreateOrJoinProject.enterName": { - "message": "Enter a name for the Project" + "message": "Digite um nome para o projeto" }, "screens.Settings.CreateOrJoinProject.importConfig": { - "message": "Import Config" + "message": "Importar configuração" + }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "O nome do arquivo deve terminar com .mapeoconfig" }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Junte-se a um projeto existente" }, "screens.Settings.CreateOrJoinProject.joinProject": { - "message": "Join a Project" + "message": "Participe de um projeto" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "Um projeto é um espaço seguro para os seus dados, apenas dispositivos que você convidar podem inserir e compartilhar informações com você. Crie ou participe de projetos para compartilhar dados com outros dispositivos. Esta ação irá apagar as observações que você coletou até agora. Considere compartilhar {icon} observações importantes para seu e-mail antes de continuar." }, "screens.Settings.CreateOrJoinProject.startProject": { - "message": "Start a CoMapeo Project" + "message": "Iniciar um projeto CoMapeo" }, "screens.Settings.CreateOrJoinProject.title": { - "message": "Create or Join" + "message": "Criar ou Juntar-se a um projeto" }, "screens.Settings.CreateOrJoinProject.whatIsAProject": { - "message": "What is a Project" + "message": "O que é um Projeto" }, "screens.Settings.YourTeam.InviteDeclined": { - "message": "Invitation Declined" + "message": "Convite recusado" }, "screens.Settings.YourTeam.close": { - "message": "Close" + "message": "Fechar" }, "screens.Settings.YourTeam.deviceHasJoined": { - "message": "Device Has Joined {projectName}" + "message": "O dispositivo está participando do {projectName}" }, "screens.Settings.YourTeam.inviteDeclinedDes": { - "message": "This device has declined your invitation. They have not joined the project." + "message": "Este dispositivo recusou seu convite. Ele não entrou no projeto." }, "screens.Settings.YourTeam.unableToCancel": { - "message": "Unable to Cancel Invitation" + "message": "Não foi possível cancelar o convite" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "Sobre o Mapeo" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "Sobre o CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "Versão e número do build" }, "screens.Settings.appSettings": { - "message": "App Settings" + "message": "Configurações do Aplicativo" }, "screens.Settings.appSettingsDesc": { "description": "list of avaialable app settings", - "message": "Language, Security, Coordinates" + "message": "Idioma, Segurança, Coordenadas" + }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Configuração do projeto" }, "screens.Settings.createOrJoin": { - "message": "Create or Join Project" + "message": "Criar ou Juntar-se a um Projeto" }, "screens.Settings.createOrJoinDesc": { - "message": "Create a new project or join existing one" + "message": "Criar um novo projeto ou se juntar a um já existente" }, "screens.Settings.projectSettings": { - "message": "Project Settings" + "message": "Configurações do Projeto" }, "screens.Settings.projectSettingsDesc": { "description": "list of avaialable project settings", - "message": "Categories, Config, Team" + "message": "Categorias, Configurações, Equipe" }, "screens.Settings.title": { "description": "Title of settings screen", "message": "Ajustes" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Política de Privacidade" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { - "message": "Create or Join Project" + "message": "Criar ou Juntar-se a um Projeto" + }, + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "Esta ação excluirá as observações que você coletou até agora. Considere compartilhar {icon} observações importantes em seu e-mail antes de continuar." }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "Você poderá compartilhar dados com dispositivos que fazem parte do mesmo projeto." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Crie ou participe de um projeto para coletar dados com uma equipe" }, "screens.Sync.HeaderTitle.noWiFi": { - "message": "No WiFi" + "message": "Sem Wi-Fi" }, "screens.Sync.NoWifiDisplay.buttonText": { - "message": "Open Settings" + "message": "Abrir Configurações" }, "screens.Sync.NoWifiDisplay.description": { - "message": "Open your phone settings and connect to a WiFi network to synchronize" + "message": "Abra as configurações do seu dispositivo e conecte-se a uma rede Wi-Fi para sincronizar" }, "screens.Sync.NoWifiDisplay.title": { - "message": "No WiFi" + "message": "Sem Wi-Fi" + }, + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "Está tudo sincronizado!" + }, + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "Todos os dados foram sincronizados" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Dispositivos disponíveis" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Dispositivos encontrados" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "Não há dispositivos disponíveis para sincronização" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Sincronizando…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Esperando…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Aguardando dispositivos" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Iniciar sincronização" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Parar" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Concluído! Esperando que outros dispositivos participem" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "Completo! Você está atualizado" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "Você está sincronizando com sua equipe" + }, + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Aguardando dispositivos" + }, + "screens.Track.ObservationList.observations": { + "message": "Observações" + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "Excluir trilha?" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Trilha" + }, + "screens.Track.tracks": { + "message": "Trilhas" + }, + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Editar trilha" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Trilha" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", - "message": "Show Options" + "message": "Mostrar opções" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Sair do Projeto" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Desconectado" }, "sharedComponents.DeviceIconWithName.thisDevice": { - "message": "This Device!" + "message": "Este Dispositivo!" + }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "Procurando…" + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Alterar" }, "sharedComponents.ErrorModal.goBack": { - "message": "Go Back" + "message": "Voltar" }, "sharedComponents.ErrorModal.somethingWrong": { - "message": "Something Went Wrong" + "message": "Ocorreu um erro" }, "sharedComponents.ErrorModal.tryAgain": { - "message": "Try Again" + "message": "Tente novamente" }, "sharedComponents.GpsPill.noGps": { - "message": "No GPS" + "message": "Sem GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "Procurando…" }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { - "message": "Accept Invite" + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Convite cancelado" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { - "message": "Decline Invite" + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Fechar" }, - "sharedComponents.ProjectInviteBottomSheet.goToMap": { - "message": "Go To Map" + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Seu convite para {projectName} foi cancelado." }, - "sharedComponents.ProjectInviteBottomSheet.goToSync": { - "message": "Go To Sync" + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { + "message": "Aceitar Convite" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { + "message": "Recusar convite" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "Você foi convidado a juntar-se a {projectName}" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Entrar no projeto {projectName}" }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" + "sharedComponents.ProjectInviteBottomSheet.goToMap": { + "message": "Ir para mapa" + }, + "sharedComponents.ProjectInviteBottomSheet.goToSync": { + "message": "Ir para Sincronização" }, "sharedComponents.ProjectInviteBottomSheet.success": { - "message": "Success" + "message": "Sucesso" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "Você está no projeto {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { - "message": "Coordinator" + "message": "Coordenador" }, "sharedComponents.RoleWithIcon.participant": { - "message": "Participant" + "message": "Participante" }, "sharedComponents.WifiBar.noWifi": { "message": "Sem internet" diff --git a/messages/si.json b/messages/si.json index 055045021..8427ccedd 100644 --- a/messages/si.json +++ b/messages/si.json @@ -25,24 +25,12 @@ "description": "Title of dialog that shows when cancelling a new observation", "message": "නිරීක්ෂණය ඉවතලන්නද?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { "message": "Enable" }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" - }, "Modal.GPSDisable.description": { "message": "To create a Track CoMapeo needs access to your location and GPS." }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" - }, "Modal.GPSDisable.title": { "message": "GPS Disabled" }, @@ -58,6 +46,80 @@ "Modal.GPSEnable.trackingDescription": { "message": "You’ve been recording for" }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "අනුවාදය සහ ගොඩනැගීමේ අංකය" + }, + "Navigation.Drawer.appSettings": { + "message": "App Settings" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Language, Security, Coordinates" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Create or Join Project" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Create a new project or join existing one" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Data & Privacy" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "You are currently mapping on your own" + }, + "Navigation.Drawer.projName": { + "message": "Project {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Project Settings" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categories, Config, Team" + }, + "Navigation.Drawer.security": { + "message": "ආරක්ෂාව" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "සැකසුම්" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "සංස්කරණය කරගෙන යන්න" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Discard changes" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "වෙනස්කම් ඉවතලන්න?" + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "සංස්කරණය කරගෙන යන්න" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Discard Track?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard Track" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Your Track will not be saved. This cannot be undone." + }, "Screens.Settings.AppSettings.coordinateSystem": { "message": "Coordinate System" }, @@ -71,20 +133,51 @@ "message": "Display language for app" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "App Settings" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "උපාංගයේ නම" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Sync Settings" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Project Settings" }, "Screens.Settings.ProjectSettings.yourTeam": { "message": "Your Team" }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "අවලංගු කරන්න" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "ඔව්, මකන්න" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "මකන්න" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Share" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "සංස්කරණය කරගෙන යන්න" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "වෙනස්කම් ඉවතලන්න?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard changes" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { "message": "Coordinator" }, @@ -98,7 +191,7 @@ "message": "Not seeing a Device?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Make sure both devices are on the same version of CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { "message": "Make sure both devices are on the same wifi network" @@ -118,6 +211,38 @@ "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { "message": "Select a Role" }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "CoMapeo build" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "CoMapeo variant" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "CoMapeo version" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Android build number" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Android version" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Phone model" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "About CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Unknown" + }, "screens.AddPhoto.cancel": { "message": "අවලංගු කරන්න" }, @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "මුරකේතය" + "message": "Passcode: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "යෙදුම් මුර කේතය සුරකින්න" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Make sure to note your passcode in a secure location before saving." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "යෙදුම් මුරකේත නැති වුවහොත් හෝ අමතක වූවා නම් කිසිවිටෙක ආපසු ලබාගත නොහැක! සුරැකීමට පෙර ඔබේ මුර කේතය ආරක්ෂිත ස්ථානයක සටහන් කිරීමට වග බලා ගන්න." + "message": "App Passcodes can never be recovered if lost or forgotten!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "කරුණාකර මුර කේතය ඇතුලත් කරන්න" @@ -168,7 +296,7 @@ "message": "වැරදි මුර කේතය" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "Mapeo යෙදුම විවෘත කිරීමට මෙම මුර කේතය අවශ්‍ය වනු ඇත" + "message": "This passcode will be required to open the CoMapeo App" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { "message": "Confirm Passcode" @@ -183,10 +311,10 @@ "message": "යෙදුම් මුර කේතය යනු කුමක්ද?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "Mapeo යෙදුම විවෘත කිරීම සඳහා ඔබට මුරකේතයක් ඇතුළත් කිරීම අවශ්‍ය කිරීමෙන් අමතර ආරක්ෂක ස්ථරයක් එක් කිරීමට යෙදුම් මුරකේතය ඔබට ඉඩ සලසයි. පහත විශේෂාංගය ක්‍රියාත්මක කිරීමෙන් ඔබට ඔබේම ඉලක්කම් 5ක මුරකේතය අර්ථ දැක්විය හැක." + "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**Please note that forgotten passcodes cannot be recovered!** Once this feature is enabled, if you forget or lose your passcode, you will not be able to open Mapeo and will lose access to any Mapeo data that has not been synced with other project participants." + "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "අවලංගු කරන්න" @@ -198,7 +326,7 @@ "message": "ඔබ දැනට යෙදුම් මුරකේතය භාවිතා කරයි. ඔබගේ මුර කේතය භාවිතා කිරීම නැවැත්වීමට හෝ වෙනස් කිරීමට පහත බලන්න." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app." + "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "යෙදුම් මුර කේතය" @@ -212,6 +340,26 @@ "screens.AppPasscode.TurnOffPasscode.usePasscode": { "message": "Use App Passcode" }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Allow" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Go to Settings" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Not Now" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "To record audio while using the app and in the background CoMapeo needs to access your microphone. Please enable microphone permissions in your app settings." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Recording Audio with CoMapeo" + }, "screens.CameraScreen.goToSettings": { "message": "Go to Settings" }, @@ -238,12 +386,63 @@ "description": "Universal Transverse Mercator coordinate format", "message": "Universal Transverse Mercator (UTM)" }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "Anonymized information about your device, app crashes, errors and performance helps Awana Digital improve the app and fix errors." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Diagnostic Information" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Data & Privacy" + }, + "screens.DataAndPrivacy.noPII": { + "message": "This never includes any of your data or personal information." + }, + "screens.DataAndPrivacy.optOut": { + "message": "You can opt-out of sharing diagnostic information at any time." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo Respects Your Privacy & Autonomy" + }, + "screens.DataPrivacy.description": { + "message": "CoMapeo allows you and your collaborators to map offline without needing servers." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Private by default — diagnostic information is fully anonymized and you can opt-out any time." + }, + "screens.DataPrivacy.encrypted": { + "message": "All data stays fully encrypted" + }, + "screens.DataPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Easily manage and control sharing and collaboration." + }, + "screens.DataPrivacy.next": { + "message": "ඊළඟ" + }, + "screens.DataPrivacy.stays": { + "message": "Your data stays on your devices." + }, + "screens.DataPrivacy.title": { + "message": "Data & Privacy" + }, "screens.DeviceNaming.Success.description": { "message": "You named your device" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "To find your project settings go to the main menu found on the map screen." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Go to Map" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." + }, "screens.DeviceNaming.Success.success": { "message": "Success!" }, @@ -251,7 +450,7 @@ "message": "Add Name" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." }, "screens.DeviceNaming.header": { "message": "Add a name for your device" @@ -268,23 +467,78 @@ "screens.FatalError.somethingWrong": { "message": "Something Went Wrong" }, + "screens.HowToLeaveProject.goBack": { + "message": "Go back" + }, + "screens.HowToLeaveProject.howTo": { + "message": "How to Leave Project" + }, + "screens.HowToLeaveProject.instructions": { + "message": "To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device." + }, + "screens.HowToLeaveProject.warning": { + "message": "If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!" + }, "screens.IntroToCoMapeo.collaborate": { - "message": "Collaborate on mapping and monitoring projects" + "message": "Collaborate with others" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Designed with and for Indigenous peoples & frontline communities" }, "screens.IntroToCoMapeo.getStarted": { "message": "Get Started" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "is now" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Map anywhere and everywhere" + }, + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Map your world, together" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.ownData": { + "message": "Own and control your data" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", - "message": "Language" + "message": "භාෂාව" + }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "You are already on a project" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Go Back" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Leave Current Project" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "To join a new project you must leave your current one." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "You are on {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "අවලංගු කරන්න" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Please check the box to confirm" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "I understand I will be deleting all data from Project {projectName} from my device." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "I understand I will be deleting all data from my device." + }, + "screens.LeaveProject.leaveProj": { + "message": "Leave Project" + }, + "screens.LeaveProject.leavingProject": { + "message": "Leaving Project {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "This will remove all Project {projectName}'s data from your device." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "This will remove all of the data from your device." }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", @@ -437,11 +691,50 @@ "screens.ManualGpsScreen.zoneNumber": { "message": "Zone Number" }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "අවලංගු කරන්න" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sync Everything" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "Sync Everything?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Your device will sync all content at full size, including photos, audio, and videos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "You are about to sync everything. This may increase the disk space used on your device." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Note: This will use more storage." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "You will no longer sync Audio or Video." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Sync Previews (Photos Only)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Sync Previews" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "Sync Previews?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Photos will sync at a reduced smaller size. Device will not sync audio or video." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Your device will keep all existing data but new observations will sync in a smaller, preview size." + }, + "screens.MediaSyncSettings.title": { + "message": "Sync Settings" + }, "screens.ObscurePasscode.description": { - "message": "Obscure Passcode is a security feature that allows you to open Mapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of Mapeo which allows you to create demonstration observations that are not saved to the Mapeo database." + "message": "Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database." }, "screens.ObscurePasscode.instructions": { - "message": "Enter the code above to hide your data in Mapeo" + "message": "Enter the code above to hide your data in CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Obscure Passcode" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "What is Obscure Passcode?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "වෙනස් කරන්න" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "නිරීක්ෂණ" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "මකන්න" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "නිරීක්ෂණ" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Share" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "අවලංගු කරන්න" }, + "screens.Observation.comapeoAlert": { + "message": "CoMapeo Alert" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "ඔව්, මකන්න" @@ -483,26 +776,83 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "නිරීක්ෂණය මකන්නද?" }, + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", + "message": "නිරීක්ෂණ" + }, + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Sharing image" + }, + "screens.Observation.shareMessageFooter": { + "message": "Sent from CoMapeo" + }, + "screens.Observation.shareMessageTitle": { + "message": "CoMapeo Alert" + }, + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Sharing text" + }, "screens.Observation.title": { "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", "message": "නිරීක්ෂණ" }, + "screens.ObservationCreate.changePreset": { + "message": "Change" + }, + "screens.ObservationCreate.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "මෙතන මොකද වෙන්නේ?" + }, + "screens.ObservationCreate.keepWaiting": { + "description": "Button to cancel save and continue waiting for GPS", + "message": "දිගටම බලා සිටින්න" + }, + "screens.ObservationCreate.manualEntry": { + "description": "Button to manually enter GPS coordinates", + "message": "ඛණ්ඩාංක අතින් ඇතුල් කරන්න" + }, + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "New Observation" + }, + "screens.ObservationCreate.noGpsDesc": { + "description": "Description in dialog when trying to save with no GPS coords", + "message": "මෙම නිරීක්ෂණයට ස්ථානයක් නොමැත. ඔබට GPS සංඥාවක් සඳහා රැඳී සිටිය හැක, ස්ථානයක් නොමැතිව නිරීක්ෂණ සුරකින්න, හෝ ඛණ්ඩාංක අතින් ඇතුල් කරන්න" + }, + "screens.ObservationCreate.noGpsTitle": { + "description": "Title of dialog when trying to save with no GPS coords", + "message": "GPS සංඥා නැත" + }, + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "නිරීක්ෂණ" + }, + "screens.ObservationCreate.saveAnyway": { + "description": "Button to save regardless of GPS state", + "message": "සුරකින්න" + }, + "screens.ObservationCreate.weakGpsDesc": { + "description": "Description in dialog when trying to save with low GPS accuracy.", + "message": "GPS නිරවද්‍යතාවය අඩුයි. වඩා හොඳ නිරවද්‍යතාවයක් සඳහා ඔබට දිගටම බලා සිටිය හැක, අඩු නිරවද්‍යතාවයකින් නිරීක්ෂණය සුරකින්න, හෝ ඛණ්ඩාංක අතින් ඇතුල් කරන්න" + }, + "screens.ObservationCreate.weakGpsTitle": { + "description": "Title of dialog when trying to save with low GPS accuracy.", + "message": "දුර්වල GPS සංඥා" + }, "screens.ObservationDetails.done": { "description": "Button text when all questions are complete", "message": "Done" }, "screens.ObservationDetails.nextQuestion": { "description": "Button text to navigate to next question", - "message": "Next" + "message": "ඊළඟ" }, "screens.ObservationDetails.title": { "description": "Title of observation details screen showing question number and total", "message": "Question {current} of {total}" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "එකතු කරන්න…" - }, "screens.ObservationEdit.ObservationEditView.audioButton": { "description": "Button label for adding audio", "message": "Audio" @@ -519,52 +869,30 @@ "description": "Button label for adding photo", "message": "Photo" }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "සොයමින්…" - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { - "description": "Button to cancel save and continue waiting for GPS", - "message": "දිගටම බලා සිටින්න" - }, - "screens.ObservationEdit.SaveButton.manualEntry": { - "description": "Button to manually enter GPS coordinates", - "message": "ඛණ්ඩාංක අතින් ඇතුල් කරන්න" - }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { - "description": "Description in dialog when trying to save with no GPS coords", - "message": "මෙම නිරීක්ෂණයට ස්ථානයක් නොමැත. ඔබට GPS සංඥාවක් සඳහා රැඳී සිටිය හැක, ස්ථානයක් නොමැතිව නිරීක්ෂණ සුරකින්න, හෝ ඛණ්ඩාංක අතින් ඇතුල් කරන්න" - }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { - "description": "Title of dialog when trying to save with no GPS coords", - "message": "GPS සංඥා නැත" + "screens.ObservationEdit.changePreset": { + "message": "Change" }, - "screens.ObservationEdit.SaveButton.saveAnyway": { - "description": "Button to save regardless of GPS state", - "message": "සුරකින්න" - }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { - "description": "Description in dialog when trying to save with low GPS accuracy.", - "message": "GPS නිරවද්‍යතාවය අඩුයි. වඩා හොඳ නිරවද්‍යතාවයක් සඳහා ඔබට දිගටම බලා සිටිය හැක, අඩු නිරවද්‍යතාවයකින් නිරීක්ෂණය සුරකින්න, හෝ ඛණ්ඩාංක අතින් ඇතුල් කරන්න" + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "මෙතන මොකද වෙන්නේ?" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { - "description": "Title of dialog when trying to save with low GPS accuracy.", - "message": "දුර්වල GPS සංඥා" + "screens.ObservationEdit.navTitle": { + "description": "screen title for new observation screen", + "message": "Edit Observation" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", - "message": "නිරීක්ෂණ සංස්කරණය කරන්න" + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "නිරීක්ෂණ" }, - "screens.ObservationEdit.newTitle": { - "description": "screen title for new observation screen", - "message": "නව නිරීක්ෂණයක්" + "screens.ObservationList.TrackListItem.Track": { + "message": "Track" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "නිරීක්ෂණය" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "You are currently mapping on your own." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,32 +907,150 @@ "message": "නිරීක්ෂණය එකතු කරන්න" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Create or Join a Project" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "නිරීක්ෂණ පූරණය කිරීමේ දෝෂයකි. Mapeo වෙතින් ඉවත් වී නැවත ආරම්භ කිරීමට උත්සාහ කරන්න." + "message": "Error loading observations. Try quitting and restarting CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "පූරණය වෙමින් පවතී... මෙය නව උපාංගයක් සමඟ සමමුහුර්ත කිරීමෙන් පසු යම් කාලයක් ගත විය හැක" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, - "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { - "description": "Placeholder for description/notes field", - "message": "What is happening here?" + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Privacy Policy" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Current Permissions" }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Share Diagnostic Information" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "අවලංගු කරන්න" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Delete Image" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "Delete this photo?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Delete Photo" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "About Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo is developed by Awana Digital, a 501c3 non-profit organization registered in the United States. Awana Digital works in solidarity with frontline communities to use technology to defend their rights and fight climate change." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "App Errors" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Information about internal errors that result in the app not functioning as expected" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "App Info" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "The version and locale (language) of CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "App Usage" + }, + "screens.PrivacyPolicy.control": { + "message": "You're in control" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "You can opt out of sending any information to Awana Digital. You choose where your data is stored and who it is shared with. You may choose to share anonymized, summarized data about how you use CoMapeo with Awana Digital. We will always be transparent about what information you choose to share for the purposed of improving the app, and this information will never include photos, videos, audio, text, or precise locations that you have entered into CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Crash Data" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Information about what caused the app to close unexpectedly" + }, + "screens.PrivacyPolicy.dataCollection": { + "message": "CoMapeo Data Collection" + }, + "screens.PrivacyPolicy.deviceInfo": { + "message": "Device Info" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Such as model and manufacturer of your device; device operating system; screen size; device locale (language); device memory." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnostics" + }, + "screens.PrivacyPolicy.noPII": { + "message": "No personally identifiable information" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "Using CoMapeo does not require a user account. Awana Digital does not collect your name, email address or any other personal details. No permanent user identifier or device identifier is ever shared with Awana Digital, and we take extra measures to ensure that no information you share can be used to track you: identifiers are randomized and rotated (changed) every month and we do not store IP addresses." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "What is not collected?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "We do not collect any personal data or anything that can be used to identify or track a user or device. Device identifiers used to aggregate information are random, anonymous, and changed every month. Diagnostic information does not include data about how you use the app, and it never includes any of the data you have collected with the app. We do not collect your precise or coarse location, only the country where you are using CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Open Source and the \"Official\" Version" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo is an open-source application. This means that anyone can view the code that makes the app work and can verify the privacy declarations in this document. It also means that anyone can adapt the app to their own needs and release an alternative version. This document refers to data collected by the official releases of CoMapeo, digitally signed by Awana Digital, available from the Google Play Store or the Awana Digital website. Unofficial releases of CoMapeo obtained from other channels are outside our control and may share additional information with other organizations." + }, + "screens.PrivacyPolicy.overview": { + "message": "This document describes what information (\"data\") is sent from CoMapeo to the application developer, Awana Digital, and how that information is used." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Performance Data" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Such as launch time, energy usage, app freezes, and responsiveness" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "CoMapeo Data Privacy" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Private by default" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "The data you collect and create with CoMapeo (locations, photos, video, audio, text) is only stored on your device by default, and is not stored or sent anywhere else. When you share data with collaborators by joining a project with them, it is sent encrypted, directly to your collaborators' device. This means that the data is not sent via Awana Digital, nor anyone else, on its way to your collaborator. Awana Digital never sees nor has access to any of the data you collect with CoMapeo unless you explicitly send it to us." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Third-party access to data" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "A \"third-party\" is an organization other than Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "User Counts" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "The number of users per country and per project. Aggregated and anonymized" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "What is collected?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "By default, anonymized diagnostic information about your device, app crashes, errors and performance is shared with Awana Digital. You can opt-out of sharing this information at any time. This diagnostic information is completely anonymized and it never contains any of your data (the data you have collected with CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "Why is this data collected?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Crash data and app errors together with the device and app info provide Awana Digital with the information we need to fix errors and bugs in the app. The performance data helps us improve the responsiveness of the app and identify errors. User counts, including total users, users per country, and users per project, help justify ongoing investment in the development of CoMapeo." + }, + "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "මෙතන මොකද වෙන්නේ?" }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", @@ -614,15 +1060,6 @@ "description": "Category title for new track screen", "message": "Track" }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "භාවිතා කිරීමට, යෙදුම් මුරකේතය සබල කරන්න" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "අල්ලා ගැනීමෙන් ඔබේ උපාංගය ආරක්ෂා කරන්න" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Obscure Passcode" - }, "screens.Security.passDesriptionPassNotSet": { "message": "මුර කේතය සකසා නැත" }, @@ -642,7 +1079,7 @@ "message": "Your Device Name" }, "screens.Setting.ProjectSettings.DeviceName.DisplayScreen.title": { - "message": "Device Name" + "message": "උපාංගයේ නම" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.deviceNameLabel": { "message": "Edit Device Name" @@ -654,10 +1091,10 @@ "message": "Discard Changes" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "වෙනස්කම් ඉවතලන්න?" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { - "message": "Device Name" + "message": "උපාංගයේ නම" }, "screens.Setting.ProjectSettings.YourTeam.InviteAccepted.addAnotherDevice": { "message": "Add Another Device" @@ -702,7 +1139,7 @@ "message": "Date Added" }, "screens.Setting.ProjectSettings.YourTeam.deviceName": { - "message": "Device Name" + "message": "උපාංගයේ නම" }, "screens.Setting.ProjectSettings.YourTeam.inviteDevice": { "message": "Invite Device" @@ -716,6 +1153,21 @@ "screens.Setting.ProjectSettings.YourTeam.title": { "message": "Your Team" }, + "screens.Settings.Config.created": { + "message": "Created {date} at {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Import Config" + }, + "screens.Settings.Config.name": { + "message": "Config Name:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuration" + }, + "screens.Settings.Config.projectName": { + "message": "Project Name:" + }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { "message": "Create a Project" }, @@ -755,14 +1207,17 @@ "screens.Settings.CreateOrJoinProject.importConfig": { "message": "Import Config" }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "File name should end with .comapeocat" + }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Join an existing CoMapeo Project" }, "screens.Settings.CreateOrJoinProject.joinProject": { "message": "Join a Project" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.Settings.CreateOrJoinProject.startProject": { "message": "Start a CoMapeo Project" @@ -788,12 +1243,12 @@ "screens.Settings.YourTeam.unableToCancel": { "message": "Unable to Cancel Invitation" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "Mapeo ගැන" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "අනුවාදය සහ ගොඩනැගීමේ අංකය" }, "screens.Settings.appSettings": { @@ -803,6 +1258,10 @@ "description": "list of avaialable app settings", "message": "Language, Security, Coordinates" }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Project Configuration" + }, "screens.Settings.createOrJoin": { "message": "Create or Join Project" }, @@ -820,11 +1279,20 @@ "description": "Title of settings screen", "message": "සැකසුම්" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { "message": "Create or Join Project" }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "You will be able to share data with devices that are part of the same project." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Create or join a project to collect data with a team" }, "screens.Sync.HeaderTitle.noWiFi": { "message": "No WiFi" @@ -838,49 +1306,93 @@ "screens.Sync.NoWifiDisplay.title": { "message": "No WiFi" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "You're all caught up!" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "All data synced" + }, + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Devices available" + }, + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Devices found" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "No devices available to sync" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Syncing…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Waiting…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Waiting for other devices" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Start Sync" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Stop" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Complete! Waiting for other devices to join" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "Complete! You're up to date" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "You are syncing with your team" + }, + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Waiting for devices" + }, + "screens.Track.ObservationList.observations": { + "message": "නිරීක්ෂණය" + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "Delete track?" + }, + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Track" + }, + "screens.Track.tracks": { + "message": "Tracks" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Edit Track" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Track" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", "message": "Show Options" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Leave Project" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Disconnected" }, "sharedComponents.DeviceIconWithName.thisDevice": { "message": "This Device!" }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "සොයමින්…" + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Change" + }, "sharedComponents.ErrorModal.goBack": { "message": "Go Back" }, @@ -894,31 +1406,40 @@ "message": "No GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "සොයමින්…" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Invite Canceled" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Close" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Your invitation to {projectName} has been canceled." }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { "message": "Accept Invite" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { "message": "Decline Invite" }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "You've been invited to join {projectName}" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Join Project {projectName}" + }, "sharedComponents.ProjectInviteBottomSheet.goToMap": { - "message": "Go To Map" + "message": "සිතියම වෙත යන්න" }, "sharedComponents.ProjectInviteBottomSheet.goToSync": { "message": "Go To Sync" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" - }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" - }, "sharedComponents.ProjectInviteBottomSheet.success": { "message": "Success" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "You have joined {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { "message": "Coordinator" diff --git a/messages/sw.json b/messages/sw.json index 031c717b4..268d5039e 100644 --- a/messages/sw.json +++ b/messages/sw.json @@ -25,24 +25,12 @@ "description": "Title of dialog that shows when cancelling a new observation", "message": "Ungependa kutupa uchunguzi?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { "message": "Enable" }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" - }, "Modal.GPSDisable.description": { "message": "To create a Track CoMapeo needs access to your location and GPS." }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" - }, "Modal.GPSDisable.title": { "message": "GPS Disabled" }, @@ -58,6 +46,80 @@ "Modal.GPSEnable.trackingDescription": { "message": "You’ve been recording for" }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "Toleo na nambari ya muundo" + }, + "Navigation.Drawer.appSettings": { + "message": "App Settings" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Language, Security, Coordinates" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Create or Join Project" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Create a new project or join existing one" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Data & Privacy" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "You are currently mapping on your own" + }, + "Navigation.Drawer.projName": { + "message": "Project {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Project Settings" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categories, Config, Team" + }, + "Navigation.Drawer.security": { + "message": "Usalama" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "Mipangilio" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Endelea kuhariri" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Discard changes" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Ungependa kutupa mabadiliko?" + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Endelea kuhariri" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Discard Track?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard Track" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Your Track will not be saved. This cannot be undone." + }, "Screens.Settings.AppSettings.coordinateSystem": { "message": "Coordinate System" }, @@ -71,20 +133,51 @@ "message": "Display language for app" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "App Settings" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "Jina la Kifaa" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Sync Settings" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Project Settings" }, "Screens.Settings.ProjectSettings.yourTeam": { "message": "Your Team" }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "Ghairi" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "Ndiyo, futa" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "Futa" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Share" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Endelea kuhariri" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Ungependa kutupa mabadiliko?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard changes" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { "message": "Coordinator" }, @@ -98,7 +191,7 @@ "message": "Not seeing a Device?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Make sure both devices are on the same version of CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { "message": "Make sure both devices are on the same wifi network" @@ -118,6 +211,38 @@ "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { "message": "Select a Role" }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "CoMapeo build" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "CoMapeo variant" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "CoMapeo version" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Android build number" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Android version" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Phone model" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "About CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Unknown" + }, "screens.AddPhoto.cancel": { "message": "Ghairi" }, @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "Nambari ya siri" + "message": "Passcode: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "Hifadhi Nambari ya siri ya Programu" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Make sure to note your passcode in a secure location before saving." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "Nambari za Siri za Programu haziwezi kurejeshwa ikiwa zimepotea au kusahaulika! Hakikisha umeandika nambari yako ya siri katika eneo salama kabla ya kuhifadhi." + "message": "App Passcodes can never be recovered if lost or forgotten!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "Tafadhali Weka Nambari ya siri" @@ -168,7 +296,7 @@ "message": "Nambari ya siri si sahihi" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "Nambari hii ya siri itahitajika ili kufungua Programu ya Mapeo" + "message": "This passcode will be required to open the CoMapeo App" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { "message": "Confirm Passcode" @@ -183,10 +311,10 @@ "message": "Nambari ya siri ya Programu ni nini?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "Nambari ya siri ya Programu hukuruhusu kuongeza safu ya ziada ya usalama kwa kukuhitaji uweke nambari ya siri ili ufungue programu ya Mapeo. Unaweza kufafanua nambari yako ya siri yenye tarakimu 5 kwa kuwasha kipengele kilicho hapa chini." + "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**Tafadhali kumbuka kuwa nambari za siri zilizosahaulika haziwezi kurejeshwa!** Kipengele hiki kikiwashwa, ukisahau au kupoteza nambari yako ya siri, hutaweza kufungua Mapeo na utapoteza ufikiaji wa data yoyote ya Mapeo ambayo haijasawazishwa na washiriki wengine wa mradi." + "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "Ghairi" @@ -198,7 +326,7 @@ "message": "Kwa sasa unatumia Nambari ya siri ya Programu. Tazama hapa chini ili uache kutumia au ubadilishe nenosiri lako." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "Nambari ya siri ya Programu huongeza safu ya ziada ya usalama kwa kukuhitaji uweke nambari ya siri ili ufungue programu ya Mapeo." + "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "Nambari ya siri ya Programu" @@ -212,6 +340,26 @@ "screens.AppPasscode.TurnOffPasscode.usePasscode": { "message": "Tumia Nambari ya siri ya Programu" }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Allow" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Go to Settings" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Not Now" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "To record audio while using the app and in the background CoMapeo needs to access your microphone. Please enable microphone permissions in your app settings." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Recording Audio with CoMapeo" + }, "screens.CameraScreen.goToSettings": { "message": "Go to Settings" }, @@ -238,12 +386,63 @@ "description": "Universal Transverse Mercator coordinate format", "message": "Universal Transverse Mercator (UTM)" }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "Anonymized information about your device, app crashes, errors and performance helps Awana Digital improve the app and fix errors." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Diagnostic Information" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Data & Privacy" + }, + "screens.DataAndPrivacy.noPII": { + "message": "This never includes any of your data or personal information." + }, + "screens.DataAndPrivacy.optOut": { + "message": "You can opt-out of sharing diagnostic information at any time." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo Respects Your Privacy & Autonomy" + }, + "screens.DataPrivacy.description": { + "message": "CoMapeo allows you and your collaborators to map offline without needing servers." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Private by default — diagnostic information is fully anonymized and you can opt-out any time." + }, + "screens.DataPrivacy.encrypted": { + "message": "All data stays fully encrypted" + }, + "screens.DataPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Easily manage and control sharing and collaboration." + }, + "screens.DataPrivacy.next": { + "message": "Inayofuata" + }, + "screens.DataPrivacy.stays": { + "message": "Your data stays on your devices." + }, + "screens.DataPrivacy.title": { + "message": "Data & Privacy" + }, "screens.DeviceNaming.Success.description": { "message": "You named your device" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "To find your project settings go to the main menu found on the map screen." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Go to Map" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." + }, "screens.DeviceNaming.Success.success": { "message": "Success!" }, @@ -251,7 +450,7 @@ "message": "Add Name" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." }, "screens.DeviceNaming.header": { "message": "Add a name for your device" @@ -268,23 +467,78 @@ "screens.FatalError.somethingWrong": { "message": "Something Went Wrong" }, + "screens.HowToLeaveProject.goBack": { + "message": "Go back" + }, + "screens.HowToLeaveProject.howTo": { + "message": "How to Leave Project" + }, + "screens.HowToLeaveProject.instructions": { + "message": "To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device." + }, + "screens.HowToLeaveProject.warning": { + "message": "If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!" + }, "screens.IntroToCoMapeo.collaborate": { - "message": "Collaborate on mapping and monitoring projects" + "message": "Collaborate with others" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Designed with and for Indigenous peoples & frontline communities" }, "screens.IntroToCoMapeo.getStarted": { "message": "Get Started" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "is now" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Map anywhere and everywhere" + }, + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Map your world, together" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.ownData": { + "message": "Own and control your data" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", - "message": "Language" + "message": "Lugha" + }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "You are already on a project" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Go Back" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Leave Current Project" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "To join a new project you must leave your current one." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "You are on {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "Ghairi" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Please check the box to confirm" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "I understand I will be deleting all data from Project {projectName} from my device." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "I understand I will be deleting all data from my device." + }, + "screens.LeaveProject.leaveProj": { + "message": "Leave Project" + }, + "screens.LeaveProject.leavingProject": { + "message": "Leaving Project {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "This will remove all Project {projectName}'s data from your device." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "This will remove all of the data from your device." }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", @@ -437,11 +691,50 @@ "screens.ManualGpsScreen.zoneNumber": { "message": "Zone Number" }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "Ghairi" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sync Everything" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "Sync Everything?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Your device will sync all content at full size, including photos, audio, and videos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "You are about to sync everything. This may increase the disk space used on your device." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Note: This will use more storage." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "You will no longer sync Audio or Video." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Sync Previews (Photos Only)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Sync Previews" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "Sync Previews?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Photos will sync at a reduced smaller size. Device will not sync audio or video." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Your device will keep all existing data but new observations will sync in a smaller, preview size." + }, + "screens.MediaSyncSettings.title": { + "message": "Sync Settings" + }, "screens.ObscurePasscode.description": { - "message": "Nambari ya siri Isiyojulikana ni kipengele cha usalama kinachokuruhusu kufungua Mapeo katika hali bandia ambayo huficha data yako yote. Kuweka Nambari ya siri Isiyojulikana kwenye skrini ya utangulizi kutaonyesha toleo tupu la Mapeo ambalo hukuruhusu kuunda uchunguzi wa maonyesho ambao hauhifadhiwi kwenye hifadhidata ya Mapeo." + "message": "Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database." }, "screens.ObscurePasscode.instructions": { - "message": "Weka nambari iliyo hapo juu ili kuficha data yako kwenye Mapeo" + "message": "Enter the code above to hide your data in CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Nambari ya siri Isiyojulikana" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "Nambari ya siri Isiyojulikana ni nini?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "Badilisha" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "Uchunguzi" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "Futa" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "Uchunguzi" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Share" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "Ghairi" }, + "screens.Observation.comapeoAlert": { + "message": "CoMapeo Alert" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "Ndiyo, futa" @@ -483,26 +776,83 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "Ungependa kufuta uchunguzi?" }, + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", + "message": "Uchunguzi" + }, + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Sharing image" + }, + "screens.Observation.shareMessageFooter": { + "message": "Sent from CoMapeo" + }, + "screens.Observation.shareMessageTitle": { + "message": "CoMapeo Alert" + }, + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Sharing text" + }, "screens.Observation.title": { "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", "message": "Uchunguzi" }, + "screens.ObservationCreate.changePreset": { + "message": "Change" + }, + "screens.ObservationCreate.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Ni nini kinachofanyika hapa?" + }, + "screens.ObservationCreate.keepWaiting": { + "description": "Button to cancel save and continue waiting for GPS", + "message": "Endelea kusubiri" + }, + "screens.ObservationCreate.manualEntry": { + "description": "Button to manually enter GPS coordinates", + "message": "Viratibu vya kuweka Wewe Mwenyewe" + }, + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "New Observation" + }, + "screens.ObservationCreate.noGpsDesc": { + "description": "Description in dialog when trying to save with no GPS coords", + "message": "Uchunguzi huu hauna eneo. Unaweza kuendelea kusubiri ishara ya GPS, kuhifadhi uchunguzi bila eneo, au kuweka viratibu wewe mwenyewe" + }, + "screens.ObservationCreate.noGpsTitle": { + "description": "Title of dialog when trying to save with no GPS coords", + "message": "Hakuna ishara ya GPS" + }, + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "Uchunguzi" + }, + "screens.ObservationCreate.saveAnyway": { + "description": "Button to save regardless of GPS state", + "message": "Hifadhi" + }, + "screens.ObservationCreate.weakGpsDesc": { + "description": "Description in dialog when trying to save with low GPS accuracy.", + "message": "Usahihi wa GPS ni wa chini. Unaweza kuendelea kusubiri usahihi bora, kuhifadhi uchunguzi ulio na usahihi wa chini, au uweke viratibu wewe mwenyewe" + }, + "screens.ObservationCreate.weakGpsTitle": { + "description": "Title of dialog when trying to save with low GPS accuracy.", + "message": "Ishara dhaifu ya GPS" + }, "screens.ObservationDetails.done": { "description": "Button text when all questions are complete", "message": "Done" }, "screens.ObservationDetails.nextQuestion": { "description": "Button text to navigate to next question", - "message": "Next" + "message": "Inayofuata" }, "screens.ObservationDetails.title": { "description": "Title of observation details screen showing question number and total", "message": "Question {current} of {total}" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "Ongeza…" - }, "screens.ObservationEdit.ObservationEditView.audioButton": { "description": "Button label for adding audio", "message": "Audio" @@ -519,52 +869,30 @@ "description": "Button label for adding photo", "message": "Photo" }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "Inatafuta…" - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { - "description": "Button to cancel save and continue waiting for GPS", - "message": "Endelea kusubiri" - }, - "screens.ObservationEdit.SaveButton.manualEntry": { - "description": "Button to manually enter GPS coordinates", - "message": "Viratibu vya kuweka Wewe Mwenyewe" - }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { - "description": "Description in dialog when trying to save with no GPS coords", - "message": "Uchunguzi huu hauna eneo. Unaweza kuendelea kusubiri ishara ya GPS, kuhifadhi uchunguzi bila eneo, au kuweka viratibu wewe mwenyewe" - }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { - "description": "Title of dialog when trying to save with no GPS coords", - "message": "Hakuna ishara ya GPS" + "screens.ObservationEdit.changePreset": { + "message": "Change" }, - "screens.ObservationEdit.SaveButton.saveAnyway": { - "description": "Button to save regardless of GPS state", - "message": "Hifadhi" - }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { - "description": "Description in dialog when trying to save with low GPS accuracy.", - "message": "Usahihi wa GPS ni wa chini. Unaweza kuendelea kusubiri usahihi bora, kuhifadhi uchunguzi ulio na usahihi wa chini, au uweke viratibu wewe mwenyewe" + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Ni nini kinachofanyika hapa?" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { - "description": "Title of dialog when trying to save with low GPS accuracy.", - "message": "Ishara dhaifu ya GPS" + "screens.ObservationEdit.navTitle": { + "description": "screen title for new observation screen", + "message": "Edit Observation" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", - "message": "Hariri Uchunguzi" + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "Uchunguzi" }, - "screens.ObservationEdit.newTitle": { - "description": "screen title for new observation screen", - "message": "Uchunguzi Mpya" + "screens.ObservationList.TrackListItem.Track": { + "message": "Track" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "Uchunguzi" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "You are currently mapping on your own." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,32 +907,150 @@ "message": "Ongeza Uchunguzi" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Create or Join a Project" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "Hitilafu ya kupakia uchunguzi. Jaribu kuacha na kuwasha upya Mapeo." + "message": "Error loading observations. Try quitting and restarting CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "Inapakia... hii inaweza kuchukua muda baada ya kusawazisha na kifaa kipya" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, - "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { - "description": "Placeholder for description/notes field", - "message": "What is happening here?" + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Privacy Policy" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Current Permissions" }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Share Diagnostic Information" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "Ghairi" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Delete Image" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "Delete this photo?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Delete Photo" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "About Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo is developed by Awana Digital, a 501c3 non-profit organization registered in the United States. Awana Digital works in solidarity with frontline communities to use technology to defend their rights and fight climate change." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "App Errors" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Information about internal errors that result in the app not functioning as expected" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "App Info" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "The version and locale (language) of CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "App Usage" + }, + "screens.PrivacyPolicy.control": { + "message": "You're in control" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "You can opt out of sending any information to Awana Digital. You choose where your data is stored and who it is shared with. You may choose to share anonymized, summarized data about how you use CoMapeo with Awana Digital. We will always be transparent about what information you choose to share for the purposed of improving the app, and this information will never include photos, videos, audio, text, or precise locations that you have entered into CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Crash Data" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Information about what caused the app to close unexpectedly" + }, + "screens.PrivacyPolicy.dataCollection": { + "message": "CoMapeo Data Collection" + }, + "screens.PrivacyPolicy.deviceInfo": { + "message": "Device Info" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Such as model and manufacturer of your device; device operating system; screen size; device locale (language); device memory." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnostics" + }, + "screens.PrivacyPolicy.noPII": { + "message": "No personally identifiable information" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "Using CoMapeo does not require a user account. Awana Digital does not collect your name, email address or any other personal details. No permanent user identifier or device identifier is ever shared with Awana Digital, and we take extra measures to ensure that no information you share can be used to track you: identifiers are randomized and rotated (changed) every month and we do not store IP addresses." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "What is not collected?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "We do not collect any personal data or anything that can be used to identify or track a user or device. Device identifiers used to aggregate information are random, anonymous, and changed every month. Diagnostic information does not include data about how you use the app, and it never includes any of the data you have collected with the app. We do not collect your precise or coarse location, only the country where you are using CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Open Source and the \"Official\" Version" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo is an open-source application. This means that anyone can view the code that makes the app work and can verify the privacy declarations in this document. It also means that anyone can adapt the app to their own needs and release an alternative version. This document refers to data collected by the official releases of CoMapeo, digitally signed by Awana Digital, available from the Google Play Store or the Awana Digital website. Unofficial releases of CoMapeo obtained from other channels are outside our control and may share additional information with other organizations." + }, + "screens.PrivacyPolicy.overview": { + "message": "This document describes what information (\"data\") is sent from CoMapeo to the application developer, Awana Digital, and how that information is used." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Performance Data" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Such as launch time, energy usage, app freezes, and responsiveness" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "CoMapeo Data Privacy" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Private by default" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "The data you collect and create with CoMapeo (locations, photos, video, audio, text) is only stored on your device by default, and is not stored or sent anywhere else. When you share data with collaborators by joining a project with them, it is sent encrypted, directly to your collaborators' device. This means that the data is not sent via Awana Digital, nor anyone else, on its way to your collaborator. Awana Digital never sees nor has access to any of the data you collect with CoMapeo unless you explicitly send it to us." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Third-party access to data" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "A \"third-party\" is an organization other than Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "User Counts" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "The number of users per country and per project. Aggregated and anonymized" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "What is collected?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "By default, anonymized diagnostic information about your device, app crashes, errors and performance is shared with Awana Digital. You can opt-out of sharing this information at any time. This diagnostic information is completely anonymized and it never contains any of your data (the data you have collected with CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "Why is this data collected?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Crash data and app errors together with the device and app info provide Awana Digital with the information we need to fix errors and bugs in the app. The performance data helps us improve the responsiveness of the app and identify errors. User counts, including total users, users per country, and users per project, help justify ongoing investment in the development of CoMapeo." + }, + "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Ni nini kinachofanyika hapa?" }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", @@ -614,15 +1060,6 @@ "description": "Category title for new track screen", "message": "Track" }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "Ili kutumia, washa Msimbo wa siri wa Programu" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "Linda kifaa chako ili kisipokonywe" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Nambari ya siri Isiyojulikana" - }, "screens.Security.passDesriptionPassNotSet": { "message": "Nambari ya siri haijawekwa" }, @@ -642,7 +1079,7 @@ "message": "Your Device Name" }, "screens.Setting.ProjectSettings.DeviceName.DisplayScreen.title": { - "message": "Device Name" + "message": "Jina la Kifaa" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.deviceNameLabel": { "message": "Edit Device Name" @@ -654,10 +1091,10 @@ "message": "Discard Changes" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "Ungependa kutupa mabadiliko?" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { - "message": "Device Name" + "message": "Jina la Kifaa" }, "screens.Setting.ProjectSettings.YourTeam.InviteAccepted.addAnotherDevice": { "message": "Add Another Device" @@ -702,7 +1139,7 @@ "message": "Date Added" }, "screens.Setting.ProjectSettings.YourTeam.deviceName": { - "message": "Device Name" + "message": "Jina la Kifaa" }, "screens.Setting.ProjectSettings.YourTeam.inviteDevice": { "message": "Invite Device" @@ -716,6 +1153,21 @@ "screens.Setting.ProjectSettings.YourTeam.title": { "message": "Your Team" }, + "screens.Settings.Config.created": { + "message": "Created {date} at {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Import Config" + }, + "screens.Settings.Config.name": { + "message": "Config Name:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuration" + }, + "screens.Settings.Config.projectName": { + "message": "Project Name:" + }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { "message": "Create a Project" }, @@ -755,14 +1207,17 @@ "screens.Settings.CreateOrJoinProject.importConfig": { "message": "Import Config" }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "File name should end with .comapeocat" + }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Join an existing CoMapeo Project" }, "screens.Settings.CreateOrJoinProject.joinProject": { "message": "Join a Project" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.Settings.CreateOrJoinProject.startProject": { "message": "Start a CoMapeo Project" @@ -788,12 +1243,12 @@ "screens.Settings.YourTeam.unableToCancel": { "message": "Unable to Cancel Invitation" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "Kuhuu Mapeo" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "Toleo na nambari ya muundo" }, "screens.Settings.appSettings": { @@ -803,6 +1258,10 @@ "description": "list of avaialable app settings", "message": "Language, Security, Coordinates" }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Project Configuration" + }, "screens.Settings.createOrJoin": { "message": "Create or Join Project" }, @@ -820,11 +1279,20 @@ "description": "Title of settings screen", "message": "Mipangilio" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { "message": "Create or Join Project" }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "You will be able to share data with devices that are part of the same project." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Create or join a project to collect data with a team" }, "screens.Sync.HeaderTitle.noWiFi": { "message": "No WiFi" @@ -838,49 +1306,93 @@ "screens.Sync.NoWifiDisplay.title": { "message": "No WiFi" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "You're all caught up!" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "All data synced" + }, + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Devices available" + }, + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Devices found" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "No devices available to sync" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Syncing…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Waiting…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Waiting for other devices" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Start Sync" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Stop" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Complete! Waiting for other devices to join" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "Complete! You're up to date" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "You are syncing with your team" + }, + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Waiting for devices" + }, + "screens.Track.ObservationList.observations": { + "message": "Uchunguzi" + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "Delete track?" + }, + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Track" + }, + "screens.Track.tracks": { + "message": "Tracks" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Edit Track" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Track" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", "message": "Show Options" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Leave Project" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Disconnected" }, "sharedComponents.DeviceIconWithName.thisDevice": { "message": "This Device!" }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "Inatafuta…" + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Change" + }, "sharedComponents.ErrorModal.goBack": { "message": "Go Back" }, @@ -894,31 +1406,40 @@ "message": "No GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "Inatafuta…" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Invite Canceled" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Close" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Your invitation to {projectName} has been canceled." }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { "message": "Accept Invite" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { "message": "Decline Invite" }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "You've been invited to join {projectName}" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Join Project {projectName}" + }, "sharedComponents.ProjectInviteBottomSheet.goToMap": { - "message": "Go To Map" + "message": "Nenda kwenye Ramani" }, "sharedComponents.ProjectInviteBottomSheet.goToSync": { "message": "Go To Sync" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" - }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" - }, "sharedComponents.ProjectInviteBottomSheet.success": { "message": "Success" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "You have joined {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { "message": "Coordinator" diff --git a/messages/ta.json b/messages/ta.json index e57cbbac7..ed3fc1743 100644 --- a/messages/ta.json +++ b/messages/ta.json @@ -25,24 +25,12 @@ "description": "Title of dialog that shows when cancelling a new observation", "message": "அவதானிப்புகளை நீக்கவா?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { "message": "Enable" }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" - }, "Modal.GPSDisable.description": { "message": "To create a Track CoMapeo needs access to your location and GPS." }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" - }, "Modal.GPSDisable.title": { "message": "GPS Disabled" }, @@ -58,6 +46,80 @@ "Modal.GPSEnable.trackingDescription": { "message": "You’ve been recording for" }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "பதிப்பு மற்றும் உருவாக்க எண்" + }, + "Navigation.Drawer.appSettings": { + "message": "App Settings" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Language, Security, Coordinates" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Create or Join Project" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Create a new project or join existing one" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Data & Privacy" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "You are currently mapping on your own" + }, + "Navigation.Drawer.projName": { + "message": "Project {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Project Settings" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categories, Config, Team" + }, + "Navigation.Drawer.security": { + "message": "பாதுகாப்பு" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "அமைப்புகள்" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "தொடர்ந்து திருத்தவும்" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Discard changes" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "மாற்றங்களை அகற்றவா?" + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "தொடர்ந்து திருத்தவும்" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Discard Track?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard Track" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Your Track will not be saved. This cannot be undone." + }, "Screens.Settings.AppSettings.coordinateSystem": { "message": "Coordinate System" }, @@ -71,20 +133,51 @@ "message": "Display language for app" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "App Settings" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "சாதனத்தின் பெயர்" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Sync Settings" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Project Settings" }, "Screens.Settings.ProjectSettings.yourTeam": { "message": "Your Team" }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "ரத்து செய்க" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "ஆம், நீக்குக" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "அழி" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Share" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "தொடர்ந்து திருத்தவும்" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "மாற்றங்களை அகற்றவா?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard changes" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { "message": "Coordinator" }, @@ -98,7 +191,7 @@ "message": "Not seeing a Device?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Make sure both devices are on the same version of CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { "message": "Make sure both devices are on the same wifi network" @@ -118,6 +211,38 @@ "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { "message": "Select a Role" }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "CoMapeo build" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "CoMapeo variant" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "CoMapeo version" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Android build number" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Android version" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Phone model" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "About CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Unknown" + }, "screens.AddPhoto.cancel": { "message": "ரத்து செய்க" }, @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "Passcode" + "message": "Passcode: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "Save App Passcode" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Make sure to note your passcode in a secure location before saving." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "App Passcodes can never be recovered if lost or forgotten! Make sure to note your passcode in a secure location before saving." + "message": "App Passcodes can never be recovered if lost or forgotten!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "Please Enter Passcode" @@ -168,7 +296,7 @@ "message": "Incorrect Passcode" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "This passcode will be required to open the Mapeo App" + "message": "This passcode will be required to open the CoMapeo App" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { "message": "Confirm Passcode" @@ -183,10 +311,10 @@ "message": " App கடவுக்குறியீடு என்றால் என்ன?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app. You can define your own 5-digit passcode by turning on the feature below." + "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**Please note that forgotten passcodes cannot be recovered!** Once this feature is enabled, if you forget or lose your passcode, you will not be able to open Mapeo and will lose access to any Mapeo data that has not been synced with other project participants." + "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "ரத்து செய்க" @@ -198,7 +326,7 @@ "message": "You are currently using App Passcode. See below to stop using or change your passcode." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app." + "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "App கடவுக்குறியீடு" @@ -212,6 +340,26 @@ "screens.AppPasscode.TurnOffPasscode.usePasscode": { "message": "Use App Passcode" }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Allow" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Go to Settings" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Not Now" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "To record audio while using the app and in the background CoMapeo needs to access your microphone. Please enable microphone permissions in your app settings." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Recording Audio with CoMapeo" + }, "screens.CameraScreen.goToSettings": { "message": "Go to Settings" }, @@ -238,12 +386,63 @@ "description": "Universal Transverse Mercator coordinate format", "message": "Universal Transverse Mercator (UTM)" }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "Anonymized information about your device, app crashes, errors and performance helps Awana Digital improve the app and fix errors." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Diagnostic Information" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Data & Privacy" + }, + "screens.DataAndPrivacy.noPII": { + "message": "This never includes any of your data or personal information." + }, + "screens.DataAndPrivacy.optOut": { + "message": "You can opt-out of sharing diagnostic information at any time." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo Respects Your Privacy & Autonomy" + }, + "screens.DataPrivacy.description": { + "message": "CoMapeo allows you and your collaborators to map offline without needing servers." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Private by default — diagnostic information is fully anonymized and you can opt-out any time." + }, + "screens.DataPrivacy.encrypted": { + "message": "All data stays fully encrypted" + }, + "screens.DataPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Easily manage and control sharing and collaboration." + }, + "screens.DataPrivacy.next": { + "message": "அடுத்து" + }, + "screens.DataPrivacy.stays": { + "message": "Your data stays on your devices." + }, + "screens.DataPrivacy.title": { + "message": "Data & Privacy" + }, "screens.DeviceNaming.Success.description": { "message": "You named your device" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "To find your project settings go to the main menu found on the map screen." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Go to Map" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." + }, "screens.DeviceNaming.Success.success": { "message": "Success!" }, @@ -251,7 +450,7 @@ "message": "Add Name" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." }, "screens.DeviceNaming.header": { "message": "Add a name for your device" @@ -268,23 +467,78 @@ "screens.FatalError.somethingWrong": { "message": "Something Went Wrong" }, + "screens.HowToLeaveProject.goBack": { + "message": "Go back" + }, + "screens.HowToLeaveProject.howTo": { + "message": "How to Leave Project" + }, + "screens.HowToLeaveProject.instructions": { + "message": "To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device." + }, + "screens.HowToLeaveProject.warning": { + "message": "If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!" + }, "screens.IntroToCoMapeo.collaborate": { - "message": "Collaborate on mapping and monitoring projects" + "message": "Collaborate with others" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Designed with and for Indigenous peoples & frontline communities" }, "screens.IntroToCoMapeo.getStarted": { "message": "Get Started" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "is now" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Map anywhere and everywhere" + }, + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Map your world, together" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.ownData": { + "message": "Own and control your data" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", - "message": "Language" + "message": "மொழி" + }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "You are already on a project" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Go Back" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Leave Current Project" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "To join a new project you must leave your current one." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "You are on {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "ரத்து செய்க" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Please check the box to confirm" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "I understand I will be deleting all data from Project {projectName} from my device." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "I understand I will be deleting all data from my device." + }, + "screens.LeaveProject.leaveProj": { + "message": "Leave Project" + }, + "screens.LeaveProject.leavingProject": { + "message": "Leaving Project {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "This will remove all Project {projectName}'s data from your device." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "This will remove all of the data from your device." }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", @@ -437,11 +691,50 @@ "screens.ManualGpsScreen.zoneNumber": { "message": "Zone Number" }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "ரத்து செய்க" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sync Everything" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "Sync Everything?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Your device will sync all content at full size, including photos, audio, and videos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "You are about to sync everything. This may increase the disk space used on your device." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Note: This will use more storage." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "You will no longer sync Audio or Video." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Sync Previews (Photos Only)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Sync Previews" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "Sync Previews?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Photos will sync at a reduced smaller size. Device will not sync audio or video." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Your device will keep all existing data but new observations will sync in a smaller, preview size." + }, + "screens.MediaSyncSettings.title": { + "message": "Sync Settings" + }, "screens.ObscurePasscode.description": { - "message": "Obscure Passcode is a security feature that allows you to open Mapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of Mapeo which allows you to create demonstration observations that are not saved to the Mapeo database." + "message": "Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database." }, "screens.ObscurePasscode.instructions": { - "message": "Enter the code above to hide your data in Mapeo" + "message": "Enter the code above to hide your data in CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Obscure Passcode" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "What is Obscure Passcode?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "மாற்றுக" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "அவதானிப்புகள்" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "அழி" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "அவதானிப்புகள்" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Share" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "ரத்து செய்க" }, + "screens.Observation.comapeoAlert": { + "message": "CoMapeo Alert" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "ஆம், நீக்குக" @@ -483,26 +776,83 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "அவதானிப்புகளை நீக்கவா?" }, + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", + "message": "அவதானிப்புகள்" + }, + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Sharing image" + }, + "screens.Observation.shareMessageFooter": { + "message": "Sent from CoMapeo" + }, + "screens.Observation.shareMessageTitle": { + "message": "CoMapeo Alert" + }, + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Sharing text" + }, "screens.Observation.title": { "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", "message": "அவதானிப்புகள்" }, + "screens.ObservationCreate.changePreset": { + "message": "Change" + }, + "screens.ObservationCreate.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "இங்கே என்ன நடக்கிறது?" + }, + "screens.ObservationCreate.keepWaiting": { + "description": "Button to cancel save and continue waiting for GPS", + "message": "தொடர்ந்து காத்திருக்கவும்" + }, + "screens.ObservationCreate.manualEntry": { + "description": "Button to manually enter GPS coordinates", + "message": "கையேடு இணைப்புகள்" + }, + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "New Observation" + }, + "screens.ObservationCreate.noGpsDesc": { + "description": "Description in dialog when trying to save with no GPS coords", + "message": "இந்தக் கவனிப்புக்கு இடம் இல்லை. ஜிபிஎஸ் சிக்னலுக்காக நீங்கள் தொடர்ந்து காத்திருக்கலாம், இருப்பிடம் இல்லாமல் கண்காணிப்பைச் சேமிக்கலாம் அல்லது ஆயங்களை கைமுறையாக உள்ளிடலாம்" + }, + "screens.ObservationCreate.noGpsTitle": { + "description": "Title of dialog when trying to save with no GPS coords", + "message": "GPS சமிக்ஞை இல்லை" + }, + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "அவதானிப்புகள்" + }, + "screens.ObservationCreate.saveAnyway": { + "description": "Button to save regardless of GPS state", + "message": "சேமிக்கவும்" + }, + "screens.ObservationCreate.weakGpsDesc": { + "description": "Description in dialog when trying to save with low GPS accuracy.", + "message": "GPS துல்லியம் குறைவாக உள்ளது. சிறந்த துல்லியத்திற்காக நீங்கள் தொடர்ந்து காத்திருக்கலாம், குறைந்த துல்லியத்துடன் கண்காணிப்பைச் சேமிக்கலாம் அல்லது ஆயங்களை கைமுறையாக உள்ளிடலாம்" + }, + "screens.ObservationCreate.weakGpsTitle": { + "description": "Title of dialog when trying to save with low GPS accuracy.", + "message": "பலவீனமான GPS சிக்னல்" + }, "screens.ObservationDetails.done": { "description": "Button text when all questions are complete", "message": "Done" }, "screens.ObservationDetails.nextQuestion": { "description": "Button text to navigate to next question", - "message": "Next" + "message": "அடுத்து" }, "screens.ObservationDetails.title": { "description": "Title of observation details screen showing question number and total", "message": "Question {current} of {total}" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "சேர்க்க…" - }, "screens.ObservationEdit.ObservationEditView.audioButton": { "description": "Button label for adding audio", "message": "Audio" @@ -519,52 +869,30 @@ "description": "Button label for adding photo", "message": "Photo" }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "தேடு…" - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { - "description": "Button to cancel save and continue waiting for GPS", - "message": "தொடர்ந்து காத்திருக்கவும்" - }, - "screens.ObservationEdit.SaveButton.manualEntry": { - "description": "Button to manually enter GPS coordinates", - "message": "கையேடு இணைப்புகள்" - }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { - "description": "Description in dialog when trying to save with no GPS coords", - "message": "இந்தக் கவனிப்புக்கு இடம் இல்லை. ஜிபிஎஸ் சிக்னலுக்காக நீங்கள் தொடர்ந்து காத்திருக்கலாம், இருப்பிடம் இல்லாமல் கண்காணிப்பைச் சேமிக்கலாம் அல்லது ஆயங்களை கைமுறையாக உள்ளிடலாம்" - }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { - "description": "Title of dialog when trying to save with no GPS coords", - "message": "GPS சமிக்ஞை இல்லை" + "screens.ObservationEdit.changePreset": { + "message": "Change" }, - "screens.ObservationEdit.SaveButton.saveAnyway": { - "description": "Button to save regardless of GPS state", - "message": "சேமிக்கவும்" - }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { - "description": "Description in dialog when trying to save with low GPS accuracy.", - "message": "GPS துல்லியம் குறைவாக உள்ளது. சிறந்த துல்லியத்திற்காக நீங்கள் தொடர்ந்து காத்திருக்கலாம், குறைந்த துல்லியத்துடன் கண்காணிப்பைச் சேமிக்கலாம் அல்லது ஆயங்களை கைமுறையாக உள்ளிடலாம்" + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "இங்கே என்ன நடக்கிறது?" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { - "description": "Title of dialog when trying to save with low GPS accuracy.", - "message": "பலவீனமான GPS சிக்னல்" + "screens.ObservationEdit.navTitle": { + "description": "screen title for new observation screen", + "message": "Edit Observation" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", - "message": "கவனிப்பைத் திருத்து" + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "அவதானிப்புகள்" }, - "screens.ObservationEdit.newTitle": { - "description": "screen title for new observation screen", - "message": "புதிய கவனிப்பு" + "screens.ObservationList.TrackListItem.Track": { + "message": "Track" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "அவதானிப்புகள்" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "You are currently mapping on your own." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,32 +907,150 @@ "message": "அவதானிப்புகளைச் சேர்க்கவும்" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Create or Join a Project" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "அவதானிப்புகளை ஏற்றுவதில் பிழை. Mapeo ஐ விட்டுவிட்டு மீண்டும் தொடங்க முயற்சிக்கவும்." + "message": "Error loading observations. Try quitting and restarting CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "ஏற்றுகிறது... புதிய சாதனத்துடன் ஒத்திசைத்த பிறகு இதற்கு சிறிது நேரம் ஆகலாம்" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, - "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { - "description": "Placeholder for description/notes field", - "message": "What is happening here?" + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Privacy Policy" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Current Permissions" }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Share Diagnostic Information" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "ரத்து செய்க" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Delete Image" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "Delete this photo?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Delete Photo" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "About Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo is developed by Awana Digital, a 501c3 non-profit organization registered in the United States. Awana Digital works in solidarity with frontline communities to use technology to defend their rights and fight climate change." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "App Errors" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Information about internal errors that result in the app not functioning as expected" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "App Info" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "The version and locale (language) of CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "App Usage" + }, + "screens.PrivacyPolicy.control": { + "message": "You're in control" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "You can opt out of sending any information to Awana Digital. You choose where your data is stored and who it is shared with. You may choose to share anonymized, summarized data about how you use CoMapeo with Awana Digital. We will always be transparent about what information you choose to share for the purposed of improving the app, and this information will never include photos, videos, audio, text, or precise locations that you have entered into CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Crash Data" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Information about what caused the app to close unexpectedly" + }, + "screens.PrivacyPolicy.dataCollection": { + "message": "CoMapeo Data Collection" + }, + "screens.PrivacyPolicy.deviceInfo": { + "message": "Device Info" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Such as model and manufacturer of your device; device operating system; screen size; device locale (language); device memory." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnostics" + }, + "screens.PrivacyPolicy.noPII": { + "message": "No personally identifiable information" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "Using CoMapeo does not require a user account. Awana Digital does not collect your name, email address or any other personal details. No permanent user identifier or device identifier is ever shared with Awana Digital, and we take extra measures to ensure that no information you share can be used to track you: identifiers are randomized and rotated (changed) every month and we do not store IP addresses." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "What is not collected?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "We do not collect any personal data or anything that can be used to identify or track a user or device. Device identifiers used to aggregate information are random, anonymous, and changed every month. Diagnostic information does not include data about how you use the app, and it never includes any of the data you have collected with the app. We do not collect your precise or coarse location, only the country where you are using CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Open Source and the \"Official\" Version" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo is an open-source application. This means that anyone can view the code that makes the app work and can verify the privacy declarations in this document. It also means that anyone can adapt the app to their own needs and release an alternative version. This document refers to data collected by the official releases of CoMapeo, digitally signed by Awana Digital, available from the Google Play Store or the Awana Digital website. Unofficial releases of CoMapeo obtained from other channels are outside our control and may share additional information with other organizations." + }, + "screens.PrivacyPolicy.overview": { + "message": "This document describes what information (\"data\") is sent from CoMapeo to the application developer, Awana Digital, and how that information is used." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Performance Data" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Such as launch time, energy usage, app freezes, and responsiveness" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "CoMapeo Data Privacy" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Private by default" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "The data you collect and create with CoMapeo (locations, photos, video, audio, text) is only stored on your device by default, and is not stored or sent anywhere else. When you share data with collaborators by joining a project with them, it is sent encrypted, directly to your collaborators' device. This means that the data is not sent via Awana Digital, nor anyone else, on its way to your collaborator. Awana Digital never sees nor has access to any of the data you collect with CoMapeo unless you explicitly send it to us." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Third-party access to data" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "A \"third-party\" is an organization other than Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "User Counts" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "The number of users per country and per project. Aggregated and anonymized" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "What is collected?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "By default, anonymized diagnostic information about your device, app crashes, errors and performance is shared with Awana Digital. You can opt-out of sharing this information at any time. This diagnostic information is completely anonymized and it never contains any of your data (the data you have collected with CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "Why is this data collected?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Crash data and app errors together with the device and app info provide Awana Digital with the information we need to fix errors and bugs in the app. The performance data helps us improve the responsiveness of the app and identify errors. User counts, including total users, users per country, and users per project, help justify ongoing investment in the development of CoMapeo." + }, + "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "இங்கே என்ன நடக்கிறது?" }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", @@ -614,15 +1060,6 @@ "description": "Category title for new track screen", "message": "Track" }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "பயன்படுத்த, பயன்பாட்டு கடவுக்குறியீட்டை இயக்கவும்" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "வலிப்புத்தாக்கத்திலிருந்து உங்கள் சாதனத்தைப் பாதுகாக்கவும்" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Obscure Passcode" - }, "screens.Security.passDesriptionPassNotSet": { "message": "கடவுக்குறியீடு அமைக்கப்படவில்லை" }, @@ -642,7 +1079,7 @@ "message": "Your Device Name" }, "screens.Setting.ProjectSettings.DeviceName.DisplayScreen.title": { - "message": "Device Name" + "message": "சாதனத்தின் பெயர்" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.deviceNameLabel": { "message": "Edit Device Name" @@ -654,10 +1091,10 @@ "message": "Discard Changes" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "மாற்றங்களை அகற்றவா?" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { - "message": "Device Name" + "message": "சாதனத்தின் பெயர்" }, "screens.Setting.ProjectSettings.YourTeam.InviteAccepted.addAnotherDevice": { "message": "Add Another Device" @@ -702,7 +1139,7 @@ "message": "Date Added" }, "screens.Setting.ProjectSettings.YourTeam.deviceName": { - "message": "Device Name" + "message": "சாதனத்தின் பெயர்" }, "screens.Setting.ProjectSettings.YourTeam.inviteDevice": { "message": "Invite Device" @@ -716,6 +1153,21 @@ "screens.Setting.ProjectSettings.YourTeam.title": { "message": "Your Team" }, + "screens.Settings.Config.created": { + "message": "Created {date} at {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Import Config" + }, + "screens.Settings.Config.name": { + "message": "Config Name:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuration" + }, + "screens.Settings.Config.projectName": { + "message": "Project Name:" + }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { "message": "Create a Project" }, @@ -755,14 +1207,17 @@ "screens.Settings.CreateOrJoinProject.importConfig": { "message": "Import Config" }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "File name should end with .comapeocat" + }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Join an existing CoMapeo Project" }, "screens.Settings.CreateOrJoinProject.joinProject": { "message": "Join a Project" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.Settings.CreateOrJoinProject.startProject": { "message": "Start a CoMapeo Project" @@ -788,12 +1243,12 @@ "screens.Settings.YourTeam.unableToCancel": { "message": "Unable to Cancel Invitation" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "மேபியோ பற்றி" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "பதிப்பு மற்றும் உருவாக்க எண்" }, "screens.Settings.appSettings": { @@ -803,6 +1258,10 @@ "description": "list of avaialable app settings", "message": "Language, Security, Coordinates" }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Project Configuration" + }, "screens.Settings.createOrJoin": { "message": "Create or Join Project" }, @@ -820,11 +1279,20 @@ "description": "Title of settings screen", "message": "அமைப்புகள்" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { "message": "Create or Join Project" }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "You will be able to share data with devices that are part of the same project." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Create or join a project to collect data with a team" }, "screens.Sync.HeaderTitle.noWiFi": { "message": "No WiFi" @@ -838,49 +1306,93 @@ "screens.Sync.NoWifiDisplay.title": { "message": "No WiFi" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "You're all caught up!" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "All data synced" + }, + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Devices available" + }, + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Devices found" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "No devices available to sync" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Syncing…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Waiting…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Waiting for other devices" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Start Sync" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Stop" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Complete! Waiting for other devices to join" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "Complete! You're up to date" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "You are syncing with your team" + }, + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Waiting for devices" + }, + "screens.Track.ObservationList.observations": { + "message": "அவதானிப்புகள்" + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "Delete track?" + }, + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Track" + }, + "screens.Track.tracks": { + "message": "Tracks" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Edit Track" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Track" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", "message": "Show Options" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Leave Project" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Disconnected" }, "sharedComponents.DeviceIconWithName.thisDevice": { "message": "This Device!" }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "தேடு…" + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Change" + }, "sharedComponents.ErrorModal.goBack": { "message": "Go Back" }, @@ -894,31 +1406,40 @@ "message": "No GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "தேடு…" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Invite Canceled" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Close" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Your invitation to {projectName} has been canceled." }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { "message": "Accept Invite" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { "message": "Decline Invite" }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "You've been invited to join {projectName}" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Join Project {projectName}" + }, "sharedComponents.ProjectInviteBottomSheet.goToMap": { - "message": "Go To Map" + "message": "வரைபடத்திற்குச் செல்லவும்" }, "sharedComponents.ProjectInviteBottomSheet.goToSync": { "message": "Go To Sync" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" - }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" - }, "sharedComponents.ProjectInviteBottomSheet.success": { "message": "Success" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "You have joined {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { "message": "Coordinator" diff --git a/messages/th.json b/messages/th.json index 3637ab365..460568b57 100644 --- a/messages/th.json +++ b/messages/th.json @@ -25,24 +25,12 @@ "description": "Title of dialog that shows when cancelling a new observation", "message": "ยืนยันการยกเลิก?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { "message": "Enable" }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" - }, "Modal.GPSDisable.description": { "message": "To create a Track CoMapeo needs access to your location and GPS." }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" - }, "Modal.GPSDisable.title": { "message": "GPS Disabled" }, @@ -58,6 +46,80 @@ "Modal.GPSEnable.trackingDescription": { "message": "You’ve been recording for" }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "เวอร์ชันและรหัส Build Number" + }, + "Navigation.Drawer.appSettings": { + "message": "App Settings" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Language, Security, Coordinates" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Create or Join Project" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Create a new project or join existing one" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Data & Privacy" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "You are currently mapping on your own" + }, + "Navigation.Drawer.projName": { + "message": "Project {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Project Settings" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categories, Config, Team" + }, + "Navigation.Drawer.security": { + "message": "ความปลอดภัย" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "การตั้งค่า" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "ทำการแก้ไขต่อ" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Discard changes" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "ยกเลิกการเปลี่ยนแปลงหรือไม่?" + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "ทำการแก้ไขต่อ" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Discard Track?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard Track" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Your Track will not be saved. This cannot be undone." + }, "Screens.Settings.AppSettings.coordinateSystem": { "message": "Coordinate System" }, @@ -71,20 +133,51 @@ "message": "Display language for app" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "App Settings" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "ชื่ออุปกรณ์" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Sync Settings" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Project Settings" }, "Screens.Settings.ProjectSettings.yourTeam": { "message": "Your Team" }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "ยกเลิก" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "ใช่ ลบได้" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "ลบ" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Share" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "ทำการแก้ไขต่อ" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "ยกเลิกการเปลี่ยนแปลงหรือไม่?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard changes" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { "message": "Coordinator" }, @@ -98,7 +191,7 @@ "message": "Not seeing a Device?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Make sure both devices are on the same version of CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { "message": "Make sure both devices are on the same wifi network" @@ -118,6 +211,38 @@ "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { "message": "Select a Role" }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "CoMapeo build" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "CoMapeo variant" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "CoMapeo version" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Android build number" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Android version" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Phone model" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "About CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Unknown" + }, "screens.AddPhoto.cancel": { "message": "ยกเลิก" }, @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "Passcode" + "message": "Passcode: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "Save App Passcode" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Make sure to note your passcode in a secure location before saving." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "App Passcodes can never be recovered if lost or forgotten! Make sure to note your passcode in a secure location before saving." + "message": "App Passcodes can never be recovered if lost or forgotten!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "Please Enter Passcode" @@ -168,7 +296,7 @@ "message": "Incorrect Passcode" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "This passcode will be required to open the Mapeo App" + "message": "This passcode will be required to open the CoMapeo App" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { "message": "Confirm Passcode" @@ -183,10 +311,10 @@ "message": "รหัสผ่านแอป คืออะไร?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app. You can define your own 5-digit passcode by turning on the feature below." + "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**Please note that forgotten passcodes cannot be recovered!** Once this feature is enabled, if you forget or lose your passcode, you will not be able to open Mapeo and will lose access to any Mapeo data that has not been synced with other project participants." + "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "ยกเลิก" @@ -198,7 +326,7 @@ "message": "You are currently using App Passcode. See below to stop using or change your passcode." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app." + "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "รหัสผ่านแอป" @@ -212,6 +340,26 @@ "screens.AppPasscode.TurnOffPasscode.usePasscode": { "message": "Use App Passcode" }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Allow" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Go to Settings" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Not Now" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "To record audio while using the app and in the background CoMapeo needs to access your microphone. Please enable microphone permissions in your app settings." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Recording Audio with CoMapeo" + }, "screens.CameraScreen.goToSettings": { "message": "Go to Settings" }, @@ -238,12 +386,63 @@ "description": "Universal Transverse Mercator coordinate format", "message": "Universal Transverse Mercator (UTM)" }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "Anonymized information about your device, app crashes, errors and performance helps Awana Digital improve the app and fix errors." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Diagnostic Information" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Data & Privacy" + }, + "screens.DataAndPrivacy.noPII": { + "message": "This never includes any of your data or personal information." + }, + "screens.DataAndPrivacy.optOut": { + "message": "You can opt-out of sharing diagnostic information at any time." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo Respects Your Privacy & Autonomy" + }, + "screens.DataPrivacy.description": { + "message": "CoMapeo allows you and your collaborators to map offline without needing servers." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Private by default — diagnostic information is fully anonymized and you can opt-out any time." + }, + "screens.DataPrivacy.encrypted": { + "message": "All data stays fully encrypted" + }, + "screens.DataPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Easily manage and control sharing and collaboration." + }, + "screens.DataPrivacy.next": { + "message": "ถัดไป" + }, + "screens.DataPrivacy.stays": { + "message": "Your data stays on your devices." + }, + "screens.DataPrivacy.title": { + "message": "Data & Privacy" + }, "screens.DeviceNaming.Success.description": { "message": "You named your device" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "To find your project settings go to the main menu found on the map screen." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Go to Map" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." + }, "screens.DeviceNaming.Success.success": { "message": "Success!" }, @@ -251,7 +450,7 @@ "message": "Add Name" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." }, "screens.DeviceNaming.header": { "message": "Add a name for your device" @@ -268,23 +467,78 @@ "screens.FatalError.somethingWrong": { "message": "Something Went Wrong" }, + "screens.HowToLeaveProject.goBack": { + "message": "Go back" + }, + "screens.HowToLeaveProject.howTo": { + "message": "How to Leave Project" + }, + "screens.HowToLeaveProject.instructions": { + "message": "To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device." + }, + "screens.HowToLeaveProject.warning": { + "message": "If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!" + }, "screens.IntroToCoMapeo.collaborate": { - "message": "Collaborate on mapping and monitoring projects" + "message": "Collaborate with others" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Designed with and for Indigenous peoples & frontline communities" }, "screens.IntroToCoMapeo.getStarted": { "message": "Get Started" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "is now" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Map anywhere and everywhere" + }, + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Map your world, together" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.ownData": { + "message": "Own and control your data" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", - "message": "Language" + "message": "ภาษา" + }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "You are already on a project" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Go Back" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Leave Current Project" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "To join a new project you must leave your current one." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "You are on {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "ยกเลิก" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Please check the box to confirm" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "I understand I will be deleting all data from Project {projectName} from my device." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "I understand I will be deleting all data from my device." + }, + "screens.LeaveProject.leaveProj": { + "message": "Leave Project" + }, + "screens.LeaveProject.leavingProject": { + "message": "Leaving Project {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "This will remove all Project {projectName}'s data from your device." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "This will remove all of the data from your device." }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", @@ -437,11 +691,50 @@ "screens.ManualGpsScreen.zoneNumber": { "message": "Zone Number" }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "ยกเลิก" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sync Everything" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "Sync Everything?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Your device will sync all content at full size, including photos, audio, and videos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "You are about to sync everything. This may increase the disk space used on your device." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Note: This will use more storage." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "You will no longer sync Audio or Video." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Sync Previews (Photos Only)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Sync Previews" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "Sync Previews?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Photos will sync at a reduced smaller size. Device will not sync audio or video." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Your device will keep all existing data but new observations will sync in a smaller, preview size." + }, + "screens.MediaSyncSettings.title": { + "message": "Sync Settings" + }, "screens.ObscurePasscode.description": { - "message": "Obscure Passcode is a security feature that allows you to open Mapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of Mapeo which allows you to create demonstration observations that are not saved to the Mapeo database." + "message": "Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database." }, "screens.ObscurePasscode.instructions": { - "message": "Enter the code above to hide your data in Mapeo" + "message": "Enter the code above to hide your data in CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Obscure Passcode" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "What is Obscure Passcode?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "แก้ไข" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "การสังเกต" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "ลบ" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "การสังเกต" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Share" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "ยกเลิก" }, + "screens.Observation.comapeoAlert": { + "message": "CoMapeo Alert" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "ใช่ ลบได้" @@ -483,26 +776,83 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "ยืนยันให้ลบการสังเกตนี้หรือไม่?" }, + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", + "message": "การสังเกต" + }, + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Sharing image" + }, + "screens.Observation.shareMessageFooter": { + "message": "Sent from CoMapeo" + }, + "screens.Observation.shareMessageTitle": { + "message": "CoMapeo Alert" + }, + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Sharing text" + }, "screens.Observation.title": { "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", "message": "การสังเกต" }, + "screens.ObservationCreate.changePreset": { + "message": "Change" + }, + "screens.ObservationCreate.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "เกิดอะไรขึ้นที่นี่?" + }, + "screens.ObservationCreate.keepWaiting": { + "description": "Button to cancel save and continue waiting for GPS", + "message": "กำลังรอ" + }, + "screens.ObservationCreate.manualEntry": { + "description": "Button to manually enter GPS coordinates", + "message": "ป้อนพิกัดด้วยตัวเอง" + }, + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "New Observation" + }, + "screens.ObservationCreate.noGpsDesc": { + "description": "Description in dialog when trying to save with no GPS coords", + "message": "ข้อสังเกตนี้ไม่ปรากฎสถานที่ กรุณารอสัญญาณ GPS สักครู่ บันทึกข้อสังเกต โดยป้อนพิกัดด้วยตัวเอง " + }, + "screens.ObservationCreate.noGpsTitle": { + "description": "Title of dialog when trying to save with no GPS coords", + "message": "ไม่มีสัญญาณ GPS" + }, + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "การสังเกต" + }, + "screens.ObservationCreate.saveAnyway": { + "description": "Button to save regardless of GPS state", + "message": "บันทึก" + }, + "screens.ObservationCreate.weakGpsDesc": { + "description": "Description in dialog when trying to save with low GPS accuracy.", + "message": "ความแม่นยำของ GPS ต่ำ กรุณารอสักพักเพื่อความแม่นยำของสัญญาณ กรุณาบันทึกข้อสังเกต หรือป้อนพิกัดด้วยตัวเอง" + }, + "screens.ObservationCreate.weakGpsTitle": { + "description": "Title of dialog when trying to save with low GPS accuracy.", + "message": "สัญญาณ GPS อ่อน" + }, "screens.ObservationDetails.done": { "description": "Button text when all questions are complete", "message": "Done" }, "screens.ObservationDetails.nextQuestion": { "description": "Button text to navigate to next question", - "message": "Next" + "message": "ถัดไป" }, "screens.ObservationDetails.title": { "description": "Title of observation details screen showing question number and total", "message": "Question {current} of {total}" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "เพิ่มเติม..." - }, "screens.ObservationEdit.ObservationEditView.audioButton": { "description": "Button label for adding audio", "message": "Audio" @@ -519,52 +869,30 @@ "description": "Button label for adding photo", "message": "Photo" }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "กำลัง​ค้น​หา..." - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { - "description": "Button to cancel save and continue waiting for GPS", - "message": "กำลังรอ" - }, - "screens.ObservationEdit.SaveButton.manualEntry": { - "description": "Button to manually enter GPS coordinates", - "message": "ป้อนพิกัดด้วยตัวเอง" - }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { - "description": "Description in dialog when trying to save with no GPS coords", - "message": "ข้อสังเกตนี้ไม่ปรากฎสถานที่ กรุณารอสัญญาณ GPS สักครู่ บันทึกข้อสังเกต โดยป้อนพิกัดด้วยตัวเอง " - }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { - "description": "Title of dialog when trying to save with no GPS coords", - "message": "ไม่มีสัญญาณ GPS" + "screens.ObservationEdit.changePreset": { + "message": "Change" }, - "screens.ObservationEdit.SaveButton.saveAnyway": { - "description": "Button to save regardless of GPS state", - "message": "บันทึก" - }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { - "description": "Description in dialog when trying to save with low GPS accuracy.", - "message": "ความแม่นยำของ GPS ต่ำ กรุณารอสักพักเพื่อความแม่นยำของสัญญาณ กรุณาบันทึกข้อสังเกต หรือป้อนพิกัดด้วยตัวเอง" + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "เกิดอะไรขึ้นที่นี่?" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { - "description": "Title of dialog when trying to save with low GPS accuracy.", - "message": "สัญญาณ GPS อ่อน" + "screens.ObservationEdit.navTitle": { + "description": "screen title for new observation screen", + "message": "Edit Observation" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", - "message": "แก้ไขการสังเกต" + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "การสังเกต" }, - "screens.ObservationEdit.newTitle": { - "description": "screen title for new observation screen", - "message": "การสังเกตใหม่" + "screens.ObservationList.TrackListItem.Track": { + "message": "Track" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "การสังเกตต่าง ๆ " }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "You are currently mapping on your own." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,32 +907,150 @@ "message": "เพิ่มการสังเกต" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Create or Join a Project" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "การแสดงผลไม่สำเร็จ ลองปิด-เปิด Mapeo อีกครั้ง" + "message": "Error loading observations. Try quitting and restarting CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "กำลังโหลดข้อมูล... การเชื่อมต่อกับอุปกรณ์ใหม่จะใช้เวลาสักครู่" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, - "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { - "description": "Placeholder for description/notes field", - "message": "What is happening here?" + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Privacy Policy" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Current Permissions" }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Share Diagnostic Information" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "ยกเลิก" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Delete Image" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "Delete this photo?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Delete Photo" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "About Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo is developed by Awana Digital, a 501c3 non-profit organization registered in the United States. Awana Digital works in solidarity with frontline communities to use technology to defend their rights and fight climate change." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "App Errors" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Information about internal errors that result in the app not functioning as expected" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "App Info" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "The version and locale (language) of CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "App Usage" + }, + "screens.PrivacyPolicy.control": { + "message": "You're in control" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "You can opt out of sending any information to Awana Digital. You choose where your data is stored and who it is shared with. You may choose to share anonymized, summarized data about how you use CoMapeo with Awana Digital. We will always be transparent about what information you choose to share for the purposed of improving the app, and this information will never include photos, videos, audio, text, or precise locations that you have entered into CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Crash Data" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Information about what caused the app to close unexpectedly" + }, + "screens.PrivacyPolicy.dataCollection": { + "message": "CoMapeo Data Collection" + }, + "screens.PrivacyPolicy.deviceInfo": { + "message": "Device Info" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Such as model and manufacturer of your device; device operating system; screen size; device locale (language); device memory." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnostics" + }, + "screens.PrivacyPolicy.noPII": { + "message": "No personally identifiable information" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "Using CoMapeo does not require a user account. Awana Digital does not collect your name, email address or any other personal details. No permanent user identifier or device identifier is ever shared with Awana Digital, and we take extra measures to ensure that no information you share can be used to track you: identifiers are randomized and rotated (changed) every month and we do not store IP addresses." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "What is not collected?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "We do not collect any personal data or anything that can be used to identify or track a user or device. Device identifiers used to aggregate information are random, anonymous, and changed every month. Diagnostic information does not include data about how you use the app, and it never includes any of the data you have collected with the app. We do not collect your precise or coarse location, only the country where you are using CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Open Source and the \"Official\" Version" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo is an open-source application. This means that anyone can view the code that makes the app work and can verify the privacy declarations in this document. It also means that anyone can adapt the app to their own needs and release an alternative version. This document refers to data collected by the official releases of CoMapeo, digitally signed by Awana Digital, available from the Google Play Store or the Awana Digital website. Unofficial releases of CoMapeo obtained from other channels are outside our control and may share additional information with other organizations." + }, + "screens.PrivacyPolicy.overview": { + "message": "This document describes what information (\"data\") is sent from CoMapeo to the application developer, Awana Digital, and how that information is used." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Performance Data" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Such as launch time, energy usage, app freezes, and responsiveness" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "CoMapeo Data Privacy" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Private by default" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "The data you collect and create with CoMapeo (locations, photos, video, audio, text) is only stored on your device by default, and is not stored or sent anywhere else. When you share data with collaborators by joining a project with them, it is sent encrypted, directly to your collaborators' device. This means that the data is not sent via Awana Digital, nor anyone else, on its way to your collaborator. Awana Digital never sees nor has access to any of the data you collect with CoMapeo unless you explicitly send it to us." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Third-party access to data" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "A \"third-party\" is an organization other than Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "User Counts" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "The number of users per country and per project. Aggregated and anonymized" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "What is collected?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "By default, anonymized diagnostic information about your device, app crashes, errors and performance is shared with Awana Digital. You can opt-out of sharing this information at any time. This diagnostic information is completely anonymized and it never contains any of your data (the data you have collected with CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "Why is this data collected?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Crash data and app errors together with the device and app info provide Awana Digital with the information we need to fix errors and bugs in the app. The performance data helps us improve the responsiveness of the app and identify errors. User counts, including total users, users per country, and users per project, help justify ongoing investment in the development of CoMapeo." + }, + "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "เกิดอะไรขึ้นที่นี่?" }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", @@ -614,15 +1060,6 @@ "description": "Category title for new track screen", "message": "Track" }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "ในการใช้งาน ให้เปิดใช้งานรหัสผ่านแอป" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "ปกป้องอุปกรณ์ของคุณจากหน้าจอค้าง" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Obscure Passcode" - }, "screens.Security.passDesriptionPassNotSet": { "message": "ยังไม่ได้ตั้งรหัสผ่าน" }, @@ -642,7 +1079,7 @@ "message": "Your Device Name" }, "screens.Setting.ProjectSettings.DeviceName.DisplayScreen.title": { - "message": "Device Name" + "message": "ชื่ออุปกรณ์" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.deviceNameLabel": { "message": "Edit Device Name" @@ -654,10 +1091,10 @@ "message": "Discard Changes" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "ยกเลิกการเปลี่ยนแปลงหรือไม่?" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { - "message": "Device Name" + "message": "ชื่ออุปกรณ์" }, "screens.Setting.ProjectSettings.YourTeam.InviteAccepted.addAnotherDevice": { "message": "Add Another Device" @@ -702,7 +1139,7 @@ "message": "Date Added" }, "screens.Setting.ProjectSettings.YourTeam.deviceName": { - "message": "Device Name" + "message": "ชื่ออุปกรณ์" }, "screens.Setting.ProjectSettings.YourTeam.inviteDevice": { "message": "Invite Device" @@ -716,6 +1153,21 @@ "screens.Setting.ProjectSettings.YourTeam.title": { "message": "Your Team" }, + "screens.Settings.Config.created": { + "message": "Created {date} at {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Import Config" + }, + "screens.Settings.Config.name": { + "message": "Config Name:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuration" + }, + "screens.Settings.Config.projectName": { + "message": "Project Name:" + }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { "message": "Create a Project" }, @@ -755,14 +1207,17 @@ "screens.Settings.CreateOrJoinProject.importConfig": { "message": "Import Config" }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "File name should end with .comapeocat" + }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Join an existing CoMapeo Project" }, "screens.Settings.CreateOrJoinProject.joinProject": { "message": "Join a Project" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.Settings.CreateOrJoinProject.startProject": { "message": "Start a CoMapeo Project" @@ -788,12 +1243,12 @@ "screens.Settings.YourTeam.unableToCancel": { "message": "Unable to Cancel Invitation" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "เกี่ยวกับ Mapeo" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "เวอร์ชันและรหัส Build Number" }, "screens.Settings.appSettings": { @@ -803,6 +1258,10 @@ "description": "list of avaialable app settings", "message": "Language, Security, Coordinates" }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Project Configuration" + }, "screens.Settings.createOrJoin": { "message": "Create or Join Project" }, @@ -820,11 +1279,20 @@ "description": "Title of settings screen", "message": "การตั้งค่า" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { "message": "Create or Join Project" }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "You will be able to share data with devices that are part of the same project." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Create or join a project to collect data with a team" }, "screens.Sync.HeaderTitle.noWiFi": { "message": "No WiFi" @@ -838,49 +1306,93 @@ "screens.Sync.NoWifiDisplay.title": { "message": "No WiFi" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "You're all caught up!" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "All data synced" + }, + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Devices available" + }, + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Devices found" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "No devices available to sync" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Syncing…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Waiting…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Waiting for other devices" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Start Sync" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Stop" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Complete! Waiting for other devices to join" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "Complete! You're up to date" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "You are syncing with your team" + }, + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Waiting for devices" + }, + "screens.Track.ObservationList.observations": { + "message": "การสังเกตต่าง ๆ " + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "Delete track?" + }, + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Track" + }, + "screens.Track.tracks": { + "message": "Tracks" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Edit Track" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Track" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", "message": "Show Options" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Leave Project" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Disconnected" }, "sharedComponents.DeviceIconWithName.thisDevice": { "message": "This Device!" }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "กำลัง​ค้น​หา..." + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Change" + }, "sharedComponents.ErrorModal.goBack": { "message": "Go Back" }, @@ -894,31 +1406,40 @@ "message": "No GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "กำลัง​ค้น​หา..." + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Invite Canceled" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Close" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Your invitation to {projectName} has been canceled." }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { "message": "Accept Invite" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { "message": "Decline Invite" }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "You've been invited to join {projectName}" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Join Project {projectName}" + }, "sharedComponents.ProjectInviteBottomSheet.goToMap": { - "message": "Go To Map" + "message": "เปิดแผนที่" }, "sharedComponents.ProjectInviteBottomSheet.goToSync": { "message": "Go To Sync" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" - }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" - }, "sharedComponents.ProjectInviteBottomSheet.success": { "message": "Success" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "You have joined {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { "message": "Coordinator" diff --git a/messages/vi.json b/messages/vi.json index 4e8a9a70b..969c2361a 100644 --- a/messages/vi.json +++ b/messages/vi.json @@ -25,24 +25,12 @@ "description": "Title of dialog that shows when cancelling a new observation", "message": "Hủy bỏ quan sát?" }, - "Modal.DiscardTrack.description": { - "message": "Your Track will not be saved. This cannot be undone." - }, - "Modal.DiscardTrack.title": { - "message": "Discard Track?" - }, "Modal.GPSDisable.button": { "message": "Enable" }, - "Modal.GPSDisable.defaultButton": { - "message": "Continue Editing" - }, "Modal.GPSDisable.description": { "message": "To create a Track CoMapeo needs access to your location and GPS." }, - "Modal.GPSDisable.discardButton": { - "message": "Discard Track" - }, "Modal.GPSDisable.title": { "message": "GPS Disabled" }, @@ -58,6 +46,80 @@ "Modal.GPSEnable.trackingDescription": { "message": "You’ve been recording for" }, + "Navigation.Drawer.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" + }, + "Navigation.Drawer.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", + "message": "Phiên bản và số hiệu bản tạo" + }, + "Navigation.Drawer.appSettings": { + "message": "App Settings" + }, + "Navigation.Drawer.appSettingsDesc": { + "description": "list of avaialable app settings", + "message": "Language, Security, Coordinates" + }, + "Navigation.Drawer.createOrJoin": { + "message": "Create or Join Project" + }, + "Navigation.Drawer.createOrJoinDesc": { + "message": "Create a new project or join existing one" + }, + "Navigation.Drawer.dataAndPrivacy": { + "message": "Data & Privacy" + }, + "Navigation.Drawer.mappingOnOwn": { + "message": "You are currently mapping on your own" + }, + "Navigation.Drawer.projName": { + "message": "Project {projectName}" + }, + "Navigation.Drawer.projectSettings": { + "message": "Project Settings" + }, + "Navigation.Drawer.projectSettingsDesc": { + "description": "list of avaialable project settings", + "message": "Categories, Config, Team" + }, + "Navigation.Drawer.security": { + "message": "Bảo mật" + }, + "Navigation.Drawer.title": { + "description": "Title of settings screen", + "message": "Cài đặt" + }, + "ObservationEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Tiếp tục chỉnh sửa" + }, + "ObservationEdit.HeaderLeft.discardObservationButton": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Discard changes" + }, + "ObservationEdit.HeaderLeft.discardObservationDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, + "ObservationEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling observation edits", + "message": "Hủy bỏ thay đổi?" + }, + "SaveTrack.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Tiếp tục chỉnh sửa" + }, + "SaveTrack.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Discard Track?" + }, + "SaveTrack.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard Track" + }, + "SaveTrack.HeaderLeft.discardTrackDescription": { + "message": "Your Track will not be saved. This cannot be undone." + }, "Screens.Settings.AppSettings.coordinateSystem": { "message": "Coordinate System" }, @@ -71,20 +133,51 @@ "message": "Display language for app" }, "Screens.Settings.AppSettings.title": { - "message": "App Setttings" - }, - "Screens.Settings.ProjectSettings.configuration": { - "message": "Configuration" + "message": "App Settings" }, "Screens.Settings.ProjectSettings.deviceName": { "message": "Tên thiết bị" }, + "Screens.Settings.ProjectSettings.mediaSyncSettings": { + "message": "Sync Settings" + }, "Screens.Settings.ProjectSettings.title": { - "message": "Project Setttings" + "message": "Project Settings" }, "Screens.Settings.ProjectSettings.yourTeam": { "message": "Your Team" }, + "SharedComponents.ActionButtons.cancel": { + "description": "Button to cancel delete of observation", + "message": "Hủy" + }, + "SharedComponents.ActionButtons.confirm": { + "description": "Button to confirm delete of observation", + "message": "Có, xóa" + }, + "SharedComponents.ActionButtons.delete": { + "description": "Button to delete an observation", + "message": "Xóa" + }, + "SharedComponents.ActionButtons.share": { + "description": "Button to share an observation", + "message": "Share" + }, + "TrackEdit.HeaderLeft.discardCancel": { + "description": "Button on dialog to keep editing (cancelling close action)", + "message": "Tiếp tục chỉnh sửa" + }, + "TrackEdit.HeaderLeft.discardTitle": { + "description": "Title of dialog that shows when cancelling track edits", + "message": "Hủy bỏ thay đổi?" + }, + "TrackEdit.HeaderLeft.discardTrackButton": { + "description": "Button to confirm discarding the track", + "message": "Discard changes" + }, + "TrackEdit.HeaderLeft.discardTrackDescription": { + "message": "Your changes will not be saved. This cannot be undone." + }, "screen.Settings.ProjectSettings.YourTeam.ReviewAndInvite.ReviewInvitation.coordinator": { "message": "Coordinator" }, @@ -98,7 +191,7 @@ "message": "Not seeing a Device?" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion": { - "message": "Make sure both devices are on the same version of Mapeo" + "message": "Make sure both devices are on the same version of CoMapeo" }, "screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameWifi": { "message": "Make sure both devices are on the same wifi network" @@ -118,6 +211,38 @@ "screen.Settings.ProjectSettings.YourTeam.SelectInviteeRole.title": { "message": "Select a Role" }, + "screens.AboutSettings.CoMapeoBuild": { + "description": "Label for CoMapeo build number", + "message": "CoMapeo build" + }, + "screens.AboutSettings.CoMapeoType": { + "description": "Label for CoMapeo type/variant (e.g. QA for testing vs normal version of app)", + "message": "CoMapeo variant" + }, + "screens.AboutSettings.CoMapeoVersion": { + "description": "Label for CoMapeo version", + "message": "CoMapeo version" + }, + "screens.AboutSettings.androidBuild": { + "description": "Label for Android build number", + "message": "Android build number" + }, + "screens.AboutSettings.androidVersion": { + "description": "Label for Android version", + "message": "Android version" + }, + "screens.AboutSettings.phoneModel": { + "description": "Label for phone model", + "message": "Phone model" + }, + "screens.AboutSettings.title": { + "description": "Title of 'About CoMapeo' screen", + "message": "About CoMapeo" + }, + "screens.AboutSettings.unknownValue": { + "description": "Shown when a device info (e.g. version number) is unknown", + "message": "Unknown" + }, "screens.AddPhoto.cancel": { "message": "Hủy" }, @@ -129,13 +254,16 @@ }, "screens.AppPasscode.ConfirmPasscodeSheet.passcode": { "description": "used to indicate to the user what the new passcode will be.", - "message": "Mật khẩu" + "message": "Passcode: {passcode}" }, "screens.AppPasscode.ConfirmPasscodeSheet.saveAppPasscode": { "message": "Lưu mật khẩu ứng dụng" }, + "screens.AppPasscode.ConfirmPasscodeSheet.suggestion": { + "message": "Make sure to note your passcode in a secure location before saving." + }, "screens.AppPasscode.ConfirmPasscodeSheet.title": { - "message": "Mật khẩu ứng dụng không thể được phục hồi nếu bị mất hoặc bị quên! Hãy nhớ ghi lại mật khẩu của bạn ở một nơi an toàn trước khi lưu để dùng." + "message": "App Passcodes can never be recovered if lost or forgotten!" }, "screens.AppPasscode.EnterPassToTurnOff.subTitleEnter": { "message": "Vui lòng nhập mật khẩu" @@ -168,7 +296,7 @@ "message": "Mật khẩu không đúng" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet": { - "message": "Mật khẩu này sẽ được yêu cầu để mở ứng dụng Mapeo" + "message": "This passcode will be required to open the CoMapeo App" }, "screens.AppPasscode.NewPasscode.InputPasscodeScreen.title": { "message": "Confirm Passcode" @@ -183,10 +311,10 @@ "message": "Mật khẩu Ứng dụng là gì?" }, "screens.AppPasscode.PasscodeIntro.description": { - "message": "Mật khẩu ứng dụng cho phép bạn thêm một lớp bảo mật bổ sung bằng cách yêu cầu bạn nhập mật khẩu để mở ứng dụng Mapeo. Bạn có thể xác định mật khẩu gồm 5 chữ số của riêng mình bằng cách bật tính năng bên dưới." + "message": "App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below." }, "screens.AppPasscode.PasscodeIntro.warning": { - "message": "**Xin lưu ý rằng mật khẩu đã quên không thể khôi phục được!** Khi tính năng này được bật, nếu bạn quên hoặc mất mật khẩu, bạn sẽ không thể mở Mapeo và sẽ mất quyền truy cập vào mọi dữ liệu Mapeo chưa được đồng bộ hóa với những người tham gia dự án khác." + "message": "Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants." }, "screens.AppPasscode.TurnOffPasscode.cancel": { "message": "Hủy" @@ -198,7 +326,7 @@ "message": "Bạn đang sử dụng Mật khẩu ứng dụng. Xem bên dưới để ngừng sử dụng hoặc thay đổi mật khẩu của bạn." }, "screens.AppPasscode.TurnOffPasscode.description": { - "message": "Mật khẩu ứng dụng bổ sung thêm một lớp bảo mật bằng cách yêu cầu bạn nhập mật khẩu để mở ứng dụng Mapeo." + "message": "App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app." }, "screens.AppPasscode.TurnOffPasscode.title": { "message": "Mật khẩu Ứng dụng" @@ -212,6 +340,26 @@ "screens.AppPasscode.TurnOffPasscode.usePasscode": { "message": "Sử dụng mật khẩu ứng dụng" }, + "screens.AudioPermission.Button.allow": { + "description": "Screen button text for allow the audio permission", + "message": "Allow" + }, + "screens.AudioPermission.Button.goToSettings": { + "description": "Screen button text for navigate user to settings when audio permission was denied", + "message": "Go to Settings" + }, + "screens.AudioPermission.Button.notNow": { + "description": "Screen button text for not allowed audio permission", + "message": "Not Now" + }, + "screens.AudioPermission.description": { + "description": "Screen description for audio permission screen", + "message": "To record audio while using the app and in the background CoMapeo needs to access your microphone. Please enable microphone permissions in your app settings." + }, + "screens.AudioPermission.title": { + "description": "Screen title for audio permission screen", + "message": "Recording Audio with CoMapeo" + }, "screens.CameraScreen.goToSettings": { "message": "Go to Settings" }, @@ -238,12 +386,63 @@ "description": "Universal Transverse Mercator coordinate format", "message": "Universal Transverse Mercator (UTM)" }, + "screens.DataAndPrivacy.diagnosticInfoText": { + "message": "Anonymized information about your device, app crashes, errors and performance helps Awana Digital improve the app and fix errors." + }, + "screens.DataAndPrivacy.diagnosticInfoTitle": { + "message": "Diagnostic Information" + }, + "screens.DataAndPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataAndPrivacy.navTitle": { + "message": "Data & Privacy" + }, + "screens.DataAndPrivacy.noPII": { + "message": "This never includes any of your data or personal information." + }, + "screens.DataAndPrivacy.optOut": { + "message": "You can opt-out of sharing diagnostic information at any time." + }, + "screens.DataAndPrivacy.respectsPrivacy": { + "message": "CoMapeo Respects Your Privacy & Autonomy" + }, + "screens.DataPrivacy.description": { + "message": "CoMapeo allows you and your collaborators to map offline without needing servers." + }, + "screens.DataPrivacy.diagnostic": { + "message": "Private by default — diagnostic information is fully anonymized and you can opt-out any time." + }, + "screens.DataPrivacy.encrypted": { + "message": "All data stays fully encrypted" + }, + "screens.DataPrivacy.learnMore": { + "message": "Learn More" + }, + "screens.DataPrivacy.manageAndControl": { + "message": "Easily manage and control sharing and collaboration." + }, + "screens.DataPrivacy.next": { + "message": "Tiếp theo" + }, + "screens.DataPrivacy.stays": { + "message": "Your data stays on your devices." + }, + "screens.DataPrivacy.title": { + "message": "Data & Privacy" + }, "screens.DeviceNaming.Success.description": { "message": "You named your device" }, + "screens.DeviceNaming.Success.findSettings": { + "message": "To find your project settings go to the main menu found on the map screen." + }, "screens.DeviceNaming.Success.goToMap": { "message": "Go to Map" }, + "screens.DeviceNaming.Success.startMappingInstructions": { + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." + }, "screens.DeviceNaming.Success.success": { "message": "Success!" }, @@ -251,7 +450,7 @@ "message": "Add Name" }, "screens.DeviceNaming.description": { - "message": "To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more." + "message": "You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project." }, "screens.DeviceNaming.header": { "message": "Add a name for your device" @@ -268,24 +467,79 @@ "screens.FatalError.somethingWrong": { "message": "Something Went Wrong" }, + "screens.HowToLeaveProject.goBack": { + "message": "Go back" + }, + "screens.HowToLeaveProject.howTo": { + "message": "How to Leave Project" + }, + "screens.HowToLeaveProject.instructions": { + "message": "To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device." + }, + "screens.HowToLeaveProject.warning": { + "message": "If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!" + }, "screens.IntroToCoMapeo.collaborate": { - "message": "Collaborate on mapping and monitoring projects" + "message": "Collaborate with others" + }, + "screens.IntroToCoMapeo.designedFor": { + "message": "Designed with and for Indigenous peoples & frontline communities" }, "screens.IntroToCoMapeo.getStarted": { "message": "Get Started" }, - "screens.IntroToCoMapeo.isNow": { - "description": "The full sentence is mapeo 'is now' comapeo. ", - "message": "is now" + "screens.IntroToCoMapeo.mapAnywhere": { + "message": "Map anywhere and everywhere" + }, + "screens.IntroToCoMapeo.mapWorldTogether": { + "message": "Map your world, together" }, - "screens.IntroToCoMapeo.version": { - "description": "v is short for version. the translation for version can be used instead", - "message": "V" + "screens.IntroToCoMapeo.ownData": { + "message": "Own and control your data" }, "screens.LanguageSettings.title": { "description": "Title language settings screen", "message": "Language" }, + "screens.LeaveProject.AlreadyOnProject.alreadyOnProject": { + "message": "You are already on a project" + }, + "screens.LeaveProject.AlreadyOnProject.goBack": { + "message": "Go Back" + }, + "screens.LeaveProject.AlreadyOnProject.leaveProj": { + "message": "Leave Current Project" + }, + "screens.LeaveProject.AlreadyOnProject.leaveWarning": { + "message": "To join a new project you must leave your current one." + }, + "screens.LeaveProject.AlreadyOnProject.onProject": { + "message": "You are on {projectName}" + }, + "screens.LeaveProject.cancel": { + "message": "Hủy" + }, + "screens.LeaveProject.checkToConfirm": { + "message": "Please check the box to confirm" + }, + "screens.LeaveProject.deleteConsentWithName": { + "message": "I understand I will be deleting all data from Project {projectName} from my device." + }, + "screens.LeaveProject.deleteConsentWithoutName": { + "message": "I understand I will be deleting all data from my device." + }, + "screens.LeaveProject.leaveProj": { + "message": "Leave Project" + }, + "screens.LeaveProject.leavingProject": { + "message": "Leaving Project {projectName}" + }, + "screens.LeaveProject.removeFromProjWithName": { + "message": "This will remove all Project {projectName}'s data from your device." + }, + "screens.LeaveProject.removeFromProjWithoutName": { + "message": "This will remove all of the data from your device." + }, "screens.LocationInfoScreen.details": { "description": "Section title for details about current position", "message": "Details" @@ -437,11 +691,50 @@ "screens.ManualGpsScreen.zoneNumber": { "message": "Zone Number" }, + "screens.MediaSyncActionSheetContent.cancel": { + "message": "Hủy" + }, + "screens.MediaSyncSettings.syncEverything": { + "message": "Sync Everything" + }, + "screens.MediaSyncSettings.syncEverythingButtonBottomSheet": { + "message": "Sync Everything?" + }, + "screens.MediaSyncSettings.syncEverythingDescription": { + "message": "Your device will sync all content at full size, including photos, audio, and videos." + }, + "screens.MediaSyncSettings.syncEverythingDescriptionBottomSheet": { + "message": "You are about to sync everything. This may increase the disk space used on your device." + }, + "screens.MediaSyncSettings.syncEverythingWarning": { + "message": "Note: This will use more storage." + }, + "screens.MediaSyncSettings.syncPreviewWarningBottomSheet": { + "message": "You will no longer sync Audio or Video." + }, + "screens.MediaSyncSettings.syncPreviews": { + "message": "Sync Previews (Photos Only)" + }, + "screens.MediaSyncSettings.syncPreviewsBottomSheetConfirm": { + "message": "Sync Previews" + }, + "screens.MediaSyncSettings.syncPreviewsButtonBottomSheet": { + "message": "Sync Previews?" + }, + "screens.MediaSyncSettings.syncPreviewsDescription": { + "message": "Photos will sync at a reduced smaller size. Device will not sync audio or video." + }, + "screens.MediaSyncSettings.syncPreviewsDescriptionBottomSheet": { + "message": "Your device will keep all existing data but new observations will sync in a smaller, preview size." + }, + "screens.MediaSyncSettings.title": { + "message": "Sync Settings" + }, "screens.ObscurePasscode.description": { - "message": "Obscure Passcode is a security feature that allows you to open Mapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of Mapeo which allows you to create demonstration observations that are not saved to the Mapeo database." + "message": "Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database." }, "screens.ObscurePasscode.instructions": { - "message": "Enter the code above to hide your data in Mapeo" + "message": "Enter the code above to hide your data in CoMapeo" }, "screens.ObscurePasscode.title": { "message": "Obscure Passcode" @@ -452,13 +745,6 @@ "screens.ObscurePasscode.whatIsObscure": { "message": "What is Obscure Passcode?" }, - "screens.Observation.ObservationEdit.CategoryView.changePreset": { - "message": "Thay đổi" - }, - "screens.Observation.ObservationEdit.CategoryView.observation": { - "description": "Default name of observation with no matching preset", - "message": "Quan sát" - }, "screens.Observation.ObservationView.delete": { "description": "Button to delete an observation", "message": "Xóa" @@ -471,10 +757,17 @@ "description": "Default name of observation with no matching preset", "message": "Quan sát" }, + "screens.Observation.ObservationView.share": { + "description": "Button to share an observation", + "message": "Share" + }, "screens.Observation.cancel": { "description": "Button to cancel delete of observation", "message": "Hủy" }, + "screens.Observation.comapeoAlert": { + "message": "CoMapeo Alert" + }, "screens.Observation.confirm": { "description": "Button to confirm delete of observation", "message": "Có, xóa" @@ -483,26 +776,83 @@ "description": "Title of dialog asking confirmation to delete an observation", "message": "Xóa quan sát?" }, + "screens.Observation.fallbackCategoryName": { + "description": "Fallback name used when category name cannot be determined for observation", + "message": "Quan sát" + }, + "screens.Observation.shareMediaTitle": { + "description": "Title of dialog to share an observation with media", + "message": "Sharing image" + }, + "screens.Observation.shareMessageFooter": { + "message": "Sent from CoMapeo" + }, + "screens.Observation.shareMessageTitle": { + "message": "CoMapeo Alert" + }, + "screens.Observation.shareTextTitle": { + "description": "Title of dialog to share an observation without media", + "message": "Sharing text" + }, "screens.Observation.title": { "description": "Title of observation screen showing (non-editable) view of observation with map and answered questions", "message": "Quan sát" }, + "screens.ObservationCreate.changePreset": { + "message": "Change" + }, + "screens.ObservationCreate.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Có điều gì đang diễn ra ở đây?" + }, + "screens.ObservationCreate.keepWaiting": { + "description": "Button to cancel save and continue waiting for GPS", + "message": "Tiếp tục chờ" + }, + "screens.ObservationCreate.manualEntry": { + "description": "Button to manually enter GPS coordinates", + "message": "Tọa độ thủ công" + }, + "screens.ObservationCreate.navTitle": { + "description": "screen title for new observation screen", + "message": "New Observation" + }, + "screens.ObservationCreate.noGpsDesc": { + "description": "Description in dialog when trying to save with no GPS coords", + "message": "Quan sát này không có vị trí. Bạn có thể tiếp tục chờ tín hiệu GPS, lưu quan sát mà không có vị trí, hoặc nhập tọa độ thủ công" + }, + "screens.ObservationCreate.noGpsTitle": { + "description": "Title of dialog when trying to save with no GPS coords", + "message": "Không có tín hiệu GPS" + }, + "screens.ObservationCreate.observation": { + "description": "Default name of observation with no matching preset", + "message": "Quan sát" + }, + "screens.ObservationCreate.saveAnyway": { + "description": "Button to save regardless of GPS state", + "message": "Lưu" + }, + "screens.ObservationCreate.weakGpsDesc": { + "description": "Description in dialog when trying to save with low GPS accuracy.", + "message": "Độ chính xác của GPS thấp. Bạn có thể tiếp tục đợi để có độ chính xác cao hơn, lưu quan sát với độ chính xác thấp, hoặc nhập tọa độ thủ công" + }, + "screens.ObservationCreate.weakGpsTitle": { + "description": "Title of dialog when trying to save with low GPS accuracy.", + "message": "Tín hiệu GPS yếu" + }, "screens.ObservationDetails.done": { "description": "Button text when all questions are complete", "message": "Done" }, "screens.ObservationDetails.nextQuestion": { "description": "Button text to navigate to next question", - "message": "Next" + "message": "Tiếp theo" }, "screens.ObservationDetails.title": { "description": "Title of observation details screen showing question number and total", "message": "Question {current} of {total}" }, - "screens.ObservationEdit.BottomSheet.addLabel": { - "description": "Label above keyboard that expands into bottom sheet of options to add (photo, details etc)", - "message": "Thêm vào…" - }, "screens.ObservationEdit.ObservationEditView.audioButton": { "description": "Button label for adding audio", "message": "Audio" @@ -519,52 +869,30 @@ "description": "Button label for adding photo", "message": "Photo" }, - "screens.ObservationEdit.ObservationEditView.searching": { - "description": "Shown in new observation screen whilst looking for GPS", - "message": "Tìm kiếm…" - }, - "screens.ObservationEdit.SaveButton.keepWaiting": { - "description": "Button to cancel save and continue waiting for GPS", - "message": "Tiếp tục chờ" - }, - "screens.ObservationEdit.SaveButton.manualEntry": { - "description": "Button to manually enter GPS coordinates", - "message": "Tọa độ thủ công" - }, - "screens.ObservationEdit.SaveButton.noGpsDesc": { - "description": "Description in dialog when trying to save with no GPS coords", - "message": "Quan sát này không có vị trí. Bạn có thể tiếp tục chờ tín hiệu GPS, lưu quan sát mà không có vị trí, hoặc nhập tọa độ thủ công" - }, - "screens.ObservationEdit.SaveButton.noGpsTitle": { - "description": "Title of dialog when trying to save with no GPS coords", - "message": "Không có tín hiệu GPS" - }, - "screens.ObservationEdit.SaveButton.saveAnyway": { - "description": "Button to save regardless of GPS state", - "message": "Lưu" + "screens.ObservationEdit.changePreset": { + "message": "Change" }, - "screens.ObservationEdit.SaveButton.weakGpsDesc": { - "description": "Description in dialog when trying to save with low GPS accuracy.", - "message": "Độ chính xác của GPS thấp. Bạn có thể tiếp tục đợi để có độ chính xác cao hơn, lưu quan sát với độ chính xác thấp, hoặc nhập tọa độ thủ công" + "screens.ObservationEdit.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Có điều gì đang diễn ra ở đây?" }, - "screens.ObservationEdit.SaveButton.weakGpsTitle": { - "description": "Title of dialog when trying to save with low GPS accuracy.", - "message": "Tín hiệu GPS yếu" + "screens.ObservationEdit.navTitle": { + "description": "screen title for new observation screen", + "message": "Edit Observation" }, - "screens.ObservationEdit.editTitle": { - "description": "screen title for edit observation screen", - "message": "Chỉnh sửa quan sát" + "screens.ObservationEdit.observation": { + "description": "Default name of observation with no matching preset", + "message": "Quan sát" }, - "screens.ObservationEdit.newTitle": { - "description": "screen title for new observation screen", - "message": "Quan sát mới" + "screens.ObservationList.TrackListItem.Track": { + "message": "Track" }, "screens.ObservationList.observationListTitle": { "description": "Title of screen with list of observations", "message": "Các quan sát" }, "screens.ObservationsList.NoProjectWarning": { - "message": "You won’t be able to share observations collected yet." + "message": "You are currently mapping on your own." }, "screens.ObservationsList.ObservationsEmptyView.backButton": { "description": "Back button on observation list screen when no observations are yet recorded", @@ -579,32 +907,150 @@ "message": "Thêm Quan sát" }, "screens.ObservationsList.createOrJoin": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "Create or Join a Project." + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "Create or Join a Project" }, "screens.ObservationsList.error": { "description": "message shown when there is an unexpected error when loading observations", - "message": "Lỗi tải các quan sát. Hãy thử rời bỏ và khởi động lại Mapeo." + "message": "Error loading observations. Try quitting and restarting CoMapeo." }, "screens.ObservationsList.loading": { "description": "message shown whilst observations are loading", "message": "Đang tải... việc này có thể càn một chút thời gian sau khi đồng bộ hóa với thiết bị mới" }, "screens.ObservationsList.toSync": { - "description": "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", - "message": "To sync and share with other devices," + "description": "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", + "message": "to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, - "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { - "description": "Placeholder for description/notes field", - "message": "What is happening here?" + "screens.OnboardingPrivacyPolicy.navTitle": { + "message": "Privacy Policy" }, - "screens.SaveTrack.TrackEditView.saveTrackCamera": { - "description": "Button label for adding photo", - "message": "Camera" + "screens.OnboardingPrivacyPolicy.permissionsTitle": { + "message": "Current Permissions" }, - "screens.SaveTrack.TrackEditView.saveTrackDetails": { - "description": "Button label for check details", - "message": "Details" + "screens.OnboardingPrivacyPolicy.shareDiagnostics": { + "message": "Share Diagnostic Information" + }, + "screens.PhotoPreviewModal.DeletePhoto.cancelButton": { + "message": "Hủy" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalDeleteButton": { + "message": "Delete Image" + }, + "screens.PhotoPreviewModal.DeletePhoto.deleteModalTitle": { + "message": "Delete this photo?" + }, + "screens.PhotoPreviewModal.DeletePhoto.headerButtonText": { + "message": "Delete Photo" + }, + "screens.PrivacyPolicy.aboutAwana": { + "message": "About Awana Digital" + }, + "screens.PrivacyPolicy.aboutAwanaContent": { + "message": "CoMapeo is developed by Awana Digital, a 501c3 non-profit organization registered in the United States. Awana Digital works in solidarity with frontline communities to use technology to defend their rights and fight climate change." + }, + "screens.PrivacyPolicy.appErrors": { + "message": "App Errors" + }, + "screens.PrivacyPolicy.appErrorsDescription": { + "message": "Information about internal errors that result in the app not functioning as expected" + }, + "screens.PrivacyPolicy.appInfo": { + "message": "App Info" + }, + "screens.PrivacyPolicy.appInfoDescription": { + "message": "The version and locale (language) of CoMapeo" + }, + "screens.PrivacyPolicy.appUsageTitle": { + "message": "App Usage" + }, + "screens.PrivacyPolicy.control": { + "message": "You're in control" + }, + "screens.PrivacyPolicy.controlDescription": { + "message": "You can opt out of sending any information to Awana Digital. You choose where your data is stored and who it is shared with. You may choose to share anonymized, summarized data about how you use CoMapeo with Awana Digital. We will always be transparent about what information you choose to share for the purposed of improving the app, and this information will never include photos, videos, audio, text, or precise locations that you have entered into CoMapeo." + }, + "screens.PrivacyPolicy.crashData": { + "message": "Crash Data" + }, + "screens.PrivacyPolicy.crashDataDescription": { + "message": "Information about what caused the app to close unexpectedly" + }, + "screens.PrivacyPolicy.dataCollection": { + "message": "CoMapeo Data Collection" + }, + "screens.PrivacyPolicy.deviceInfo": { + "message": "Device Info" + }, + "screens.PrivacyPolicy.deviceInfoDescription": { + "message": "Such as model and manufacturer of your device; device operating system; screen size; device locale (language); device memory." + }, + "screens.PrivacyPolicy.diagnosticsTitle": { + "message": "Diagnostics" + }, + "screens.PrivacyPolicy.noPII": { + "message": "No personally identifiable information" + }, + "screens.PrivacyPolicy.noPIIDescription": { + "message": "Using CoMapeo does not require a user account. Awana Digital does not collect your name, email address or any other personal details. No permanent user identifier or device identifier is ever shared with Awana Digital, and we take extra measures to ensure that no information you share can be used to track you: identifiers are randomized and rotated (changed) every month and we do not store IP addresses." + }, + "screens.PrivacyPolicy.notCollected": { + "message": "What is not collected?" + }, + "screens.PrivacyPolicy.notCollectedDescription": { + "message": "We do not collect any personal data or anything that can be used to identify or track a user or device. Device identifiers used to aggregate information are random, anonymous, and changed every month. Diagnostic information does not include data about how you use the app, and it never includes any of the data you have collected with the app. We do not collect your precise or coarse location, only the country where you are using CoMapeo." + }, + "screens.PrivacyPolicy.openSource": { + "message": "Open Source and the \"Official\" Version" + }, + "screens.PrivacyPolicy.openSourceContent": { + "message": "CoMapeo is an open-source application. This means that anyone can view the code that makes the app work and can verify the privacy declarations in this document. It also means that anyone can adapt the app to their own needs and release an alternative version. This document refers to data collected by the official releases of CoMapeo, digitally signed by Awana Digital, available from the Google Play Store or the Awana Digital website. Unofficial releases of CoMapeo obtained from other channels are outside our control and may share additional information with other organizations." + }, + "screens.PrivacyPolicy.overview": { + "message": "This document describes what information (\"data\") is sent from CoMapeo to the application developer, Awana Digital, and how that information is used." + }, + "screens.PrivacyPolicy.performanceData": { + "message": "Performance Data" + }, + "screens.PrivacyPolicy.performanceDataDescription": { + "message": "Such as launch time, energy usage, app freezes, and responsiveness" + }, + "screens.PrivacyPolicy.privacyPolicyTitle": { + "message": "CoMapeo Data Privacy" + }, + "screens.PrivacyPolicy.privateByDefault": { + "message": "Private by default" + }, + "screens.PrivacyPolicy.privateByDefaultDescription": { + "message": "The data you collect and create with CoMapeo (locations, photos, video, audio, text) is only stored on your device by default, and is not stored or sent anywhere else. When you share data with collaborators by joining a project with them, it is sent encrypted, directly to your collaborators' device. This means that the data is not sent via Awana Digital, nor anyone else, on its way to your collaborator. Awana Digital never sees nor has access to any of the data you collect with CoMapeo unless you explicitly send it to us." + }, + "screens.PrivacyPolicy.thirdParty": { + "message": "Third-party access to data" + }, + "screens.PrivacyPolicy.thirdPartyDescription": { + "message": "A \"third-party\" is an organization other than Awana Digital." + }, + "screens.PrivacyPolicy.userCount": { + "message": "User Counts" + }, + "screens.PrivacyPolicy.userCountDescription": { + "message": "The number of users per country and per project. Aggregated and anonymized" + }, + "screens.PrivacyPolicy.whatIsCollected": { + "message": "What is collected?" + }, + "screens.PrivacyPolicy.whatIsCollectedDescription": { + "message": "By default, anonymized diagnostic information about your device, app crashes, errors and performance is shared with Awana Digital. You can opt-out of sharing this information at any time. This diagnostic information is completely anonymized and it never contains any of your data (the data you have collected with CoMapeo)." + }, + "screens.PrivacyPolicy.whyCollected": { + "message": "Why is this data collected?" + }, + "screens.PrivacyPolicy.whyCollectedDescription": { + "message": "Crash data and app errors together with the device and app info provide Awana Digital with the information we need to fix errors and bugs in the app. The performance data helps us improve the responsiveness of the app and identify errors. User counts, including total users, users per country, and users per project, help justify ongoing investment in the development of CoMapeo." + }, + "screens.SaveTrack.TrackEditView.descriptionPlaceholder": { + "description": "Placeholder for description/notes field", + "message": "Có điều gì đang diễn ra ở đây?" }, "screens.SaveTrack.TrackEditView.title": { "description": "Title for new track screen", @@ -614,15 +1060,6 @@ "description": "Category title for new track screen", "message": "Track" }, - "screens.Security.obscurePassDescriptonPassNotSet": { - "message": "Để sử dụng, bật Mật khẩu ứng dụng" - }, - "screens.Security.obscurePassDescriptonPassSet": { - "message": "Bảo vệ thiế bị của bạn khỏi bị tịch thu" - }, - "screens.Security.obscurePasscodeHeader": { - "message": "Obscure Passcode" - }, "screens.Security.passDesriptionPassNotSet": { "message": "Mật khẩu chưa được đặt" }, @@ -642,7 +1079,7 @@ "message": "Your Device Name" }, "screens.Setting.ProjectSettings.DeviceName.DisplayScreen.title": { - "message": "Device Name" + "message": "Tên thiết bị" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.deviceNameLabel": { "message": "Edit Device Name" @@ -654,10 +1091,10 @@ "message": "Discard Changes" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.discardChangesAlertTitle": { - "message": "Discard changes?" + "message": "Hủy bỏ thay đổi?" }, "screens.Setting.ProjectSettings.DeviceName.EditScreen.title": { - "message": "Device Name" + "message": "Tên thiết bị" }, "screens.Setting.ProjectSettings.YourTeam.InviteAccepted.addAnotherDevice": { "message": "Add Another Device" @@ -702,7 +1139,7 @@ "message": "Date Added" }, "screens.Setting.ProjectSettings.YourTeam.deviceName": { - "message": "Device Name" + "message": "Tên thiết bị" }, "screens.Setting.ProjectSettings.YourTeam.inviteDevice": { "message": "Invite Device" @@ -716,6 +1153,21 @@ "screens.Setting.ProjectSettings.YourTeam.title": { "message": "Your Team" }, + "screens.Settings.Config.created": { + "message": "Created {date} at {time}" + }, + "screens.Settings.Config.importConfig": { + "message": "Import Config" + }, + "screens.Settings.Config.name": { + "message": "Config Name:" + }, + "screens.Settings.Config.navTitle": { + "message": "Configuration" + }, + "screens.Settings.Config.projectName": { + "message": "Project Name:" + }, "screens.Settings.CreateOrJoinProject.CreateProject.title": { "message": "Create a Project" }, @@ -755,14 +1207,17 @@ "screens.Settings.CreateOrJoinProject.importConfig": { "message": "Import Config" }, + "screens.Settings.CreateOrJoinProject.importConfigFileError": { + "message": "File name should end with .comapeocat" + }, "screens.Settings.CreateOrJoinProject.joinExisting": { - "message": "Join an existing Mapeo Project" + "message": "Join an existing CoMapeo Project" }, "screens.Settings.CreateOrJoinProject.joinProject": { "message": "Join a Project" }, "screens.Settings.CreateOrJoinProject.projectDescription": { - "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices." + "message": "A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." }, "screens.Settings.CreateOrJoinProject.startProject": { "message": "Start a CoMapeo Project" @@ -788,12 +1243,12 @@ "screens.Settings.YourTeam.unableToCancel": { "message": "Unable to Cancel Invitation" }, - "screens.Settings.aboutMapeo": { - "description": "Primary text for 'About Mapeo' link (version info)", - "message": "Giới thiệu về Mapeo" + "screens.Settings.aboutCoMapeo": { + "description": "Primary text for 'About CoMapeo' link (version info)", + "message": "About CoMapeo" }, - "screens.Settings.aboutMapeoDesc": { - "description": "Description of the 'About Mapeo' page", + "screens.Settings.aboutCoMapeoDesc": { + "description": "Description of the 'About CoMapeo' page", "message": "Phiên bản và số hiệu bản tạo" }, "screens.Settings.appSettings": { @@ -803,6 +1258,10 @@ "description": "list of avaialable app settings", "message": "Language, Security, Coordinates" }, + "screens.Settings.config": { + "description": "Primary text for project config settings", + "message": "Project Configuration" + }, "screens.Settings.createOrJoin": { "message": "Create or Join Project" }, @@ -820,11 +1279,20 @@ "description": "Title of settings screen", "message": "Cài đặt" }, + "screens.SettingsPrivacyPolicy.navTitle": { + "message": "Privacy Policy" + }, "screens.Sync.CreateOrJoinProjectDisplay.buttonText": { "message": "Create or Join Project" }, - "screens.Sync.CreateOrJoinProjectDisplay.description": { - "message": "Create or Join a Project to sync with other devices" + "screens.Sync.CreateOrJoinProjectDisplay.subText": { + "message": "This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding." + }, + "screens.Sync.CreateOrJoinProjectDisplay.subTitle": { + "message": "You will be able to share data with devices that are part of the same project." + }, + "screens.Sync.CreateOrJoinProjectDisplay.title": { + "message": "Create or join a project to collect data with a team" }, "screens.Sync.HeaderTitle.noWiFi": { "message": "No WiFi" @@ -838,49 +1306,93 @@ "screens.Sync.NoWifiDisplay.title": { "message": "No WiFi" }, - "screens.Sync.ProjectSyncDisplay.buttonTextDone": { - "message": "You're all caught up" + "screens.Sync.ProjectSyncDisplay.allCaughtUp": { + "message": "You're all caught up!" }, - "screens.Sync.ProjectSyncDisplay.buttonTextStop": { - "message": "Stop" + "screens.Sync.ProjectSyncDisplay.allDataSynced": { + "message": "All data synced" + }, + "screens.Sync.ProjectSyncDisplay.devicesAvailableToSync": { + "message": "Devices available" }, - "screens.Sync.ProjectSyncDisplay.buttonTextSync": { - "message": "Sync" + "screens.Sync.ProjectSyncDisplay.devicesFound": { + "message": "Devices found" }, - "screens.Sync.ProjectSyncDisplay.deviceName": { - "message": "Your device name is {name}" + "screens.Sync.ProjectSyncDisplay.noDevicesAvailableToSync": { + "message": "No devices available to sync" + }, + "screens.Sync.ProjectSyncDisplay.progressLabelSyncing": { + "message": "Syncing…" }, - "screens.Sync.ProjectSyncDisplay.devicesNearby": { - "message": "{count} {count, plural, one {device} other {devices}} nearby/connected" + "screens.Sync.ProjectSyncDisplay.progressLabelWaiting": { + "message": "Waiting…" }, - "screens.Sync.ProjectSyncDisplay.devicesSyncing": { - "message": "Syncing with {count} {count, plural, one {Device} other {Devices}}" + "screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount": { + "message": "Waiting for other devices" }, - "screens.Sync.ProjectSyncDisplay.devicesWaitingToSync": { - "message": "{count} {count, plural, one {Device} other {Devices}} Waiting to Sync with you" + "screens.Sync.ProjectSyncDisplay.startSync": { + "message": "Start Sync" }, - "screens.Sync.ProjectSyncDisplay.noDevicesSyncing": { - "message": "No Devices are Syncing" + "screens.Sync.ProjectSyncDisplay.stop": { + "message": "Stop" }, "screens.Sync.ProjectSyncDisplay.syncProgress": { "message": "{value}%" }, - "screens.Sync.ProjectSyncDisplay.syncing": { - "message": "Syncing…" + "screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers": { + "message": "Complete! Waiting for other devices to join" + }, + "screens.Sync.ProjectSyncDisplay.syncingFullyComplete": { + "message": "Complete! You're up to date" + }, + "screens.Sync.ProjectSyncDisplay.syncingWithDevices": { + "message": "You are syncing with your team" + }, + "screens.Sync.ProjectSyncDisplay.waitingForDevices": { + "message": "Waiting for devices" + }, + "screens.Track.ObservationList.observations": { + "message": "Các quan sát" + }, + "screens.Track.deleteTitle": { + "description": "Title of dialog asking confirmation to delete a track", + "message": "Delete track?" + }, + "screens.Track.title": { + "description": "Title of track screen showing (non-editable) view of observation with map", + "message": "Track" }, - "screens.Sync.ProjectSyncDisplay.upToDate": { - "message": "Up to Date! No data to Sync" + "screens.Track.tracks": { + "message": "Tracks" + }, + "screens.TrackEdit.title": { + "description": "Title for editing track screen", + "message": "Edit Track" + }, + "screens.TrackEdit.track": { + "description": "Preset title for new track screen", + "message": "Track" }, "shareComponent.KeyboardAccessory.showOptions": { "description": "title for observation options", "message": "Show Options" }, - "sharedComponents.DeviceCard.ThisDevice": { - "message": "This Device!" + "sharedComponents.DeviceCard.leaveProject": { + "message": "Leave Project" + }, + "sharedComponents.DeviceIconWithName.Disconnected": { + "message": "Disconnected" }, "sharedComponents.DeviceIconWithName.thisDevice": { "message": "This Device!" }, + "sharedComponents.EditScreen.PresetAndLocationView.seaching": { + "description": "Shown in new observation screen whilst looking for GPS", + "message": "Tìm kiếm…" + }, + "sharedComponents.Editor.PresetView.Change": { + "message": "Change" + }, "sharedComponents.ErrorModal.goBack": { "message": "Go Back" }, @@ -894,31 +1406,40 @@ "message": "No GPS" }, "sharedComponents.GpsPill.searching": { - "message": "Searching…" + "message": "Tìm kiếm…" }, - "sharedComponents.ProjectInviteBottomSheet.acceptInvite": { + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.canceled": { + "message": "Invite Canceled" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.close": { + "message": "Close" + }, + "sharedComponents.ProjectInviteBottomSheet.InviteCancelled.projectInviteCanceled": { + "message": "Your invitation to {projectName} has been canceled." + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.acceptInvite": { "message": "Accept Invite" }, - "sharedComponents.ProjectInviteBottomSheet.declineInvite": { + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.declineInvite": { "message": "Decline Invite" }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.invitedToJoin": { + "message": "You've been invited to join {projectName}" + }, + "sharedComponents.ProjectInviteBottomSheet.NewInviteBottomSheetContent.joinProject": { + "message": "Join Project {projectName}" + }, "sharedComponents.ProjectInviteBottomSheet.goToMap": { - "message": "Go To Map" + "message": "Đến Bản đồ" }, "sharedComponents.ProjectInviteBottomSheet.goToSync": { "message": "Go To Sync" }, - "sharedComponents.ProjectInviteBottomSheet.invitedToJoin": { - "message": "You've been invited to join {projName}" - }, - "sharedComponents.ProjectInviteBottomSheet.joinProject": { - "message": "Join Project {projName}" - }, "sharedComponents.ProjectInviteBottomSheet.success": { "message": "Success" }, "sharedComponents.ProjectInviteBottomSheet.youHaveJoined": { - "message": "You have joined {projName}" + "message": "You have joined {projectName}" }, "sharedComponents.RoleWithIcon.coordinator": { "message": "Coordinator" diff --git a/metro.config.js b/metro.config.js index 88c5de4f2..22bfa65da 100644 --- a/metro.config.js +++ b/metro.config.js @@ -16,7 +16,12 @@ module.exports = { resolver: { ...config.resolver, // For nodejs-mobile - blockList: [...defaultBlockList, /nodejs-assets\/.*/], + blockList: [ + ...defaultBlockList, + /nodejs-assets\/.*/, + // TODO: Update comapeo-schema to make ajv a dev-dep + /node_modules\/ajv\/.*/, + ], // For https://github.com/kristerkari/react-native-svg-transformer assetExts: config.resolver.assetExts.filter(ext => ext !== 'svg'), sourceExts: [...config.resolver.sourceExts, 'svg'], diff --git a/package-lock.json b/package-lock.json index bf515b2d5..035d20a77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,16 @@ { "name": "comapeo-mobile", - "version": "0.0.1", + "version": "1.0.0-pre", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "comapeo-mobile", - "version": "0.0.1", + "version": "1.0.0-pre", "hasInstallScript": true, "dependencies": { "@bam.tech/react-native-image-resizer": "^3.0.7", + "@comapeo/ipc": "1.0.1", "@dev-plugins/react-navigation": "^0.0.6", "@dr.pogodin/react-native-fs": "^2.24.1", "@formatjs/intl-getcanonicallocales": "^2.3.0", @@ -17,8 +18,6 @@ "@formatjs/intl-pluralrules": "^5.2.4", "@formatjs/intl-relativetimeformat": "^11.2.4", "@gorhom/bottom-sheet": "^4.5.1", - "@mapeo/ipc": "0.11.0", - "@mapeo/mock-data": "1.0.2", "@osm_borders/maritime_10000m": "^1.1.0", "@react-native-community/hooks": "^2.8.0", "@react-native-community/netinfo": "11.1.0", @@ -61,6 +60,7 @@ "geojson-geometries-lookup": "^0.5.0", "lodash.isequal": "^4.5.0", "luxon": "^3.4.4", + "map-obj": "^5.0.2", "nanoid": "^5.0.1", "nodejs-mobile-react-native": "^18.17.8", "react": "18.2.0", @@ -98,9 +98,9 @@ "@babel/core": "^7.20.0", "@babel/preset-env": "^7.20.0", "@babel/runtime": "^7.20.0", + "@comapeo/core": "1.0.1", + "@comapeo/schema": "1.0.0", "@formatjs/cli": "^6.2.0", - "@mapeo/core": "9.0.0-alpha.16", - "@mapeo/schema": "3.0.0-next.19", "@react-native-community/cli": "^12.3.6", "@react-native/babel-preset": "^0.73.21", "@react-native/eslint-config": "^0.73.2", @@ -110,13 +110,13 @@ "@testing-library/react-native": "^12.4.3", "@types/debug": "^4.1.7", "@types/geojson": "^7946.0.14", - "@types/jest": "^29.5.12", + "@types/jest": "^29.5.13", "@types/lodash.isequal": "^4.5.6", "@types/node": "^20.8.4", "@types/react": "^18.2.58", "@types/react-native-indicators": "^0.16.2", "@types/react-native-vector-icons": "^6.4.8", - "@types/react-native-zeroconf": "^0.12.3", + "@types/react-native-zeroconf": "^0.13.1", "@types/react-test-renderer": "^18.0.0", "@types/semver": "^7.5.8", "@types/utm": "^1.1.2", @@ -125,12 +125,14 @@ "babel-jest": "^29.6.3", "babel-plugin-transform-inline-environment-variables": "^0.4.4", "date-fns": "^3.6.0", + "dotenv-cli": "^7.4.2", "eslint": "^8.19.0", "eslint-config-prettier": "^9.1.0", "execa": "^8.0.1", "glob": "^10.3.14", "husky": "^8.0.0", - "jest": "^29.6.3", + "jest": "^29.7.0", + "jest-expo": "^50.0.4", "lint-staged": "^14.0.1", "patch-package": "^8.0.0", "prettier": "^3.2.5", @@ -313,12 +315,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.25.7", "picocolors": "^1.0.0" }, "engines": { @@ -326,27 +328,31 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.9", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", + "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.11", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.11", - "@babel/parser": "^7.22.11", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", @@ -397,13 +403,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.4", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.25.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" @@ -446,12 +454,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -604,24 +614,28 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -682,10 +696,13 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -714,23 +731,27 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -749,22 +770,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.11", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", "license": "MIT", "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11" + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.2", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -836,8 +860,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.4", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", + "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.7" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -2468,31 +2497,30 @@ "license": "MIT" }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.1", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2501,11 +2529,13 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", + "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2530,6 +2560,154 @@ "dev": true, "license": "MIT" }, + "node_modules/@comapeo/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@comapeo/core/-/core-1.0.1.tgz", + "integrity": "sha512-soQTuH+vLTXrLu56BPH6axSMC3gLa0FZip2cjnhQ1b94R8HpcM+IbRbK1KpHnwZl8zZEqGPZZ88DxRPiK1+uLw==", + "license": "MIT", + "dependencies": { + "@comapeo/schema": "1.0.0", + "@digidem/types": "^2.3.0", + "@electron/asar": "^3.2.8", + "@fastify/error": "^3.4.1", + "@fastify/static": "^7.0.3", + "@fastify/type-provider-typebox": "^4.0.0", + "@hyperswarm/secret-stream": "^6.1.2", + "@mapeo/crypto": "1.0.0-alpha.10", + "@mapeo/sqlite-indexer": "1.0.0-alpha.9", + "@sinclair/typebox": "^0.29.6", + "b4a": "^1.6.3", + "bcp-47": "^2.1.0", + "better-sqlite3": "^8.7.0", + "big-sparse-array": "^1.0.3", + "bogon": "^1.1.0", + "compact-encoding": "^2.12.0", + "corestore": "6.8.4", + "debug": "^4.3.4", + "dot-prop": "^9.0.0", + "drizzle-orm": "^0.30.8", + "fastify": ">= 4", + "fastify-plugin": "^4.5.1", + "hyperblobs": "2.3.0", + "hypercore": "10.17.0", + "hypercore-crypto": "3.4.2", + "hyperdrive": "11.5.3", + "json-stable-stringify": "^1.1.1", + "magic-bytes.js": "^1.10.0", + "map-obj": "^5.0.2", + "mime": "^4.0.3", + "multi-core-indexer": "^1.0.0-alpha.10", + "p-defer": "^4.0.0", + "p-event": "^6.0.1", + "p-timeout": "^6.1.2", + "protobufjs": "^7.2.3", + "protomux": "^3.4.1", + "quickbit-universal": "^2.2.0", + "sodium-universal": "^4.0.0", + "start-stop-state-machine": "^1.2.0", + "streamx": "^2.19.0", + "sub-encoder": "^2.1.1", + "throttle-debounce": "^5.0.0", + "tiny-typed-emitter": "^2.1.0", + "type-fest": "^4.5.0", + "undici": "^6.13.0", + "varint": "^6.0.0", + "yauzl-promise": "^4.0.0" + } + }, + "node_modules/@comapeo/core/node_modules/@sinclair/typebox": { + "version": "0.29.6", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.29.6.tgz", + "integrity": "sha512-aX5IFYWlMa7tQ8xZr3b2gtVReCvg7f3LEhjir/JAjX2bJCMVJA5tIPv30wTD4KDfcwMd7DDYY3hFDeGmOgtrZQ==", + "license": "MIT" + }, + "node_modules/@comapeo/core/node_modules/hypercore": { + "version": "10.17.0", + "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-10.17.0.tgz", + "integrity": "sha512-Yp9lyfUjp81Gy1nPHemNFtYQtngliCGZ6prH+qxvjr2FPVG1QFtNqtOh+ZxFu4hXZ1dAOLYkQOA7Qq2vjFe64A==", + "license": "MIT", + "dependencies": { + "@hyperswarm/secret-stream": "^6.0.0", + "b4a": "^1.1.0", + "big-sparse-array": "^1.0.3", + "compact-encoding": "^2.11.0", + "crc-universal": "^1.0.2", + "events": "^3.3.0", + "flat-tree": "^1.9.0", + "hypercore-crypto": "^3.2.1", + "is-options": "^1.0.1", + "protomux": "^3.4.0", + "quickbit-universal": "^2.1.1", + "random-access-file": "^4.0.0", + "random-array-iterator": "^1.0.0", + "safety-catch": "^1.0.1", + "sodium-universal": "^4.0.0", + "streamx": "^2.12.4", + "xache": "^1.1.0", + "z32": "^1.0.0" + } + }, + "node_modules/@comapeo/core/node_modules/mime": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.4.tgz", + "integrity": "sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==", + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@comapeo/core/node_modules/p-timeout": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", + "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@comapeo/core/node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "license": "MIT" + }, + "node_modules/@comapeo/ipc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@comapeo/ipc/-/ipc-1.0.1.tgz", + "integrity": "sha512-z0G6fFNUVb4VWg4X6NMvLk3kQp4M11Mb0UqOq5+o3Vtd55xb/cx/yROUajgt4vFee0ubaPfuy+zBHosY1Cn0rA==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-defer": "^4.0.0", + "rpc-reflector": "^1.3.11" + }, + "engines": { + "node": ">=18.17.1" + }, + "peerDependencies": { + "@comapeo/core": "1.0.1" + } + }, + "node_modules/@comapeo/schema": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@comapeo/schema/-/schema-1.0.0.tgz", + "integrity": "sha512-dK227I+0yg9D2y5/O5NGywx50tgeNYyUkl1uYnSmNAPlbv+r2KX9aaC9m4dEjIja2aR2VFnYn6z537ERZiahqQ==", + "license": "MIT", + "dependencies": { + "compact-encoding": "^2.12.0", + "protobufjs": "^7.2.5", + "type-fest": "^4.26.0" + } + }, "node_modules/@dev-plugins/react-navigation": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@dev-plugins/react-navigation/-/react-navigation-0.0.6.tgz", @@ -4402,21 +4580,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@faker-js/faker": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", - "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/fakerjs" - } - ], - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=6.14.13" - } - }, "node_modules/@fastify/accept-negotiator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-1.1.0.tgz", @@ -5007,15 +5170,17 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -5041,7 +5206,9 @@ } }, "node_modules/@jest/console/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -5049,14 +5216,16 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -5064,21 +5233,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -5113,7 +5282,9 @@ } }, "node_modules/@jest/core/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -5134,7 +5305,9 @@ } }, "node_modules/@jest/core/node_modules/ci-info": { - "version": "3.8.0", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -5148,7 +5321,9 @@ } }, "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.6.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5195,13 +5370,15 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "license": "MIT", "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5225,26 +5402,32 @@ } }, "node_modules/@jest/environment/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@jest/expect": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "license": "MIT", "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "license": "MIT", "dependencies": { @@ -5255,15 +5438,17 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5287,21 +5472,25 @@ } }, "node_modules/@jest/fake-timers/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@jest/globals": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5326,7 +5515,9 @@ } }, "node_modules/@jest/globals/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -5334,14 +5525,16 @@ } }, "node_modules/@jest/reporters": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -5355,9 +5548,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -5394,7 +5587,9 @@ } }, "node_modules/@jest/reporters/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -5405,6 +5600,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -5423,13 +5619,15 @@ } }, "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "6.0.0", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" }, @@ -5465,11 +5663,13 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -5497,7 +5697,9 @@ } }, "node_modules/@jest/test-result/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -5505,13 +5707,15 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -5519,7 +5723,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", "dependencies": { @@ -5531,9 +5737,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -5569,13 +5775,6 @@ "@types/yargs-parser": "*" } }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, "node_modules/@jest/types": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", @@ -5653,33 +5852,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@json-schema-spec/json-pointer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@json-schema-spec/json-pointer/-/json-pointer-0.1.2.tgz", - "integrity": "sha512-BYY7IavBjwsWWSmVcMz2A9mKiDD9RvacnsItgmy1xV8cmgbtxFfKmKMtkVpD7pYtkx4mIW4800yZBXueVFIWPw==", - "license": "MIT" - }, - "node_modules/@json-schema-tools/dereferencer": { - "version": "1.6.1", - "license": "Apache-2.0", - "dependencies": { - "@json-schema-tools/reference-resolver": "^1.2.5", - "@json-schema-tools/traverse": "^1.10.0", - "fast-safe-stringify": "^2.1.1" - } - }, - "node_modules/@json-schema-tools/reference-resolver": { - "version": "1.2.5", - "license": "Apache-2.0", - "dependencies": { - "@json-schema-spec/json-pointer": "^0.1.2", - "isomorphic-fetch": "^3.0.0" - } - }, - "node_modules/@json-schema-tools/traverse": { - "version": "1.10.1", - "license": "Apache-2.0" - }, "node_modules/@lukeed/ms": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz", @@ -5688,132 +5860,11 @@ "node": ">=8" } }, - "node_modules/@mapeo/core": { - "version": "9.0.0-alpha.16", - "resolved": "https://registry.npmjs.org/@mapeo/core/-/core-9.0.0-alpha.16.tgz", - "integrity": "sha512-DYHsa5BhCFsZvbgq3zCqUiWDmRsdTpKLYKz/5gkwCj2Qaj0aLrng7iNCm5ULtsUa01FY+VI1Z68N/pGhVrP1dw==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@digidem/types": "^2.3.0", - "@electron/asar": "^3.2.8", - "@fastify/error": "^3.4.1", - "@fastify/static": "^7.0.3", - "@fastify/type-provider-typebox": "^4.0.0", - "@hyperswarm/secret-stream": "^6.1.2", - "@mapeo/crypto": "1.0.0-alpha.10", - "@mapeo/schema": "^3.0.0-next.19", - "@mapeo/sqlite-indexer": "1.0.0-alpha.9", - "@sinclair/typebox": "^0.29.6", - "b4a": "^1.6.3", - "bcp-47": "^2.1.0", - "better-sqlite3": "^8.7.0", - "big-sparse-array": "^1.0.3", - "bogon": "^1.1.0", - "compact-encoding": "^2.12.0", - "corestore": "^6.8.4", - "debug": "^4.3.4", - "dot-prop": "^9.0.0", - "drizzle-orm": "^0.30.8", - "fastify": ">= 4", - "fastify-plugin": "^4.5.1", - "hyperblobs": "2.3.0", - "hypercore": "10.17.0", - "hypercore-crypto": "3.4.0", - "hyperdrive": "11.5.3", - "hyperswarm": "4.4.1", - "json-stable-stringify": "^1.1.1", - "magic-bytes.js": "^1.10.0", - "map-obj": "^5.0.2", - "mime": "^4.0.3", - "multi-core-indexer": "^1.0.0-alpha.10", - "p-defer": "^4.0.0", - "p-event": "^6.0.1", - "p-timeout": "^6.1.2", - "patch-package": "^8.0.0", - "protobufjs": "^7.2.3", - "protomux": "^3.4.1", - "quickbit-universal": "^2.2.0", - "sodium-universal": "^4.0.0", - "start-stop-state-machine": "^1.2.0", - "sub-encoder": "^2.1.1", - "throttle-debounce": "^5.0.0", - "tiny-typed-emitter": "^2.1.0", - "type-fest": "^4.5.0", - "undici": "^6.13.0", - "varint": "^6.0.0", - "yauzl-promise": "^4.0.0" - } - }, - "node_modules/@mapeo/core/node_modules/@sinclair/typebox": { - "version": "0.29.6", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.29.6.tgz", - "integrity": "sha512-aX5IFYWlMa7tQ8xZr3b2gtVReCvg7f3LEhjir/JAjX2bJCMVJA5tIPv30wTD4KDfcwMd7DDYY3hFDeGmOgtrZQ==", - "license": "MIT" - }, - "node_modules/@mapeo/core/node_modules/hypercore": { - "version": "10.17.0", - "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-10.17.0.tgz", - "integrity": "sha512-Yp9lyfUjp81Gy1nPHemNFtYQtngliCGZ6prH+qxvjr2FPVG1QFtNqtOh+ZxFu4hXZ1dAOLYkQOA7Qq2vjFe64A==", - "license": "MIT", - "dependencies": { - "@hyperswarm/secret-stream": "^6.0.0", - "b4a": "^1.1.0", - "big-sparse-array": "^1.0.3", - "compact-encoding": "^2.11.0", - "crc-universal": "^1.0.2", - "events": "^3.3.0", - "flat-tree": "^1.9.0", - "hypercore-crypto": "^3.2.1", - "is-options": "^1.0.1", - "protomux": "^3.4.0", - "quickbit-universal": "^2.1.1", - "random-access-file": "^4.0.0", - "random-array-iterator": "^1.0.0", - "safety-catch": "^1.0.1", - "sodium-universal": "^4.0.0", - "streamx": "^2.12.4", - "xache": "^1.1.0", - "z32": "^1.0.0" - } - }, - "node_modules/@mapeo/core/node_modules/mime": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.3.tgz", - "integrity": "sha512-KgUb15Oorc0NEKPbvfa0wRU+PItIEZmiv+pyAO2i0oTIVTJhlzMclU7w4RXWQrSOVH5ax/p/CkIO7KI4OyFJTQ==", - "funding": [ - "https://github.com/sponsors/broofa" - ], - "bin": { - "mime": "bin/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@mapeo/core/node_modules/p-timeout": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", - "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mapeo/core/node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "license": "MIT" - }, - "node_modules/@mapeo/crypto": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@mapeo/crypto/-/crypto-1.0.0-alpha.10.tgz", - "integrity": "sha512-TEK8HN1W0XZOOADIMxa4saXtqAZKyBDeVVn3RBCcPaCiOGHeYy43/0rMnBVTbXZCLsLVPnOXwv6vg+vUkasrWQ==", - "license": "ISC", + "node_modules/@mapeo/crypto": { + "version": "1.0.0-alpha.10", + "resolved": "https://registry.npmjs.org/@mapeo/crypto/-/crypto-1.0.0-alpha.10.tgz", + "integrity": "sha512-TEK8HN1W0XZOOADIMxa4saXtqAZKyBDeVVn3RBCcPaCiOGHeYy43/0rMnBVTbXZCLsLVPnOXwv6vg+vUkasrWQ==", + "license": "ISC", "dependencies": { "@types/b4a": "^1.6.0", "b4a": "^1.6.4", @@ -5828,141 +5879,6 @@ "z32": "^1.0.0" } }, - "node_modules/@mapeo/ipc": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@mapeo/ipc/-/ipc-0.11.0.tgz", - "integrity": "sha512-KxLb/sfEVpwf6z4n7CAJBmd7nVgS5FwxZ/Eb1UdJE3xeeUOF0GNGFxFHOF/0jN9+rhexJ/H8hrwHtNjY1/bbFw==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-defer": "^4.0.0", - "rpc-reflector": "^1.3.11" - }, - "engines": { - "node": ">=18.17.1" - }, - "peerDependencies": { - "@mapeo/core": "9.0.0-alpha.16" - } - }, - "node_modules/@mapeo/mock-data": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@mapeo/mock-data/-/mock-data-1.0.2.tgz", - "integrity": "sha512-4SpjlrtT1RWTfy4J0mDKcpAEMIaAcN7NjhuqSM+kN7LlADl0mZ5qJlsYbV0sYPPY6O1neOGRyjBi2j0bR/lbYQ==", - "dependencies": { - "@faker-js/faker": "^8.3.1", - "@mapeo/schema": "^3.0.0-next.16", - "json-schema-faker": "^0.5.3", - "type-fest": "^4.8.0" - }, - "bin": { - "generate-mapeo-data": "bin/generate-mapeo-data.js", - "list-mapeo-schemas": "bin/list-mapeo-schemas.js" - } - }, - "node_modules/@mapeo/schema": { - "version": "3.0.0-next.19", - "resolved": "https://registry.npmjs.org/@mapeo/schema/-/schema-3.0.0-next.19.tgz", - "integrity": "sha512-lG98YaaX/Ww07tTzbhfvBDZpk5DY0HnPAo8fSYrIKu5Kw9Xo559NT+vmmQbZhINZoRCJATFXxnNMW3TvQE4qCw==", - "dependencies": { - "@json-schema-tools/dereferencer": "^1.6.1", - "ajv": "^8.12.0", - "ajv-formats": "^2.1.1", - "compact-encoding": "^2.12.0", - "glob": "^10.3.3", - "protobufjs": "^7.2.5", - "type-fest": "^4.1.0", - "typedoc": "^0.24.8", - "typedoc-plugin-markdown": "^3.15.4" - } - }, - "node_modules/@mapeo/schema/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@mapeo/schema/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@mapeo/schema/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/@mapeo/schema/node_modules/minimatch": { - "version": "9.0.3", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@mapeo/schema/node_modules/typedoc": { - "version": "0.24.8", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz", - "integrity": "sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w==", - "license": "Apache-2.0", - "dependencies": { - "lunr": "^2.3.9", - "marked": "^4.3.0", - "minimatch": "^9.0.0", - "shiki": "^0.14.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 14.14" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x" - } - }, - "node_modules/@mapeo/schema/node_modules/typedoc-plugin-markdown": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.17.1.tgz", - "integrity": "sha512-QzdU3fj0Kzw2XSdoL15ExLASt2WPqD7FbLeaqwT70+XjKyTshBnUlQA5nNREO1C2P8Uen0CDjsBLMsCQ+zd0lw==", - "license": "MIT", - "dependencies": { - "handlebars": "^4.7.7" - }, - "peerDependencies": { - "typedoc": ">=0.24.0" - } - }, - "node_modules/@mapeo/schema/node_modules/typescript": { - "version": "5.1.6", - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/@mapeo/sqlite-indexer": { "version": "1.0.0-alpha.9", "resolved": "https://registry.npmjs.org/@mapeo/sqlite-indexer/-/sqlite-indexer-1.0.0-alpha.9.tgz", @@ -8503,7 +8419,9 @@ "license": "MIT" }, "node_modules/@sinonjs/commons": { - "version": "3.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" @@ -9142,7 +9060,6 @@ "node_modules/@tootallnate/once": { "version": "2.0.0", "license": "MIT", - "peer": true, "engines": { "node": ">= 10" } @@ -9556,7 +9473,9 @@ "license": "MIT" }, "node_modules/@types/graceful-fs": { - "version": "4.1.6", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9594,9 +9513,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "version": "29.5.13", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.13.tgz", + "integrity": "sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==", "dev": true, "license": "MIT", "dependencies": { @@ -9630,6 +9549,18 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, "node_modules/@types/json-schema": { "version": "7.0.11", "dev": true, @@ -9706,9 +9637,9 @@ } }, "node_modules/@types/react-native-zeroconf": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/@types/react-native-zeroconf/-/react-native-zeroconf-0.12.3.tgz", - "integrity": "sha512-IV9BSqbVf+I8ZNLMd4Vc8O3GPc4RVkHTlkGq7lHXaSd3egGZ9v2yoeNTZM2DNTNmFGb18Xn3mSYfAM8BkYLU1A==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@types/react-native-zeroconf/-/react-native-zeroconf-0.13.1.tgz", + "integrity": "sha512-edAbIS+1/o9OTYU6S7stNli9ATHlJA2z2jOv6ZC+n38Q2qyUKqzycuD+hLqRLIxe1BibYYcpOoJtuoBkLSsdYg==", "dev": true, "license": "MIT", "dependencies": { @@ -9750,6 +9681,13 @@ "@types/node": "*" } }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/utm": { "version": "1.1.2", "dev": true, @@ -10042,8 +9980,17 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, "license": "BSD-2-Clause" }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/abbrev": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", @@ -10085,7 +10032,9 @@ } }, "node_modules/acorn": { - "version": "8.10.0", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -10094,6 +10043,17 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, "node_modules/acorn-import-assertions": { "version": "1.9.0", "license": "MIT", @@ -10112,6 +10072,19 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -10324,12 +10297,6 @@ "node": ">=8" } }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", - "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", - "license": "MIT" - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -10628,8 +10595,10 @@ } }, "node_modules/b4a": { - "version": "1.6.4", - "license": "ISC" + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "license": "Apache-2.0" }, "node_modules/babel-core": { "version": "7.0.0-bridge.0", @@ -10641,11 +10610,13 @@ } }, "node_modules/babel-jest": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -10863,6 +10834,12 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/bare-events": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "license": "Apache-2.0" + }, "node_modules/base-x": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", @@ -10998,15 +10975,6 @@ "file-uri-to-path": "1.0.0" } }, - "node_modules/bits-to-bytes": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bits-to-bytes/-/bits-to-bytes-1.3.0.tgz", - "integrity": "sha512-OJoHTpFXS9bXHBCekGTByf3MqM8CGblBDIduKQeeVVeiU9dDWywSSirXIBYGgg3d1zbVuvnMa1vD4r6PA0kOKg==", - "license": "ISC", - "dependencies": { - "b4a": "^1.5.0" - } - }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -11059,6 +11027,8 @@ "node_modules/blake2b": { "version": "2.1.4", "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "blake2b-wasm": "^2.4.0", "nanoassert": "^2.0.0" @@ -11067,24 +11037,13 @@ "node_modules/blake2b-wasm": { "version": "2.4.0", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "b4a": "^1.0.1", "nanoassert": "^2.0.0" } }, - "node_modules/blind-relay": { - "version": "1.3.1", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4", - "bits-to-bytes": "^1.3.0", - "compact-encoding": "^2.12.0", - "compact-encoding-bitfield": "^1.0.0", - "protomux": "^3.5.1", - "sodium-universal": "^4.0.0", - "streamx": "^2.15.1" - } - }, "node_modules/blueimp-md5": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", @@ -11095,7 +11054,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/bogon/-/bogon-1.1.0.tgz", "integrity": "sha512-a6SnToksXHuUlgeMvI/txWmTcKz7c7iBa8f0HbXL4toN1Uza/CTQ4F7n9jSDX49TCpxv3KUP100q4sZfwLyLiw==", - "license": "MIT", "dependencies": { "compact-encoding": "^2.11.0", "compact-encoding-net": "^1.2.0" @@ -11149,7 +11107,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.10", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "funding": [ { "type": "opencollective", @@ -11166,10 +11126,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -11370,11 +11330,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" - }, "node_modules/caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", @@ -11428,7 +11383,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001522", + "version": "1.0.30001667", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz", + "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==", "funding": [ { "type": "opencollective", @@ -11448,6 +11405,8 @@ "node_modules/chacha20-universal": { "version": "1.0.4", "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "nanoassert": "^2.0.0" } @@ -11899,21 +11858,13 @@ "license": "MIT" }, "node_modules/compact-encoding": { - "version": "2.12.0", - "license": "Apache-2.0", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/compact-encoding/-/compact-encoding-2.15.0.tgz", + "integrity": "sha512-af/NomxL9Mo0lqCk++rxLLDZI+lJqeBrPt4dK6FbjxTCEhfC9yQAIoO6yq9ixyCirce0luQwErkwJrhem6clxA==", "dependencies": { "b4a": "^1.3.0" } }, - "node_modules/compact-encoding-bitfield": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/compact-encoding-bitfield/-/compact-encoding-bitfield-1.0.0.tgz", - "integrity": "sha512-3nMVKUg+PF72UHfainmCL8uKvyWfxsjqOtUY+HiMPGLPCTjnwzoKfFAMo1Ad7nwTPdjBqtGK5b3BOFTFW4EBTg==", - "license": "ISC", - "dependencies": { - "compact-encoding": "^2.4.1" - } - }, "node_modules/compact-encoding-net": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/compact-encoding-net/-/compact-encoding-net-1.2.0.tgz", @@ -12065,7 +12016,9 @@ } }, "node_modules/convert-source-map": { - "version": "1.9.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "license": "MIT" }, "node_modules/cookie": { @@ -12093,13 +12046,14 @@ "license": "MIT" }, "node_modules/corestore": { - "version": "6.15.9", + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/corestore/-/corestore-6.8.4.tgz", + "integrity": "sha512-rJUn1bK2Id18mxZSb64fKGCSsbbBAvPUkSZVzsLB4Nnwhf3pkwxt/JjBvKHtsrvRyPAu9xtxUdUk1cSQ1JnOPw==", "license": "MIT", "dependencies": { - "b4a": "^1.6.4", - "hypercore": "^10.28.1", - "hypercore-crypto": "^3.4.0", - "hypercore-id-encoding": "^1.2.0", + "b4a": "^1.3.1", + "hypercore": "^10.12.0", + "hypercore-crypto": "^3.2.1", "read-write-mutexify": "^2.1.0", "ready-resource": "^1.0.0", "safety-catch": "^1.0.1", @@ -12197,11 +12151,61 @@ "ieee754": "^1.1.13" } }, - "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "license": "MIT", + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "license": "MIT", "dependencies": { "node-fetch": "^2.6.12" } @@ -12324,6 +12328,33 @@ "dev": true, "license": "CC0-1.0" }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true, + "license": "MIT" + }, "node_modules/csstype": { "version": "3.1.1", "license": "MIT" @@ -12334,6 +12365,21 @@ "integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==", "license": "MIT" }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -12426,15 +12472,6 @@ } } }, - "node_modules/debugging-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/debugging-stream/-/debugging-stream-2.0.0.tgz", - "integrity": "sha512-xwfl6wB/3xc553uwtGnSa94jFxnGOc02C0WU2Nmzwr80gzeqn1FX4VcbvoKIhe8L/lPq4BTQttAbrTN94uN8rA==", - "license": "MIT", - "dependencies": { - "streamx": "^2.12.4" - } - }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -12444,6 +12481,13 @@ "node": ">=0.10.0" } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true, + "license": "MIT" + }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -12469,7 +12513,9 @@ } }, "node_modules/dedent": { - "version": "1.5.1", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -12841,23 +12887,6 @@ "node": ">=8" } }, - "node_modules/dht-rpc": { - "version": "6.10.0", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.1", - "compact-encoding": "^2.11.0", - "compact-encoding-net": "^1.2.0", - "events": "^3.3.0", - "fast-fifo": "^1.1.0", - "kademlia-routing-table": "^1.0.1", - "nat-sampler": "^1.0.1", - "sodium-universal": "^4.0.0", - "streamx": "^2.13.2", - "time-ordered-set": "^1.0.2", - "udx-native": "^1.5.3" - } - }, "node_modules/diagnostic-channel": { "version": "1.1.1", "license": "MIT", @@ -12935,6 +12964,30 @@ ], "license": "BSD-2-Clause" }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", @@ -13001,6 +13054,30 @@ "url": "https://dotenvx.com" } }, + "node_modules/dotenv-cli": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-7.4.2.tgz", + "integrity": "sha512-SbUj8l61zIbzyhIbg0FwPJq6+wjbzdn9oEtozQpZ6kW2ihCcapKVZj49oCT3oPM+mgQm+itgvUQcG5szxVrZTA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "dotenv": "^16.3.0", + "dotenv-expand": "^10.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "dotenv": "cli.js" + } + }, + "node_modules/dotenv-cli/node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/dotenv-expand": { "version": "11.0.6", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", @@ -13161,7 +13238,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.501", + "version": "1.5.33", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.33.tgz", + "integrity": "sha512-+cYTcFB1QqD4j4LegwLfpCNxifb6dDFUAwk6RsLusCwIaZI6or2f+q8rs5tTB2YC53HhOlIbEaqHMAAC8IOIwA==", "license": "ISC" }, "node_modules/emitter-listener": { @@ -13210,19 +13289,6 @@ "iconv-lite": "^0.6.2" } }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -13476,7 +13542,9 @@ "license": "MIT" }, "node_modules/escalade": { - "version": "3.1.1", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { "node": ">=6" @@ -13497,6 +13565,28 @@ "node": ">=0.8.0" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, "node_modules/eslint": { "version": "8.47.0", "dev": true, @@ -14191,15 +14281,17 @@ } }, "node_modules/expect": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -15017,12 +15109,6 @@ "node": ">=6" } }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "license": "MIT" - }, "node_modules/fast-uri": { "version": "2.2.0", "license": "MIT" @@ -15486,11 +15572,6 @@ "node": ">= 6" } }, - "node_modules/format-util": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz", - "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==" - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -16030,27 +16111,6 @@ "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, "node_modules/has": { "version": "1.0.3", "dev": true, @@ -16206,6 +16266,19 @@ "node": ">=10" } }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -16323,81 +16396,62 @@ } }, "node_modules/hypercore": { - "version": "10.30.0", + "version": "10.37.22", + "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-10.37.22.tgz", + "integrity": "sha512-4xF+l2V7musYWD3Dfti7+AumBD6q+Kr32wnsQgB+HsBez7yueqidrZhFJlvq2zDH2fwu+rvFLSObIj/ObHjrdA==", "license": "MIT", "dependencies": { "@hyperswarm/secret-stream": "^6.0.0", "b4a": "^1.1.0", + "bare-events": "^2.2.0", "big-sparse-array": "^1.0.3", "compact-encoding": "^2.11.0", "crc-universal": "^1.0.2", - "events": "^3.3.0", "fast-fifo": "^1.3.0", "flat-tree": "^1.9.0", "hypercore-crypto": "^3.2.1", - "hypercore-errors": "^1.1.0", + "hypercore-errors": "^1.2.0", "hypercore-id-encoding": "^1.2.0", + "hypertrace": "^1.2.1", "is-options": "^1.0.1", "protomux": "^3.5.0", - "quickbit-universal": "^2.1.1", + "quickbit-universal": "^2.2.0", "random-access-file": "^4.0.0", "random-array-iterator": "^1.0.0", "safety-catch": "^1.0.1", "sodium-universal": "^4.0.0", "streamx": "^2.12.4", + "unslab": "^1.3.0", "xache": "^1.1.0", "z32": "^1.0.0" } }, "node_modules/hypercore-crypto": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-3.4.0.tgz", - "integrity": "sha512-0cZA1B58p1J84TDbTh8DMMIj7Qr7Rzz8NyGIo+ykUhdwD21gtjiiLWoME92QvN+lgbfu0Zfr9vwxT8sRmyg+AA==", - "license": "MIT", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-3.4.2.tgz", + "integrity": "sha512-16ii4M6T1dFfRa41Szv3IR0wXfImJMYJ8ysZEGwHEDH7sMeWVEBck6tg1GCNutYl39E+H7wMY2p3ndCRfj+XdQ==", "dependencies": { - "b4a": "^1.1.0", - "compact-encoding": "^2.5.1", - "sodium-universal": "^4.0.0" + "b4a": "^1.6.6", + "compact-encoding": "^2.15.0", + "sodium-universal": "^4.0.1" } }, "node_modules/hypercore-errors": { - "version": "1.1.0", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/hypercore-errors/-/hypercore-errors-1.3.0.tgz", + "integrity": "sha512-WsmSu05Ve1hXaT/2Etwz7mgZ1sAXe8EaveahUfaeECllxvYNaP5EbAPw5YaA4OqR3d217litGt4qKch9TBnavA==", "license": "Apache-2.0" }, "node_modules/hypercore-id-encoding": { - "version": "1.2.0", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/hypercore-id-encoding/-/hypercore-id-encoding-1.3.0.tgz", + "integrity": "sha512-W6sHdGo5h7LXEsoWfKf/KfuROZmZRQDlGqJF2EPHW+noCK66Vvr0+zE6cL0vqQi18s0kQPeN7Sq3QyR0Ytc2VQ==", "license": "Apache-2.0", "dependencies": { "b4a": "^1.5.3", "z32": "^1.0.0" } }, - "node_modules/hyperdht": { - "version": "6.11.0", - "license": "MIT", - "dependencies": { - "@hyperswarm/secret-stream": "^6.0.0", - "b4a": "^1.3.1", - "blind-relay": "^1.3.0", - "bogon": "^1.0.0", - "compact-encoding": "^2.4.1", - "compact-encoding-net": "^1.0.1", - "debugging-stream": "^2.0.0", - "dht-rpc": "^6.9.0", - "events": "^3.3.0", - "hypercore-crypto": "^3.3.0", - "noise-curve-ed": "^2.0.0", - "noise-handshake": "^3.0.0", - "record-cache": "^1.1.1", - "safety-catch": "^1.0.1", - "signal-promise": "^1.0.3", - "sodium-universal": "^4.0.0", - "xache": "^1.1.0" - }, - "bin": { - "hyperdht": "bin.js" - } - }, "node_modules/hyperdrive": { "version": "11.5.3", "resolved": "https://registry.npmjs.org/hyperdrive/-/hyperdrive-11.5.3.tgz", @@ -16416,17 +16470,23 @@ "unix-path-resolve": "^1.0.2" } }, - "node_modules/hyperswarm": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/hyperswarm/-/hyperswarm-4.4.1.tgz", - "integrity": "sha512-8VLR/DLx6BnZATdCoECwFWasz7tIVdxkwlALT25sV6GEERf2fwttkJrb+5BS9vht/fyXJ4l41x6YgDWCabIoiw==", + "node_modules/hypertrace": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/hypertrace/-/hypertrace-1.4.2.tgz", + "integrity": "sha512-sa6iq1FaJ03Db3eUl5ZodyOL3fheyrum9xzeHasXOQ/AprTT6vS1WjpbXfYkHhmzVmyn0jBW/VsCb1QaBkGyow==", + "license": "Apache-2.0" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "devOptional": true, "license": "MIT", "dependencies": { - "b4a": "^1.3.1", - "events": "^3.3.0", - "hyperdht": "^6.5.2", - "safety-catch": "^1.0.2", - "shuffled-priority-queue": "^2.1.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/ieee754": { @@ -16517,9 +16577,9 @@ } }, "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", "dependencies": { @@ -17094,6 +17154,13 @@ "node": ">=0.10.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -17286,16 +17353,6 @@ "node": ">=0.10.0" } }, - "node_modules/isomorphic-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", - "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.1", - "whatwg-fetch": "^3.4.1" - } - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "dev": true, @@ -17362,7 +17419,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -17391,14 +17450,16 @@ } }, "node_modules/jest": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "^29.6.4", + "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.6.4" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" @@ -17416,12 +17477,14 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "license": "MIT", "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -17518,27 +17581,29 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -17566,7 +17631,9 @@ } }, "node_modules/jest-circus/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -17603,7 +17670,9 @@ } }, "node_modules/jest-circus/node_modules/pretty-format": { - "version": "29.6.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17616,21 +17685,22 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -17667,7 +17737,9 @@ } }, "node_modules/jest-cli/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -17747,30 +17819,32 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -17809,7 +17883,9 @@ } }, "node_modules/jest-config/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -17830,7 +17906,9 @@ } }, "node_modules/jest-config/node_modules/ci-info": { - "version": "3.8.0", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -17847,6 +17925,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -17884,7 +17963,9 @@ } }, "node_modules/jest-config/node_modules/pretty-format": { - "version": "29.6.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17941,7 +18022,9 @@ } }, "node_modules/jest-docblock": { - "version": "29.6.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "license": "MIT", "dependencies": { @@ -17952,15 +18035,17 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -17985,7 +18070,9 @@ } }, "node_modules/jest-each/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -18006,7 +18093,9 @@ } }, "node_modules/jest-each/node_modules/pretty-format": { - "version": "29.6.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18018,16 +18107,74 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, "node_modules/jest-environment-node": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "license": "MIT", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -18057,6 +18204,95 @@ "@types/yargs-parser": "*" } }, + "node_modules/jest-expo": { + "version": "50.0.4", + "resolved": "https://registry.npmjs.org/jest-expo/-/jest-expo-50.0.4.tgz", + "integrity": "sha512-qtCqtdGaQtEcA3vc6UPN5Xn78jAyoBJj6Pxpk2raizdwI7carsg9Us9Wc+D4kl+7+ffhBMeS3cYWeJqVIZl1pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@expo/config": "~8.5.0", + "@expo/json-file": "^8.2.37", + "@jest/create-cache-key-function": "^29.2.1", + "babel-jest": "^29.2.1", + "find-up": "^5.0.0", + "jest-environment-jsdom": "^29.2.1", + "jest-watch-select-projects": "^2.0.0", + "jest-watch-typeahead": "2.2.1", + "json5": "^2.2.3", + "lodash": "^4.17.19", + "react-test-renderer": "18.2.0", + "stacktrace-js": "^2.0.2" + }, + "bin": { + "jest": "bin/jest.js" + } + }, + "node_modules/jest-expo/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-expo/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-expo/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-expo/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", @@ -18067,7 +18303,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", "dependencies": { @@ -18078,8 +18316,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -18109,7 +18347,9 @@ } }, "node_modules/jest-haste-map/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -18117,12 +18357,14 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -18142,7 +18384,9 @@ } }, "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "29.6.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18199,7 +18443,9 @@ } }, "node_modules/jest-message-util": { - "version": "29.6.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", @@ -18208,7 +18454,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -18253,7 +18499,9 @@ } }, "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.6.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", @@ -18265,12 +18513,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -18294,7 +18544,9 @@ } }, "node_modules/jest-mock/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -18329,16 +18581,18 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -18348,41 +18602,45 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "license": "MIT", "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -18409,7 +18667,9 @@ } }, "node_modules/jest-runner/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -18433,16 +18693,18 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -18450,13 +18712,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -18483,7 +18745,9 @@ } }, "node_modules/jest-runtime/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -18494,6 +18758,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -18512,7 +18777,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "license": "MIT", "dependencies": { @@ -18521,20 +18788,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -18560,7 +18827,9 @@ } }, "node_modules/jest-snapshot/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -18581,7 +18850,9 @@ } }, "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "29.6.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18594,7 +18865,9 @@ } }, "node_modules/jest-util": { - "version": "29.6.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", @@ -18726,18 +18999,150 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-watch-select-projects": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-watch-select-projects/-/jest-watch-select-projects-2.0.0.tgz", + "integrity": "sha512-j00nW4dXc2NiCW6znXgFLF9g8PJ0zP25cpQ1xRro/HU2GBfZQFZD0SoXnAlaoKkIY4MlfTMkKGbNXFpvCdjl1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.0", + "chalk": "^3.0.0", + "prompts": "^2.2.1" + } + }, + "node_modules/jest-watch-select-projects/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-2.2.1.tgz", + "integrity": "sha512-jYpYmUnTzysmVnwq49TAxlmtOAwp8QIqvZyoofQFn8fiWhEDZj33ZXzg3JA4nGnzWFm1hbWf3ADpteUokvXgFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^6.0.0", + "chalk": "^4.0.0", + "jest-regex-util": "^29.0.0", + "jest-watcher": "^29.0.0", + "slash": "^5.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0 || ^29.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/char-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/jest-watcher": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -18763,7 +19168,9 @@ } }, "node_modules/jest-watcher/node_modules/@types/yargs": { - "version": "17.0.24", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -18771,11 +19178,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "license": "MIT", "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -18928,16 +19337,124 @@ "signal-exit": "^3.0.2" } }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-parse-better-errors": { @@ -18992,29 +19509,6 @@ "is-buffer": "~1.1.1" } }, - "node_modules/json-schema-faker": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.6.tgz", - "integrity": "sha512-u/cFC26/GDxh2vPiAC8B8xVvpXAW+QYtG2mijEbKrimCk8IHtiwQBjCE8TwvowdhALWq9IcdIWZ+/8ocXvdL3Q==", - "dependencies": { - "json-schema-ref-parser": "^6.1.0", - "jsonpath-plus": "^7.2.0" - }, - "bin": { - "jsf": "bin/gen.cjs" - } - }, - "node_modules/json-schema-ref-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz", - "integrity": "sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==", - "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", - "dependencies": { - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.12.1", - "ono": "^4.0.11" - } - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -19063,10 +19557,6 @@ "node": ">=6" } }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "license": "MIT" - }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -19085,14 +19575,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsonpath-plus": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", - "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/jsx-ast-utils": { "version": "3.3.3", "dev": true, @@ -19105,10 +19587,6 @@ "node": ">=4.0" } }, - "node_modules/kademlia-routing-table": { - "version": "1.0.1", - "license": "MIT" - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -19122,6 +19600,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.1.11" @@ -19897,12 +20376,6 @@ "node": ">=10" } }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "license": "MIT" - }, "node_modules/luxon": { "version": "3.4.4", "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", @@ -20100,18 +20573,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, "node_modules/marky": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", @@ -21029,13 +21490,8 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", - "license": "MIT" - }, - "node_modules/nat-sampler": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nat-sampler/-/nat-sampler-1.0.1.tgz", - "integrity": "sha512-yQvyNN7xbqR8crTKk3U8gRgpcV1Az+vfCEijiHu9oHHsnIl8n3x+yXNHl42M6L3czGynAVoOT9TqBfS87gDdcw==", - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/natural-compare": { "version": "1.4.0", @@ -21213,7 +21669,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.13", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "license": "MIT" }, "node_modules/node-stream-zip": { @@ -21402,6 +21860,13 @@ "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "license": "MIT" }, + "node_modules/nwsapi": { + "version": "2.2.13", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz", + "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==", + "dev": true, + "license": "MIT" + }, "node_modules/ob1": { "version": "0.80.6", "license": "MIT", @@ -21579,14 +22044,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ono": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", - "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", - "dependencies": { - "format-util": "^1.0.3" - } - }, "node_modules/open": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", @@ -21912,6 +22369,19 @@ "node": ">=10" } }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -21935,6 +22405,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "dev": true, "license": "MIT", "dependencies": { "@yarnpkg/lockfile": "^1.1.0", @@ -21965,6 +22436,7 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, "funding": [ { "type": "github", @@ -21980,6 +22452,7 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", @@ -21995,6 +22468,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -22014,6 +22488,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, "license": "MIT", "dependencies": { "is-docker": "^2.0.0" @@ -22026,6 +22501,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -22038,6 +22514,7 @@ "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, "license": "MIT", "dependencies": { "is-docker": "^2.0.0", @@ -22054,6 +22531,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -22065,6 +22543,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -22072,6 +22551,7 @@ }, "node_modules/patch-package/node_modules/universalify": { "version": "2.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -22150,7 +22630,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "license": "ISC" }, "node_modules/picomatch": { @@ -22574,6 +23056,13 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true, + "license": "MIT" + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -22592,7 +23081,9 @@ } }, "node_modules/pure-rand": { - "version": "6.0.2", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { @@ -22632,6 +23123,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, "node_modules/queue": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", @@ -23035,12 +23533,6 @@ "react-native": "*" } }, - "node_modules/react-native-reanimated/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, "node_modules/react-native-restart": { "version": "0.0.27", "resolved": "https://registry.npmjs.org/react-native-restart/-/react-native-restart-0.0.27.tgz", @@ -24053,15 +24545,6 @@ "node": ">= 0.10" } }, - "node_modules/record-cache": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.2.0.tgz", - "integrity": "sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw==", - "license": "MIT", - "dependencies": { - "b4a": "^1.3.1" - } - }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -24225,6 +24708,13 @@ "path-parse": "^1.0.5" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.1", "license": "MIT", @@ -24550,8 +25040,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT", - "optional": true + "devOptional": true, + "license": "MIT" }, "node_modules/safety-catch": { "version": "1.0.2", @@ -24571,6 +25061,19 @@ "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", "license": "ISC" }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/scheduler": { "version": "0.23.0", "dev": true, @@ -24738,6 +25241,8 @@ "node_modules/sha256-universal": { "version": "1.2.1", "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "b4a": "^1.0.1", "sha256-wasm": "^2.2.1" @@ -24746,6 +25251,8 @@ "node_modules/sha256-wasm": { "version": "2.2.2", "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "b4a": "^1.0.1", "nanoassert": "^2.0.0" @@ -24754,6 +25261,8 @@ "node_modules/sha512-universal": { "version": "1.2.1", "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "b4a": "^1.0.1", "sha512-wasm": "^2.3.1" @@ -24762,6 +25271,8 @@ "node_modules/sha512-wasm": { "version": "2.3.4", "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "b4a": "^1.0.1", "nanoassert": "^2.0.0" @@ -24842,30 +25353,11 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/shiki": { - "version": "0.14.4", - "license": "MIT", - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, "node_modules/shimmer": { "version": "1.2.1", "license": "BSD-2-Clause", "peer": true }, - "node_modules/shuffled-priority-queue": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/shuffled-priority-queue/-/shuffled-priority-queue-2.1.0.tgz", - "integrity": "sha512-xhdh7fHyMsr0m/w2kDfRJuBFRS96b9l8ZPNWGaQ+PMvnUnZ/Eh+gJJ9NsHBd7P9k0399WYlCLzsy18EaMfyadA==", - "license": "MIT", - "dependencies": { - "unordered-set": "^2.0.1" - } - }, "node_modules/side-channel": { "version": "1.0.4", "license": "MIT", @@ -24884,12 +25376,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, - "node_modules/signal-promise": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/signal-promise/-/signal-promise-1.0.3.tgz", - "integrity": "sha512-WBgv0UnIq2C+Aeh0/n+IRpP6967eIx9WpynTUoiW3isPpfe1zu2LJzyfXdo9Tgef8yR/sGjcMvoUXD7EYdiz+g==", - "license": "MIT" - }, "node_modules/signed-varint": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/signed-varint/-/signed-varint-2.0.1.tgz", @@ -25005,6 +25491,8 @@ "node_modules/siphash24": { "version": "1.3.1", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "nanoassert": "^2.0.0" } @@ -25134,6 +25622,8 @@ "node_modules/sodium-javascript": { "version": "0.8.0", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "blake2b": "^2.1.1", "chacha20-universal": "^1.0.4", @@ -25155,18 +25645,19 @@ } }, "node_modules/sodium-universal": { - "version": "4.0.0", - "license": "MIT", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.1.tgz", + "integrity": "sha512-sNp13PrxYLaUFHTGoDKkSDFvoEu51bfzE12RwGlqU1fcrkpAOK0NvizaJzOWV0Omtk9me2+Pnbjcf/l0efxuGQ==", "dependencies": { - "blake2b": "^2.1.1", - "chacha20-universal": "^1.0.4", - "nanoassert": "^2.0.0", - "sha256-universal": "^1.1.0", - "sha512-universal": "^1.1.0", - "siphash24": "^1.0.1", - "sodium-javascript": "~0.8.0", - "sodium-native": "^4.0.0", - "xsalsa20": "^1.0.0" + "sodium-native": "^4.0.0" + }, + "peerDependencies": { + "sodium-javascript": "~0.8.0" + }, + "peerDependenciesMeta": { + "sodium-javascript": { + "optional": true + } } }, "node_modules/sodium-universal/node_modules/sodium-native": { @@ -25285,6 +25776,16 @@ "license": "MIT", "peer": true }, + "node_modules/stack-generator": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -25312,6 +25813,39 @@ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "license": "MIT" }, + "node_modules/stacktrace-gps": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "0.5.6", + "stackframe": "^1.3.4" + } + }, + "node_modules/stacktrace-gps/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, "node_modules/stacktrace-parser": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", @@ -25376,11 +25910,16 @@ "license": "MIT" }, "node_modules/streamx": { - "version": "2.15.1", - "license": "MIT", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.19.0.tgz", + "integrity": "sha512-5z6CNR4gtkPbwlxyEqoDGDmWIzoNJqCBt4Eac1ICP9YaIT08ct712cFj0u1rx4F8luAuL+3Qc+RFIdI4OX00kg==", "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" } }, "node_modules/strict-uri-encode": { @@ -25812,6 +26351,13 @@ "dev": true, "license": "CC0-1.0" }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, "node_modules/tar": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", @@ -26081,6 +26627,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/text-decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", + "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -26170,12 +26725,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/time-ordered-set": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/time-ordered-set/-/time-ordered-set-1.0.2.tgz", - "integrity": "sha512-vGO99JkxvgX+u+LtOKQEpYf31Kj3i/GNwVstfnh4dyINakMgeZCpew1e3Aj+06hEslhtHEd52g7m5IV+o1K8Mw==", - "license": "MIT" - }, "node_modules/timeout-refresh": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/timeout-refresh/-/timeout-refresh-2.0.1.tgz", @@ -26252,6 +26801,45 @@ "node": ">=0.6" } }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/traverse": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.9.tgz", @@ -26351,9 +26939,9 @@ } }, "node_modules/type-fest": { - "version": "4.20.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz", - "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.0.tgz", + "integrity": "sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==", "engines": { "node": ">=16" }, @@ -26483,31 +27071,6 @@ "node": "*" } }, - "node_modules/udx-native": { - "version": "1.7.12", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "b4a": "^1.5.0", - "events": "^3.3.0", - "napi-macros": "^2.0.0", - "node-gyp-build": "^4.4.0", - "streamx": "^2.14.0" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/uint8array-extras": { "version": "0.5.0", "license": "MIT", @@ -26633,12 +27196,6 @@ "integrity": "sha512-kG4g5nobBBaMnH2XbrS4sLUXEpx4nY2J3C6KAlAUcnahG2HChxSPVKWYrqEq76iTo+cyMkLUjqxGaQR2tz097Q==", "license": "MIT" }, - "node_modules/unordered-set": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unordered-set/-/unordered-set-2.0.1.tgz", - "integrity": "sha512-eUmNTPzdx+q/WvOHW0bgGYLWvWHNT3PTKEQLg0MAQhc0AHASHVHoP/9YytYd4RBVariqno/mEUhVZN98CmD7bg==", - "license": "MIT" - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -26648,8 +27205,19 @@ "node": ">= 0.8" } }, + "node_modules/unslab": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/unslab/-/unslab-1.3.0.tgz", + "integrity": "sha512-YATkfKAFj47kTzmiQrWXMyRvaVrHsW6MEALa4bm+FhiA2YG4oira+Z3DXN6LrYOYn2Y8eO94Lwl9DOHjs1FpoQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.6" + } + }, "node_modules/update-browserslist-db": { - "version": "1.0.11", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "funding": [ { "type": "opencollective", @@ -26666,8 +27234,8 @@ ], "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -26691,6 +27259,17 @@ "integrity": "sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==", "license": "MIT" }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/use-latest-callback": { "version": "0.1.6", "license": "MIT", @@ -26892,13 +27471,15 @@ } }, "node_modules/v8-to-istanbul": { - "version": "9.1.0", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "convert-source-map": "^2.0.0" }, "engines": { "node": ">=10.12.0" @@ -26967,17 +27548,18 @@ "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "license": "MIT" }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "license": "MIT" - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "license": "MIT" + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } }, "node_modules/walker": { "version": "1.0.8", @@ -27012,10 +27594,47 @@ "node": ">=8" } }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/whatwg-fetch": { "version": "3.6.2", "license": "MIT" }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/whatwg-url-without-unicode": { "version": "8.0.0-3", "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", @@ -27054,6 +27673,16 @@ "ieee754": "^1.1.13" } }, + "node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -27131,12 +27760,6 @@ "integrity": "sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg==", "license": "MIT" }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "license": "MIT" - }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -27226,6 +27849,16 @@ "node": ">=6.0.0" } }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, "node_modules/xml-parser": { "version": "1.2.1", "license": "MIT", @@ -27282,6 +27915,13 @@ "node": ">=8.0" } }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, "node_modules/xpath": { "version": "0.0.27", "license": "MIT", @@ -27292,7 +27932,9 @@ }, "node_modules/xsalsa20": { "version": "1.2.0", - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/xtend": { "version": "4.0.2", diff --git a/package.json b/package.json index ceeae7ee5..7c2a32d45 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "comapeo-mobile", - "version": "0.0.1", + "version": "1.0.0-pre", "private": true, "main": "index.js", "scripts": { @@ -10,7 +10,7 @@ "ios-no-backend-rebuild": "expo run:ios", "prestart": "npm run build:translations && npm run build:intl-polyfills", "start": "expo start", - "test": "jest", + "test": "dotenv -- jest", "lint:prettier": "prettier \"src/**/*.{js,ts,jsx,tsx}\" --check", "lint:eslint": "eslint . --ext .js,.jsx,.ts,.tsx --cache --ignore-path .gitignore", "lint:types": "tsc --noEmit", @@ -28,6 +28,7 @@ }, "dependencies": { "@bam.tech/react-native-image-resizer": "^3.0.7", + "@comapeo/ipc": "1.0.1", "@dev-plugins/react-navigation": "^0.0.6", "@dr.pogodin/react-native-fs": "^2.24.1", "@formatjs/intl-getcanonicallocales": "^2.3.0", @@ -35,8 +36,6 @@ "@formatjs/intl-pluralrules": "^5.2.4", "@formatjs/intl-relativetimeformat": "^11.2.4", "@gorhom/bottom-sheet": "^4.5.1", - "@mapeo/ipc": "0.11.0", - "@mapeo/mock-data": "1.0.2", "@osm_borders/maritime_10000m": "^1.1.0", "@react-native-community/hooks": "^2.8.0", "@react-native-community/netinfo": "11.1.0", @@ -79,6 +78,7 @@ "geojson-geometries-lookup": "^0.5.0", "lodash.isequal": "^4.5.0", "luxon": "^3.4.4", + "map-obj": "^5.0.2", "nanoid": "^5.0.1", "nodejs-mobile-react-native": "^18.17.8", "react": "18.2.0", @@ -116,9 +116,9 @@ "@babel/core": "^7.20.0", "@babel/preset-env": "^7.20.0", "@babel/runtime": "^7.20.0", + "@comapeo/core": "1.0.1", + "@comapeo/schema": "1.0.0", "@formatjs/cli": "^6.2.0", - "@mapeo/core": "9.0.0-alpha.16", - "@mapeo/schema": "3.0.0-next.19", "@react-native-community/cli": "^12.3.6", "@react-native/babel-preset": "^0.73.21", "@react-native/eslint-config": "^0.73.2", @@ -128,13 +128,13 @@ "@testing-library/react-native": "^12.4.3", "@types/debug": "^4.1.7", "@types/geojson": "^7946.0.14", - "@types/jest": "^29.5.12", + "@types/jest": "^29.5.13", "@types/lodash.isequal": "^4.5.6", "@types/node": "^20.8.4", "@types/react": "^18.2.58", "@types/react-native-indicators": "^0.16.2", "@types/react-native-vector-icons": "^6.4.8", - "@types/react-native-zeroconf": "^0.12.3", + "@types/react-native-zeroconf": "^0.13.1", "@types/react-test-renderer": "^18.0.0", "@types/semver": "^7.5.8", "@types/utm": "^1.1.2", @@ -143,12 +143,14 @@ "babel-jest": "^29.6.3", "babel-plugin-transform-inline-environment-variables": "^0.4.4", "date-fns": "^3.6.0", + "dotenv-cli": "^7.4.2", "eslint": "^8.19.0", "eslint-config-prettier": "^9.1.0", "execa": "^8.0.1", "glob": "^10.3.14", "husky": "^8.0.0", - "jest": "^29.6.3", + "jest": "^29.7.0", + "jest-expo": "^50.0.4", "lint-staged": "^14.0.1", "patch-package": "^8.0.0", "prettier": "^3.2.5", @@ -161,7 +163,7 @@ "typescript": "^5.3.3" }, "jest": { - "preset": "react-native", + "preset": "jest-expo", "moduleFileExtensions": [ "ts", "tsx", @@ -174,7 +176,7 @@ "@rnmapbox/maps/setup-jest" ], "transformIgnorePatterns": [ - "node_modules/(?!(...|@rnmapbox))" + "node_modules/(?!(...|@rnmapbox|(jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@sentry/react-native|native-base|react-native-svg)" ] }, "lint-staged": { diff --git a/patches/@mapeo+ipc+0.11.0.patch b/patches/@comapeo+ipc+1.0.1.patch similarity index 59% rename from patches/@mapeo+ipc+0.11.0.patch rename to patches/@comapeo+ipc+1.0.1.patch index eff42e03e..b10a35be9 100644 --- a/patches/@mapeo+ipc+0.11.0.patch +++ b/patches/@comapeo+ipc+1.0.1.patch @@ -1,17 +1,17 @@ -diff --git a/node_modules/@mapeo/ipc/dist/client.js b/node_modules/@mapeo/ipc/dist/client.js +diff --git a/node_modules/@comapeo/ipc/dist/client.js b/node_modules/@comapeo/ipc/dist/client.js index 6ccb1e9..561ab9d 100644 ---- a/node_modules/@mapeo/ipc/dist/client.js -+++ b/node_modules/@mapeo/ipc/dist/client.js +--- a/node_modules/@comapeo/ipc/dist/client.js ++++ b/node_modules/@comapeo/ipc/dist/client.js @@ -1,4 +1,4 @@ -import { createClient } from 'rpc-reflector'; +import createClient from 'rpc-reflector/client.js'; import pDefer from 'p-defer'; import { MANAGER_CHANNEL_ID, MAPEO_RPC_ID, SubChannel, } from './lib/sub-channel.js'; /** -diff --git a/node_modules/@mapeo/ipc/dist/server.js b/node_modules/@mapeo/ipc/dist/server.js +diff --git a/node_modules/@comapeo/ipc/dist/server.js b/node_modules/@comapeo/ipc/dist/server.js index 164f9a7..5b3f4d5 100644 ---- a/node_modules/@mapeo/ipc/dist/server.js -+++ b/node_modules/@mapeo/ipc/dist/server.js +--- a/node_modules/@comapeo/ipc/dist/server.js ++++ b/node_modules/@comapeo/ipc/dist/server.js @@ -1,4 +1,4 @@ -import { createServer } from 'rpc-reflector'; +import createServer from 'rpc-reflector/server.js'; diff --git a/patches/README.md b/patches/README.md index 23592691c..91dd0290c 100644 --- a/patches/README.md +++ b/patches/README.md @@ -78,9 +78,9 @@ desirable to have Prettier tightly integrated with ESLint. The patch removes the We can remove this if either [this](https://github.com/facebook/react-native/pull/41877) or [this](https://github.com/facebook/react-native/pull/43756) is merged. -## @mapeo/ipc +## @comapeo/ipc -### [Change imports to avoid calling unavailable code](./@mapeo+ipc+0.11.0.patch) +### [Change imports to avoid calling unavailable code](./@comapeo+ipc+1.0.1.patch) There was an error while running app via Expo because of exports in `rpc-reflector` package. To remove this patch, `rpc-reflector` would need to be updated not to use `encode-decode.js` file which indirect usage results in errors. diff --git a/scripts/build-backend.mjs b/scripts/build-backend.mjs index 05241eb31..31695ab06 100755 --- a/scripts/build-backend.mjs +++ b/scripts/build-backend.mjs @@ -72,10 +72,10 @@ const KEEP_THESE = [ 'package.json', 'index.bundle.js', 'loader.js', - // Static folders referenced by @mapeo/core code - 'node_modules/@mapeo/core/drizzle', + // Static folders referenced by @comapeo/core code + 'node_modules/@comapeo/core/drizzle', // zip file that is the default config - 'node_modules/@mapeo/default-config/dist/mapeo-default-config.mapeoconfig', + 'node_modules/@mapeo/default-config/dist/mapeo-default-config.comapeocat', // Offline fallback map 'node_modules/mapeo-offline-map', ]; diff --git a/src/backend/index.js b/src/backend/index.js index 8997a3516..0e35c154a 100644 --- a/src/backend/index.js +++ b/src/backend/index.js @@ -6,7 +6,7 @@ import { init } from './src/app.js' // This assumes that we keep the relevant directory as part of the built assets when building for nodejs mobile // (see `KEEP_THESE` variable in build-backend.mjs) const MIGRATIONS_FOLDER_PATH = new URL( - './node_modules/@mapeo/core/drizzle', + './node_modules/@comapeo/core/drizzle', import.meta.url, ).pathname const FALLBACK_MAP_PATH = new URL( @@ -15,7 +15,7 @@ const FALLBACK_MAP_PATH = new URL( ).pathname const DEFAULT_CONFIG_PATH = new URL( - './node_modules/@mapeo/default-config/dist/mapeo-default-config.mapeoconfig', + './node_modules/@mapeo/default-config/dist/mapeo-default-config.comapeocat', import.meta.url, ).pathname diff --git a/src/backend/package-lock.json b/src/backend/package-lock.json index 929cdd6e0..b80d0f00f 100644 --- a/src/backend/package-lock.json +++ b/src/backend/package-lock.json @@ -10,9 +10,9 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@mapeo/core": "9.0.0-alpha.16", - "@mapeo/default-config": "^4.0.0-alpha.6", - "@mapeo/ipc": "0.11.0", + "@comapeo/core": "1.0.1", + "@comapeo/ipc": "1.0.1", + "@mapeo/default-config": "5.0.0", "debug": "^4.3.4", "mapeo-offline-map": "^2.0.0" }, @@ -45,9 +45,10 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -55,6 +56,157 @@ "node": ">=6.9.0" } }, + "node_modules/@comapeo/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@comapeo/core/-/core-1.0.1.tgz", + "integrity": "sha512-soQTuH+vLTXrLu56BPH6axSMC3gLa0FZip2cjnhQ1b94R8HpcM+IbRbK1KpHnwZl8zZEqGPZZ88DxRPiK1+uLw==", + "license": "MIT", + "dependencies": { + "@comapeo/schema": "1.0.0", + "@digidem/types": "^2.3.0", + "@electron/asar": "^3.2.8", + "@fastify/error": "^3.4.1", + "@fastify/static": "^7.0.3", + "@fastify/type-provider-typebox": "^4.0.0", + "@hyperswarm/secret-stream": "^6.1.2", + "@mapeo/crypto": "1.0.0-alpha.10", + "@mapeo/sqlite-indexer": "1.0.0-alpha.9", + "@sinclair/typebox": "^0.29.6", + "b4a": "^1.6.3", + "bcp-47": "^2.1.0", + "better-sqlite3": "^8.7.0", + "big-sparse-array": "^1.0.3", + "bogon": "^1.1.0", + "compact-encoding": "^2.12.0", + "corestore": "6.8.4", + "debug": "^4.3.4", + "dot-prop": "^9.0.0", + "drizzle-orm": "^0.30.8", + "fastify": ">= 4", + "fastify-plugin": "^4.5.1", + "hyperblobs": "2.3.0", + "hypercore": "10.17.0", + "hypercore-crypto": "3.4.2", + "hyperdrive": "11.5.3", + "json-stable-stringify": "^1.1.1", + "magic-bytes.js": "^1.10.0", + "map-obj": "^5.0.2", + "mime": "^4.0.3", + "multi-core-indexer": "^1.0.0-alpha.10", + "p-defer": "^4.0.0", + "p-event": "^6.0.1", + "p-timeout": "^6.1.2", + "protobufjs": "^7.2.3", + "protomux": "^3.4.1", + "quickbit-universal": "^2.2.0", + "sodium-universal": "^4.0.0", + "start-stop-state-machine": "^1.2.0", + "streamx": "^2.19.0", + "sub-encoder": "^2.1.1", + "throttle-debounce": "^5.0.0", + "tiny-typed-emitter": "^2.1.0", + "type-fest": "^4.5.0", + "undici": "^6.13.0", + "varint": "^6.0.0", + "yauzl-promise": "^4.0.0" + } + }, + "node_modules/@comapeo/core/node_modules/@digidem/types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@digidem/types/-/types-2.3.0.tgz", + "integrity": "sha512-05dj9Z/xEmKQ5s9bl5doBHmmefgYoOQPn2BNu4eAbf6qgm6kylT1N94Ynr1zpdww+sB4sT9vjzAbc3BXtxQAKw==", + "license": "ISC", + "dependencies": { + "@types/node": "^18.16.19", + "@types/streamx": "^2.9.1", + "tiny-typed-emitter": "^2.1.0" + } + }, + "node_modules/@comapeo/core/node_modules/@types/node": { + "version": "18.19.50", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.50.tgz", + "integrity": "sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@comapeo/core/node_modules/p-timeout": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", + "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@comapeo/core/node_modules/type-fest": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@comapeo/core/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/@comapeo/core/node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "license": "MIT" + }, + "node_modules/@comapeo/ipc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@comapeo/ipc/-/ipc-1.0.1.tgz", + "integrity": "sha512-z0G6fFNUVb4VWg4X6NMvLk3kQp4M11Mb0UqOq5+o3Vtd55xb/cx/yROUajgt4vFee0ubaPfuy+zBHosY1Cn0rA==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-defer": "^4.0.0", + "rpc-reflector": "^1.3.11" + }, + "engines": { + "node": ">=18.17.1" + }, + "peerDependencies": { + "@comapeo/core": "1.0.1" + } + }, + "node_modules/@comapeo/schema": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@comapeo/schema/-/schema-1.0.0.tgz", + "integrity": "sha512-dK227I+0yg9D2y5/O5NGywx50tgeNYyUkl1uYnSmNAPlbv+r2KX9aaC9m4dEjIja2aR2VFnYn6z537ERZiahqQ==", + "license": "MIT", + "dependencies": { + "compact-encoding": "^2.12.0", + "protobufjs": "^7.2.5", + "type-fest": "^4.26.0" + } + }, + "node_modules/@comapeo/schema/node_modules/type-fest": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@digidem/types": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@digidem/types/-/types-2.1.0.tgz", @@ -73,10 +225,12 @@ "dev": true }, "node_modules/@electron/asar": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.9.tgz", - "integrity": "sha512-Vu2P3X2gcZ3MY9W7yH72X9+AMXwUQZEJBrsPIbX0JsdllLtoh62/Q8Wg370/DawIEVKOyfD6KtTLo645ezqxUA==", + "version": "3.2.13", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.13.tgz", + "integrity": "sha512-pY5z2qQSwbFzJsBdgfJIzXf5ElHTVMutC2dxh0FD60njknMu3n1NnTABOcQwbb5/v5soqE79m9UjaJryBf3epg==", + "license": "MIT", "dependencies": { + "@types/glob": "^7.1.0", "commander": "^5.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4" @@ -92,6 +246,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -101,6 +256,8 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -120,6 +277,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -128,18 +286,31 @@ } }, "node_modules/@emnapi/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.1.0.tgz", - "integrity": "sha512-gNEVZo0HhUfVjhr6rFG//HZXbauclxueiDxaKGBZHcK5h8i9pslABNPfG8kMwYTubAn3mV7AyOZN8gfPRgbU8A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.2.0.tgz", + "integrity": "sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==", + "license": "MIT", "optional": true, "dependencies": { + "@emnapi/wasi-threads": "1.0.1", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.1.0.tgz", - "integrity": "sha512-gCGlE0fJGWalfy+wbFApjhKn6uoSVvopru77IPyxNKkjkaiSx2HxDS7eOYSmo9dcMIhmmIvoxiC3N9TM1c3EaA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", + "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", + "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -278,42 +449,57 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-1.1.0.tgz", "integrity": "sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==", + "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/@fastify/ajv-compiler": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.5.0.tgz", - "integrity": "sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.6.0.tgz", + "integrity": "sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==", + "license": "MIT", "dependencies": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", "fast-uri": "^2.0.0" } }, - "node_modules/@fastify/deepmerge": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@fastify/deepmerge/-/deepmerge-1.3.0.tgz", - "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" + "node_modules/@fastify/ajv-compiler/node_modules/fast-uri": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", + "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==", + "license": "MIT" }, "node_modules/@fastify/error": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", - "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==" + "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==", + "license": "MIT" }, "node_modules/@fastify/fast-json-stringify-compiler": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "license": "MIT", "dependencies": { "fast-json-stringify": "^5.7.0" } }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, "node_modules/@fastify/send": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@fastify/send/-/send-2.1.0.tgz", "integrity": "sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==", + "license": "MIT", "dependencies": { "@lukeed/ms": "^2.0.1", "escape-html": "~1.0.3", @@ -326,6 +512,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -337,6 +524,7 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/@fastify/static/-/static-7.0.4.tgz", "integrity": "sha512-p2uKtaf8BMOZWLs6wu+Ihg7bWNBdjNgCwDza4MJtTqg+5ovKmcbgbR9Xs5/smZ1YISfzKOCNYmZV8LaCj+eJ1Q==", + "license": "MIT", "dependencies": { "@fastify/accept-negotiator": "^1.0.0", "@fastify/send": "^2.0.0", @@ -347,30 +535,30 @@ } }, "node_modules/@fastify/static/node_modules/glob": { - "version": "10.3.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", - "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.11.0" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@fastify/static/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -382,11 +570,12 @@ } }, "node_modules/@fastify/type-provider-typebox": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@fastify/type-provider-typebox/-/type-provider-typebox-4.0.0.tgz", - "integrity": "sha512-kTlN0saC/+xhcQPyBjb3YONQAMjiD/EHlCRjQjsr5E3NFjS5K8ZX5LGzXYDRjSa+sV4y8gTL5Q7FlObePv4iTA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@fastify/type-provider-typebox/-/type-provider-typebox-4.1.0.tgz", + "integrity": "sha512-mXNBaBEoS6Yf4/O2ujNhu9yEZwvBC7niqRESsiftE9NP1hV6ZdV3ZsFbPf1S520BK3rTZ0F28zr+sMdIXNJlfw==", + "license": "MIT", "peerDependencies": { - "@sinclair/typebox": ">=0.26 <=0.32" + "@sinclair/typebox": ">=0.26 <=0.33" } }, "node_modules/@humanwhocodes/config-array": { @@ -445,9 +634,10 @@ "dev": true }, "node_modules/@hyperswarm/secret-stream": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@hyperswarm/secret-stream/-/secret-stream-6.2.0.tgz", - "integrity": "sha512-eBoHJaw8KUNR1Zj8HzrlvZ+/RzSFXkZFBBovzgkso93D3DEVHrfP4ddhwbq7HQI8l5YnRYm4Obj+IsdX1PiT5w==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@hyperswarm/secret-stream/-/secret-stream-6.6.3.tgz", + "integrity": "sha512-F/EF5KLUqjkTNFof1K5dz57CwrwjSzG0XxZe2X9t/2/mG5iQ28yJIwNcVabkWS1Wk2ZB719piVGKk6YbwkJ0aQ==", + "license": "Apache-2.0", "dependencies": { "b4a": "^1.1.0", "hypercore-crypto": "^3.3.1", @@ -463,6 +653,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -481,344 +672,52 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, - "node_modules/@json-schema-spec/json-pointer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@json-schema-spec/json-pointer/-/json-pointer-0.1.2.tgz", - "integrity": "sha512-BYY7IavBjwsWWSmVcMz2A9mKiDD9RvacnsItgmy1xV8cmgbtxFfKmKMtkVpD7pYtkx4mIW4800yZBXueVFIWPw==" - }, - "node_modules/@json-schema-tools/dereferencer": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@json-schema-tools/dereferencer/-/dereferencer-1.6.3.tgz", - "integrity": "sha512-NoQkj6hx9Joqbd/GZAOHSGtE6R+OzlnOcDfyidmx8e/CUv1Q+Z6/fmZo2wwCQWiwP1pnGYc95iKwp8M7XlV7wQ==", - "dependencies": { - "@json-schema-tools/reference-resolver": "^1.2.6", - "@json-schema-tools/traverse": "^1.10.4", - "fast-safe-stringify": "^2.1.1" - } - }, - "node_modules/@json-schema-tools/reference-resolver": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@json-schema-tools/reference-resolver/-/reference-resolver-1.2.6.tgz", - "integrity": "sha512-4QZu5ROb5EpLSvV+buzk8WR30W+dffSNaKqD3VGFYJ3y0BLDi2OHoSz5e6NKcLYTyUYXV8IKxocNOszeVBJI4Q==", - "dependencies": { - "@json-schema-spec/json-pointer": "^0.1.2", - "isomorphic-fetch": "^3.0.0" - } - }, - "node_modules/@json-schema-tools/traverse": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@json-schema-tools/traverse/-/traverse-1.10.4.tgz", - "integrity": "sha512-9e42zjhLIxzBONroNC4SGsTqdB877tzwH2S6lqgTav9K24kWJR9vNieeMVSuyqnY8FlclH21D8wsm/tuD9WA9Q==" - }, "node_modules/@lukeed/ms": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz", "integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@mapeo/core": { - "version": "9.0.0-alpha.16", - "resolved": "https://registry.npmjs.org/@mapeo/core/-/core-9.0.0-alpha.16.tgz", - "integrity": "sha512-DYHsa5BhCFsZvbgq3zCqUiWDmRsdTpKLYKz/5gkwCj2Qaj0aLrng7iNCm5ULtsUa01FY+VI1Z68N/pGhVrP1dw==", - "hasInstallScript": true, - "license": "MIT", + "node_modules/@mapeo/crypto": { + "version": "1.0.0-alpha.10", + "resolved": "https://registry.npmjs.org/@mapeo/crypto/-/crypto-1.0.0-alpha.10.tgz", + "integrity": "sha512-TEK8HN1W0XZOOADIMxa4saXtqAZKyBDeVVn3RBCcPaCiOGHeYy43/0rMnBVTbXZCLsLVPnOXwv6vg+vUkasrWQ==", + "license": "ISC", "dependencies": { - "@digidem/types": "^2.3.0", - "@electron/asar": "^3.2.8", - "@fastify/error": "^3.4.1", - "@fastify/static": "^7.0.3", - "@fastify/type-provider-typebox": "^4.0.0", - "@hyperswarm/secret-stream": "^6.1.2", - "@mapeo/crypto": "1.0.0-alpha.10", - "@mapeo/schema": "^3.0.0-next.19", - "@mapeo/sqlite-indexer": "1.0.0-alpha.9", - "@sinclair/typebox": "^0.29.6", - "b4a": "^1.6.3", - "bcp-47": "^2.1.0", - "better-sqlite3": "^8.7.0", - "big-sparse-array": "^1.0.3", - "bogon": "^1.1.0", - "compact-encoding": "^2.12.0", - "corestore": "^6.8.4", - "debug": "^4.3.4", - "dot-prop": "^9.0.0", - "drizzle-orm": "^0.30.8", - "fastify": ">= 4", - "fastify-plugin": "^4.5.1", - "hyperblobs": "2.3.0", - "hypercore": "10.17.0", - "hypercore-crypto": "3.4.0", - "hyperdrive": "11.5.3", - "hyperswarm": "4.4.1", - "json-stable-stringify": "^1.1.1", - "magic-bytes.js": "^1.10.0", - "map-obj": "^5.0.2", - "mime": "^4.0.3", - "multi-core-indexer": "^1.0.0-alpha.10", - "p-defer": "^4.0.0", - "p-event": "^6.0.1", - "p-timeout": "^6.1.2", - "patch-package": "^8.0.0", - "protobufjs": "^7.2.3", - "protomux": "^3.4.1", - "quickbit-universal": "^2.2.0", + "@types/b4a": "^1.6.0", + "b4a": "^1.6.4", + "base-x": "^3.0.9", + "base32.js": "^0.1.0", + "compact-encoding": "^2.5.1", + "compact-encoding-net": "^1.0.1", + "compact-encoding-struct": "^1.2.0", + "crc": "^3.8.0", + "lodash": "^4.17.21", "sodium-universal": "^4.0.0", - "start-stop-state-machine": "^1.2.0", - "sub-encoder": "^2.1.1", - "throttle-debounce": "^5.0.0", - "tiny-typed-emitter": "^2.1.0", - "type-fest": "^4.5.0", - "undici": "^6.13.0", - "varint": "^6.0.0", - "yauzl-promise": "^4.0.0" + "z32": "^1.0.0" } }, - "node_modules/@mapeo/core/node_modules/@digidem/types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@digidem/types/-/types-2.3.0.tgz", - "integrity": "sha512-05dj9Z/xEmKQ5s9bl5doBHmmefgYoOQPn2BNu4eAbf6qgm6kylT1N94Ynr1zpdww+sB4sT9vjzAbc3BXtxQAKw==", - "dependencies": { - "@types/node": "^18.16.19", - "@types/streamx": "^2.9.1", - "tiny-typed-emitter": "^2.1.0" - } + "node_modules/@mapeo/default-config": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@mapeo/default-config/-/default-config-5.0.0.tgz", + "integrity": "sha512-SNUUxN0UI0i/g5XshUKuLY1O3SWClzwgM3qiiBDW3Dw+AcHK+jdONFK6KjvwYK13cwdQadTzIJbEKWmLP+0UWA==", + "license": "CC-BY-NC-4.0" }, - "node_modules/@mapeo/core/node_modules/@types/node": { - "version": "18.19.33", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz", - "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==", + "node_modules/@mapeo/sqlite-indexer": { + "version": "1.0.0-alpha.9", + "resolved": "https://registry.npmjs.org/@mapeo/sqlite-indexer/-/sqlite-indexer-1.0.0-alpha.9.tgz", + "integrity": "sha512-TxuqTVmHjt3FHzQYos9dLakSi0Ibbn8I1frNgUwIo9fMAiuVVrsHIiibULZjnwqMMkkqGmvonVMCKZQOsdu32g==", + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@mapeo/core/node_modules/hypercore": { - "version": "10.17.0", - "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-10.17.0.tgz", - "integrity": "sha512-Yp9lyfUjp81Gy1nPHemNFtYQtngliCGZ6prH+qxvjr2FPVG1QFtNqtOh+ZxFu4hXZ1dAOLYkQOA7Qq2vjFe64A==", - "dependencies": { - "@hyperswarm/secret-stream": "^6.0.0", - "b4a": "^1.1.0", - "big-sparse-array": "^1.0.3", - "compact-encoding": "^2.11.0", - "crc-universal": "^1.0.2", - "events": "^3.3.0", - "flat-tree": "^1.9.0", - "hypercore-crypto": "^3.2.1", - "is-options": "^1.0.1", - "protomux": "^3.4.0", - "quickbit-universal": "^2.1.1", - "random-access-file": "^4.0.0", - "random-array-iterator": "^1.0.0", - "safety-catch": "^1.0.1", - "sodium-universal": "^4.0.0", - "streamx": "^2.12.4", - "xache": "^1.1.0", - "z32": "^1.0.0" - } - }, - "node_modules/@mapeo/core/node_modules/p-timeout": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", - "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mapeo/core/node_modules/type-fest": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.1.tgz", - "integrity": "sha512-ShaaYnjf+0etG8W/FumARKMjjIToy/haCaTjN2dvcewOSoNqCQzdgG7m2JVOlM5qndGTHjkvsrWZs+k/2Z7E0Q==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mapeo/core/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/@mapeo/core/node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" - }, - "node_modules/@mapeo/crypto": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@mapeo/crypto/-/crypto-1.0.0-alpha.10.tgz", - "integrity": "sha512-TEK8HN1W0XZOOADIMxa4saXtqAZKyBDeVVn3RBCcPaCiOGHeYy43/0rMnBVTbXZCLsLVPnOXwv6vg+vUkasrWQ==", - "dependencies": { - "@types/b4a": "^1.6.0", - "b4a": "^1.6.4", - "base-x": "^3.0.9", - "base32.js": "^0.1.0", - "compact-encoding": "^2.5.1", - "compact-encoding-net": "^1.0.1", - "compact-encoding-struct": "^1.2.0", - "crc": "^3.8.0", - "lodash": "^4.17.21", - "sodium-universal": "^4.0.0", - "z32": "^1.0.0" - } - }, - "node_modules/@mapeo/default-config": { - "version": "4.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@mapeo/default-config/-/default-config-4.0.0-alpha.6.tgz", - "integrity": "sha512-FSpeqM7KE3zc+jbPy7vwl4T9TznbDxE7CYJQ2bIKtrs+DSmyOlyEyJ6ZeBKTEyOf0ZJC7xFLU3VtXfWFwxeoqQ==" - }, - "node_modules/@mapeo/ipc": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@mapeo/ipc/-/ipc-0.11.0.tgz", - "integrity": "sha512-KxLb/sfEVpwf6z4n7CAJBmd7nVgS5FwxZ/Eb1UdJE3xeeUOF0GNGFxFHOF/0jN9+rhexJ/H8hrwHtNjY1/bbFw==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-defer": "^4.0.0", - "rpc-reflector": "^1.3.11" - }, - "engines": { - "node": ">=18.17.1" - }, - "peerDependencies": { - "@mapeo/core": "9.0.0-alpha.16" - } - }, - "node_modules/@mapeo/schema": { - "version": "3.0.0-next.19", - "resolved": "https://registry.npmjs.org/@mapeo/schema/-/schema-3.0.0-next.19.tgz", - "integrity": "sha512-lG98YaaX/Ww07tTzbhfvBDZpk5DY0HnPAo8fSYrIKu5Kw9Xo559NT+vmmQbZhINZoRCJATFXxnNMW3TvQE4qCw==", - "dependencies": { - "@json-schema-tools/dereferencer": "^1.6.1", - "ajv": "^8.12.0", - "ajv-formats": "^2.1.1", - "compact-encoding": "^2.12.0", - "glob": "^10.3.3", - "protobufjs": "^7.2.5", - "type-fest": "^4.1.0", - "typedoc": "^0.24.8", - "typedoc-plugin-markdown": "^3.15.4" - } - }, - "node_modules/@mapeo/schema/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@mapeo/schema/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/@mapeo/schema/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@mapeo/schema/node_modules/type-fest": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.24.0.tgz", - "integrity": "sha512-spAaHzc6qre0TlZQQ2aA/nGMe+2Z/wyGk5Z+Ru2VUfdNwT6kWO6TjevOlpebsATEG1EIQ2sOiDszud3lO5mt/Q==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mapeo/schema/node_modules/typedoc": { - "version": "0.24.8", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz", - "integrity": "sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w==", - "dependencies": { - "lunr": "^2.3.9", - "marked": "^4.3.0", - "minimatch": "^9.0.0", - "shiki": "^0.14.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 14.14" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x" - } - }, - "node_modules/@mapeo/schema/node_modules/typedoc-plugin-markdown": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.17.1.tgz", - "integrity": "sha512-QzdU3fj0Kzw2XSdoL15ExLASt2WPqD7FbLeaqwT70+XjKyTshBnUlQA5nNREO1C2P8Uen0CDjsBLMsCQ+zd0lw==", - "dependencies": { - "handlebars": "^4.7.7" - }, - "peerDependencies": { - "typedoc": ">=0.24.0" - } - }, - "node_modules/@mapeo/schema/node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@mapeo/sqlite-indexer": { - "version": "1.0.0-alpha.9", - "resolved": "https://registry.npmjs.org/@mapeo/sqlite-indexer/-/sqlite-indexer-1.0.0-alpha.9.tgz", - "integrity": "sha512-TxuqTVmHjt3FHzQYos9dLakSi0Ibbn8I1frNgUwIo9fMAiuVVrsHIiibULZjnwqMMkkqGmvonVMCKZQOsdu32g==", - "dependencies": { - "@types/better-sqlite3": "^7.6.4", - "better-sqlite3": "^8.4.0" - }, - "engines": { - "node": ">=18.17.1", - "npm": ">=9.6.7" + "@types/better-sqlite3": "^7.6.4", + "better-sqlite3": "^8.4.0" + }, + "engines": { + "node": ">=18.17.1", + "npm": ">=9.6.7" } }, "node_modules/@msgpack/msgpack": { @@ -830,20 +729,22 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.1.2.tgz", - "integrity": "sha512-8JuczewTFIZ/XIjHQ+YlQUydHvlKx2hkcxtuGwh+t/t5zWyZct6YG4+xjHcq8xyc/e7FmFwf42Zj2YgICwmlvA==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", + "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", + "license": "MIT", "optional": true, "dependencies": { "@emnapi/core": "^1.1.0", "@emnapi/runtime": "^1.1.0", - "@tybys/wasm-util": "^0.8.1" + "@tybys/wasm-util": "^0.9.0" } }, "node_modules/@node-rs/crc32": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32/-/crc32-1.10.0.tgz", - "integrity": "sha512-SFvU8PGZexRMRPUhi+4a9LW4oqFuK5CLEElysrKoRtNkJ+LcRFL+b3wfuzbcDq/ea0rS0nzRLFZwVsNVyWaGew==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32/-/crc32-1.10.3.tgz", + "integrity": "sha512-4UgH0fDRxs0eMSgrUN0UUM4BpIEbVKutiSkFLICwegbgIger3c1t7V3jOYralK0xTBHraW3r59wlESdc3h/nQg==", + "license": "MIT", "engines": { "node": ">= 10" }, @@ -852,29 +753,30 @@ "url": "https://github.com/sponsors/Brooooooklyn" }, "optionalDependencies": { - "@node-rs/crc32-android-arm-eabi": "1.10.0", - "@node-rs/crc32-android-arm64": "1.10.0", - "@node-rs/crc32-darwin-arm64": "1.10.0", - "@node-rs/crc32-darwin-x64": "1.10.0", - "@node-rs/crc32-freebsd-x64": "1.10.0", - "@node-rs/crc32-linux-arm-gnueabihf": "1.10.0", - "@node-rs/crc32-linux-arm64-gnu": "1.10.0", - "@node-rs/crc32-linux-arm64-musl": "1.10.0", - "@node-rs/crc32-linux-x64-gnu": "1.10.0", - "@node-rs/crc32-linux-x64-musl": "1.10.0", - "@node-rs/crc32-wasm32-wasi": "1.10.0", - "@node-rs/crc32-win32-arm64-msvc": "1.10.0", - "@node-rs/crc32-win32-ia32-msvc": "1.10.0", - "@node-rs/crc32-win32-x64-msvc": "1.10.0" + "@node-rs/crc32-android-arm-eabi": "1.10.3", + "@node-rs/crc32-android-arm64": "1.10.3", + "@node-rs/crc32-darwin-arm64": "1.10.3", + "@node-rs/crc32-darwin-x64": "1.10.3", + "@node-rs/crc32-freebsd-x64": "1.10.3", + "@node-rs/crc32-linux-arm-gnueabihf": "1.10.3", + "@node-rs/crc32-linux-arm64-gnu": "1.10.3", + "@node-rs/crc32-linux-arm64-musl": "1.10.3", + "@node-rs/crc32-linux-x64-gnu": "1.10.3", + "@node-rs/crc32-linux-x64-musl": "1.10.3", + "@node-rs/crc32-wasm32-wasi": "1.10.3", + "@node-rs/crc32-win32-arm64-msvc": "1.10.3", + "@node-rs/crc32-win32-ia32-msvc": "1.10.3", + "@node-rs/crc32-win32-x64-msvc": "1.10.3" } }, "node_modules/@node-rs/crc32-android-arm-eabi": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-android-arm-eabi/-/crc32-android-arm-eabi-1.10.0.tgz", - "integrity": "sha512-IRas7ylc8nB3988nnaT4PC5ZuaK3VOrLbTyg1Y/5ZHlxsYpqLpCb7VMf/oRrHxkSzSTlluD+inv3J8UE3i5Ojg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-android-arm-eabi/-/crc32-android-arm-eabi-1.10.3.tgz", + "integrity": "sha512-V9iNJd5ux9I415qOldmxZIHrazYMJNsQ6v+Kq/t9FTQyYqiEeHvRc1FzBh9MT6Uc24InwMhBeC1WVw0BL4VaxQ==", "cpu": [ "arm" ], + "license": "MIT", "optional": true, "os": [ "android" @@ -884,12 +786,13 @@ } }, "node_modules/@node-rs/crc32-android-arm64": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-android-arm64/-/crc32-android-arm64-1.10.0.tgz", - "integrity": "sha512-4vX1gB+rf3sYma/LLycmYsuFKolWdZX7tQOwLQ6PDwE7dAoN3mWAgS3RBw2G6PerGD9r90vSXWXPLJnF3OAhlw==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-android-arm64/-/crc32-android-arm64-1.10.3.tgz", + "integrity": "sha512-d6xLAhbk5FDGpltAKTFs7hZO/PWpHeihZ/ZCKx2LEVz8jXQEshpo2/ojnfb5FAw6oNzU2H+S/RI5GeCr7paa1Q==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "android" @@ -899,12 +802,13 @@ } }, "node_modules/@node-rs/crc32-darwin-arm64": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-darwin-arm64/-/crc32-darwin-arm64-1.10.0.tgz", - "integrity": "sha512-nAAdxZqxFBxqhI3ZMEGi7QDwg44N4laYO4iGIGhjLvsUDqJlYeIlqZ39Lh2gOK3D2uF/TaT4b0bU5EPHWnKMOQ==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-darwin-arm64/-/crc32-darwin-arm64-1.10.3.tgz", + "integrity": "sha512-IoX6HC4dlKc9BONe7632DADBtiHUiIVD7Bibuj3bGrvOBllN8hvBL9+dDC+/iDdOeuiBKgb0hgL5h2nPIybpzA==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -914,12 +818,13 @@ } }, "node_modules/@node-rs/crc32-darwin-x64": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-darwin-x64/-/crc32-darwin-x64-1.10.0.tgz", - "integrity": "sha512-0YhLJFDY7VAKlJ4+SdfZFY+u0X18tkuD3NCtPp1SYh1o9pWpFVBbTKWvdjjx/Ihqw0ozkfc3iewFJU7vlrDQJg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-darwin-x64/-/crc32-darwin-x64-1.10.3.tgz", + "integrity": "sha512-JUDGAX/0W4A9ok9p6yuy4fAsBDrq8Db0sUjKLMZ/+P3NHB+Qk+OsZUsEDxP3yhBJxhPq97JpN4bBzgMnkDajpw==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -929,12 +834,13 @@ } }, "node_modules/@node-rs/crc32-freebsd-x64": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-freebsd-x64/-/crc32-freebsd-x64-1.10.0.tgz", - "integrity": "sha512-BE0IeHn59GzaebTM85Dpe+ErPV8E+WuXd/sNyLLS8jZUuNoOJwFUKotm8CUFG+MI40N0U9PzvZjQSwaeMsyMsQ==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-freebsd-x64/-/crc32-freebsd-x64-1.10.3.tgz", + "integrity": "sha512-mbpVcrF9cRJm9ksv2vVaWc/yRsLJErdb90Kusc6I8CgsBxpS6/wI637i0khSl1l10iWrALXjfh6osihixANYhQ==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -944,12 +850,13 @@ } }, "node_modules/@node-rs/crc32-linux-arm-gnueabihf": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm-gnueabihf/-/crc32-linux-arm-gnueabihf-1.10.0.tgz", - "integrity": "sha512-R3mN3uSZaslJtXW3NXdropB9tHCnOgbrvq7MtmCRpHi2Ie3E46Ohi8cW0HgHjihptafTf8NWsoYzErm39BTY0Q==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm-gnueabihf/-/crc32-linux-arm-gnueabihf-1.10.3.tgz", + "integrity": "sha512-9MZohdtKzdnb16xRKU76t1UTEJu80dFO8f2/N0geJYNobnT1E6p/+5pqB/G1/H6OnPvjqMuFuLVL4BJVvO4GYQ==", "cpu": [ "arm" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -959,12 +866,13 @@ } }, "node_modules/@node-rs/crc32-linux-arm64-gnu": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm64-gnu/-/crc32-linux-arm64-gnu-1.10.0.tgz", - "integrity": "sha512-2zZ2RQLVhjCWRWiLvz/CoP5BFld/zE/uD2Z9Nk+Y5zmJ11CD1RC3lqKG1M3MgEiQq9CnWJxwyy5kM2q4jDeXkg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm64-gnu/-/crc32-linux-arm64-gnu-1.10.3.tgz", + "integrity": "sha512-t1+9ik4awZF+luQp94HsUH8M1lSw8jWjvQiLaHyxMzrM0NY0/oIkhjqdOswXL11Wybkc63eunNwVqGKWfJEi4Q==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -974,12 +882,13 @@ } }, "node_modules/@node-rs/crc32-linux-arm64-musl": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm64-musl/-/crc32-linux-arm64-musl-1.10.0.tgz", - "integrity": "sha512-WEIavGFHMAFe8NIKhbYnM6k2x7y6M/NQewXE8cqeV03Q8mLzCDBr34i/MzpW+M42NvEYgcM8c3Ayn2FijHb64Q==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm64-musl/-/crc32-linux-arm64-musl-1.10.3.tgz", + "integrity": "sha512-fsxOk9CpFzyon+vktvCICwhGk0b+tnfEZfPOXa3QDrkyZD7R7cHmpEHGim1BYgJZIJSTBfal5eM11hzBGjJbxw==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -989,12 +898,13 @@ } }, "node_modules/@node-rs/crc32-linux-x64-gnu": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-x64-gnu/-/crc32-linux-x64-gnu-1.10.0.tgz", - "integrity": "sha512-K/7aY/h8QngsLk0KsalQ3AlZ8ljXRisZgc20RcbB4UZkjl5AN6TeHQlVbx9U2MSBE5f6ViiZEr8c8CcID3W2Mg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-x64-gnu/-/crc32-linux-x64-gnu-1.10.3.tgz", + "integrity": "sha512-0zIX68FIeqpRMRNvmB5AgONnLMm628+8mV9UDuCRmGppME8WGnY+Dirx+TPUeTJ4f27+in+6CU4u6LJDi9cXmQ==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1004,12 +914,13 @@ } }, "node_modules/@node-rs/crc32-linux-x64-musl": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-x64-musl/-/crc32-linux-x64-musl-1.10.0.tgz", - "integrity": "sha512-GyCSm+Dp96qUvqrsxKgfd3TFrE8v5sRUYiMgNKK6G1m7nQb/VXvab9UoBSKeFw131odt3LlIuBAuhMnbb4za5w==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-x64-musl/-/crc32-linux-x64-musl-1.10.3.tgz", + "integrity": "sha512-dKKt0FEm8JDp2MvIu1J7vg8Dc5D5upNO6LAuvfShq9Hy8hYNQWy6f+AF8mSm/c5wWnjn+pv7I1+jvrZIe6wMig==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -1019,27 +930,29 @@ } }, "node_modules/@node-rs/crc32-wasm32-wasi": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-wasm32-wasi/-/crc32-wasm32-wasi-1.10.0.tgz", - "integrity": "sha512-C+2IK5HwNUz2aiMGiN0RTijb80X5V1jo/o8bsHqi8ukoRyO6HLMhVn+xptqY+RRSf4VUzzNR5eHqD+WLcLId0g==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-wasm32-wasi/-/crc32-wasm32-wasi-1.10.3.tgz", + "integrity": "sha512-oT2V4r0lGZqZHkFLHeXu5Z8C8SutIvBVV0Ws3unz4/KhwmlMcOZYRmSelUSSILbjNLrg4FihCe20tC1VbmaNxA==", "cpu": [ "wasm32" ], + "license": "MIT", "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^0.1.1" + "@napi-rs/wasm-runtime": "^0.2.3" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@node-rs/crc32-win32-arm64-msvc": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-arm64-msvc/-/crc32-win32-arm64-msvc-1.10.0.tgz", - "integrity": "sha512-RaVo4edbEM3DyQkvXGKdPizUmr2A4NjLMk/1x9b/tz/k2rdd+QaPAauDwWAzs7SKoDBV9H4qc3hNFuKGjjRhjA==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-arm64-msvc/-/crc32-win32-arm64-msvc-1.10.3.tgz", + "integrity": "sha512-IwP/TjDoQycv3ZCbAHV3qS9oH8pmBo7h9RC0chOvKY0g9+RxRl0nXhxcAcmZvJugKdJd+eCOR9fJrWzcwQOgFg==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -1049,12 +962,13 @@ } }, "node_modules/@node-rs/crc32-win32-ia32-msvc": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-ia32-msvc/-/crc32-win32-ia32-msvc-1.10.0.tgz", - "integrity": "sha512-5KqJFdzRXELpXcdNgahafjkc9MxZJfKDVkFPBMkQIjjkv8PQ49DVw15/7yuhAN0pyYccNaUil4vtVoo7WTIVgQ==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-ia32-msvc/-/crc32-win32-ia32-msvc-1.10.3.tgz", + "integrity": "sha512-YK0qYTHUFqriqAkHyXfe3IpDFfpG5fc2yuNl7MXn4ejklLLyNQPOCSawvPU7ouOBgtQDaAH60yZhFhsXZfwSfQ==", "cpu": [ "ia32" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -1064,12 +978,13 @@ } }, "node_modules/@node-rs/crc32-win32-x64-msvc": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-x64-msvc/-/crc32-win32-x64-msvc-1.10.0.tgz", - "integrity": "sha512-6b99QpwNCQube1xleD+9IcF6foEWHYQYjuZrHAR5diuP/uqM7i+KCgMU9fbCFLs5zmssYHO3CQSZ8G+V0eC59g==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-x64-msvc/-/crc32-win32-x64-msvc-1.10.3.tgz", + "integrity": "sha512-VI9jd8ECiij4YADsfzVuDnhk/UZ5op4RYHyN40yZzwhzcOQ8DDluOeHv91FPHSyMYJEsVsqbr3cqtD6R47xYjw==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -1117,6 +1032,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -1125,27 +1041,32 @@ "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -1154,27 +1075,32 @@ "node_modules/@protobufjs/float": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" }, "node_modules/@rollup/plugin-alias": { "version": "5.1.0", @@ -1311,7 +1237,8 @@ "node_modules/@sinclair/typebox": { "version": "0.29.6", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.29.6.tgz", - "integrity": "sha512-aX5IFYWlMa7tQ8xZr3b2gtVReCvg7f3LEhjir/JAjX2bJCMVJA5tIPv30wTD4KDfcwMd7DDYY3hFDeGmOgtrZQ==" + "integrity": "sha512-aX5IFYWlMa7tQ8xZr3b2gtVReCvg7f3LEhjir/JAjX2bJCMVJA5tIPv30wTD4KDfcwMd7DDYY3hFDeGmOgtrZQ==", + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "16.1.1", @@ -1320,26 +1247,29 @@ "dev": true }, "node_modules/@tybys/wasm-util": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.8.1.tgz", - "integrity": "sha512-GSsTwyBl4pIzsxAY5wroZdyQKyhXk0d8PCRZtrSZ2WEB1cBdrp2EgGBwHOGCZtIIPun/DL3+AykCv+J6fyRH4Q==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@types/b4a": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@types/b4a/-/b4a-1.6.3.tgz", - "integrity": "sha512-zdzwrNkqvFdqbhbmyl5akTma8GI5ctg1QJBkWXQxgPM5vK4/9JX/xMImb0diAkVFuw6SGckTf8JiNxZlSwA3ag==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@types/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-Cc8vY7BHSjttPbLCQ4+C+v8EfWlki2yxwCJV8sbsMChzcj46CXKx4iP71HbWxyHiSSyC+t3hbTtFnWVpNwDs1w==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/better-sqlite3": { - "version": "7.6.5", - "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.5.tgz", - "integrity": "sha512-H3ZUx89KiPhYa9nalUXVVStSUFHuzYxt4yoazufpTTYW9rVUCzhh02V8CH2C8nE4libnK0UgFq5DFIe0DOhqow==", + "version": "7.6.11", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.11.tgz", + "integrity": "sha512-i8KcD3PgGtGBLl3+mMYA8PdKkButvPyARxA7IQAd6qeslht13qxb1zzO8dRCtE7U3IoJS782zDBAeoKiM695kg==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -1359,6 +1289,22 @@ "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", "dev": true }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "license": "MIT", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "license": "MIT" + }, "node_modules/@types/ms": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", @@ -1390,12 +1336,14 @@ "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" }, @@ -1406,7 +1354,8 @@ "node_modules/abstract-logging": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "license": "MIT" }, "node_modules/acorn": { "version": "8.10.0", @@ -1430,14 +1379,15 @@ } }, "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -1448,6 +1398,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -1461,9 +1412,10 @@ } }, "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -1471,11 +1423,6 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", - "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==" - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1490,11 +1437,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1505,6 +1447,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, "engines": { "node": ">= 4.0.0" } @@ -1513,47 +1456,117 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/avvio": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.2.1.tgz", - "integrity": "sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.4.0.tgz", + "integrity": "sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==", + "license": "MIT", "dependencies": { - "archy": "^1.0.0", - "debug": "^4.0.0", - "fastq": "^1.6.1" + "@fastify/error": "^3.3.0", + "fastq": "^1.17.1" } }, "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "license": "Apache-2.0" }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "node_modules/bare-addon-resolve": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/bare-addon-resolve/-/bare-addon-resolve-1.4.2.tgz", + "integrity": "sha512-tvUF2orgRAfazmCwZuOUtj5sudU1iowTtwlD63BGvxh50KrHugBMQAUaSk4KxjfEznT99PuJyJSpc4ObPTiS6g==", + "license": "Apache-2.0", + "optional": true, "dependencies": { - "safe-buffer": "^5.0.1" + "bare-module-resolve": "^1.5.0" } }, - "node_modules/base32.js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", - "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==", - "engines": { - "node": ">=0.12.0" + "node_modules/bare-events": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "license": "Apache-2.0" + }, + "node_modules/bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" } }, - "node_modules/base64-js": { + "node_modules/bare-module-resolve": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/bare-module-resolve/-/bare-module-resolve-1.6.1.tgz", + "integrity": "sha512-IM+aQ7c0HXpKbKTFLakMohyxfOxl+lj9w3mWkHAMMCmAf1SO8rNOX+chyERkefi5BN/Fr3l177CfS4c0wK6AxA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "semver": "^7.6.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.0.tgz", + "integrity": "sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "b4a": "^1.6.6", + "streamx": "^2.20.0" + } + }, + "node_modules/base-x": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base32.js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", + "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", @@ -1570,12 +1583,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/bcp-47": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "license": "MIT", "dependencies": { "is-alphabetical": "^2.0.0", "is-alphanumerical": "^2.0.0", @@ -1591,6 +1606,7 @@ "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-8.7.0.tgz", "integrity": "sha512-99jZU4le+f3G6aIl6PmmV0cxUIWqKieHxsiF7G34CVFiE+/UabpYqkU0NJIkY/96mQKikHeBjtR27vFfs5JpEw==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "bindings": "^1.5.0", "prebuild-install": "^7.1.1" @@ -1599,12 +1615,14 @@ "node_modules/big-sparse-array": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/big-sparse-array/-/big-sparse-array-1.0.3.tgz", - "integrity": "sha512-6RjV/3mSZORlMdpUaQ6rUSpG637cZm0//E54YYGtQg1c1O+AbZP8UTdJ/TchsDZcTVLmyWZcseBfp2HBeXUXOQ==" + "integrity": "sha512-6RjV/3mSZORlMdpUaQ6rUSpG637cZm0//E54YYGtQg1c1O+AbZP8UTdJ/TchsDZcTVLmyWZcseBfp2HBeXUXOQ==", + "license": "MIT" }, "node_modules/binary-stream-equals": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/binary-stream-equals/-/binary-stream-equals-1.0.0.tgz", "integrity": "sha512-xiUT5LGfD8JiLhbXiG+ByOnbgb9f2ssRLfZDQMl3nZdf89EotQZGZuMkDN8J3n46emabE7RnJ1q0r7Hv3INExw==", + "license": "MIT", "dependencies": { "b4a": "^1.3.1" } @@ -1613,64 +1631,27 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", "dependencies": { "file-uri-to-path": "1.0.0" } }, - "node_modules/bits-to-bytes": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bits-to-bytes/-/bits-to-bytes-1.3.0.tgz", - "integrity": "sha512-OJoHTpFXS9bXHBCekGTByf3MqM8CGblBDIduKQeeVVeiU9dDWywSSirXIBYGgg3d1zbVuvnMa1vD4r6PA0kOKg==", - "dependencies": { - "b4a": "^1.5.0" - } - }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, - "node_modules/blake2b": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", - "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", - "dependencies": { - "blake2b-wasm": "^2.4.0", - "nanoassert": "^2.0.0" - } - }, - "node_modules/blake2b-wasm": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", - "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", - "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "node_modules/blind-relay": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/blind-relay/-/blind-relay-1.3.1.tgz", - "integrity": "sha512-GNOCAQG76WvN8e1k4C8UyQgfpSl8h2NiUgr6aFQJY/WKISvsU1flG0o3TJoUGn5K9uvtbEUtdulgikS1aYKbAQ==", - "dependencies": { - "b4a": "^1.6.4", - "bits-to-bytes": "^1.3.0", - "compact-encoding": "^2.12.0", - "compact-encoding-bitfield": "^1.0.0", - "protomux": "^3.5.1", - "sodium-universal": "^4.0.0", - "streamx": "^2.15.1" - } - }, "node_modules/bogon": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/bogon/-/bogon-1.1.0.tgz", "integrity": "sha512-a6SnToksXHuUlgeMvI/txWmTcKz7c7iBa8f0HbXL4toN1Uza/CTQ4F7n9jSDX49TCpxv3KUP100q4sZfwLyLiw==", + "license": "MIT", "dependencies": { "compact-encoding": "^2.11.0", "compact-encoding-net": "^1.2.0" @@ -1688,6 +1669,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -1713,6 +1695,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -1757,18 +1740,11 @@ "node": ">=6" } }, - "node_modules/chacha20-universal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chacha20-universal/-/chacha20-universal-1.0.4.tgz", - "integrity": "sha512-/IOxdWWNa7nRabfe7+oF+jVkGjlr2xUL4J8l/OvzZhj+c9RpMqoo3Dq+5nU1j/BflRV4BKnaQ4+4oH1yBpQG1Q==", - "dependencies": { - "nanoassert": "^2.0.0" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1783,12 +1759,14 @@ "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, "funding": [ { "type": "github", @@ -1803,6 +1781,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/codecs/-/codecs-3.1.0.tgz", "integrity": "sha512-Dqx8NwvBvnMeuPQdVKy/XEF71igjR5apxBvCGeV0pP1tXadOiaLvDTXt7xh+/5wI1ASB195mXQGJbw3Ml4YDWQ==", + "license": "MIT", "dependencies": { "b4a": "^1.6.3" } @@ -1827,6 +1806,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", "engines": { "node": ">= 6" } @@ -1838,25 +1818,19 @@ "dev": true }, "node_modules/compact-encoding": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/compact-encoding/-/compact-encoding-2.12.0.tgz", - "integrity": "sha512-8eCZLmyBT4LtC90F/ekIqWos8Y7NaFxY75qa/SlSDVa95NVgMcibQb8z8MTeKb9zctemOJczSXMf5pwMqKjYEQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/compact-encoding/-/compact-encoding-2.15.0.tgz", + "integrity": "sha512-af/NomxL9Mo0lqCk++rxLLDZI+lJqeBrPt4dK6FbjxTCEhfC9yQAIoO6yq9ixyCirce0luQwErkwJrhem6clxA==", + "license": "Apache-2.0", "dependencies": { "b4a": "^1.3.0" } }, - "node_modules/compact-encoding-bitfield": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/compact-encoding-bitfield/-/compact-encoding-bitfield-1.0.0.tgz", - "integrity": "sha512-3nMVKUg+PF72UHfainmCL8uKvyWfxsjqOtUY+HiMPGLPCTjnwzoKfFAMo1Ad7nwTPdjBqtGK5b3BOFTFW4EBTg==", - "dependencies": { - "compact-encoding": "^2.4.1" - } - }, "node_modules/compact-encoding-net": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/compact-encoding-net/-/compact-encoding-net-1.2.0.tgz", "integrity": "sha512-LVXpNpF7PGQeHRVVLGgYWzuVoYAaDZvKUsUxRioGfkotzvOh4AzoQF1HBH3zMNaSnx7gJXuUr3hkjnijaH/Eng==", + "license": "ISC", "dependencies": { "compact-encoding": "^2.4.1" } @@ -1864,7 +1838,8 @@ "node_modules/compact-encoding-struct": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/compact-encoding-struct/-/compact-encoding-struct-1.3.0.tgz", - "integrity": "sha512-8wgarWCGjtTQlpLu7ebVeeW0hEterei/D8MoIASBiZIUKV2RtzEaViAK+EMemOOOaHQFbp6yRH/k4Q2I94Qpxg==" + "integrity": "sha512-8wgarWCGjtTQlpLu7ebVeeW0hEterei/D8MoIASBiZIUKV2RtzEaViAK+EMemOOOaHQFbp6yRH/k4Q2I94Qpxg==", + "license": "ISC" }, "node_modules/concat-map": { "version": "0.0.1", @@ -1880,6 +1855,7 @@ "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -1888,22 +1864,23 @@ } }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/corestore": { - "version": "6.15.9", - "resolved": "https://registry.npmjs.org/corestore/-/corestore-6.15.9.tgz", - "integrity": "sha512-GXGApW5zOUMFLLP02mQYgclWPvPWKj7dTCYI0rI00Ka1k+tdnmbWt4pybvIavwM1GOge8u2poaWPUkiSAZXQyw==", + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/corestore/-/corestore-6.8.4.tgz", + "integrity": "sha512-rJUn1bK2Id18mxZSb64fKGCSsbbBAvPUkSZVzsLB4Nnwhf3pkwxt/JjBvKHtsrvRyPAu9xtxUdUk1cSQ1JnOPw==", + "license": "MIT", "dependencies": { - "b4a": "^1.6.4", - "hypercore": "^10.28.1", - "hypercore-crypto": "^3.4.0", - "hypercore-id-encoding": "^1.2.0", + "b4a": "^1.3.1", + "hypercore": "^10.12.0", + "hypercore-crypto": "^3.2.1", "read-write-mutexify": "^2.1.0", "ready-resource": "^1.0.0", "safety-catch": "^1.0.1", @@ -1915,25 +1892,26 @@ "version": "3.8.0", "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "license": "MIT", "dependencies": { "buffer": "^5.1.0" } }, "node_modules/crc-native": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/crc-native/-/crc-native-1.0.11.tgz", - "integrity": "sha512-F3eeKJSA2Bx/jgy9f/sVdNVo4FnY+u+XiXHmFutw4RwM+r0SErbu4d/X6UbSlENLLm26T3tp6ycbs61xAEA1ag==", - "hasInstallScript": true, + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/crc-native/-/crc-native-1.1.1.tgz", + "integrity": "sha512-Qr1DdDkcMY5Q3vi7lYGDaYdtOpPyFY3h/7cSLMhc95jhI6Gnf3bV/stJ3MKfSJqe8cWnUuJ+vUrbNKw5HA+LEw==", + "license": "Apache-2.0", "optional": true, "dependencies": { - "napi-macros": "^2.0.0", - "node-gyp-build": "^4.2.3" + "load-addon": "^1.0.0" } }, "node_modules/crc-universal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/crc-universal/-/crc-universal-1.0.4.tgz", "integrity": "sha512-CE9xWEI6Gd5V0Bdmj5NoWH3d7+EIe4zUpy1sv6uvKYznzsDP1vhiWsTBmL6q9IrH2P6RRshp+8AkhR4CMtY5Hg==", + "license": "ISC", "optionalDependencies": { "crc-native": "^1.0.3" } @@ -1952,9 +1930,10 @@ } }, "node_modules/debounceify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/debounceify/-/debounceify-1.0.0.tgz", - "integrity": "sha512-7BeSMAPUohdDJ7sU6Tq2M8HkJR05IqQCeVm/qNemrpOgP5SGZD5WeNOXNfsgbESinz6OjMooWPTGZiKUX91XJQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/debounceify/-/debounceify-1.1.0.tgz", + "integrity": "sha512-eKuHDVfJVg+u/0nPy8P+fhnLgbyuTgVxuCRrS/R7EpDSMMkBDgSes41MJtSAY1F1hcqfHz3Zy/qpqHHIp/EhdA==", + "license": "MIT" }, "node_modules/debug": { "version": "4.3.4", @@ -1972,18 +1951,11 @@ } } }, - "node_modules/debugging-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/debugging-stream/-/debugging-stream-2.0.0.tgz", - "integrity": "sha512-xwfl6wB/3xc553uwtGnSa94jFxnGOc02C0WU2Nmzwr80gzeqn1FX4VcbvoKIhe8L/lPq4BTQttAbrTN94uN8rA==", - "dependencies": { - "streamx": "^2.12.4" - } - }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -1998,6 +1970,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -2037,6 +2010,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -2053,36 +2027,20 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", "engines": { "node": ">=8" } }, - "node_modules/dht-rpc": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/dht-rpc/-/dht-rpc-6.10.0.tgz", - "integrity": "sha512-wkLMZtKI/Vk/PFavDmujtPvAIkMOmwr18E/ThQwlPdimw06FJQqdXpG7OBpYXB+n964S/OHl4IVEkK4mc4Mdzw==", - "dependencies": { - "b4a": "^1.6.1", - "compact-encoding": "^2.11.0", - "compact-encoding-net": "^1.2.0", - "events": "^3.3.0", - "fast-fifo": "^1.1.0", - "kademlia-routing-table": "^1.0.1", - "nat-sampler": "^1.0.1", - "sodium-universal": "^4.0.0", - "streamx": "^2.13.2", - "time-ordered-set": "^1.0.2", - "udx-native": "^1.5.3" - } - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -2099,6 +2057,7 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", + "license": "MIT", "dependencies": { "type-fest": "^4.18.2" }, @@ -2110,9 +2069,10 @@ } }, "node_modules/dot-prop/node_modules/type-fest": { - "version": "4.20.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz", - "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==", + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" }, @@ -2121,9 +2081,10 @@ } }, "node_modules/drizzle-orm": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.30.8.tgz", - "integrity": "sha512-9pBJA0IjnpPpzZ6s9jlS1CQAbKoBmbn2GJesPhXaVblAA/joOJ4AWWevYcqvLGj9SvThBAl7WscN8Zwgg5mnTw==", + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.30.10.tgz", + "integrity": "sha512-IRy/QmMWw9lAQHpwbUh1b8fcn27S/a9zMIzqea1WNOxK9/4EB8gIo+FZWLiPXzl2n9ixGSv8BhsLZiOppWEwBw==", + "license": "Apache-2.0", "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=3", @@ -2243,12 +2204,14 @@ "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" }, "node_modules/end-of-stream": { "version": "1.4.4", @@ -2324,7 +2287,8 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -2554,6 +2518,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -2567,6 +2532,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -2575,6 +2541,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", "engines": { "node": ">=6" } @@ -2582,12 +2549,14 @@ "node_modules/fast-content-type-parse": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", - "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==" + "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==", + "license": "MIT" }, "node_modules/fast-decode-uri-component": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", - "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", @@ -2597,7 +2566,8 @@ "node_modules/fast-fifo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", @@ -2606,18 +2576,43 @@ "dev": true }, "node_modules/fast-json-stringify": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.8.0.tgz", - "integrity": "sha512-VVwK8CFMSALIvt14U8AvrSzQAwN/0vaVRiFFUVlpnXSnDGrSkOAO5MtzyN8oQNjLd5AqTW5OZRgyjoNuAuR3jQ==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.16.1.tgz", + "integrity": "sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==", + "license": "MIT", "dependencies": { - "@fastify/deepmerge": "^1.0.0", + "@fastify/merge-json-schemas": "^0.1.0", "ajv": "^8.10.0", - "ajv-formats": "^2.1.1", + "ajv-formats": "^3.0.1", "fast-deep-equal": "^3.1.3", "fast-uri": "^2.1.0", + "json-schema-ref-resolver": "^1.0.1", "rfdc": "^1.2.0" } }, + "node_modules/fast-json-stringify/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/fast-json-stringify/node_modules/fast-uri": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", + "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==", + "license": "MIT" + }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -2628,55 +2623,65 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "license": "MIT", "dependencies": { "fast-decode-uri-component": "^1.0.1" } }, "node_modules/fast-redact": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", - "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" - }, "node_modules/fast-uri": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.2.0.tgz", - "integrity": "sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "license": "MIT" }, "node_modules/fastify": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.24.0.tgz", - "integrity": "sha512-6Uu2cCAV1UgexPnWKchgRt77lng9ivNmyFhPMcgUbJ4VaVBE1l6aYluiYZiVsgOBFpHrmdj7FD6n1aHswln4yQ==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.28.1.tgz", + "integrity": "sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", "dependencies": { "@fastify/ajv-compiler": "^3.5.0", - "@fastify/error": "^3.2.0", + "@fastify/error": "^3.4.0", "@fastify/fast-json-stringify-compiler": "^4.3.0", "abstract-logging": "^2.0.1", - "avvio": "^8.2.1", - "fast-content-type-parse": "^1.0.0", - "fast-json-stringify": "^5.7.0", - "find-my-way": "^7.7.0", - "light-my-request": "^5.9.1", - "pino": "^8.12.0", - "process-warning": "^2.2.0", + "avvio": "^8.3.0", + "fast-content-type-parse": "^1.1.0", + "fast-json-stringify": "^5.8.0", + "find-my-way": "^8.0.0", + "light-my-request": "^5.11.0", + "pino": "^9.0.0", + "process-warning": "^3.0.0", "proxy-addr": "^2.0.7", "rfdc": "^1.3.0", - "secure-json-parse": "^2.5.0", - "semver": "^7.5.0", - "toad-cache": "^3.2.0" + "secure-json-parse": "^2.7.0", + "semver": "^7.5.4", + "toad-cache": "^3.3.0" } }, "node_modules/fastify-plugin": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.1.tgz", - "integrity": "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==" + "integrity": "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==", + "license": "MIT" }, "node_modules/fastq": { "version": "1.17.1", @@ -2701,12 +2706,14 @@ "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2715,13 +2722,14 @@ } }, "node_modules/find-my-way": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.7.0.tgz", - "integrity": "sha512-+SrHpvQ52Q6W9f3wJoJBbAQULJuNEEQwBvlvYwACDhBTLOTMiQ0HYWh4+vC3OivGP2ENcTI1oKlFA2OepJNjhQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.2.0.tgz", + "integrity": "sha512-HdWXgFYc6b1BJcOBDBwjqWuHJj1WYiqrxSh25qtU4DabpMFdj/gSunNBQb83t+8Zt67D7CXEzJWTkxaShMTMOA==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", - "safe-regex2": "^2.0.0" + "safe-regex2": "^3.1.0" }, "engines": { "node": ">=14" @@ -2747,6 +2755,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, "dependencies": { "micromatch": "^4.0.2" } @@ -2823,9 +2832,10 @@ } }, "node_modules/flat-tree": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/flat-tree/-/flat-tree-1.9.0.tgz", - "integrity": "sha512-WRu5/q9fcdL9f7L6Ahq8fR153e5Zr5aU6plPHupN6JDWuvEJbMjrEQprge3/I7ytndHC6/GUNg5Rg8XEisuv5w==" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/flat-tree/-/flat-tree-1.11.0.tgz", + "integrity": "sha512-dO6oawiYBpTROI9RZQ1seCFyNTr5UGnIdk5Ep+h7MbluB8ijnpA+tufJG5AA1hb6HSjhYI8qRo+negHnkBPqVA==", + "license": "MIT" }, "node_modules/flatted": { "version": "3.2.9", @@ -2834,9 +2844,10 @@ "dev": true }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -2852,6 +2863,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2859,12 +2871,14 @@ "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -2876,10 +2890,11 @@ } }, "node_modules/fs-native-extensions": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/fs-native-extensions/-/fs-native-extensions-1.2.3.tgz", - "integrity": "sha512-DwxIW9fs9o8py05YutQgFcsdcph7nlrg70ncUYXiWAgpAPFza+X7Q/vA2UeyBaK4ekcMmoNzuBVEtU8Ass7Wwg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-native-extensions/-/fs-native-extensions-1.2.7.tgz", + "integrity": "sha512-IIWKE5oNTMNwp03daCbRgnCaiEdd0r/BPHwD3Ns4NlHH28FQgfwg0ntg8AgaPO236wN0szt2t1NM+VmCW2TcxQ==", "hasInstallScript": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "napi-macros": "^2.0.0", @@ -2946,7 +2961,8 @@ "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" }, "node_modules/glob": { "version": "8.0.3", @@ -2995,11 +3011,13 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -3022,7 +3040,8 @@ "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true }, "node_modules/graphemer": { "version": "1.4.0", @@ -3030,26 +3049,6 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -3066,6 +3065,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -3118,6 +3118,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -3130,9 +3131,10 @@ } }, "node_modules/hyperbee": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/hyperbee/-/hyperbee-2.17.0.tgz", - "integrity": "sha512-Ghiq/nnhhYxQZuyBO3c7A6eb6SN6uX0THzsVQsVd+pEGvC0G9iqVjuLJSXe0j+VCeN6A6UN2/ixtmETym1qhnw==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/hyperbee/-/hyperbee-2.20.1.tgz", + "integrity": "sha512-q6UNdCalpqmXdfveoQ/VvyOrF3GBWXcWR0XAG4fj7S27ckoMskzT+BwJEsWBaUI9iAOvjcbvJ1Oe6NEXMhFBrg==", + "license": "MIT", "dependencies": { "b4a": "^1.6.0", "codecs": "^3.0.0", @@ -3140,15 +3142,18 @@ "hypercore-errors": "^1.0.0", "mutexify": "^1.4.0", "protocol-buffers-encodings": "^1.2.0", + "rache": "^1.0.0", "ready-resource": "^1.0.0", "safety-catch": "^1.0.2", - "streamx": "^2.12.4" + "streamx": "^2.12.4", + "unslab": "^1.2.0" } }, "node_modules/hyperblobs": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/hyperblobs/-/hyperblobs-2.3.0.tgz", "integrity": "sha512-iBCLVEo6FK+Xd7cpLM3DQ6cTfuMmKPfDZNj5/JqKEgziBEuI0ZGGyMM5dqaVvtRX4s71y8BhrgsDi2p0pWdSmg==", + "license": "MIT", "dependencies": { "b4a": "^1.6.1", "mutexify": "^1.4.0", @@ -3156,9 +3161,10 @@ } }, "node_modules/hypercore": { - "version": "10.29.0", - "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-10.29.0.tgz", - "integrity": "sha512-kJ2EYVECs+ZJPdWmOW3YEAJWlVj8JXvDmq9RZ5eoGEb0s5cxjt3dmkWjv0aHXT6qHvTRXEV/7sO0a/L5hPHnSw==", + "version": "10.17.0", + "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-10.17.0.tgz", + "integrity": "sha512-Yp9lyfUjp81Gy1nPHemNFtYQtngliCGZ6prH+qxvjr2FPVG1QFtNqtOh+ZxFu4hXZ1dAOLYkQOA7Qq2vjFe64A==", + "license": "MIT", "dependencies": { "@hyperswarm/secret-stream": "^6.0.0", "b4a": "^1.1.0", @@ -3166,13 +3172,10 @@ "compact-encoding": "^2.11.0", "crc-universal": "^1.0.2", "events": "^3.3.0", - "fast-fifo": "^1.3.0", "flat-tree": "^1.9.0", "hypercore-crypto": "^3.2.1", - "hypercore-errors": "^1.1.0", - "hypercore-id-encoding": "^1.2.0", "is-options": "^1.0.1", - "protomux": "^3.5.0", + "protomux": "^3.4.0", "quickbit-universal": "^2.1.1", "random-access-file": "^4.0.0", "random-array-iterator": "^1.0.0", @@ -3184,60 +3187,27 @@ } }, "node_modules/hypercore-crypto": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-3.4.0.tgz", - "integrity": "sha512-0cZA1B58p1J84TDbTh8DMMIj7Qr7Rzz8NyGIo+ykUhdwD21gtjiiLWoME92QvN+lgbfu0Zfr9vwxT8sRmyg+AA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-3.4.2.tgz", + "integrity": "sha512-16ii4M6T1dFfRa41Szv3IR0wXfImJMYJ8ysZEGwHEDH7sMeWVEBck6tg1GCNutYl39E+H7wMY2p3ndCRfj+XdQ==", + "license": "MIT", "dependencies": { - "b4a": "^1.1.0", - "compact-encoding": "^2.5.1", - "sodium-universal": "^4.0.0" + "b4a": "^1.6.6", + "compact-encoding": "^2.15.0", + "sodium-universal": "^4.0.1" } }, "node_modules/hypercore-errors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hypercore-errors/-/hypercore-errors-1.1.0.tgz", - "integrity": "sha512-pclEHYUmgveqyMObMrgwJ087VvqcRVfbaY7k9rNQ5C+3MADVSQu3f8SmoLkntDkOipm9+uELK3p8DbTGL54m8g==" - }, - "node_modules/hypercore-id-encoding": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hypercore-id-encoding/-/hypercore-id-encoding-1.2.0.tgz", - "integrity": "sha512-WqPBJ/HZ/sifoo9jYw/ZUr1Z1l4kll8hQwVdDhVqsDyYPj0c/Tl0ALLXbDxb9vcpKBV+WLgLqf8kVB0GcZU0Mg==", - "dependencies": { - "b4a": "^1.5.3", - "z32": "^1.0.0" - } - }, - "node_modules/hyperdht": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/hyperdht/-/hyperdht-6.11.0.tgz", - "integrity": "sha512-BpymRzBHYvmDiPFCllIZ76tsNtqky73iz6dVL66YJBNiR9D+3qFyeLR3ZETrnJ0dqaDEHlG7pTFrEvMlTll9lw==", - "dependencies": { - "@hyperswarm/secret-stream": "^6.0.0", - "b4a": "^1.3.1", - "blind-relay": "^1.3.0", - "bogon": "^1.0.0", - "compact-encoding": "^2.4.1", - "compact-encoding-net": "^1.0.1", - "debugging-stream": "^2.0.0", - "dht-rpc": "^6.9.0", - "events": "^3.3.0", - "hypercore-crypto": "^3.3.0", - "noise-curve-ed": "^2.0.0", - "noise-handshake": "^3.0.0", - "record-cache": "^1.1.1", - "safety-catch": "^1.0.1", - "signal-promise": "^1.0.3", - "sodium-universal": "^4.0.0", - "xache": "^1.1.0" - }, - "bin": { - "hyperdht": "bin.js" - } + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/hypercore-errors/-/hypercore-errors-1.3.0.tgz", + "integrity": "sha512-WsmSu05Ve1hXaT/2Etwz7mgZ1sAXe8EaveahUfaeECllxvYNaP5EbAPw5YaA4OqR3d217litGt4qKch9TBnavA==", + "license": "Apache-2.0" }, "node_modules/hyperdrive": { "version": "11.5.3", "resolved": "https://registry.npmjs.org/hyperdrive/-/hyperdrive-11.5.3.tgz", "integrity": "sha512-0542G6n9eAXK/+fl6bs+9rvxCrL/dQo9mZsbY+BFSCD3S6ymBlaVnjOCuQdNflYBOHFVNnbBYdDvZ9meInv+tw==", + "license": "Apache-2.0", "dependencies": { "hyperbee": "^2.11.1", "hyperblobs": "^2.3.0", @@ -3251,17 +3221,11 @@ "unix-path-resolve": "^1.0.2" } }, - "node_modules/hyperswarm": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/hyperswarm/-/hyperswarm-4.4.1.tgz", - "integrity": "sha512-8VLR/DLx6BnZATdCoECwFWasz7tIVdxkwlALT25sV6GEERf2fwttkJrb+5BS9vht/fyXJ4l41x6YgDWCabIoiw==", - "dependencies": { - "b4a": "^1.3.1", - "events": "^3.3.0", - "hyperdht": "^6.5.2", - "safety-catch": "^1.0.2", - "shuffled-priority-queue": "^2.1.0" - } + "node_modules/hypertrace": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/hypertrace/-/hypertrace-1.4.2.tgz", + "integrity": "sha512-sa6iq1FaJ03Db3eUl5ZodyOL3fheyrum9xzeHasXOQ/AprTT6vS1WjpbXfYkHhmzVmyn0jBW/VsCb1QaBkGyow==", + "license": "Apache-2.0" }, "node_modules/ieee754": { "version": "1.2.1", @@ -3280,7 +3244,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.2.4", @@ -3333,12 +3298,14 @@ "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -3347,6 +3314,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -3356,6 +3324,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" @@ -3396,6 +3365,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -3405,6 +3375,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, "bin": { "is-docker": "cli.js" }, @@ -3428,6 +3399,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } @@ -3448,6 +3420,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/is-it-type/-/is-it-type-5.1.2.tgz", "integrity": "sha512-q/gOZQTNYABAxaXWnBKZjTFH4yACvWEFtgVOj+LbgxYIgAJG1xVmUZOsECSrZPIemYUQvaQWVilSFVbh4Eyt8A==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.16.7", "globalthis": "^1.0.2" @@ -3466,6 +3439,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { "node": ">=0.12.0" } @@ -3474,6 +3448,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-options/-/is-options-1.0.2.tgz", "integrity": "sha512-u+Ai74c8Q74aS8BuHwPdI1jptGOT1FQXgCq8/zv0xRuE+wRgSMEJLj8lVO8Zp9BeGb29BXY6AsNPinfqjkr7Fg==", + "license": "MIT", "dependencies": { "b4a": "^1.1.1" } @@ -3511,6 +3486,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, "dependencies": { "is-docker": "^2.0.0" }, @@ -3528,25 +3504,14 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, - "node_modules/isomorphic-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", - "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", - "dependencies": { - "node-fetch": "^2.6.1", - "whatwg-fetch": "^3.4.1" - } - }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -3572,10 +3537,20 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, + "node_modules/json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" }, "node_modules/json-stable-stringify": { "version": "1.1.1", @@ -3600,15 +3575,11 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==" - }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -3624,11 +3595,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/kademlia-routing-table": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kademlia-routing-table/-/kademlia-routing-table-1.0.1.tgz", - "integrity": "sha512-dKk19sC3/+kWhBIvOKCthxVV+JH0NrswSBq4sA4eOkkPMqQM1rRuOWte1WSKXeP8r9Nx4NuiH2gny3lMddJTpw==" - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -3642,6 +3608,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, "dependencies": { "graceful-fs": "^4.1.11" } @@ -3670,15 +3637,26 @@ } }, "node_modules/light-my-request": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.11.0.tgz", - "integrity": "sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.13.0.tgz", + "integrity": "sha512-9IjUN9ZyCS9pTG+KqTDEQo68Sui2lHsYBrfMyVUTTZ3XhH8PMZq7xO94Kr+eP9dhi/kcKsx4N41p2IXEBil1pQ==", + "license": "BSD-3-Clause", "dependencies": { - "cookie": "^0.5.0", - "process-warning": "^2.0.0", + "cookie": "^0.6.0", + "process-warning": "^3.0.0", "set-cookie-parser": "^2.4.1" } }, + "node_modules/load-addon": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-addon/-/load-addon-1.0.0.tgz", + "integrity": "sha512-6XaA7xfpHW1CeQRrLFE9+9y8nDZMX3ZaoCMSo+Gp2i58dfY549SQqqb2ukAgQtAACEDJmaroHJvnL03cJ+KLvA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-addon-resolve": "^1.3.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3697,7 +3675,8 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -3708,25 +3687,20 @@ "node_modules/long": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "license": "Apache-2.0" }, "node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/magic-bytes.js": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz", - "integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==" + "integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==", + "license": "MIT" }, "node_modules/magic-string": { "version": "0.30.5", @@ -3744,6 +3718,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-5.0.2.tgz", "integrity": "sha512-K6K2NgKnTXimT3779/4KxSvobxOtMmx1LBZ3NwRxT/MDIR3Br/fQ4Q+WCX5QxjyUR8zg5+RV9Tbf2c5pAWTD2A==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -3756,21 +3731,11 @@ "resolved": "https://registry.npmjs.org/mapeo-offline-map/-/mapeo-offline-map-2.0.0.tgz", "integrity": "sha512-/a2BVgSwcL0EGqNxc7MWaApEJ0uLxr/scaZimd/2RvihDtvaNsLQurHIAjXJnY5lj4to5fBFBpcWXntdZoRBdg==" }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -3780,12 +3745,13 @@ } }, "node_modules/mime": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.3.tgz", - "integrity": "sha512-KgUb15Oorc0NEKPbvfa0wRU+PItIEZmiv+pyAO2i0oTIVTJhlzMclU7w4RXWQrSOVH5ax/p/CkIO7KI4OyFJTQ==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.4.tgz", + "integrity": "sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==", "funding": [ "https://github.com/sponsors/broofa" ], + "license": "MIT", "bin": { "mime": "bin/cli.js" }, @@ -3797,6 +3763,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -3828,14 +3795,16 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/mirror-drive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mirror-drive/-/mirror-drive-1.3.0.tgz", - "integrity": "sha512-m2HL5pFBUxHmkO64AAvYn/+bddUf16HGQwlQ7IGXr65PCWsr01oLebTNrsk4+nIHzs02M4/Ry0LZwmXYKebceg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mirror-drive/-/mirror-drive-1.4.0.tgz", + "integrity": "sha512-eKYAH61V+4O9u/jOcU6aT/pNFv1Dua6DutyidhJG5aiWrtaLE/1FX6VXrSc7gtMTBOksqkvIWJGT5GWq4HFnrQ==", + "license": "Apache-2.0", "dependencies": { "binary-stream-equals": "^1.0.0", "same-data": "^1.0.0" @@ -3844,7 +3813,8 @@ "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" }, "node_modules/ms": { "version": "2.1.2", @@ -3855,6 +3825,7 @@ "version": "1.0.0-alpha.10", "resolved": "https://registry.npmjs.org/multi-core-indexer/-/multi-core-indexer-1.0.0-alpha.10.tgz", "integrity": "sha512-H9QdpJ/MaelrBZw6jCcsrInE+hwUQmfz/2swtIdQNNh1IHUDGEdPkakjcZAyahpM5iIVz7EqyWO74aC03A3qSA==", + "license": "MIT", "dependencies": { "@types/node": "^18.16.19", "@types/streamx": "^2.9.1", @@ -3866,9 +3837,10 @@ } }, "node_modules/multi-core-indexer/node_modules/@types/node": { - "version": "18.19.39", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", - "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", + "version": "18.19.50", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.50.tgz", + "integrity": "sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==", + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } @@ -3876,12 +3848,14 @@ "node_modules/multi-core-indexer/node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" }, "node_modules/mutexify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/mutexify/-/mutexify-1.4.0.tgz", "integrity": "sha512-pbYSsOrSB/AKN5h/WzzLRMFgZhClWccf2XIB4RSMC8JbquiB0e0/SH5AIfdQMdyHmYtv4seU7yV/TvAwPLJ1Yg==", + "license": "MIT", "dependencies": { "queue-tick": "^1.0.0" } @@ -3889,22 +3863,21 @@ "node_modules/nanoassert": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", - "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==", + "license": "ISC" }, "node_modules/napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "license": "MIT" }, "node_modules/napi-macros": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" - }, - "node_modules/nat-sampler": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nat-sampler/-/nat-sampler-1.0.1.tgz", - "integrity": "sha512-yQvyNN7xbqR8crTKk3U8gRgpcV1Az+vfCEijiHu9oHHsnIl8n3x+yXNHl42M6L3czGynAVoOT9TqBfS87gDdcw==" + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", + "license": "MIT", + "optional": true }, "node_modules/natural-compare": { "version": "1.4.0", @@ -3912,15 +3885,11 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, "node_modules/node-abi": { - "version": "3.50.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.50.0.tgz", - "integrity": "sha512-2Gxu7Eq7vnBIRfYSmqPruEllMM14FjOQFJSoqdGWthVn+tmwEXzmdPpya6cvvwf0uZA3F5N1fMFr9mijZBplFA==", + "version": "3.67.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.67.0.tgz", + "integrity": "sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==", + "license": "MIT", "dependencies": { "semver": "^7.3.5" }, @@ -3928,29 +3897,11 @@ "node": ">=10" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-gyp-build": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", - "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", + "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", + "license": "MIT", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -3961,6 +3912,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/noise-curve-ed/-/noise-curve-ed-2.0.1.tgz", "integrity": "sha512-8HMZ40Wmarg8RQjVemLrjB49JSL6eGeOD+tlzaQW5/p+hNPfHFEMC3UZZ57zUqUprMuz6GN+gsPExpz2DWL+iA==", + "license": "ISC", "dependencies": { "b4a": "^1.1.0", "nanoassert": "^2.0.0", @@ -3968,9 +3920,10 @@ } }, "node_modules/noise-handshake": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/noise-handshake/-/noise-handshake-3.0.3.tgz", - "integrity": "sha512-fRhxQLW7uZmLS059VXA79j8eMxoYPBg7gMGBKqLbuipagTmvUT6xW46DeMsf3Y7LA4fmB9n24s6Vv/a1Q+y8UQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/noise-handshake/-/noise-handshake-3.1.0.tgz", + "integrity": "sha512-0S1qkUvMbTvZCfgr/vSkVT84YyvI4Q0OLwSc5BFxVmjaePrxAwVeXeJDY3A7N/7+qj95gZ15LaNoP9ZnBXH5Lw==", + "license": "ISC", "dependencies": { "b4a": "^1.1.0", "nanoassert": "^2.0.0", @@ -3989,6 +3942,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -4005,6 +3959,7 @@ "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -4037,14 +3992,16 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/p-defer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.0.tgz", - "integrity": "sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.1.tgz", + "integrity": "sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -4056,6 +4013,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/p-event/-/p-event-6.0.1.tgz", "integrity": "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==", + "license": "MIT", "dependencies": { "p-timeout": "^6.1.2" }, @@ -4070,6 +4028,7 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -4118,7 +4077,8 @@ "node_modules/package-json-from-dist": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "license": "BlueOak-1.0.0" }, "node_modules/parent-module": { "version": "1.0.1", @@ -4136,6 +4096,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "dev": true, "dependencies": { "@yarnpkg/lockfile": "^1.1.0", "chalk": "^4.1.2", @@ -4165,6 +4126,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, "engines": { "node": ">=6" } @@ -4204,6 +4166,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -4219,6 +4182,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -4227,30 +4191,32 @@ } }, "node_modules/pino": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.16.0.tgz", - "integrity": "sha512-UUmvQ/7KTZt/vHjhRrnyS7h+J7qPBQnpG80V56xmIC+o9IqYmQOw/UIny9S9zYDfRBR0ClouCr464EkBMIT7Fw==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.4.0.tgz", + "integrity": "sha512-nbkQb5+9YPhQRz/BeQmrWpEknAaqjpAqRK8NwJpmrX/JHu7JuZC5G1CeAwJDJfGes4h+YihC6in3Q2nGb+Y09w==", + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "v1.1.0", - "pino-std-serializers": "^6.0.0", - "process-warning": "^2.0.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.7.0", - "thread-stream": "^2.0.0" + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "node_modules/pino-abstract-transport": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", - "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "license": "MIT", "dependencies": { "readable-stream": "^4.0.0", "split2": "^4.0.0" @@ -4274,15 +4240,17 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "node_modules/pino-abstract-transport/node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -4295,14 +4263,22 @@ } }, "node_modules/pino-std-serializers": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", - "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", + "license": "MIT" + }, + "node_modules/pino/node_modules/process-warning": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", + "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==", + "license": "MIT" }, "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "license": "MIT", "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -4352,20 +4328,23 @@ "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", "engines": { "node": ">= 0.6.0" } }, "node_modules/process-warning": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.2.0.tgz", - "integrity": "sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "license": "MIT" }, "node_modules/protobufjs": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", - "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", "hasInstallScript": true, + "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -4388,6 +4367,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/protocol-buffers-encodings/-/protocol-buffers-encodings-1.2.0.tgz", "integrity": "sha512-daeNPuKh1NlLD1uDfbLpD+xyUTc07nEtfHwmBZmt/vH0B7VOM+JOCOpDcx9ZRpqHjAiIkGqyTDi+wfGSl17R9w==", + "license": "MIT", "dependencies": { "b4a": "^1.6.0", "signed-varint": "^2.0.1", @@ -4397,23 +4377,28 @@ "node_modules/protocol-buffers-encodings/node_modules/varint": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", - "integrity": "sha512-gC13b/bWrqQoKY2EmROCZ+AR0jitc6DnDGaQ6Ls9QpKmuSgJB1eQ7H3KETtQm7qSdMWMKCmsshyCmUwMLh3OAA==" + "integrity": "sha512-gC13b/bWrqQoKY2EmROCZ+AR0jitc6DnDGaQ6Ls9QpKmuSgJB1eQ7H3KETtQm7qSdMWMKCmsshyCmUwMLh3OAA==", + "license": "MIT" }, "node_modules/protomux": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/protomux/-/protomux-3.5.1.tgz", - "integrity": "sha512-+ioDo9Cu5rTNQH9Or2UkXJRFPAZMzqr4gZFuyib8tTmy8YyZDCL2poP8dhc5JgJydTrj94jn1Dsp/C0ESpEtjQ==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/protomux/-/protomux-3.9.2.tgz", + "integrity": "sha512-s439dAQSrCg3rohE+Vn7UJN20bBUKNu/4m/+pSNKnavo14HHPsW7BP6YtfXD63qPDRwfM8la3r4DA1EQGM8iYQ==", + "license": "MIT", "dependencies": { "b4a": "^1.3.1", "compact-encoding": "^2.5.1", + "hypertrace": "^1.4.2", "queue-tick": "^1.0.0", - "safety-catch": "^1.0.1" + "safety-catch": "^1.0.1", + "unslab": "^1.3.0" } }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -4435,6 +4420,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, "engines": { "node": ">=6" } @@ -4462,29 +4448,31 @@ "node_modules/queue-tick": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "license": "MIT" }, "node_modules/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" }, "node_modules/quickbit-native": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/quickbit-native/-/quickbit-native-2.2.0.tgz", - "integrity": "sha512-/C5EOMP9Kyk+P7Z0+ipedppwhMkPA0SBj31Hk8xZQ/0rfKPLlafYJcxr+H942eIQ60xRif9c18B9OV0REfCWzg==", - "hasInstallScript": true, + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/quickbit-native/-/quickbit-native-2.3.1.tgz", + "integrity": "sha512-/WOLyxcG6jFjuCuiND9/gXRlR4Po20UGhuc9izpVLioiJ2hWhoIgrNaTCkwgnPhrr1Rz8DGNCntJNEyspfo0Ug==", + "license": "Apache-2.0", "optional": true, "dependencies": { "b4a": "^1.6.0", - "napi-macros": "^2.0.0", - "node-gyp-build": "^4.2.3" + "load-addon": "^1.0.0" } }, "node_modules/quickbit-universal": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/quickbit-universal/-/quickbit-universal-2.2.0.tgz", "integrity": "sha512-w02i1R8n7+6pEKTud8DfF8zbFY9o7RtPlUc3jWbtCkDKvhbx/AvV7oNnz4/TcmsPGpSJS+fq5Ud6RH6+YPvSGg==", + "license": "ISC", "dependencies": { "b4a": "^1.6.0", "simdle-universal": "^1.1.0" @@ -4493,35 +4481,47 @@ "quickbit-native": "^2.2.0" } }, + "node_modules/rache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rache/-/rache-1.0.0.tgz", + "integrity": "sha512-e0k0g0w/8jOCB+7YqCIlOa+OJ38k0wrYS4x18pMSmqOvLKoyhmMhmQyCcvfY6VaP8D75cqkEnlakXs+RYYLqNg==", + "license": "Apache-2.0" + }, "node_modules/random-access-file": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/random-access-file/-/random-access-file-4.0.4.tgz", - "integrity": "sha512-1W21gZ8ne3RgPyTNpq8INr7feTY0+hPpV4X59yL9Miv5QiZV7U1QpRb/zEG2IuaojW9qVTeWBC19Ty0m0uqFBg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/random-access-file/-/random-access-file-4.0.7.tgz", + "integrity": "sha512-SOLseGmpbJRLLrVEDOJY3rqX1AwUmQnN0IAMjRLvld3fexaL8hYgti6VFuyT72bDMWSwVyvQROHh6FcE+PefKQ==", + "license": "MIT", "dependencies": { "random-access-storage": "^3.0.0" }, "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0", "fs-native-extensions": "^1.1.0" } }, "node_modules/random-access-storage": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/random-access-storage/-/random-access-storage-3.0.1.tgz", - "integrity": "sha512-raFoHJ/orMyur04GKrA+5ThOwhX9wICdqMDLqTM7bHEXPz7zi5MxLsLUaybxGu3b4mJTt8zhCpZHgjlu0x4wpg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/random-access-storage/-/random-access-storage-3.0.2.tgz", + "integrity": "sha512-Es9maUyWdJXWKckKy9s1+vT+DEgAt+PBb9lxPaake/0EDUsHehloKGv9v1zimS2V3gpFAcQXubvc1Rgci2sDPQ==", + "license": "MIT", "dependencies": { - "events": "^3.3.0", + "bare-events": "^2.2.0", "queue-tick": "^1.0.0" } }, "node_modules/random-array-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-array-iterator/-/random-array-iterator-1.0.0.tgz", - "integrity": "sha512-u7xCM93XqKEvPTP6xZp2ehttcAemKnh73oKNf1FvzuVCfpt6dILDt1Kxl1LeBjm2iNIeR49VGFhy4Iz3yOun+Q==" + "integrity": "sha512-u7xCM93XqKEvPTP6xZp2ehttcAemKnh73oKNf1FvzuVCfpt6dILDt1Kxl1LeBjm2iNIeR49VGFhy4Iz3yOun+Q==", + "license": "MIT" }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -4535,7 +4535,8 @@ "node_modules/read-write-mutexify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/read-write-mutexify/-/read-write-mutexify-2.1.0.tgz", - "integrity": "sha512-fDw/p5/acI1ytVY1UbxEDma/ej1yJH/n9NcjS9YNzcE6sPBPWdlru3ydRa/UBowUg4zqOvNMD5SOGYJrlQ6MzQ==" + "integrity": "sha512-fDw/p5/acI1ytVY1UbxEDma/ej1yJH/n9NcjS9YNzcE6sPBPWdlru3ydRa/UBowUg4zqOvNMD5SOGYJrlQ6MzQ==", + "license": "MIT" }, "node_modules/readable-stream": { "version": "3.6.0", @@ -4551,35 +4552,34 @@ } }, "node_modules/ready-resource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ready-resource/-/ready-resource-1.0.0.tgz", - "integrity": "sha512-9/Oj3DXv+QxWinvVcxVVRXn9Jj4b9wssv0PvQh5bO+N/vzqo6kmScUNl+faWWMEu0rYMPa6Tvp50+rP5ujZvqg==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ready-resource/-/ready-resource-1.1.1.tgz", + "integrity": "sha512-EQbJs+wXphM1opGCpYSp3toAID8okqGDLmhjGLCiptMfMHGcTxdP3lsmSsYwU+lbrUXrbuhhgcDPge656X48VQ==", + "license": "MIT", + "dependencies": { + "bare-events": "^2.2.0" + } }, "node_modules/real-require": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", "engines": { "node": ">= 12.13.0" } }, - "node_modules/record-cache": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.2.0.tgz", - "integrity": "sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw==", - "dependencies": { - "b4a": "^1.3.1" - } - }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4620,11 +4620,12 @@ } }, "node_modules/ret": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", - "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.4.3.tgz", + "integrity": "sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=10" } }, "node_modules/reusify": { @@ -4637,14 +4638,16 @@ } }, "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" }, "node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -4656,6 +4659,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4665,6 +4669,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4684,6 +4689,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4792,17 +4798,19 @@ ] }, "node_modules/safe-regex2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", - "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-3.1.0.tgz", + "integrity": "sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==", + "license": "MIT", "dependencies": { - "ret": "~0.2.0" + "ret": "~0.4.0" } }, "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", "engines": { "node": ">=10" } @@ -4810,25 +4818,26 @@ "node_modules/safety-catch": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/safety-catch/-/safety-catch-1.0.2.tgz", - "integrity": "sha512-C1UYVZ4dtbBxEtvOcpjBaaD27nP8MlvyAQEp2fOTOEe6pfUpk1cDUxij6BR1jZup6rSyUTaBBplK7LanskrULA==" + "integrity": "sha512-C1UYVZ4dtbBxEtvOcpjBaaD27nP8MlvyAQEp2fOTOEe6pfUpk1cDUxij6BR1jZup6rSyUTaBBplK7LanskrULA==", + "license": "MIT" }, "node_modules/same-data": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/same-data/-/same-data-1.0.0.tgz", - "integrity": "sha512-Eqn7N2yV+aKMlUHTRqUwYG1Iv0cJqjlvLKj/GoP5PozJn361QaOYX14+v87r7NqQUZC22noP/LfLrSQiPwAygw==" + "integrity": "sha512-Eqn7N2yV+aKMlUHTRqUwYG1Iv0cJqjlvLKj/GoP5PozJn361QaOYX14+v87r7NqQUZC22noP/LfLrSQiPwAygw==", + "license": "MIT" }, "node_modules/secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", - "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "license": "BSD-3-Clause" }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4836,17 +4845,6 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/serialize-error": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", @@ -4862,9 +4860,10 @@ } }, "node_modules/set-cookie-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", - "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz", + "integrity": "sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==", + "license": "MIT" }, "node_modules/set-function-length": { "version": "1.2.2", @@ -4885,43 +4884,8 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/sha256-universal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sha256-universal/-/sha256-universal-1.2.1.tgz", - "integrity": "sha512-ghn3muhdn1ailCQqqceNxRgkOeZSVfSE13RQWEg6njB+itsFzGVSJv+O//2hvNXZuxVIRyNzrgsZ37SPDdGJJw==", - "dependencies": { - "b4a": "^1.0.1", - "sha256-wasm": "^2.2.1" - } - }, - "node_modules/sha256-wasm": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/sha256-wasm/-/sha256-wasm-2.2.2.tgz", - "integrity": "sha512-qKSGARvao+JQlFiA+sjJZhJ/61gmW/3aNLblB2rsgIxDlDxsJPHo8a1seXj12oKtuHVgJSJJ7QEGBUYQN741lQ==", - "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "node_modules/sha512-universal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sha512-universal/-/sha512-universal-1.2.1.tgz", - "integrity": "sha512-kehYuigMoRkIngCv7rhgruLJNNHDnitGTBdkcYbCbooL8Cidj/bS78MDxByIjcc69M915WxcQTgZetZ1JbeQTQ==", - "dependencies": { - "b4a": "^1.0.1", - "sha512-wasm": "^2.3.1" - } - }, - "node_modules/sha512-wasm": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/sha512-wasm/-/sha512-wasm-2.3.4.tgz", - "integrity": "sha512-akWoxJPGCB3aZCrZ+fm6VIFhJ/p8idBv7AWGFng/CZIrQo51oQNsvDbTSRXWAzIiZJvpy16oIDiCCPqTe21sKg==", - "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", @@ -4942,29 +4906,11 @@ "node": ">=8" } }, - "node_modules/shiki": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz", - "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==", - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "node_modules/shuffled-priority-queue": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/shuffled-priority-queue/-/shuffled-priority-queue-2.1.0.tgz", - "integrity": "sha512-xhdh7fHyMsr0m/w2kDfRJuBFRS96b9l8ZPNWGaQ+PMvnUnZ/Eh+gJJ9NsHBd7P9k0399WYlCLzsy18EaMfyadA==", - "dependencies": { - "unordered-set": "^2.0.1" - } - }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", "engines": { "node": ">=14" }, @@ -4972,35 +4918,31 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/signal-promise": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/signal-promise/-/signal-promise-1.0.3.tgz", - "integrity": "sha512-WBgv0UnIq2C+Aeh0/n+IRpP6967eIx9WpynTUoiW3isPpfe1zu2LJzyfXdo9Tgef8yR/sGjcMvoUXD7EYdiz+g==" - }, "node_modules/signed-varint": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/signed-varint/-/signed-varint-2.0.1.tgz", "integrity": "sha512-abgDPg1106vuZZOvw7cFwdCABddfJRz5akcCcchzTbhyhYnsG31y4AlZEgp315T7W3nQq5P4xeOm186ZiPVFzw==", + "license": "MIT", "dependencies": { "varint": "~5.0.0" } }, "node_modules/simdle-native": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/simdle-native/-/simdle-native-1.2.0.tgz", - "integrity": "sha512-+lzydXTqqe8GWLcH4Tf4kAgrtJTDnIxAiU/a+Hs4QpLmEapgT4T0Acbauzc2Gq3Wt3XL5MthaBhrIMhZ2386Ww==", - "hasInstallScript": true, + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simdle-native/-/simdle-native-1.3.1.tgz", + "integrity": "sha512-QEFxH5JPLzMJy8pzv6Y/RA9K7F0MDOXcB+as6V+XlNOPI5Lpt0LjR6cl3muvBHk6oZiiHj5O8TOkP8ToN9kbsQ==", + "license": "Apache-2.0", "optional": true, "dependencies": { "b4a": "^1.6.0", - "napi-macros": "^2.0.0", - "node-gyp-build": "^4.2.3" + "load-addon": "^1.0.0" } }, "node_modules/simdle-universal": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/simdle-universal/-/simdle-universal-1.1.2.tgz", "integrity": "sha512-3n3w1bs+uwgHKQjt6arez83EywNlhZzYvNOhvAASTl/8KqNIcqr6aHyGt3JRlfuUC7iB0tomJRPlJ2cRGIpBzA==", + "license": "ISC", "dependencies": { "b4a": "^1.6.0" }, @@ -5025,7 +4967,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/simple-get": { "version": "4.0.1", @@ -5045,6 +4988,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -5055,18 +4999,11 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/simple-invariant/-/simple-invariant-2.0.1.tgz", "integrity": "sha512-1sbhsxqI+I2tqlmjbz99GXNmZtr6tKIyEgGGnJw/MKGblalqk/XoOYYFJlBzTKZCxx8kLaD3FD5s9BEEjx5Pyg==", + "license": "MIT", "engines": { "node": ">=10" } }, - "node_modules/siphash24": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.3.1.tgz", - "integrity": "sha512-moemC3ZKiTzH29nbFo3Iw8fbemWWod4vNs/WgKbQ54oEs6mE6XVlguxvinYjB+UmaE0PThgyED9fUkWvirT8hA==", - "dependencies": { - "nanoassert": "^2.0.0" - } - }, "node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -5079,74 +5016,57 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sodium-javascript": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.8.0.tgz", - "integrity": "sha512-rEBzR5mPxPES+UjyMDvKPIXy9ImF17KOJ32nJNi9uIquWpS/nfj+h6m05J5yLJaGXjgM72LmQoUbWZVxh/rmGg==", - "dependencies": { - "blake2b": "^2.1.1", - "chacha20-universal": "^1.0.4", - "nanoassert": "^2.0.0", - "sha256-universal": "^1.1.0", - "sha512-universal": "^1.1.0", - "siphash24": "^1.0.1", - "xsalsa20": "^1.0.0" - } - }, "node_modules/sodium-native": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.0.4.tgz", - "integrity": "sha512-faqOKw4WQKK7r/ybn6Lqo1F9+L5T6NlBJJYvpxbZPetpWylUVqz449mvlwIBKBqxEHbWakWuOlUt8J3Qpc4sWw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.2.0.tgz", + "integrity": "sha512-rdJRAf/RE/IRFUUoUsz10slNAQDTGz5ChpIeR1Ti0BtGYstl6Uok4hHALPBdnFcLml6qXJ2pDd0/De09mPa6mg==", "hasInstallScript": true, + "license": "MIT", "dependencies": { - "node-gyp-build": "^4.6.0" + "node-gyp-build": "^4.8.0" } }, "node_modules/sodium-secretstream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/sodium-secretstream/-/sodium-secretstream-1.1.0.tgz", "integrity": "sha512-Qg7D2xomELDjDCWAmE4izk1aecG/il8pQIGmSWFaKgah/V58BVWG/PuSZF6vseTpcqnetIFGaOWzmPNzyTD50A==", + "license": "MIT", "dependencies": { "b4a": "^1.1.1", "sodium-universal": "^4.0.0" } }, "node_modules/sodium-universal": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.0.tgz", - "integrity": "sha512-iKHl8XnBV96k1c75gwwzANFdephw/MDWSjQAjPmBE+du0y3P23Q8uf7AcdcfFsYAMwLg7WVBfSAIBtV/JvRsjA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.1.tgz", + "integrity": "sha512-sNp13PrxYLaUFHTGoDKkSDFvoEu51bfzE12RwGlqU1fcrkpAOK0NvizaJzOWV0Omtk9me2+Pnbjcf/l0efxuGQ==", + "license": "MIT", "dependencies": { - "blake2b": "^2.1.1", - "chacha20-universal": "^1.0.4", - "nanoassert": "^2.0.0", - "sha256-universal": "^1.1.0", - "sha512-universal": "^1.1.0", - "siphash24": "^1.0.1", - "sodium-javascript": "~0.8.0", - "sodium-native": "^4.0.0", - "xsalsa20": "^1.0.0" + "sodium-native": "^4.0.0" + }, + "peerDependencies": { + "sodium-javascript": "~0.8.0" + }, + "peerDependenciesMeta": { + "sodium-javascript": { + "optional": true + } } }, "node_modules/sonic-boom": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", - "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.1.0.tgz", + "integrity": "sha512-NGipjjRicyJJ03rPiZCJYjwlsuP2d1/5QUviozRXC7S3WdVWNK5e3Ojieb9CCyfhq2UC+3+SRd9nG3I2lPRvUw==", + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", "engines": { "node": ">= 10.x" } @@ -5155,6 +5075,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/start-stop-state-machine/-/start-stop-state-machine-1.2.0.tgz", "integrity": "sha512-U9OtWHh+YKPqXHPZc5Ziz5+P/bdKFq14Lz8GnsPXyxNN6RC18nvJ0QAey5FfDpW9DDSaakByrQ4VcnPYm4a+YA==", + "license": "MIT", "dependencies": { "tiny-typed-emitter": "^2.1.0" } @@ -5163,6 +5084,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5173,12 +5095,17 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" }, "node_modules/streamx": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz", - "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", + "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", + "license": "MIT", "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" } }, "node_modules/string_decoder": { @@ -5193,6 +5120,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -5210,6 +5138,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5223,6 +5152,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -5230,12 +5160,14 @@ "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5247,6 +5179,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -5262,6 +5195,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5273,6 +5207,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -5281,6 +5216,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5289,6 +5225,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/sub-encoder/-/sub-encoder-2.1.3.tgz", "integrity": "sha512-Xxx04ygZo/1J3yHvaSA6VhDmiSaBQkw/PmO3YnnYFXle+tfOGToC6FcDpIfMztWZXJzuKG14b/57HMkiL58C6A==", + "license": "Apache-2.0", "dependencies": { "b4a": "^1.6.0", "codecs": "^3.1.0" @@ -5298,6 +5235,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -5321,6 +5259,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "license": "MIT", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -5332,6 +5271,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -5343,6 +5283,15 @@ "node": ">=6" } }, + "node_modules/text-decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.0.tgz", + "integrity": "sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -5350,17 +5299,19 @@ "dev": true }, "node_modules/thread-stream": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", - "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "license": "MIT", "dependencies": { "real-require": "^0.2.0" } }, "node_modules/throttle-debounce": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", - "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", "engines": { "node": ">=12.22" } @@ -5373,15 +5324,11 @@ "readable-stream": "3" } }, - "node_modules/time-ordered-set": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/time-ordered-set/-/time-ordered-set-1.0.2.tgz", - "integrity": "sha512-vGO99JkxvgX+u+LtOKQEpYf31Kj3i/GNwVstfnh4dyINakMgeZCpew1e3Aj+06hEslhtHEd52g7m5IV+o1K8Mw==" - }, "node_modules/timeout-refresh": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/timeout-refresh/-/timeout-refresh-2.0.1.tgz", - "integrity": "sha512-SVqEcMZBsZF9mA78rjzCrYrUs37LMJk3ShZ851ygZYW1cMeIjs9mL57KO6Iv5mmjSQnOe/29/VAfGXo+oRCiVw==" + "integrity": "sha512-SVqEcMZBsZF9mA78rjzCrYrUs37LMJk3ShZ851ygZYW1cMeIjs9mL57KO6Iv5mmjSQnOe/29/VAfGXo+oRCiVw==", + "license": "MIT" }, "node_modules/tiny-typed-emitter": { "version": "2.1.0", @@ -5392,6 +5339,7 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -5403,6 +5351,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -5411,9 +5360,10 @@ } }, "node_modules/toad-cache": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.3.0.tgz", - "integrity": "sha512-3oDzcogWGHZdkwrHyvJVpPjA7oNzY6ENOV3PsWJY9XYPZ6INo94Yd47s5may1U+nleBPwDhrRiTPMIvKaa3MQg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", + "license": "MIT", "engines": { "node": ">=12" } @@ -5422,25 +5372,23 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD", "optional": true }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -5484,37 +5432,13 @@ "node": ">=14.17" } }, - "node_modules/udx-native": { - "version": "1.7.12", - "resolved": "https://registry.npmjs.org/udx-native/-/udx-native-1.7.12.tgz", - "integrity": "sha512-2/51ij0eYzOQuaoB3IoAO6sVMtHH7Paaw7OKnTws4wfSVGNYoVA2tMrnaeOsIeZ8DZUfLDcLZi5+de0IAIhE6w==", - "hasInstallScript": true, - "dependencies": { - "b4a": "^1.5.0", - "events": "^3.3.0", - "napi-macros": "^2.0.0", - "node-gyp-build": "^4.4.0", - "streamx": "^2.14.0" - } - }, - "node_modules/uglify-js": { - "version": "3.19.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.2.tgz", - "integrity": "sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/undici": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.13.0.tgz", - "integrity": "sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", + "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", + "license": "MIT", "engines": { - "node": ">=18.0" + "node": ">=18.17" } }, "node_modules/undici-types": { @@ -5526,6 +5450,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, "engines": { "node": ">= 10.0.0" } @@ -5533,17 +5458,23 @@ "node_modules/unix-path-resolve": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unix-path-resolve/-/unix-path-resolve-1.0.2.tgz", - "integrity": "sha512-kG4g5nobBBaMnH2XbrS4sLUXEpx4nY2J3C6KAlAUcnahG2HChxSPVKWYrqEq76iTo+cyMkLUjqxGaQR2tz097Q==" + "integrity": "sha512-kG4g5nobBBaMnH2XbrS4sLUXEpx4nY2J3C6KAlAUcnahG2HChxSPVKWYrqEq76iTo+cyMkLUjqxGaQR2tz097Q==", + "license": "MIT" }, - "node_modules/unordered-set": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unordered-set/-/unordered-set-2.0.1.tgz", - "integrity": "sha512-eUmNTPzdx+q/WvOHW0bgGYLWvWHNT3PTKEQLg0MAQhc0AHASHVHoP/9YytYd4RBVariqno/mEUhVZN98CmD7bg==" + "node_modules/unslab": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/unslab/-/unslab-1.3.0.tgz", + "integrity": "sha512-YATkfKAFj47kTzmiQrWXMyRvaVrHsW6MEALa4bm+FhiA2YG4oira+Z3DXN6LrYOYn2Y8eO94Lwl9DOHjs1FpoQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.6" + } }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -5580,35 +5511,6 @@ "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==" - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5623,15 +5525,11 @@ "node": ">= 8" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" - }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -5649,6 +5547,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -5665,6 +5564,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -5672,12 +5572,14 @@ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5691,6 +5593,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5702,6 +5605,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -5715,24 +5619,16 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/xache": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/xache/-/xache-1.2.0.tgz", - "integrity": "sha512-AiWCGTrnsh//rrbJt8DLbDkDW8eLp1Ktkq0nTWzpE+FKCY35oeqLjtz+LNb4abMnjfTgL0ZBaSwzhgzan1ocEw==" - }, - "node_modules/xsalsa20": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.2.0.tgz", - "integrity": "sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/xache/-/xache-1.2.1.tgz", + "integrity": "sha512-igRS6jPreJ54ABdzhh4mCDXcz+XMaWO2q1ABRV2yWYuk29jlp8VT7UBdCqNkX7rpYBbXsebVVKkwIuYZjyZNqA==", + "license": "MIT" }, "node_modules/yaml": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", + "dev": true, "engines": { "node": ">= 14" } @@ -5741,6 +5637,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yauzl-promise/-/yauzl-promise-4.0.0.tgz", "integrity": "sha512-/HCXpyHXJQQHvFq9noqrjfa/WpQC2XYs3vI7tBiAi4QiIU1knvYhZGaO1QPjwIVMdqflxbmwgMXtYeaRiAE0CA==", + "license": "MIT", "dependencies": { "@node-rs/crc32": "^1.7.0", "is-it-type": "^5.1.2", @@ -5763,9 +5660,10 @@ } }, "node_modules/z32": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/z32/-/z32-1.0.1.tgz", - "integrity": "sha512-Uytfqf6VEVchHKZDw0NRdCViOARHP84uzvOw0CXCMLOwhgHZUL9XibpEPLLQN10mCVLxOlGCQWbkV7km7yNYcw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/z32/-/z32-1.1.0.tgz", + "integrity": "sha512-1WUHy+VS6d0HPNspDxvLssBbeQjXMjSnpv0vH82vRAUfg847NmX3OXozp/hRP5jPhxBbrVzrgvAt+UsGNzRFQQ==", + "license": "MIT", "dependencies": { "b4a": "^1.5.3" } @@ -5779,13 +5677,134 @@ "dev": true }, "@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", "requires": { "regenerator-runtime": "^0.14.0" } }, + "@comapeo/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@comapeo/core/-/core-1.0.1.tgz", + "integrity": "sha512-soQTuH+vLTXrLu56BPH6axSMC3gLa0FZip2cjnhQ1b94R8HpcM+IbRbK1KpHnwZl8zZEqGPZZ88DxRPiK1+uLw==", + "requires": { + "@comapeo/schema": "1.0.0", + "@digidem/types": "^2.3.0", + "@electron/asar": "^3.2.8", + "@fastify/error": "^3.4.1", + "@fastify/static": "^7.0.3", + "@fastify/type-provider-typebox": "^4.0.0", + "@hyperswarm/secret-stream": "^6.1.2", + "@mapeo/crypto": "1.0.0-alpha.10", + "@mapeo/sqlite-indexer": "1.0.0-alpha.9", + "@sinclair/typebox": "^0.29.6", + "b4a": "^1.6.3", + "bcp-47": "^2.1.0", + "better-sqlite3": "^8.7.0", + "big-sparse-array": "^1.0.3", + "bogon": "^1.1.0", + "compact-encoding": "^2.12.0", + "corestore": "6.8.4", + "debug": "^4.3.4", + "dot-prop": "^9.0.0", + "drizzle-orm": "^0.30.8", + "fastify": ">= 4", + "fastify-plugin": "^4.5.1", + "hyperblobs": "2.3.0", + "hypercore": "10.17.0", + "hypercore-crypto": "3.4.2", + "hyperdrive": "11.5.3", + "json-stable-stringify": "^1.1.1", + "magic-bytes.js": "^1.10.0", + "map-obj": "^5.0.2", + "mime": "^4.0.3", + "multi-core-indexer": "^1.0.0-alpha.10", + "p-defer": "^4.0.0", + "p-event": "^6.0.1", + "p-timeout": "^6.1.2", + "protobufjs": "^7.2.3", + "protomux": "^3.4.1", + "quickbit-universal": "^2.2.0", + "sodium-universal": "^4.0.0", + "start-stop-state-machine": "^1.2.0", + "streamx": "^2.19.0", + "sub-encoder": "^2.1.1", + "throttle-debounce": "^5.0.0", + "tiny-typed-emitter": "^2.1.0", + "type-fest": "^4.5.0", + "undici": "^6.13.0", + "varint": "^6.0.0", + "yauzl-promise": "^4.0.0" + }, + "dependencies": { + "@digidem/types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@digidem/types/-/types-2.3.0.tgz", + "integrity": "sha512-05dj9Z/xEmKQ5s9bl5doBHmmefgYoOQPn2BNu4eAbf6qgm6kylT1N94Ynr1zpdww+sB4sT9vjzAbc3BXtxQAKw==", + "requires": { + "@types/node": "^18.16.19", + "@types/streamx": "^2.9.1", + "tiny-typed-emitter": "^2.1.0" + } + }, + "@types/node": { + "version": "18.19.50", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.50.tgz", + "integrity": "sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==", + "requires": { + "undici-types": "~5.26.4" + } + }, + "p-timeout": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", + "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==" + }, + "type-fest": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==" + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" + } + } + }, + "@comapeo/ipc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@comapeo/ipc/-/ipc-1.0.1.tgz", + "integrity": "sha512-z0G6fFNUVb4VWg4X6NMvLk3kQp4M11Mb0UqOq5+o3Vtd55xb/cx/yROUajgt4vFee0ubaPfuy+zBHosY1Cn0rA==", + "requires": { + "eventemitter3": "^5.0.1", + "p-defer": "^4.0.0", + "rpc-reflector": "^1.3.11" + } + }, + "@comapeo/schema": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@comapeo/schema/-/schema-1.0.0.tgz", + "integrity": "sha512-dK227I+0yg9D2y5/O5NGywx50tgeNYyUkl1uYnSmNAPlbv+r2KX9aaC9m4dEjIja2aR2VFnYn6z537ERZiahqQ==", + "requires": { + "compact-encoding": "^2.12.0", + "protobufjs": "^7.2.5", + "type-fest": "^4.26.0" + }, + "dependencies": { + "type-fest": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==" + } + } + }, "@digidem/types": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@digidem/types/-/types-2.1.0.tgz", @@ -5806,10 +5825,11 @@ } }, "@electron/asar": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.9.tgz", - "integrity": "sha512-Vu2P3X2gcZ3MY9W7yH72X9+AMXwUQZEJBrsPIbX0JsdllLtoh62/Q8Wg370/DawIEVKOyfD6KtTLo645ezqxUA==", + "version": "3.2.13", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.13.tgz", + "integrity": "sha512-pY5z2qQSwbFzJsBdgfJIzXf5ElHTVMutC2dxh0FD60njknMu3n1NnTABOcQwbb5/v5soqE79m9UjaJryBf3epg==", "requires": { + "@types/glob": "^7.1.0", "commander": "^5.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4" @@ -5848,18 +5868,28 @@ } }, "@emnapi/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.1.0.tgz", - "integrity": "sha512-gNEVZo0HhUfVjhr6rFG//HZXbauclxueiDxaKGBZHcK5h8i9pslABNPfG8kMwYTubAn3mV7AyOZN8gfPRgbU8A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.2.0.tgz", + "integrity": "sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==", "optional": true, "requires": { + "@emnapi/wasi-threads": "1.0.1", "tslib": "^2.4.0" } }, "@emnapi/runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.1.0.tgz", - "integrity": "sha512-gCGlE0fJGWalfy+wbFApjhKn6uoSVvopru77IPyxNKkjkaiSx2HxDS7eOYSmo9dcMIhmmIvoxiC3N9TM1c3EaA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", + "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", + "optional": true, + "requires": { + "tslib": "^2.4.0" + } + }, + "@emnapi/wasi-threads": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", + "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", "optional": true, "requires": { "tslib": "^2.4.0" @@ -5962,20 +5992,22 @@ "integrity": "sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==" }, "@fastify/ajv-compiler": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.5.0.tgz", - "integrity": "sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.6.0.tgz", + "integrity": "sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==", "requires": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", "fast-uri": "^2.0.0" + }, + "dependencies": { + "fast-uri": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", + "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==" + } } }, - "@fastify/deepmerge": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@fastify/deepmerge/-/deepmerge-1.3.0.tgz", - "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" - }, "@fastify/error": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", @@ -5989,345 +6021,44 @@ "fast-json-stringify": "^5.7.0" } }, - "@fastify/send": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/send/-/send-2.1.0.tgz", - "integrity": "sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==", - "requires": { - "@lukeed/ms": "^2.0.1", - "escape-html": "~1.0.3", - "fast-decode-uri-component": "^1.0.1", - "http-errors": "2.0.0", - "mime": "^3.0.0" - }, - "dependencies": { - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" - } - } - }, - "@fastify/static": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@fastify/static/-/static-7.0.4.tgz", - "integrity": "sha512-p2uKtaf8BMOZWLs6wu+Ihg7bWNBdjNgCwDza4MJtTqg+5ovKmcbgbR9Xs5/smZ1YISfzKOCNYmZV8LaCj+eJ1Q==", - "requires": { - "@fastify/accept-negotiator": "^1.0.0", - "@fastify/send": "^2.0.0", - "content-disposition": "^0.5.3", - "fastify-plugin": "^4.0.0", - "fastq": "^1.17.0", - "glob": "^10.3.4" - }, - "dependencies": { - "glob": { - "version": "10.3.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", - "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.11.0" - } - }, - "minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@fastify/type-provider-typebox": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@fastify/type-provider-typebox/-/type-provider-typebox-4.0.0.tgz", - "integrity": "sha512-kTlN0saC/+xhcQPyBjb3YONQAMjiD/EHlCRjQjsr5E3NFjS5K8ZX5LGzXYDRjSa+sV4y8gTL5Q7FlObePv4iTA==", - "requires": {} - }, - "@humanwhocodes/config-array": { - "version": "0.11.12", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.12.tgz", - "integrity": "sha512-NlGesA1usRNn6ctHCZ21M4/dKPgW9Nn1FypRdIKKgZOKzkVV4T1FlK5mBiLhHBCDmEbdQG0idrcXlbZfksJ+RA==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.0", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.0.tgz", - "integrity": "sha512-9S9QrXY2K0L4AGDcSgTi9vgiCcG8VcBv4Mp7/1hDPYoswIy6Z6KO5blYto82BT8M0MZNRWmCFLpCs3HlpYGGdw==", - "dev": true - }, - "@hyperswarm/secret-stream": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@hyperswarm/secret-stream/-/secret-stream-6.2.0.tgz", - "integrity": "sha512-eBoHJaw8KUNR1Zj8HzrlvZ+/RzSFXkZFBBovzgkso93D3DEVHrfP4ddhwbq7HQI8l5YnRYm4Obj+IsdX1PiT5w==", - "requires": { - "b4a": "^1.1.0", - "hypercore-crypto": "^3.3.1", - "noise-curve-ed": "^2.0.1", - "noise-handshake": "^3.0.2", - "sodium-secretstream": "^1.1.0", - "sodium-universal": "^4.0.0", - "streamx": "^2.14.0", - "timeout-refresh": "^2.0.0" - } - }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@json-schema-spec/json-pointer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@json-schema-spec/json-pointer/-/json-pointer-0.1.2.tgz", - "integrity": "sha512-BYY7IavBjwsWWSmVcMz2A9mKiDD9RvacnsItgmy1xV8cmgbtxFfKmKMtkVpD7pYtkx4mIW4800yZBXueVFIWPw==" - }, - "@json-schema-tools/dereferencer": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@json-schema-tools/dereferencer/-/dereferencer-1.6.3.tgz", - "integrity": "sha512-NoQkj6hx9Joqbd/GZAOHSGtE6R+OzlnOcDfyidmx8e/CUv1Q+Z6/fmZo2wwCQWiwP1pnGYc95iKwp8M7XlV7wQ==", - "requires": { - "@json-schema-tools/reference-resolver": "^1.2.6", - "@json-schema-tools/traverse": "^1.10.4", - "fast-safe-stringify": "^2.1.1" - } - }, - "@json-schema-tools/reference-resolver": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@json-schema-tools/reference-resolver/-/reference-resolver-1.2.6.tgz", - "integrity": "sha512-4QZu5ROb5EpLSvV+buzk8WR30W+dffSNaKqD3VGFYJ3y0BLDi2OHoSz5e6NKcLYTyUYXV8IKxocNOszeVBJI4Q==", - "requires": { - "@json-schema-spec/json-pointer": "^0.1.2", - "isomorphic-fetch": "^3.0.0" - } - }, - "@json-schema-tools/traverse": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@json-schema-tools/traverse/-/traverse-1.10.4.tgz", - "integrity": "sha512-9e42zjhLIxzBONroNC4SGsTqdB877tzwH2S6lqgTav9K24kWJR9vNieeMVSuyqnY8FlclH21D8wsm/tuD9WA9Q==" - }, - "@lukeed/ms": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz", - "integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==" - }, - "@mapeo/core": { - "version": "9.0.0-alpha.16", - "resolved": "https://registry.npmjs.org/@mapeo/core/-/core-9.0.0-alpha.16.tgz", - "integrity": "sha512-DYHsa5BhCFsZvbgq3zCqUiWDmRsdTpKLYKz/5gkwCj2Qaj0aLrng7iNCm5ULtsUa01FY+VI1Z68N/pGhVrP1dw==", + "@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", "requires": { - "@digidem/types": "^2.3.0", - "@electron/asar": "^3.2.8", - "@fastify/error": "^3.4.1", - "@fastify/static": "^7.0.3", - "@fastify/type-provider-typebox": "^4.0.0", - "@hyperswarm/secret-stream": "^6.1.2", - "@mapeo/crypto": "1.0.0-alpha.10", - "@mapeo/schema": "^3.0.0-next.19", - "@mapeo/sqlite-indexer": "1.0.0-alpha.9", - "@sinclair/typebox": "^0.29.6", - "b4a": "^1.6.3", - "bcp-47": "^2.1.0", - "better-sqlite3": "^8.7.0", - "big-sparse-array": "^1.0.3", - "bogon": "^1.1.0", - "compact-encoding": "^2.12.0", - "corestore": "^6.8.4", - "debug": "^4.3.4", - "dot-prop": "^9.0.0", - "drizzle-orm": "^0.30.8", - "fastify": ">= 4", - "fastify-plugin": "^4.5.1", - "hyperblobs": "2.3.0", - "hypercore": "10.17.0", - "hypercore-crypto": "3.4.0", - "hyperdrive": "11.5.3", - "hyperswarm": "4.4.1", - "json-stable-stringify": "^1.1.1", - "magic-bytes.js": "^1.10.0", - "map-obj": "^5.0.2", - "mime": "^4.0.3", - "multi-core-indexer": "^1.0.0-alpha.10", - "p-defer": "^4.0.0", - "p-event": "^6.0.1", - "p-timeout": "^6.1.2", - "patch-package": "^8.0.0", - "protobufjs": "^7.2.3", - "protomux": "^3.4.1", - "quickbit-universal": "^2.2.0", - "sodium-universal": "^4.0.0", - "start-stop-state-machine": "^1.2.0", - "sub-encoder": "^2.1.1", - "throttle-debounce": "^5.0.0", - "tiny-typed-emitter": "^2.1.0", - "type-fest": "^4.5.0", - "undici": "^6.13.0", - "varint": "^6.0.0", - "yauzl-promise": "^4.0.0" - }, - "dependencies": { - "@digidem/types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@digidem/types/-/types-2.3.0.tgz", - "integrity": "sha512-05dj9Z/xEmKQ5s9bl5doBHmmefgYoOQPn2BNu4eAbf6qgm6kylT1N94Ynr1zpdww+sB4sT9vjzAbc3BXtxQAKw==", - "requires": { - "@types/node": "^18.16.19", - "@types/streamx": "^2.9.1", - "tiny-typed-emitter": "^2.1.0" - } - }, - "@types/node": { - "version": "18.19.33", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz", - "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==", - "requires": { - "undici-types": "~5.26.4" - } - }, - "hypercore": { - "version": "10.17.0", - "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-10.17.0.tgz", - "integrity": "sha512-Yp9lyfUjp81Gy1nPHemNFtYQtngliCGZ6prH+qxvjr2FPVG1QFtNqtOh+ZxFu4hXZ1dAOLYkQOA7Qq2vjFe64A==", - "requires": { - "@hyperswarm/secret-stream": "^6.0.0", - "b4a": "^1.1.0", - "big-sparse-array": "^1.0.3", - "compact-encoding": "^2.11.0", - "crc-universal": "^1.0.2", - "events": "^3.3.0", - "flat-tree": "^1.9.0", - "hypercore-crypto": "^3.2.1", - "is-options": "^1.0.1", - "protomux": "^3.4.0", - "quickbit-universal": "^2.1.1", - "random-access-file": "^4.0.0", - "random-array-iterator": "^1.0.0", - "safety-catch": "^1.0.1", - "sodium-universal": "^4.0.0", - "streamx": "^2.12.4", - "xache": "^1.1.0", - "z32": "^1.0.0" - } - }, - "p-timeout": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", - "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==" - }, - "type-fest": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.1.tgz", - "integrity": "sha512-ShaaYnjf+0etG8W/FumARKMjjIToy/haCaTjN2dvcewOSoNqCQzdgG7m2JVOlM5qndGTHjkvsrWZs+k/2Z7E0Q==" - }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" - } - } - }, - "@mapeo/crypto": { - "version": "1.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@mapeo/crypto/-/crypto-1.0.0-alpha.10.tgz", - "integrity": "sha512-TEK8HN1W0XZOOADIMxa4saXtqAZKyBDeVVn3RBCcPaCiOGHeYy43/0rMnBVTbXZCLsLVPnOXwv6vg+vUkasrWQ==", - "requires": { - "@types/b4a": "^1.6.0", - "b4a": "^1.6.4", - "base-x": "^3.0.9", - "base32.js": "^0.1.0", - "compact-encoding": "^2.5.1", - "compact-encoding-net": "^1.0.1", - "compact-encoding-struct": "^1.2.0", - "crc": "^3.8.0", - "lodash": "^4.17.21", - "sodium-universal": "^4.0.0", - "z32": "^1.0.0" - } - }, - "@mapeo/default-config": { - "version": "4.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@mapeo/default-config/-/default-config-4.0.0-alpha.6.tgz", - "integrity": "sha512-FSpeqM7KE3zc+jbPy7vwl4T9TznbDxE7CYJQ2bIKtrs+DSmyOlyEyJ6ZeBKTEyOf0ZJC7xFLU3VtXfWFwxeoqQ==" + "fast-deep-equal": "^3.1.3" + } }, - "@mapeo/ipc": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@mapeo/ipc/-/ipc-0.11.0.tgz", - "integrity": "sha512-KxLb/sfEVpwf6z4n7CAJBmd7nVgS5FwxZ/Eb1UdJE3xeeUOF0GNGFxFHOF/0jN9+rhexJ/H8hrwHtNjY1/bbFw==", + "@fastify/send": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/send/-/send-2.1.0.tgz", + "integrity": "sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==", "requires": { - "eventemitter3": "^5.0.1", - "p-defer": "^4.0.0", - "rpc-reflector": "^1.3.11" + "@lukeed/ms": "^2.0.1", + "escape-html": "~1.0.3", + "fast-decode-uri-component": "^1.0.1", + "http-errors": "2.0.0", + "mime": "^3.0.0" + }, + "dependencies": { + "mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" + } } }, - "@mapeo/schema": { - "version": "3.0.0-next.19", - "resolved": "https://registry.npmjs.org/@mapeo/schema/-/schema-3.0.0-next.19.tgz", - "integrity": "sha512-lG98YaaX/Ww07tTzbhfvBDZpk5DY0HnPAo8fSYrIKu5Kw9Xo559NT+vmmQbZhINZoRCJATFXxnNMW3TvQE4qCw==", + "@fastify/static": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@fastify/static/-/static-7.0.4.tgz", + "integrity": "sha512-p2uKtaf8BMOZWLs6wu+Ihg7bWNBdjNgCwDza4MJtTqg+5ovKmcbgbR9Xs5/smZ1YISfzKOCNYmZV8LaCj+eJ1Q==", "requires": { - "@json-schema-tools/dereferencer": "^1.6.1", - "ajv": "^8.12.0", - "ajv-formats": "^2.1.1", - "compact-encoding": "^2.12.0", - "glob": "^10.3.3", - "protobufjs": "^7.2.5", - "type-fest": "^4.1.0", - "typedoc": "^0.24.8", - "typedoc-plugin-markdown": "^3.15.4" + "@fastify/accept-negotiator": "^1.0.0", + "@fastify/send": "^2.0.0", + "content-disposition": "^0.5.3", + "fastify-plugin": "^4.0.0", + "fastq": "^1.17.0", + "glob": "^10.3.4" }, "dependencies": { "glob": { @@ -6343,15 +6074,6 @@ "path-scurry": "^1.11.1" } }, - "jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, "minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -6359,39 +6081,121 @@ "requires": { "brace-expansion": "^2.0.1" } - }, - "type-fest": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.24.0.tgz", - "integrity": "sha512-spAaHzc6qre0TlZQQ2aA/nGMe+2Z/wyGk5Z+Ru2VUfdNwT6kWO6TjevOlpebsATEG1EIQ2sOiDszud3lO5mt/Q==" - }, - "typedoc": { - "version": "0.24.8", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz", - "integrity": "sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w==", + } + } + }, + "@fastify/type-provider-typebox": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@fastify/type-provider-typebox/-/type-provider-typebox-4.1.0.tgz", + "integrity": "sha512-mXNBaBEoS6Yf4/O2ujNhu9yEZwvBC7niqRESsiftE9NP1hV6ZdV3ZsFbPf1S520BK3rTZ0F28zr+sMdIXNJlfw==", + "requires": {} + }, + "@humanwhocodes/config-array": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.12.tgz", + "integrity": "sha512-NlGesA1usRNn6ctHCZ21M4/dKPgW9Nn1FypRdIKKgZOKzkVV4T1FlK5mBiLhHBCDmEbdQG0idrcXlbZfksJ+RA==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^2.0.0", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { - "lunr": "^2.3.9", - "marked": "^4.3.0", - "minimatch": "^9.0.0", - "shiki": "^0.14.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "typedoc-plugin-markdown": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.17.1.tgz", - "integrity": "sha512-QzdU3fj0Kzw2XSdoL15ExLASt2WPqD7FbLeaqwT70+XjKyTshBnUlQA5nNREO1C2P8Uen0CDjsBLMsCQ+zd0lw==", + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "requires": { - "handlebars": "^4.7.7" + "brace-expansion": "^1.1.7" } - }, - "typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "peer": true } } }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.0.tgz", + "integrity": "sha512-9S9QrXY2K0L4AGDcSgTi9vgiCcG8VcBv4Mp7/1hDPYoswIy6Z6KO5blYto82BT8M0MZNRWmCFLpCs3HlpYGGdw==", + "dev": true + }, + "@hyperswarm/secret-stream": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@hyperswarm/secret-stream/-/secret-stream-6.6.3.tgz", + "integrity": "sha512-F/EF5KLUqjkTNFof1K5dz57CwrwjSzG0XxZe2X9t/2/mG5iQ28yJIwNcVabkWS1Wk2ZB719piVGKk6YbwkJ0aQ==", + "requires": { + "b4a": "^1.1.0", + "hypercore-crypto": "^3.3.1", + "noise-curve-ed": "^2.0.1", + "noise-handshake": "^3.0.2", + "sodium-secretstream": "^1.1.0", + "sodium-universal": "^4.0.0", + "streamx": "^2.14.0", + "timeout-refresh": "^2.0.0" + } + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@lukeed/ms": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz", + "integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==" + }, + "@mapeo/crypto": { + "version": "1.0.0-alpha.10", + "resolved": "https://registry.npmjs.org/@mapeo/crypto/-/crypto-1.0.0-alpha.10.tgz", + "integrity": "sha512-TEK8HN1W0XZOOADIMxa4saXtqAZKyBDeVVn3RBCcPaCiOGHeYy43/0rMnBVTbXZCLsLVPnOXwv6vg+vUkasrWQ==", + "requires": { + "@types/b4a": "^1.6.0", + "b4a": "^1.6.4", + "base-x": "^3.0.9", + "base32.js": "^0.1.0", + "compact-encoding": "^2.5.1", + "compact-encoding-net": "^1.0.1", + "compact-encoding-struct": "^1.2.0", + "crc": "^3.8.0", + "lodash": "^4.17.21", + "sodium-universal": "^4.0.0", + "z32": "^1.0.0" + } + }, + "@mapeo/default-config": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@mapeo/default-config/-/default-config-5.0.0.tgz", + "integrity": "sha512-SNUUxN0UI0i/g5XshUKuLY1O3SWClzwgM3qiiBDW3Dw+AcHK+jdONFK6KjvwYK13cwdQadTzIJbEKWmLP+0UWA==" + }, "@mapeo/sqlite-indexer": { "version": "1.0.0-alpha.9", "resolved": "https://registry.npmjs.org/@mapeo/sqlite-indexer/-/sqlite-indexer-1.0.0-alpha.9.tgz", @@ -6407,122 +6211,122 @@ "integrity": "sha512-Vwhc3ObxmDZmA5hY8mfsau2rJ4vGPvzbj20QSZ2/E1GDPF61QVyjLfNHak9xmel6pW4heRt3v1fHa6np9Ehfeg==" }, "@napi-rs/wasm-runtime": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.1.2.tgz", - "integrity": "sha512-8JuczewTFIZ/XIjHQ+YlQUydHvlKx2hkcxtuGwh+t/t5zWyZct6YG4+xjHcq8xyc/e7FmFwf42Zj2YgICwmlvA==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", + "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", "optional": true, "requires": { "@emnapi/core": "^1.1.0", "@emnapi/runtime": "^1.1.0", - "@tybys/wasm-util": "^0.8.1" + "@tybys/wasm-util": "^0.9.0" } }, "@node-rs/crc32": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32/-/crc32-1.10.0.tgz", - "integrity": "sha512-SFvU8PGZexRMRPUhi+4a9LW4oqFuK5CLEElysrKoRtNkJ+LcRFL+b3wfuzbcDq/ea0rS0nzRLFZwVsNVyWaGew==", - "requires": { - "@node-rs/crc32-android-arm-eabi": "1.10.0", - "@node-rs/crc32-android-arm64": "1.10.0", - "@node-rs/crc32-darwin-arm64": "1.10.0", - "@node-rs/crc32-darwin-x64": "1.10.0", - "@node-rs/crc32-freebsd-x64": "1.10.0", - "@node-rs/crc32-linux-arm-gnueabihf": "1.10.0", - "@node-rs/crc32-linux-arm64-gnu": "1.10.0", - "@node-rs/crc32-linux-arm64-musl": "1.10.0", - "@node-rs/crc32-linux-x64-gnu": "1.10.0", - "@node-rs/crc32-linux-x64-musl": "1.10.0", - "@node-rs/crc32-wasm32-wasi": "1.10.0", - "@node-rs/crc32-win32-arm64-msvc": "1.10.0", - "@node-rs/crc32-win32-ia32-msvc": "1.10.0", - "@node-rs/crc32-win32-x64-msvc": "1.10.0" + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32/-/crc32-1.10.3.tgz", + "integrity": "sha512-4UgH0fDRxs0eMSgrUN0UUM4BpIEbVKutiSkFLICwegbgIger3c1t7V3jOYralK0xTBHraW3r59wlESdc3h/nQg==", + "requires": { + "@node-rs/crc32-android-arm-eabi": "1.10.3", + "@node-rs/crc32-android-arm64": "1.10.3", + "@node-rs/crc32-darwin-arm64": "1.10.3", + "@node-rs/crc32-darwin-x64": "1.10.3", + "@node-rs/crc32-freebsd-x64": "1.10.3", + "@node-rs/crc32-linux-arm-gnueabihf": "1.10.3", + "@node-rs/crc32-linux-arm64-gnu": "1.10.3", + "@node-rs/crc32-linux-arm64-musl": "1.10.3", + "@node-rs/crc32-linux-x64-gnu": "1.10.3", + "@node-rs/crc32-linux-x64-musl": "1.10.3", + "@node-rs/crc32-wasm32-wasi": "1.10.3", + "@node-rs/crc32-win32-arm64-msvc": "1.10.3", + "@node-rs/crc32-win32-ia32-msvc": "1.10.3", + "@node-rs/crc32-win32-x64-msvc": "1.10.3" } }, "@node-rs/crc32-android-arm-eabi": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-android-arm-eabi/-/crc32-android-arm-eabi-1.10.0.tgz", - "integrity": "sha512-IRas7ylc8nB3988nnaT4PC5ZuaK3VOrLbTyg1Y/5ZHlxsYpqLpCb7VMf/oRrHxkSzSTlluD+inv3J8UE3i5Ojg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-android-arm-eabi/-/crc32-android-arm-eabi-1.10.3.tgz", + "integrity": "sha512-V9iNJd5ux9I415qOldmxZIHrazYMJNsQ6v+Kq/t9FTQyYqiEeHvRc1FzBh9MT6Uc24InwMhBeC1WVw0BL4VaxQ==", "optional": true }, "@node-rs/crc32-android-arm64": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-android-arm64/-/crc32-android-arm64-1.10.0.tgz", - "integrity": "sha512-4vX1gB+rf3sYma/LLycmYsuFKolWdZX7tQOwLQ6PDwE7dAoN3mWAgS3RBw2G6PerGD9r90vSXWXPLJnF3OAhlw==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-android-arm64/-/crc32-android-arm64-1.10.3.tgz", + "integrity": "sha512-d6xLAhbk5FDGpltAKTFs7hZO/PWpHeihZ/ZCKx2LEVz8jXQEshpo2/ojnfb5FAw6oNzU2H+S/RI5GeCr7paa1Q==", "optional": true }, "@node-rs/crc32-darwin-arm64": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-darwin-arm64/-/crc32-darwin-arm64-1.10.0.tgz", - "integrity": "sha512-nAAdxZqxFBxqhI3ZMEGi7QDwg44N4laYO4iGIGhjLvsUDqJlYeIlqZ39Lh2gOK3D2uF/TaT4b0bU5EPHWnKMOQ==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-darwin-arm64/-/crc32-darwin-arm64-1.10.3.tgz", + "integrity": "sha512-IoX6HC4dlKc9BONe7632DADBtiHUiIVD7Bibuj3bGrvOBllN8hvBL9+dDC+/iDdOeuiBKgb0hgL5h2nPIybpzA==", "optional": true }, "@node-rs/crc32-darwin-x64": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-darwin-x64/-/crc32-darwin-x64-1.10.0.tgz", - "integrity": "sha512-0YhLJFDY7VAKlJ4+SdfZFY+u0X18tkuD3NCtPp1SYh1o9pWpFVBbTKWvdjjx/Ihqw0ozkfc3iewFJU7vlrDQJg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-darwin-x64/-/crc32-darwin-x64-1.10.3.tgz", + "integrity": "sha512-JUDGAX/0W4A9ok9p6yuy4fAsBDrq8Db0sUjKLMZ/+P3NHB+Qk+OsZUsEDxP3yhBJxhPq97JpN4bBzgMnkDajpw==", "optional": true }, "@node-rs/crc32-freebsd-x64": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-freebsd-x64/-/crc32-freebsd-x64-1.10.0.tgz", - "integrity": "sha512-BE0IeHn59GzaebTM85Dpe+ErPV8E+WuXd/sNyLLS8jZUuNoOJwFUKotm8CUFG+MI40N0U9PzvZjQSwaeMsyMsQ==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-freebsd-x64/-/crc32-freebsd-x64-1.10.3.tgz", + "integrity": "sha512-mbpVcrF9cRJm9ksv2vVaWc/yRsLJErdb90Kusc6I8CgsBxpS6/wI637i0khSl1l10iWrALXjfh6osihixANYhQ==", "optional": true }, "@node-rs/crc32-linux-arm-gnueabihf": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm-gnueabihf/-/crc32-linux-arm-gnueabihf-1.10.0.tgz", - "integrity": "sha512-R3mN3uSZaslJtXW3NXdropB9tHCnOgbrvq7MtmCRpHi2Ie3E46Ohi8cW0HgHjihptafTf8NWsoYzErm39BTY0Q==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm-gnueabihf/-/crc32-linux-arm-gnueabihf-1.10.3.tgz", + "integrity": "sha512-9MZohdtKzdnb16xRKU76t1UTEJu80dFO8f2/N0geJYNobnT1E6p/+5pqB/G1/H6OnPvjqMuFuLVL4BJVvO4GYQ==", "optional": true }, "@node-rs/crc32-linux-arm64-gnu": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm64-gnu/-/crc32-linux-arm64-gnu-1.10.0.tgz", - "integrity": "sha512-2zZ2RQLVhjCWRWiLvz/CoP5BFld/zE/uD2Z9Nk+Y5zmJ11CD1RC3lqKG1M3MgEiQq9CnWJxwyy5kM2q4jDeXkg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm64-gnu/-/crc32-linux-arm64-gnu-1.10.3.tgz", + "integrity": "sha512-t1+9ik4awZF+luQp94HsUH8M1lSw8jWjvQiLaHyxMzrM0NY0/oIkhjqdOswXL11Wybkc63eunNwVqGKWfJEi4Q==", "optional": true }, "@node-rs/crc32-linux-arm64-musl": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm64-musl/-/crc32-linux-arm64-musl-1.10.0.tgz", - "integrity": "sha512-WEIavGFHMAFe8NIKhbYnM6k2x7y6M/NQewXE8cqeV03Q8mLzCDBr34i/MzpW+M42NvEYgcM8c3Ayn2FijHb64Q==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm64-musl/-/crc32-linux-arm64-musl-1.10.3.tgz", + "integrity": "sha512-fsxOk9CpFzyon+vktvCICwhGk0b+tnfEZfPOXa3QDrkyZD7R7cHmpEHGim1BYgJZIJSTBfal5eM11hzBGjJbxw==", "optional": true }, "@node-rs/crc32-linux-x64-gnu": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-x64-gnu/-/crc32-linux-x64-gnu-1.10.0.tgz", - "integrity": "sha512-K/7aY/h8QngsLk0KsalQ3AlZ8ljXRisZgc20RcbB4UZkjl5AN6TeHQlVbx9U2MSBE5f6ViiZEr8c8CcID3W2Mg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-x64-gnu/-/crc32-linux-x64-gnu-1.10.3.tgz", + "integrity": "sha512-0zIX68FIeqpRMRNvmB5AgONnLMm628+8mV9UDuCRmGppME8WGnY+Dirx+TPUeTJ4f27+in+6CU4u6LJDi9cXmQ==", "optional": true }, "@node-rs/crc32-linux-x64-musl": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-x64-musl/-/crc32-linux-x64-musl-1.10.0.tgz", - "integrity": "sha512-GyCSm+Dp96qUvqrsxKgfd3TFrE8v5sRUYiMgNKK6G1m7nQb/VXvab9UoBSKeFw131odt3LlIuBAuhMnbb4za5w==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-x64-musl/-/crc32-linux-x64-musl-1.10.3.tgz", + "integrity": "sha512-dKKt0FEm8JDp2MvIu1J7vg8Dc5D5upNO6LAuvfShq9Hy8hYNQWy6f+AF8mSm/c5wWnjn+pv7I1+jvrZIe6wMig==", "optional": true }, "@node-rs/crc32-wasm32-wasi": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-wasm32-wasi/-/crc32-wasm32-wasi-1.10.0.tgz", - "integrity": "sha512-C+2IK5HwNUz2aiMGiN0RTijb80X5V1jo/o8bsHqi8ukoRyO6HLMhVn+xptqY+RRSf4VUzzNR5eHqD+WLcLId0g==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-wasm32-wasi/-/crc32-wasm32-wasi-1.10.3.tgz", + "integrity": "sha512-oT2V4r0lGZqZHkFLHeXu5Z8C8SutIvBVV0Ws3unz4/KhwmlMcOZYRmSelUSSILbjNLrg4FihCe20tC1VbmaNxA==", "optional": true, "requires": { - "@napi-rs/wasm-runtime": "^0.1.1" + "@napi-rs/wasm-runtime": "^0.2.3" } }, "@node-rs/crc32-win32-arm64-msvc": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-arm64-msvc/-/crc32-win32-arm64-msvc-1.10.0.tgz", - "integrity": "sha512-RaVo4edbEM3DyQkvXGKdPizUmr2A4NjLMk/1x9b/tz/k2rdd+QaPAauDwWAzs7SKoDBV9H4qc3hNFuKGjjRhjA==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-arm64-msvc/-/crc32-win32-arm64-msvc-1.10.3.tgz", + "integrity": "sha512-IwP/TjDoQycv3ZCbAHV3qS9oH8pmBo7h9RC0chOvKY0g9+RxRl0nXhxcAcmZvJugKdJd+eCOR9fJrWzcwQOgFg==", "optional": true }, "@node-rs/crc32-win32-ia32-msvc": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-ia32-msvc/-/crc32-win32-ia32-msvc-1.10.0.tgz", - "integrity": "sha512-5KqJFdzRXELpXcdNgahafjkc9MxZJfKDVkFPBMkQIjjkv8PQ49DVw15/7yuhAN0pyYccNaUil4vtVoo7WTIVgQ==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-ia32-msvc/-/crc32-win32-ia32-msvc-1.10.3.tgz", + "integrity": "sha512-YK0qYTHUFqriqAkHyXfe3IpDFfpG5fc2yuNl7MXn4ejklLLyNQPOCSawvPU7ouOBgtQDaAH60yZhFhsXZfwSfQ==", "optional": true }, "@node-rs/crc32-win32-x64-msvc": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-x64-msvc/-/crc32-win32-x64-msvc-1.10.0.tgz", - "integrity": "sha512-6b99QpwNCQube1xleD+9IcF6foEWHYQYjuZrHAR5diuP/uqM7i+KCgMU9fbCFLs5zmssYHO3CQSZ8G+V0eC59g==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-x64-msvc/-/crc32-win32-x64-msvc-1.10.3.tgz", + "integrity": "sha512-VI9jd8ECiij4YADsfzVuDnhk/UZ5op4RYHyN40yZzwhzcOQ8DDluOeHv91FPHSyMYJEsVsqbr3cqtD6R47xYjw==", "optional": true }, "@nodelib/fs.scandir": { @@ -6689,26 +6493,26 @@ "dev": true }, "@tybys/wasm-util": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.8.1.tgz", - "integrity": "sha512-GSsTwyBl4pIzsxAY5wroZdyQKyhXk0d8PCRZtrSZ2WEB1cBdrp2EgGBwHOGCZtIIPun/DL3+AykCv+J6fyRH4Q==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", "optional": true, "requires": { "tslib": "^2.4.0" } }, "@types/b4a": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@types/b4a/-/b4a-1.6.3.tgz", - "integrity": "sha512-zdzwrNkqvFdqbhbmyl5akTma8GI5ctg1QJBkWXQxgPM5vK4/9JX/xMImb0diAkVFuw6SGckTf8JiNxZlSwA3ag==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@types/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-Cc8vY7BHSjttPbLCQ4+C+v8EfWlki2yxwCJV8sbsMChzcj46CXKx4iP71HbWxyHiSSyC+t3hbTtFnWVpNwDs1w==", "requires": { "@types/node": "*" } }, "@types/better-sqlite3": { - "version": "7.6.5", - "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.5.tgz", - "integrity": "sha512-H3ZUx89KiPhYa9nalUXVVStSUFHuzYxt4yoazufpTTYW9rVUCzhh02V8CH2C8nE4libnK0UgFq5DFIe0DOhqow==", + "version": "7.6.11", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.11.tgz", + "integrity": "sha512-i8KcD3PgGtGBLl3+mMYA8PdKkButvPyARxA7IQAd6qeslht13qxb1zzO8dRCtE7U3IoJS782zDBAeoKiM695kg==", "requires": { "@types/node": "*" } @@ -6728,6 +6532,20 @@ "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", "dev": true }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" + }, "@types/ms": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", @@ -6759,7 +6577,8 @@ "@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true }, "abort-controller": { "version": "3.0.0", @@ -6788,14 +6607,14 @@ "requires": {} }, "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" } }, "ajv-formats": { @@ -6807,14 +6626,9 @@ } }, "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "ansi-sequence-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", - "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" }, "ansi-styles": { "version": "4.3.0", @@ -6824,11 +6638,6 @@ "color-convert": "^2.0.1" } }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" - }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -6838,7 +6647,8 @@ "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true }, "atomic-sleep": { "version": "1.0.0", @@ -6846,29 +6656,87 @@ "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" }, "avvio": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.2.1.tgz", - "integrity": "sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.4.0.tgz", + "integrity": "sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==", "requires": { - "archy": "^1.0.0", - "debug": "^4.0.0", - "fastq": "^1.6.1" + "@fastify/error": "^3.3.0", + "fastq": "^1.17.1" } }, "b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==" }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "bare-addon-resolve": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/bare-addon-resolve/-/bare-addon-resolve-1.4.2.tgz", + "integrity": "sha512-tvUF2orgRAfazmCwZuOUtj5sudU1iowTtwlD63BGvxh50KrHugBMQAUaSk4KxjfEznT99PuJyJSpc4ObPTiS6g==", + "optional": true, + "requires": { + "bare-module-resolve": "^1.5.0" + } + }, + "bare-events": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==" + }, + "bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "optional": true, + "requires": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "bare-module-resolve": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/bare-module-resolve/-/bare-module-resolve-1.6.1.tgz", + "integrity": "sha512-IM+aQ7c0HXpKbKTFLakMohyxfOxl+lj9w3mWkHAMMCmAf1SO8rNOX+chyERkefi5BN/Fr3l177CfS4c0wK6AxA==", + "optional": true, + "requires": { + "semver": "^7.6.0" + } + }, + "bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", + "optional": true + }, + "bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "optional": true, + "requires": { + "bare-os": "^2.1.0" + } + }, + "bare-stream": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.0.tgz", + "integrity": "sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==", + "optional": true, + "requires": { + "b4a": "^1.6.6", + "streamx": "^2.20.0" + } + }, "base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "requires": { "safe-buffer": "^5.0.1" } @@ -6923,14 +6791,6 @@ "file-uri-to-path": "1.0.0" } }, - "bits-to-bytes": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bits-to-bytes/-/bits-to-bytes-1.3.0.tgz", - "integrity": "sha512-OJoHTpFXS9bXHBCekGTByf3MqM8CGblBDIduKQeeVVeiU9dDWywSSirXIBYGgg3d1zbVuvnMa1vD4r6PA0kOKg==", - "requires": { - "b4a": "^1.5.0" - } - }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -6941,38 +6801,6 @@ "readable-stream": "^3.4.0" } }, - "blake2b": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", - "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", - "requires": { - "blake2b-wasm": "^2.4.0", - "nanoassert": "^2.0.0" - } - }, - "blake2b-wasm": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", - "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", - "requires": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "blind-relay": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/blind-relay/-/blind-relay-1.3.1.tgz", - "integrity": "sha512-GNOCAQG76WvN8e1k4C8UyQgfpSl8h2NiUgr6aFQJY/WKISvsU1flG0o3TJoUGn5K9uvtbEUtdulgikS1aYKbAQ==", - "requires": { - "b4a": "^1.6.4", - "bits-to-bytes": "^1.3.0", - "compact-encoding": "^2.12.0", - "compact-encoding-bitfield": "^1.0.0", - "protomux": "^3.5.1", - "sodium-universal": "^4.0.0", - "streamx": "^2.15.1" - } - }, "bogon": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/bogon/-/bogon-1.1.0.tgz", @@ -6994,6 +6822,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -7031,18 +6860,11 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "chacha20-universal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chacha20-universal/-/chacha20-universal-1.0.4.tgz", - "integrity": "sha512-/IOxdWWNa7nRabfe7+oF+jVkGjlr2xUL4J8l/OvzZhj+c9RpMqoo3Dq+5nU1j/BflRV4BKnaQ4+4oH1yBpQG1Q==", - "requires": { - "nanoassert": "^2.0.0" - } - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7056,7 +6878,8 @@ "ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true }, "codecs": { "version": "3.1.0", @@ -7091,21 +6914,13 @@ "dev": true }, "compact-encoding": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/compact-encoding/-/compact-encoding-2.12.0.tgz", - "integrity": "sha512-8eCZLmyBT4LtC90F/ekIqWos8Y7NaFxY75qa/SlSDVa95NVgMcibQb8z8MTeKb9zctemOJczSXMf5pwMqKjYEQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/compact-encoding/-/compact-encoding-2.15.0.tgz", + "integrity": "sha512-af/NomxL9Mo0lqCk++rxLLDZI+lJqeBrPt4dK6FbjxTCEhfC9yQAIoO6yq9ixyCirce0luQwErkwJrhem6clxA==", "requires": { "b4a": "^1.3.0" } }, - "compact-encoding-bitfield": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/compact-encoding-bitfield/-/compact-encoding-bitfield-1.0.0.tgz", - "integrity": "sha512-3nMVKUg+PF72UHfainmCL8uKvyWfxsjqOtUY+HiMPGLPCTjnwzoKfFAMo1Ad7nwTPdjBqtGK5b3BOFTFW4EBTg==", - "requires": { - "compact-encoding": "^2.4.1" - } - }, "compact-encoding-net": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/compact-encoding-net/-/compact-encoding-net-1.2.0.tgz", @@ -7138,19 +6953,18 @@ } }, "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" }, "corestore": { - "version": "6.15.9", - "resolved": "https://registry.npmjs.org/corestore/-/corestore-6.15.9.tgz", - "integrity": "sha512-GXGApW5zOUMFLLP02mQYgclWPvPWKj7dTCYI0rI00Ka1k+tdnmbWt4pybvIavwM1GOge8u2poaWPUkiSAZXQyw==", + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/corestore/-/corestore-6.8.4.tgz", + "integrity": "sha512-rJUn1bK2Id18mxZSb64fKGCSsbbBAvPUkSZVzsLB4Nnwhf3pkwxt/JjBvKHtsrvRyPAu9xtxUdUk1cSQ1JnOPw==", "requires": { - "b4a": "^1.6.4", - "hypercore": "^10.28.1", - "hypercore-crypto": "^3.4.0", - "hypercore-id-encoding": "^1.2.0", + "b4a": "^1.3.1", + "hypercore": "^10.12.0", + "hypercore-crypto": "^3.2.1", "read-write-mutexify": "^2.1.0", "ready-resource": "^1.0.0", "safety-catch": "^1.0.1", @@ -7167,13 +6981,12 @@ } }, "crc-native": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/crc-native/-/crc-native-1.0.11.tgz", - "integrity": "sha512-F3eeKJSA2Bx/jgy9f/sVdNVo4FnY+u+XiXHmFutw4RwM+r0SErbu4d/X6UbSlENLLm26T3tp6ycbs61xAEA1ag==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/crc-native/-/crc-native-1.1.1.tgz", + "integrity": "sha512-Qr1DdDkcMY5Q3vi7lYGDaYdtOpPyFY3h/7cSLMhc95jhI6Gnf3bV/stJ3MKfSJqe8cWnUuJ+vUrbNKw5HA+LEw==", "optional": true, "requires": { - "napi-macros": "^2.0.0", - "node-gyp-build": "^4.2.3" + "load-addon": "^1.0.0" } }, "crc-universal": { @@ -7195,9 +7008,9 @@ } }, "debounceify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/debounceify/-/debounceify-1.0.0.tgz", - "integrity": "sha512-7BeSMAPUohdDJ7sU6Tq2M8HkJR05IqQCeVm/qNemrpOgP5SGZD5WeNOXNfsgbESinz6OjMooWPTGZiKUX91XJQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/debounceify/-/debounceify-1.1.0.tgz", + "integrity": "sha512-eKuHDVfJVg+u/0nPy8P+fhnLgbyuTgVxuCRrS/R7EpDSMMkBDgSes41MJtSAY1F1hcqfHz3Zy/qpqHHIp/EhdA==" }, "debug": { "version": "4.3.4", @@ -7207,14 +7020,6 @@ "ms": "2.1.2" } }, - "debugging-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/debugging-stream/-/debugging-stream-2.0.0.tgz", - "integrity": "sha512-xwfl6wB/3xc553uwtGnSa94jFxnGOc02C0WU2Nmzwr80gzeqn1FX4VcbvoKIhe8L/lPq4BTQttAbrTN94uN8rA==", - "requires": { - "streamx": "^2.12.4" - } - }, "decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -7266,27 +7071,9 @@ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" - }, - "dht-rpc": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/dht-rpc/-/dht-rpc-6.10.0.tgz", - "integrity": "sha512-wkLMZtKI/Vk/PFavDmujtPvAIkMOmwr18E/ThQwlPdimw06FJQqdXpG7OBpYXB+n964S/OHl4IVEkK4mc4Mdzw==", - "requires": { - "b4a": "^1.6.1", - "compact-encoding": "^2.11.0", - "compact-encoding-net": "^1.2.0", - "events": "^3.3.0", - "fast-fifo": "^1.1.0", - "kademlia-routing-table": "^1.0.1", - "nat-sampler": "^1.0.1", - "sodium-universal": "^4.0.0", - "streamx": "^2.13.2", - "time-ordered-set": "^1.0.2", - "udx-native": "^1.5.3" - } + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==" }, "doctrine": { "version": "3.0.0", @@ -7306,16 +7093,16 @@ }, "dependencies": { "type-fest": { - "version": "4.20.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz", - "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==" + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==" } } }, "drizzle-orm": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.30.8.tgz", - "integrity": "sha512-9pBJA0IjnpPpzZ6s9jlS1CQAbKoBmbn2GJesPhXaVblAA/joOJ4AWWevYcqvLGj9SvThBAl7WscN8Zwgg5mnTw==", + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.30.10.tgz", + "integrity": "sha512-IRy/QmMWw9lAQHpwbUh1b8fcn27S/a9zMIzqea1WNOxK9/4EB8gIo+FZWLiPXzl2n9ixGSv8BhsLZiOppWEwBw==", "requires": {} }, "duplexify": { @@ -7617,16 +7404,32 @@ "dev": true }, "fast-json-stringify": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.8.0.tgz", - "integrity": "sha512-VVwK8CFMSALIvt14U8AvrSzQAwN/0vaVRiFFUVlpnXSnDGrSkOAO5MtzyN8oQNjLd5AqTW5OZRgyjoNuAuR3jQ==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.16.1.tgz", + "integrity": "sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==", "requires": { - "@fastify/deepmerge": "^1.0.0", + "@fastify/merge-json-schemas": "^0.1.0", "ajv": "^8.10.0", - "ajv-formats": "^2.1.1", + "ajv-formats": "^3.0.1", "fast-deep-equal": "^3.1.3", "fast-uri": "^2.1.0", + "json-schema-ref-resolver": "^1.0.1", "rfdc": "^1.2.0" + }, + "dependencies": { + "ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "requires": { + "ajv": "^8.0.0" + } + }, + "fast-uri": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", + "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==" + } } }, "fast-levenshtein": { @@ -7644,41 +7447,36 @@ } }, "fast-redact": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", - "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==" - }, - "fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==" }, "fast-uri": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.2.0.tgz", - "integrity": "sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" }, "fastify": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.24.0.tgz", - "integrity": "sha512-6Uu2cCAV1UgexPnWKchgRt77lng9ivNmyFhPMcgUbJ4VaVBE1l6aYluiYZiVsgOBFpHrmdj7FD6n1aHswln4yQ==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.28.1.tgz", + "integrity": "sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==", "requires": { "@fastify/ajv-compiler": "^3.5.0", - "@fastify/error": "^3.2.0", + "@fastify/error": "^3.4.0", "@fastify/fast-json-stringify-compiler": "^4.3.0", "abstract-logging": "^2.0.1", - "avvio": "^8.2.1", - "fast-content-type-parse": "^1.0.0", - "fast-json-stringify": "^5.7.0", - "find-my-way": "^7.7.0", - "light-my-request": "^5.9.1", - "pino": "^8.12.0", - "process-warning": "^2.2.0", + "avvio": "^8.3.0", + "fast-content-type-parse": "^1.1.0", + "fast-json-stringify": "^5.8.0", + "find-my-way": "^8.0.0", + "light-my-request": "^5.11.0", + "pino": "^9.0.0", + "process-warning": "^3.0.0", "proxy-addr": "^2.0.7", "rfdc": "^1.3.0", - "secure-json-parse": "^2.5.0", - "semver": "^7.5.0", - "toad-cache": "^3.2.0" + "secure-json-parse": "^2.7.0", + "semver": "^7.5.4", + "toad-cache": "^3.3.0" } }, "fastify-plugin": { @@ -7712,18 +7510,19 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, "find-my-way": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.7.0.tgz", - "integrity": "sha512-+SrHpvQ52Q6W9f3wJoJBbAQULJuNEEQwBvlvYwACDhBTLOTMiQ0HYWh4+vC3OivGP2ENcTI1oKlFA2OepJNjhQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.2.0.tgz", + "integrity": "sha512-HdWXgFYc6b1BJcOBDBwjqWuHJj1WYiqrxSh25qtU4DabpMFdj/gSunNBQb83t+8Zt67D7CXEzJWTkxaShMTMOA==", "requires": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", - "safe-regex2": "^2.0.0" + "safe-regex2": "^3.1.0" } }, "find-up": { @@ -7740,6 +7539,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, "requires": { "micromatch": "^4.0.2" } @@ -7800,9 +7600,9 @@ } }, "flat-tree": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/flat-tree/-/flat-tree-1.9.0.tgz", - "integrity": "sha512-WRu5/q9fcdL9f7L6Ahq8fR153e5Zr5aU6plPHupN6JDWuvEJbMjrEQprge3/I7ytndHC6/GUNg5Rg8XEisuv5w==" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/flat-tree/-/flat-tree-1.11.0.tgz", + "integrity": "sha512-dO6oawiYBpTROI9RZQ1seCFyNTr5UGnIdk5Ep+h7MbluB8ijnpA+tufJG5AA1hb6HSjhYI8qRo+negHnkBPqVA==" }, "flatted": { "version": "3.2.9", @@ -7811,9 +7611,9 @@ "dev": true }, "foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "requires": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -7833,6 +7633,7 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -7841,9 +7642,9 @@ } }, "fs-native-extensions": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/fs-native-extensions/-/fs-native-extensions-1.2.3.tgz", - "integrity": "sha512-DwxIW9fs9o8py05YutQgFcsdcph7nlrg70ncUYXiWAgpAPFza+X7Q/vA2UeyBaK4ekcMmoNzuBVEtU8Ass7Wwg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-native-extensions/-/fs-native-extensions-1.2.7.tgz", + "integrity": "sha512-IIWKE5oNTMNwp03daCbRgnCaiEdd0r/BPHwD3Ns4NlHH28FQgfwg0ntg8AgaPO236wN0szt2t1NM+VmCW2TcxQ==", "optional": true, "requires": { "napi-macros": "^2.0.0", @@ -7925,11 +7726,12 @@ } }, "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "requires": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" } }, "gopd": { @@ -7943,7 +7745,8 @@ "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true }, "graphemer": { "version": "1.4.0", @@ -7951,18 +7754,6 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -7975,7 +7766,8 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "has-property-descriptors": { "version": "1.0.2", @@ -8016,9 +7808,9 @@ } }, "hyperbee": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/hyperbee/-/hyperbee-2.17.0.tgz", - "integrity": "sha512-Ghiq/nnhhYxQZuyBO3c7A6eb6SN6uX0THzsVQsVd+pEGvC0G9iqVjuLJSXe0j+VCeN6A6UN2/ixtmETym1qhnw==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/hyperbee/-/hyperbee-2.20.1.tgz", + "integrity": "sha512-q6UNdCalpqmXdfveoQ/VvyOrF3GBWXcWR0XAG4fj7S27ckoMskzT+BwJEsWBaUI9iAOvjcbvJ1Oe6NEXMhFBrg==", "requires": { "b4a": "^1.6.0", "codecs": "^3.0.0", @@ -8026,9 +7818,11 @@ "hypercore-errors": "^1.0.0", "mutexify": "^1.4.0", "protocol-buffers-encodings": "^1.2.0", + "rache": "^1.0.0", "ready-resource": "^1.0.0", "safety-catch": "^1.0.2", - "streamx": "^2.12.4" + "streamx": "^2.12.4", + "unslab": "^1.2.0" } }, "hyperblobs": { @@ -8042,9 +7836,9 @@ } }, "hypercore": { - "version": "10.29.0", - "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-10.29.0.tgz", - "integrity": "sha512-kJ2EYVECs+ZJPdWmOW3YEAJWlVj8JXvDmq9RZ5eoGEb0s5cxjt3dmkWjv0aHXT6qHvTRXEV/7sO0a/L5hPHnSw==", + "version": "10.17.0", + "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-10.17.0.tgz", + "integrity": "sha512-Yp9lyfUjp81Gy1nPHemNFtYQtngliCGZ6prH+qxvjr2FPVG1QFtNqtOh+ZxFu4hXZ1dAOLYkQOA7Qq2vjFe64A==", "requires": { "@hyperswarm/secret-stream": "^6.0.0", "b4a": "^1.1.0", @@ -8052,13 +7846,10 @@ "compact-encoding": "^2.11.0", "crc-universal": "^1.0.2", "events": "^3.3.0", - "fast-fifo": "^1.3.0", "flat-tree": "^1.9.0", "hypercore-crypto": "^3.2.1", - "hypercore-errors": "^1.1.0", - "hypercore-id-encoding": "^1.2.0", "is-options": "^1.0.1", - "protomux": "^3.5.0", + "protomux": "^3.4.0", "quickbit-universal": "^2.1.1", "random-access-file": "^4.0.0", "random-array-iterator": "^1.0.0", @@ -8070,52 +7861,19 @@ } }, "hypercore-crypto": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-3.4.0.tgz", - "integrity": "sha512-0cZA1B58p1J84TDbTh8DMMIj7Qr7Rzz8NyGIo+ykUhdwD21gtjiiLWoME92QvN+lgbfu0Zfr9vwxT8sRmyg+AA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-3.4.2.tgz", + "integrity": "sha512-16ii4M6T1dFfRa41Szv3IR0wXfImJMYJ8ysZEGwHEDH7sMeWVEBck6tg1GCNutYl39E+H7wMY2p3ndCRfj+XdQ==", "requires": { - "b4a": "^1.1.0", - "compact-encoding": "^2.5.1", - "sodium-universal": "^4.0.0" + "b4a": "^1.6.6", + "compact-encoding": "^2.15.0", + "sodium-universal": "^4.0.1" } }, "hypercore-errors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hypercore-errors/-/hypercore-errors-1.1.0.tgz", - "integrity": "sha512-pclEHYUmgveqyMObMrgwJ087VvqcRVfbaY7k9rNQ5C+3MADVSQu3f8SmoLkntDkOipm9+uELK3p8DbTGL54m8g==" - }, - "hypercore-id-encoding": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hypercore-id-encoding/-/hypercore-id-encoding-1.2.0.tgz", - "integrity": "sha512-WqPBJ/HZ/sifoo9jYw/ZUr1Z1l4kll8hQwVdDhVqsDyYPj0c/Tl0ALLXbDxb9vcpKBV+WLgLqf8kVB0GcZU0Mg==", - "requires": { - "b4a": "^1.5.3", - "z32": "^1.0.0" - } - }, - "hyperdht": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/hyperdht/-/hyperdht-6.11.0.tgz", - "integrity": "sha512-BpymRzBHYvmDiPFCllIZ76tsNtqky73iz6dVL66YJBNiR9D+3qFyeLR3ZETrnJ0dqaDEHlG7pTFrEvMlTll9lw==", - "requires": { - "@hyperswarm/secret-stream": "^6.0.0", - "b4a": "^1.3.1", - "blind-relay": "^1.3.0", - "bogon": "^1.0.0", - "compact-encoding": "^2.4.1", - "compact-encoding-net": "^1.0.1", - "debugging-stream": "^2.0.0", - "dht-rpc": "^6.9.0", - "events": "^3.3.0", - "hypercore-crypto": "^3.3.0", - "noise-curve-ed": "^2.0.0", - "noise-handshake": "^3.0.0", - "record-cache": "^1.1.1", - "safety-catch": "^1.0.1", - "signal-promise": "^1.0.3", - "sodium-universal": "^4.0.0", - "xache": "^1.1.0" - } + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/hypercore-errors/-/hypercore-errors-1.3.0.tgz", + "integrity": "sha512-WsmSu05Ve1hXaT/2Etwz7mgZ1sAXe8EaveahUfaeECllxvYNaP5EbAPw5YaA4OqR3d217litGt4qKch9TBnavA==" }, "hyperdrive": { "version": "11.5.3", @@ -8134,17 +7892,10 @@ "unix-path-resolve": "^1.0.2" } }, - "hyperswarm": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/hyperswarm/-/hyperswarm-4.4.1.tgz", - "integrity": "sha512-8VLR/DLx6BnZATdCoECwFWasz7tIVdxkwlALT25sV6GEERf2fwttkJrb+5BS9vht/fyXJ4l41x6YgDWCabIoiw==", - "requires": { - "b4a": "^1.3.1", - "events": "^3.3.0", - "hyperdht": "^6.5.2", - "safety-catch": "^1.0.2", - "shuffled-priority-queue": "^2.1.0" - } + "hypertrace": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/hypertrace/-/hypertrace-1.4.2.tgz", + "integrity": "sha512-sa6iq1FaJ03Db3eUl5ZodyOL3fheyrum9xzeHasXOQ/AprTT6vS1WjpbXfYkHhmzVmyn0jBW/VsCb1QaBkGyow==" }, "ieee754": { "version": "1.2.1", @@ -8237,7 +7988,8 @@ "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true }, "is-extglob": { "version": "2.1.1", @@ -8277,7 +8029,8 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, "is-options": { "version": "1.0.2", @@ -8311,6 +8064,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, "requires": { "is-docker": "^2.0.0" } @@ -8325,19 +8079,10 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, - "isomorphic-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", - "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", - "requires": { - "node-fetch": "^2.6.1", - "whatwg-fetch": "^3.4.1" - } - }, "jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "requires": { "@isaacs/cliui": "^8.0.2", "@pkgjs/parseargs": "^0.11.0" @@ -8358,6 +8103,14 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, + "json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -8380,15 +8133,11 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==" - }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" @@ -8399,11 +8148,6 @@ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==" }, - "kademlia-routing-table": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kademlia-routing-table/-/kademlia-routing-table-1.0.1.tgz", - "integrity": "sha512-dKk19sC3/+kWhBIvOKCthxVV+JH0NrswSBq4sA4eOkkPMqQM1rRuOWte1WSKXeP8r9Nx4NuiH2gny3lMddJTpw==" - }, "keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -8417,6 +8161,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, "requires": { "graceful-fs": "^4.1.11" } @@ -8442,15 +8187,24 @@ } }, "light-my-request": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.11.0.tgz", - "integrity": "sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.13.0.tgz", + "integrity": "sha512-9IjUN9ZyCS9pTG+KqTDEQo68Sui2lHsYBrfMyVUTTZ3XhH8PMZq7xO94Kr+eP9dhi/kcKsx4N41p2IXEBil1pQ==", "requires": { - "cookie": "^0.5.0", - "process-warning": "^2.0.0", + "cookie": "^0.6.0", + "process-warning": "^3.0.0", "set-cookie-parser": "^2.4.1" } }, + "load-addon": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-addon/-/load-addon-1.0.0.tgz", + "integrity": "sha512-6XaA7xfpHW1CeQRrLFE9+9y8nDZMX3ZaoCMSo+Gp2i58dfY549SQqqb2ukAgQtAACEDJmaroHJvnL03cJ+KLvA==", + "optional": true, + "requires": { + "bare-addon-resolve": "^1.3.0" + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -8477,14 +8231,9 @@ "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==" - }, - "lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, "magic-bytes.js": { "version": "1.10.0", @@ -8510,24 +8259,20 @@ "resolved": "https://registry.npmjs.org/mapeo-offline-map/-/mapeo-offline-map-2.0.0.tgz", "integrity": "sha512-/a2BVgSwcL0EGqNxc7MWaApEJ0uLxr/scaZimd/2RvihDtvaNsLQurHIAjXJnY5lj4to5fBFBpcWXntdZoRBdg==" }, - "marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" - }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "mime": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.3.tgz", - "integrity": "sha512-KgUb15Oorc0NEKPbvfa0wRU+PItIEZmiv+pyAO2i0oTIVTJhlzMclU7w4RXWQrSOVH5ax/p/CkIO7KI4OyFJTQ==" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.4.tgz", + "integrity": "sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==" }, "mimic-response": { "version": "3.1.0", @@ -8554,9 +8299,9 @@ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" }, "mirror-drive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mirror-drive/-/mirror-drive-1.3.0.tgz", - "integrity": "sha512-m2HL5pFBUxHmkO64AAvYn/+bddUf16HGQwlQ7IGXr65PCWsr01oLebTNrsk4+nIHzs02M4/Ry0LZwmXYKebceg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mirror-drive/-/mirror-drive-1.4.0.tgz", + "integrity": "sha512-eKYAH61V+4O9u/jOcU6aT/pNFv1Dua6DutyidhJG5aiWrtaLE/1FX6VXrSc7gtMTBOksqkvIWJGT5GWq4HFnrQ==", "requires": { "binary-stream-equals": "^1.0.0", "same-data": "^1.0.0" @@ -8587,9 +8332,9 @@ }, "dependencies": { "@types/node": { - "version": "18.19.39", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", - "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", + "version": "18.19.50", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.50.tgz", + "integrity": "sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==", "requires": { "undici-types": "~5.26.4" } @@ -8622,12 +8367,8 @@ "napi-macros": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" - }, - "nat-sampler": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nat-sampler/-/nat-sampler-1.0.1.tgz", - "integrity": "sha512-yQvyNN7xbqR8crTKk3U8gRgpcV1Az+vfCEijiHu9oHHsnIl8n3x+yXNHl42M6L3czGynAVoOT9TqBfS87gDdcw==" + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", + "optional": true }, "natural-compare": { "version": "1.4.0", @@ -8635,31 +8376,18 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, "node-abi": { - "version": "3.50.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.50.0.tgz", - "integrity": "sha512-2Gxu7Eq7vnBIRfYSmqPruEllMM14FjOQFJSoqdGWthVn+tmwEXzmdPpya6cvvwf0uZA3F5N1fMFr9mijZBplFA==", + "version": "3.67.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.67.0.tgz", + "integrity": "sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==", "requires": { "semver": "^7.3.5" } }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, "node-gyp-build": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", - "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==" + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", + "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==" }, "noise-curve-ed": { "version": "2.0.1", @@ -8672,9 +8400,9 @@ } }, "noise-handshake": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/noise-handshake/-/noise-handshake-3.0.3.tgz", - "integrity": "sha512-fRhxQLW7uZmLS059VXA79j8eMxoYPBg7gMGBKqLbuipagTmvUT6xW46DeMsf3Y7LA4fmB9n24s6Vv/a1Q+y8UQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/noise-handshake/-/noise-handshake-3.1.0.tgz", + "integrity": "sha512-0S1qkUvMbTvZCfgr/vSkVT84YyvI4Q0OLwSc5BFxVmjaePrxAwVeXeJDY3A7N/7+qj95gZ15LaNoP9ZnBXH5Lw==", "requires": { "b4a": "^1.1.0", "nanoassert": "^2.0.0", @@ -8703,6 +8431,7 @@ "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -8725,12 +8454,13 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true }, "p-defer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.0.tgz", - "integrity": "sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.1.tgz", + "integrity": "sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==" }, "p-event": { "version": "6.0.1", @@ -8788,6 +8518,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "dev": true, "requires": { "@yarnpkg/lockfile": "^1.1.0", "chalk": "^4.1.2", @@ -8809,7 +8540,8 @@ "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true } } }, @@ -8847,30 +8579,38 @@ "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true }, "pino": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.16.0.tgz", - "integrity": "sha512-UUmvQ/7KTZt/vHjhRrnyS7h+J7qPBQnpG80V56xmIC+o9IqYmQOw/UIny9S9zYDfRBR0ClouCr464EkBMIT7Fw==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.4.0.tgz", + "integrity": "sha512-nbkQb5+9YPhQRz/BeQmrWpEknAaqjpAqRK8NwJpmrX/JHu7JuZC5G1CeAwJDJfGes4h+YihC6in3Q2nGb+Y09w==", "requires": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "v1.1.0", - "pino-std-serializers": "^6.0.0", - "process-warning": "^2.0.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.7.0", - "thread-stream": "^2.0.0" + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "dependencies": { + "process-warning": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", + "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==" + } } }, "pino-abstract-transport": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", - "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", "requires": { "readable-stream": "^4.0.0", "split2": "^4.0.0" @@ -8886,9 +8626,9 @@ } }, "readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "requires": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -8900,14 +8640,14 @@ } }, "pino-std-serializers": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", - "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" }, "prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", "requires": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -8941,14 +8681,14 @@ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" }, "process-warning": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.2.0.tgz", - "integrity": "sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" }, "protobufjs": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", - "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -8982,14 +8722,16 @@ } }, "protomux": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/protomux/-/protomux-3.5.1.tgz", - "integrity": "sha512-+ioDo9Cu5rTNQH9Or2UkXJRFPAZMzqr4gZFuyib8tTmy8YyZDCL2poP8dhc5JgJydTrj94jn1Dsp/C0ESpEtjQ==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/protomux/-/protomux-3.9.2.tgz", + "integrity": "sha512-s439dAQSrCg3rohE+Vn7UJN20bBUKNu/4m/+pSNKnavo14HHPsW7BP6YtfXD63qPDRwfM8la3r4DA1EQGM8iYQ==", "requires": { "b4a": "^1.3.1", "compact-encoding": "^2.5.1", + "hypertrace": "^1.4.2", "queue-tick": "^1.0.0", - "safety-catch": "^1.0.1" + "safety-catch": "^1.0.1", + "unslab": "^1.3.0" } }, "proxy-addr": { @@ -9013,7 +8755,8 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "queue-microtask": { "version": "1.2.3", @@ -9032,14 +8775,13 @@ "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" }, "quickbit-native": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/quickbit-native/-/quickbit-native-2.2.0.tgz", - "integrity": "sha512-/C5EOMP9Kyk+P7Z0+ipedppwhMkPA0SBj31Hk8xZQ/0rfKPLlafYJcxr+H942eIQ60xRif9c18B9OV0REfCWzg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/quickbit-native/-/quickbit-native-2.3.1.tgz", + "integrity": "sha512-/WOLyxcG6jFjuCuiND9/gXRlR4Po20UGhuc9izpVLioiJ2hWhoIgrNaTCkwgnPhrr1Rz8DGNCntJNEyspfo0Ug==", "optional": true, "requires": { "b4a": "^1.6.0", - "napi-macros": "^2.0.0", - "node-gyp-build": "^4.2.3" + "load-addon": "^1.0.0" } }, "quickbit-universal": { @@ -9052,21 +8794,28 @@ "simdle-universal": "^1.1.0" } }, + "rache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rache/-/rache-1.0.0.tgz", + "integrity": "sha512-e0k0g0w/8jOCB+7YqCIlOa+OJ38k0wrYS4x18pMSmqOvLKoyhmMhmQyCcvfY6VaP8D75cqkEnlakXs+RYYLqNg==" + }, "random-access-file": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/random-access-file/-/random-access-file-4.0.4.tgz", - "integrity": "sha512-1W21gZ8ne3RgPyTNpq8INr7feTY0+hPpV4X59yL9Miv5QiZV7U1QpRb/zEG2IuaojW9qVTeWBC19Ty0m0uqFBg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/random-access-file/-/random-access-file-4.0.7.tgz", + "integrity": "sha512-SOLseGmpbJRLLrVEDOJY3rqX1AwUmQnN0IAMjRLvld3fexaL8hYgti6VFuyT72bDMWSwVyvQROHh6FcE+PefKQ==", "requires": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0", "fs-native-extensions": "^1.1.0", "random-access-storage": "^3.0.0" } }, "random-access-storage": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/random-access-storage/-/random-access-storage-3.0.1.tgz", - "integrity": "sha512-raFoHJ/orMyur04GKrA+5ThOwhX9wICdqMDLqTM7bHEXPz7zi5MxLsLUaybxGu3b4mJTt8zhCpZHgjlu0x4wpg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/random-access-storage/-/random-access-storage-3.0.2.tgz", + "integrity": "sha512-Es9maUyWdJXWKckKy9s1+vT+DEgAt+PBb9lxPaake/0EDUsHehloKGv9v1zimS2V3gpFAcQXubvc1Rgci2sDPQ==", "requires": { - "events": "^3.3.0", + "bare-events": "^2.2.0", "queue-tick": "^1.0.0" } }, @@ -9102,23 +8851,18 @@ } }, "ready-resource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ready-resource/-/ready-resource-1.0.0.tgz", - "integrity": "sha512-9/Oj3DXv+QxWinvVcxVVRXn9Jj4b9wssv0PvQh5bO+N/vzqo6kmScUNl+faWWMEu0rYMPa6Tvp50+rP5ujZvqg==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ready-resource/-/ready-resource-1.1.1.tgz", + "integrity": "sha512-EQbJs+wXphM1opGCpYSp3toAID8okqGDLmhjGLCiptMfMHGcTxdP3lsmSsYwU+lbrUXrbuhhgcDPge656X48VQ==", + "requires": { + "bare-events": "^2.2.0" + } }, "real-require": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==" }, - "record-cache": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.2.0.tgz", - "integrity": "sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw==", - "requires": { - "b4a": "^1.3.1" - } - }, "regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", @@ -9153,9 +8897,9 @@ "dev": true }, "ret": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", - "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==" + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.4.3.tgz", + "integrity": "sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==" }, "reusify": { "version": "1.0.4", @@ -9163,14 +8907,15 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, "requires": { "glob": "^7.1.3" }, @@ -9179,6 +8924,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -9188,6 +8934,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9201,6 +8948,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -9268,17 +9016,17 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safe-regex2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", - "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-3.1.0.tgz", + "integrity": "sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==", "requires": { - "ret": "~0.2.0" + "ret": "~0.4.0" } }, "safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==" }, "safety-catch": { "version": "1.0.2", @@ -9296,22 +9044,9 @@ "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - } - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" }, "serialize-error": { "version": "8.1.0", @@ -9322,9 +9057,9 @@ } }, "set-cookie-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", - "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz", + "integrity": "sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==" }, "set-function-length": { "version": "1.2.2", @@ -9344,42 +9079,6 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "sha256-universal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sha256-universal/-/sha256-universal-1.2.1.tgz", - "integrity": "sha512-ghn3muhdn1ailCQqqceNxRgkOeZSVfSE13RQWEg6njB+itsFzGVSJv+O//2hvNXZuxVIRyNzrgsZ37SPDdGJJw==", - "requires": { - "b4a": "^1.0.1", - "sha256-wasm": "^2.2.1" - } - }, - "sha256-wasm": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/sha256-wasm/-/sha256-wasm-2.2.2.tgz", - "integrity": "sha512-qKSGARvao+JQlFiA+sjJZhJ/61gmW/3aNLblB2rsgIxDlDxsJPHo8a1seXj12oKtuHVgJSJJ7QEGBUYQN741lQ==", - "requires": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "sha512-universal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sha512-universal/-/sha512-universal-1.2.1.tgz", - "integrity": "sha512-kehYuigMoRkIngCv7rhgruLJNNHDnitGTBdkcYbCbooL8Cidj/bS78MDxByIjcc69M915WxcQTgZetZ1JbeQTQ==", - "requires": { - "b4a": "^1.0.1", - "sha512-wasm": "^2.3.1" - } - }, - "sha512-wasm": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/sha512-wasm/-/sha512-wasm-2.3.4.tgz", - "integrity": "sha512-akWoxJPGCB3aZCrZ+fm6VIFhJ/p8idBv7AWGFng/CZIrQo51oQNsvDbTSRXWAzIiZJvpy16oIDiCCPqTe21sKg==", - "requires": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -9393,35 +9092,11 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, - "shiki": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz", - "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==", - "requires": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "shuffled-priority-queue": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/shuffled-priority-queue/-/shuffled-priority-queue-2.1.0.tgz", - "integrity": "sha512-xhdh7fHyMsr0m/w2kDfRJuBFRS96b9l8ZPNWGaQ+PMvnUnZ/Eh+gJJ9NsHBd7P9k0399WYlCLzsy18EaMfyadA==", - "requires": { - "unordered-set": "^2.0.1" - } - }, "signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" }, - "signal-promise": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/signal-promise/-/signal-promise-1.0.3.tgz", - "integrity": "sha512-WBgv0UnIq2C+Aeh0/n+IRpP6967eIx9WpynTUoiW3isPpfe1zu2LJzyfXdo9Tgef8yR/sGjcMvoUXD7EYdiz+g==" - }, "signed-varint": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/signed-varint/-/signed-varint-2.0.1.tgz", @@ -9431,14 +9106,13 @@ } }, "simdle-native": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/simdle-native/-/simdle-native-1.2.0.tgz", - "integrity": "sha512-+lzydXTqqe8GWLcH4Tf4kAgrtJTDnIxAiU/a+Hs4QpLmEapgT4T0Acbauzc2Gq3Wt3XL5MthaBhrIMhZ2386Ww==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simdle-native/-/simdle-native-1.3.1.tgz", + "integrity": "sha512-QEFxH5JPLzMJy8pzv6Y/RA9K7F0MDOXcB+as6V+XlNOPI5Lpt0LjR6cl3muvBHk6oZiiHj5O8TOkP8ToN9kbsQ==", "optional": true, "requires": { "b4a": "^1.6.0", - "napi-macros": "^2.0.0", - "node-gyp-build": "^4.2.3" + "load-addon": "^1.0.0" } }, "simdle-universal": { @@ -9470,40 +9144,18 @@ "resolved": "https://registry.npmjs.org/simple-invariant/-/simple-invariant-2.0.1.tgz", "integrity": "sha512-1sbhsxqI+I2tqlmjbz99GXNmZtr6tKIyEgGGnJw/MKGblalqk/XoOYYFJlBzTKZCxx8kLaD3FD5s9BEEjx5Pyg==" }, - "siphash24": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.3.1.tgz", - "integrity": "sha512-moemC3ZKiTzH29nbFo3Iw8fbemWWod4vNs/WgKbQ54oEs6mE6XVlguxvinYjB+UmaE0PThgyED9fUkWvirT8hA==", - "requires": { - "nanoassert": "^2.0.0" - } - }, "slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true }, - "sodium-javascript": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.8.0.tgz", - "integrity": "sha512-rEBzR5mPxPES+UjyMDvKPIXy9ImF17KOJ32nJNi9uIquWpS/nfj+h6m05J5yLJaGXjgM72LmQoUbWZVxh/rmGg==", - "requires": { - "blake2b": "^2.1.1", - "chacha20-universal": "^1.0.4", - "nanoassert": "^2.0.0", - "sha256-universal": "^1.1.0", - "sha512-universal": "^1.1.0", - "siphash24": "^1.0.1", - "xsalsa20": "^1.0.0" - } - }, "sodium-native": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.0.4.tgz", - "integrity": "sha512-faqOKw4WQKK7r/ybn6Lqo1F9+L5T6NlBJJYvpxbZPetpWylUVqz449mvlwIBKBqxEHbWakWuOlUt8J3Qpc4sWw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.2.0.tgz", + "integrity": "sha512-rdJRAf/RE/IRFUUoUsz10slNAQDTGz5ChpIeR1Ti0BtGYstl6Uok4hHALPBdnFcLml6qXJ2pDd0/De09mPa6mg==", "requires": { - "node-gyp-build": "^4.6.0" + "node-gyp-build": "^4.8.0" } }, "sodium-secretstream": { @@ -9516,34 +9168,21 @@ } }, "sodium-universal": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.0.tgz", - "integrity": "sha512-iKHl8XnBV96k1c75gwwzANFdephw/MDWSjQAjPmBE+du0y3P23Q8uf7AcdcfFsYAMwLg7WVBfSAIBtV/JvRsjA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.1.tgz", + "integrity": "sha512-sNp13PrxYLaUFHTGoDKkSDFvoEu51bfzE12RwGlqU1fcrkpAOK0NvizaJzOWV0Omtk9me2+Pnbjcf/l0efxuGQ==", "requires": { - "blake2b": "^2.1.1", - "chacha20-universal": "^1.0.4", - "nanoassert": "^2.0.0", - "sha256-universal": "^1.1.0", - "sha512-universal": "^1.1.0", - "siphash24": "^1.0.1", - "sodium-javascript": "~0.8.0", - "sodium-native": "^4.0.0", - "xsalsa20": "^1.0.0" + "sodium-native": "^4.0.0" } }, "sonic-boom": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", - "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.1.0.tgz", + "integrity": "sha512-NGipjjRicyJJ03rPiZCJYjwlsuP2d1/5QUviozRXC7S3WdVWNK5e3Ojieb9CCyfhq2UC+3+SRd9nG3I2lPRvUw==", "requires": { "atomic-sleep": "^1.0.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, "split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -9568,12 +9207,14 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" }, "streamx": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz", - "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", + "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", "requires": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" + "bare-events": "^2.2.0", + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" } }, "string_decoder": { @@ -9665,6 +9306,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -9698,6 +9340,14 @@ "readable-stream": "^3.1.1" } }, + "text-decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.0.tgz", + "integrity": "sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==", + "requires": { + "b4a": "^1.6.4" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -9705,17 +9355,17 @@ "dev": true }, "thread-stream": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", - "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", "requires": { "real-require": "^0.2.0" } }, "throttle-debounce": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", - "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==" }, "through2": { "version": "4.0.2", @@ -9725,11 +9375,6 @@ "readable-stream": "3" } }, - "time-ordered-set": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/time-ordered-set/-/time-ordered-set-1.0.2.tgz", - "integrity": "sha512-vGO99JkxvgX+u+LtOKQEpYf31Kj3i/GNwVstfnh4dyINakMgeZCpew1e3Aj+06hEslhtHEd52g7m5IV+o1K8Mw==" - }, "timeout-refresh": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/timeout-refresh/-/timeout-refresh-2.0.1.tgz", @@ -9744,6 +9389,7 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -9752,29 +9398,25 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "requires": { "is-number": "^7.0.0" } }, "toad-cache": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.3.0.tgz", - "integrity": "sha512-3oDzcogWGHZdkwrHyvJVpPjA7oNzY6ENOV3PsWJY9XYPZ6INo94Yd47s5may1U+nleBPwDhrRiTPMIvKaa3MQg==" + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==" }, "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "optional": true }, "tunnel-agent": { @@ -9805,28 +9447,10 @@ "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true }, - "udx-native": { - "version": "1.7.12", - "resolved": "https://registry.npmjs.org/udx-native/-/udx-native-1.7.12.tgz", - "integrity": "sha512-2/51ij0eYzOQuaoB3IoAO6sVMtHH7Paaw7OKnTws4wfSVGNYoVA2tMrnaeOsIeZ8DZUfLDcLZi5+de0IAIhE6w==", - "requires": { - "b4a": "^1.5.0", - "events": "^3.3.0", - "napi-macros": "^2.0.0", - "node-gyp-build": "^4.4.0", - "streamx": "^2.14.0" - } - }, - "uglify-js": { - "version": "3.19.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.2.tgz", - "integrity": "sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==", - "optional": true - }, "undici": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.13.0.tgz", - "integrity": "sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==" + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", + "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==" }, "undici-types": { "version": "5.25.3", @@ -9836,22 +9460,27 @@ "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true }, "unix-path-resolve": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unix-path-resolve/-/unix-path-resolve-1.0.2.tgz", "integrity": "sha512-kG4g5nobBBaMnH2XbrS4sLUXEpx4nY2J3C6KAlAUcnahG2HChxSPVKWYrqEq76iTo+cyMkLUjqxGaQR2tz097Q==" }, - "unordered-set": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unordered-set/-/unordered-set-2.0.1.tgz", - "integrity": "sha512-eUmNTPzdx+q/WvOHW0bgGYLWvWHNT3PTKEQLg0MAQhc0AHASHVHoP/9YytYd4RBVariqno/mEUhVZN98CmD7bg==" + "unslab": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/unslab/-/unslab-1.3.0.tgz", + "integrity": "sha512-YATkfKAFj47kTzmiQrWXMyRvaVrHsW6MEALa4bm+FhiA2YG4oira+Z3DXN6LrYOYn2Y8eO94Lwl9DOHjs1FpoQ==", + "requires": { + "b4a": "^1.6.6" + } }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -9888,35 +9517,6 @@ "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" }, - "vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==" - }, - "vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -9925,11 +9525,6 @@ "isexe": "^2.0.0" } }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" - }, "wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -9993,24 +9588,15 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "xache": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/xache/-/xache-1.2.0.tgz", - "integrity": "sha512-AiWCGTrnsh//rrbJt8DLbDkDW8eLp1Ktkq0nTWzpE+FKCY35oeqLjtz+LNb4abMnjfTgL0ZBaSwzhgzan1ocEw==" - }, - "xsalsa20": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.2.0.tgz", - "integrity": "sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/xache/-/xache-1.2.1.tgz", + "integrity": "sha512-igRS6jPreJ54ABdzhh4mCDXcz+XMaWO2q1ABRV2yWYuk29jlp8VT7UBdCqNkX7rpYBbXsebVVKkwIuYZjyZNqA==" }, "yaml": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", - "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==" + "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", + "dev": true }, "yauzl-promise": { "version": "4.0.0", @@ -10029,9 +9615,9 @@ "dev": true }, "z32": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/z32/-/z32-1.0.1.tgz", - "integrity": "sha512-Uytfqf6VEVchHKZDw0NRdCViOARHP84uzvOw0CXCMLOwhgHZUL9XibpEPLLQN10mCVLxOlGCQWbkV7km7yNYcw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/z32/-/z32-1.1.0.tgz", + "integrity": "sha512-1WUHy+VS6d0HPNspDxvLssBbeQjXMjSnpv0vH82vRAUfg847NmX3OXozp/hRP5jPhxBbrVzrgvAt+UsGNzRFQQ==", "requires": { "b4a": "^1.5.3" } diff --git a/src/backend/package.json b/src/backend/package.json index 53df7909e..fdf4ed64e 100644 --- a/src/backend/package.json +++ b/src/backend/package.json @@ -13,9 +13,9 @@ "author": "Digital Democracy", "license": "MIT", "dependencies": { - "@mapeo/core": "9.0.0-alpha.16", - "@mapeo/default-config": "^4.0.0-alpha.6", - "@mapeo/ipc": "0.11.0", + "@comapeo/core": "1.0.1", + "@comapeo/ipc": "1.0.1", + "@mapeo/default-config": "5.0.0", "debug": "^4.3.4", "mapeo-offline-map": "^2.0.0" }, diff --git a/src/backend/patches/@comapeo+core+1.0.1+001+fastify-controller-force-close.patch b/src/backend/patches/@comapeo+core+1.0.1+001+fastify-controller-force-close.patch new file mode 100644 index 000000000..9ed3c51f2 --- /dev/null +++ b/src/backend/patches/@comapeo+core+1.0.1+001+fastify-controller-force-close.patch @@ -0,0 +1,20 @@ +diff --git a/node_modules/@comapeo/core/src/fastify-controller.js b/node_modules/@comapeo/core/src/fastify-controller.js +index a84c600..d7c748c 100644 +--- a/node_modules/@comapeo/core/src/fastify-controller.js ++++ b/node_modules/@comapeo/core/src/fastify-controller.js +@@ -64,7 +64,14 @@ export class FastifyController { + + async #stopServer() { + const { server } = this.#fastify +- await promisify(server.close.bind(server))() ++ ++ const closePromise = promisify(server.close.bind(server))() ++ ++ // Need to force close some connections (see https://github.com/digidem/comapeo-mobile/issues/611#issuecomment-2368795563) ++ // We call this after `server.close()` as recommended by the Node docs (see https://nodejs.org/docs/latest-v20.x/api/http.html#servercloseidleconnections) ++ server.closeIdleConnections() ++ ++ await closePromise + } + + /** diff --git a/src/backend/patches/@electron+asar+3.2.13+001+remove-original-fs-require.patch b/src/backend/patches/@electron+asar+3.2.13+001+remove-original-fs-require.patch new file mode 100644 index 000000000..fe6184561 --- /dev/null +++ b/src/backend/patches/@electron+asar+3.2.13+001+remove-original-fs-require.patch @@ -0,0 +1,12 @@ +diff --git a/node_modules/@electron/asar/lib/wrapped-fs.js b/node_modules/@electron/asar/lib/wrapped-fs.js +index ea851eb..9721836 100644 +--- a/node_modules/@electron/asar/lib/wrapped-fs.js ++++ b/node_modules/@electron/asar/lib/wrapped-fs.js +@@ -1,6 +1,6 @@ + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); +-const fs = 'electron' in process.versions ? require('original-fs') : require('fs'); ++const fs = require('fs'); + const promisifiedMethods = ['lstat', 'mkdtemp', 'readFile', 'stat', 'writeFile']; + const promisified = {}; + for (const method of Object.keys(fs)) { diff --git a/src/backend/patches/@electron+asar+3.2.9+001+remove-original-fs-require.patch b/src/backend/patches/@electron+asar+3.2.9+001+remove-original-fs-require.patch deleted file mode 100644 index 8c1ae4e6e..000000000 --- a/src/backend/patches/@electron+asar+3.2.9+001+remove-original-fs-require.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/node_modules/@electron/asar/lib/wrapped-fs.js b/node_modules/@electron/asar/lib/wrapped-fs.js -index 24f59d0..dfb3fc6 100644 ---- a/node_modules/@electron/asar/lib/wrapped-fs.js -+++ b/node_modules/@electron/asar/lib/wrapped-fs.js -@@ -1,6 +1,6 @@ - 'use strict' - --const fs = process.versions.electron ? require('original-fs') : require('fs') -+const fs = require('fs') - - const promisifiedMethods = [ - 'lstat', diff --git a/src/backend/scripts/bundle-backend.mjs b/src/backend/scripts/bundle-backend.mjs index 740bb1e4f..d67c1d7bc 100755 --- a/src/backend/scripts/bundle-backend.mjs +++ b/src/backend/scripts/bundle-backend.mjs @@ -28,7 +28,7 @@ const { entry, output, minify: shouldMinify } = values const plugins = [ alias({ entries: [ - // @mapeo/core (indirectly) depends on @node-rs/crc32, which can't be rolled up. + // @comapeo/core (indirectly) depends on @node-rs/crc32, which can't be rolled up. // Replace it with a pure JavaScript implementation. { find: '@node-rs/crc32', diff --git a/src/backend/src/app.js b/src/backend/src/app.js index a6bf90a68..ebdd5d587 100644 --- a/src/backend/src/app.js +++ b/src/backend/src/app.js @@ -11,8 +11,8 @@ import { MapeoMapsFastifyPlugin, MapeoStaticMapsFastifyPlugin, MapeoOfflineFallbackMapFastifyPlugin, -} from '@mapeo/core' -import { createMapeoServer } from '@mapeo/ipc' +} from '@comapeo/core' +import { createMapeoServer } from '@comapeo/ipc' import Fastify from 'fastify' import MessagePortLike from './message-port-like.js' diff --git a/src/config.json b/src/config.json deleted file mode 100644 index b03609903..000000000 --- a/src/config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "mapboxAccessToken": "pk.eyJ1IjoiZGlnaWRlbSIsImEiOiJjbHRyaGh3cm0wN3l4Mmpsam95NDI3c2xiIn0.daq2iZFZXQ08BD0VZWAGUw" -} diff --git a/src/frontend/App.tsx b/src/frontend/App.tsx index 0be5119ed..2b1ba4123 100644 --- a/src/frontend/App.tsx +++ b/src/frontend/App.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import {createMapeoClient} from '@mapeo/ipc'; +import {createMapeoClient} from '@comapeo/ipc'; import {AppNavigator} from './AppNavigator'; import {MessagePortLike} from './lib/MessagePortLike'; import {initializeNodejs} from './initializeNodejs'; @@ -9,6 +9,7 @@ import {createLocalDiscoveryController} from './contexts/LocalDiscoveryContext'; import * as SplashScreen from 'expo-splash-screen'; import * as Sentry from '@sentry/react-native'; import * as TaskManager from 'expo-task-manager'; +import {applicationId} from 'expo-application'; import {LOCATION_TASK_NAME, LocationCallbackInfo} from './sharedTypes/location'; import {storage} from './hooks/persistedState/createPersistedState'; import {tracksStore} from './hooks/persistedState/usePersistedTrack'; @@ -17,12 +18,22 @@ import {getSentryUserId} from './metrics/getSentryUserId'; import {AppDiagnosticMetrics} from './metrics/AppDiagnosticMetrics'; import {DeviceDiagnosticMetrics} from './metrics/DeviceDiagnosticMetrics'; +type SentryEnvironment = 'development' | 'qa' | 'production'; + +let sentryEnvironment: SentryEnvironment = 'production'; +if (applicationId?.endsWith('.dev') || applicationId?.endsWith('.pre')) { + sentryEnvironment = 'development'; +} else if (applicationId?.endsWith('.rc')) { + sentryEnvironment = 'qa'; +} + +const sentryDebug = applicationId?.endsWith('.dev'); + Sentry.init({ dsn: 'https://e0e02907e05dc72a6da64c3483ed88a6@o4507148235702272.ingest.us.sentry.io/4507170965618688', tracesSampleRate: 1.0, - debug: - process.env.APP_VARIANT === 'development' || - process.env.APP_VARIANT === 'test', // If `true`, Sentry will try to print out useful debugging information if something goes wrong with sending the event. Set it to `false` in production + environment: sentryEnvironment, + debug: sentryDebug, // If `true`, Sentry will try to print out useful debugging information if something goes wrong with sending the event. Set it to `false` in production initialScope: { user: { id: getSentryUserId({now: new Date(), storage}), diff --git a/src/frontend/Navigation/Drawer.tsx b/src/frontend/Navigation/Drawer.tsx index e9de4cbd1..c3edd40ab 100644 --- a/src/frontend/Navigation/Drawer.tsx +++ b/src/frontend/Navigation/Drawer.tsx @@ -31,7 +31,7 @@ const m = defineMessages({ aboutCoMapeo: { id: 'Navigation.Drawer.aboutCoMapeo', defaultMessage: 'About CoMapeo', - description: "Primary text for 'About Mapeo' link (version info)", + description: "Primary text for 'About CoMapeo' link (version info)", }, aboutCoMapeoDesc: { id: 'Navigation.Drawer.aboutCoMapeoDesc', @@ -72,9 +72,9 @@ const m = defineMessages({ id: 'Navigation.Drawer.projName', defaultMessage: 'Project {projectName}', }, - createOrJoinToSync: { - id: 'Navigation.Drawer.createOrJoinToSync', - defaultMessage: 'Create or Join a Project to sync with other devices', + mappingOnOwn: { + id: 'Navigation.Drawer.mappingOnOwn', + defaultMessage: 'You are currently mapping on your own', }, security: { id: 'Navigation.Drawer.security', @@ -131,7 +131,7 @@ const DrawerContent = ({navigation}: DrawerContentComponentProps) => { }}> {data?.name ? formatMessage(m.projName, {projectName: data.name}) - : formatMessage(m.createOrJoinToSync)} + : formatMessage(m.mappingOnOwn)} + + + + + + {process.env.EXPO_PUBLIC_FEATURE_TEST_DATA_UI && ( (undefined); diff --git a/src/frontend/contexts/AppProviders.tsx b/src/frontend/contexts/AppProviders.tsx index 00a7abfb0..903ddfe1e 100644 --- a/src/frontend/contexts/AppProviders.tsx +++ b/src/frontend/contexts/AppProviders.tsx @@ -17,7 +17,7 @@ import { LocalDiscoveryProvider, createLocalDiscoveryController, } from './LocalDiscoveryContext'; -import {type MapeoClientApi} from '@mapeo/ipc'; +import {type MapeoClientApi} from '@comapeo/ipc'; import {ServerLoading} from '../ServerLoading'; import {ApiProvider} from './ApiContext'; import {MessagePortLike} from '../lib/MessagePortLike'; diff --git a/src/frontend/contexts/LocalDiscoveryContext.tsx b/src/frontend/contexts/LocalDiscoveryContext.tsx index f5b5ff71a..cc2ccf015 100644 --- a/src/frontend/contexts/LocalDiscoveryContext.tsx +++ b/src/frontend/contexts/LocalDiscoveryContext.tsx @@ -7,7 +7,8 @@ import NetInfo, { } from '@react-native-community/netinfo'; import StateMachine from 'start-stop-state-machine'; import Zeroconf, {type Service as ZeroconfService} from 'react-native-zeroconf'; -import {type MapeoClientApi} from '@mapeo/ipc'; +import {type MapeoClientApi} from '@comapeo/ipc'; +import * as Sentry from '@sentry/react-native'; import noop from '../lib/noop'; type LocalDiscoveryController = ReturnType< @@ -33,6 +34,12 @@ const POLL_WIFI_STATE_INTERVAL_MS = 2000; const ZEROCONF_SERVICE_TYPE = 'comapeo'; const ZEROCONF_PROTOCOL = 'tcp'; const ZEROCONF_DOMAIN = 'local.'; +// react-native-zeroconf does not notify when a service fails to register or unregister +// https://github.com/balthazar/react-native-zeroconf/blob/master/android/src/main/java/com/balthazargronon/RCTZeroconf/nsd/NsdServiceImpl.java#L210 +// so we need a timeout, otherwise the service would never be considered +// "started" or "stopped", which would stop browsing for peers. +const ZEROCONF_PUBLISH_TIMEOUT_MS = 5000; +const ZEROCONF_UNPUBLISH_TIMEOUT_MS = 5000; const LocalDiscoveryContext = React.createContext< LocalDiscoveryController | undefined @@ -91,33 +98,48 @@ export function createLocalDiscoveryController(mapeoApi: MapeoClientApi) { }; let cancelNetInfoFetch: undefined | (() => void); const zeroconf = new Zeroconf(); + // In edge-cases, we may end up with multiple published names (NSD service + // will append ` (1)` to the name if there is a conflict), so we need to track + // them here so that we can unpublish them when we stop the service. + const publishedNames = new Set(); const sm = new StateMachine({ async start() { - const [{name, port}] = await Promise.all([ - mapeoApi.startLocalPeerDiscoveryServer(), - startZeroconf(zeroconf), - ]); - zeroconf.publishService( - ZEROCONF_SERVICE_TYPE, - ZEROCONF_PROTOCOL, - ZEROCONF_DOMAIN, - name, - port, - ); + // start browsing straight away + const startZeroconfPromise = startZeroconf(zeroconf); + const {name, port} = await mapeoApi.startLocalPeerDiscoveryServer(); + // publishedName could be different from the name we requested, if there + // was a conflict on the network (the conflict could come from the same + // name still being registered on the network and not yet cleaned up) + try { + const publishedName = await publishZeroconf(zeroconf, {name, port}); + publishedNames.add(publishedName); + } catch (e) { + // Publishing could fail (timeout), but we don't want to throw the + // state machine start(), because that would leave the state machine + // in an "error" state and stop other things from working. By silently + // failing (with the report to Sentry), we are able to try again next + // time. + Sentry.captureException(e); + } + await startZeroconfPromise; }, async stop() { await Promise.all([ mapeoApi.stopLocalPeerDiscoveryServer(), stopZeroconf(zeroconf), + unpublishZeroconf(zeroconf, publishedNames).catch(e => { + // See above for why we silently fail here + Sentry.captureException(e); + }), ]); }, }); - sm.on('state', state => { - if (state.value === 'error') { - updateState({status: 'error', error: state.error}); + sm.on('state', smState => { + if (smState.value === 'error') { + updateState({status: 'error', error: smState.error}); } else { - updateState({status: state.value}); + updateState({status: smState.value}); } }); const listeners = new Set<() => void>(); @@ -163,9 +185,9 @@ export function createLocalDiscoveryController(mapeoApi: MapeoClientApi) { cancel = true; }; NetInfo.fetch('wifi') - .then(state => { + .then(netInfoState => { if (cancel) return; - onNetInfo(state); + onNetInfo(netInfoState); }) .catch(noop); } @@ -298,6 +320,36 @@ function startZeroconf(zeroconf: Zeroconf): Promise { }); } +function publishZeroconf( + zeroconf: Zeroconf, + {name, port}: {name: string; port: number}, +): Promise { + return new Promise((resolve, reject) => { + const timeoutId = setTimeout(() => { + cleanup(); + reject(new Error('Timed out publishing zeroconf service')); + }, ZEROCONF_PUBLISH_TIMEOUT_MS); + + const cleanup = () => { + clearTimeout(timeoutId); + zeroconf.off('published', onPublish); + }; + const onPublish = ({name: publishedName}: ZeroconfService) => { + cleanup(); + resolve(publishedName); + }; + + zeroconf.on('published', onPublish); + zeroconf.publishService( + ZEROCONF_SERVICE_TYPE, + ZEROCONF_PROTOCOL, + ZEROCONF_DOMAIN, + name, + port, + ); + }); +} + function stopZeroconf(zeroconf: Zeroconf): Promise { return new Promise((resolve, reject) => { const cleanup = () => { @@ -319,6 +371,35 @@ function stopZeroconf(zeroconf: Zeroconf): Promise { }); } +function unpublishZeroconf( + zeroconf: Zeroconf, + publishedNamesToBeMutated: Set, +): Promise { + if (publishedNamesToBeMutated.size === 0) return Promise.resolve(); + return new Promise((resolve, reject) => { + const timeoutId = setTimeout(() => { + cleanup(); + reject(new Error('Timed out unpublishing zeroconf service')); + }, ZEROCONF_UNPUBLISH_TIMEOUT_MS); + + const cleanup = () => { + clearTimeout(timeoutId); + zeroconf.off('remove', onRemove); + }; + const onRemove = (name: string) => { + publishedNamesToBeMutated.delete(name); + if (publishedNamesToBeMutated.size === 0) { + cleanup(); + resolve(); + } + }; + zeroconf.on('remove', onRemove); + for (const name of publishedNamesToBeMutated) { + zeroconf.unpublishService(name); + } + }); +} + function zeroconfServiceToMapeoPeer({ addresses, port, diff --git a/src/frontend/hooks/persistedState/usePersistedDraftObservation/index.ts b/src/frontend/hooks/persistedState/usePersistedDraftObservation/index.ts index 6e2a01a81..f11cd6115 100644 --- a/src/frontend/hooks/persistedState/usePersistedDraftObservation/index.ts +++ b/src/frontend/hooks/persistedState/usePersistedDraftObservation/index.ts @@ -7,12 +7,14 @@ import { } from '../../../contexts/PhotoPromiseContext/types'; import {deletePhoto, replaceDraftPhotos} from './photosMethods'; import {ClientGeneratedObservation, Position} from '../../../sharedTypes'; -import {Observation, Preset} from '@mapeo/schema'; +import {Observation, Preset} from '@comapeo/schema'; import {usePresetsQuery} from '../../server/presets'; import {matchPreset} from '../../../lib/utils'; const emptyObservation: ClientGeneratedObservation = { - metadata: {}, + lat: 0, + lon: 0, + metadata: {manualLocation: false}, tags: { notes: '', }, @@ -24,6 +26,7 @@ export type DraftObservationSlice = { audioRecordings: []; value: Observation | null | ClientGeneratedObservation; observationId?: string; + preset?: Preset; actions: { addPhotoPlaceholder: (draftPhotoId: string) => void; replacePhotoPlaceholderWithPhoto: (draftPhoto: DraftPhoto) => void; @@ -32,11 +35,26 @@ export type DraftObservationSlice = { // Create a new draft observation newDraft: () => void; deletePhoto: (uri: string) => void; - existingObservationToDraft: (observation: Observation) => void; - updateObservationPosition: (props: { - position: Position | undefined; - manualLocation: boolean; - }) => void; + existingObservationToDraft: ( + observation: Observation, + preset?: Preset, + ) => void; + updateObservationPosition: ( + props: + | { + manualLocation: false; + position: Position | undefined; + } + | { + manualLocation: true; + position: { + coords: { + latitude: number; + longitude: number; + }; + }; + }, + ) => void; updateTags: (tagKey: string, value: Observation['tags'][0]) => void; updatePreset: (preset: Preset) => void; }; @@ -61,6 +79,7 @@ const draftObservationSlice: StateCreator = ( audioRecordings: [], value: null, observationId: undefined, + preset: undefined, }); }, updateObservationPosition: props => { @@ -70,26 +89,40 @@ const draftObservationSlice: StateCreator = ( 'cannot update the draft position until a draft has been initialized', ); - set({ - value: { - ...prevValue, - lon: props?.position?.coords?.longitude, - lat: props?.position?.coords?.latitude, - metadata: { - ...prevValue.metadata, - position: props.position, - manualLocation: props.manualLocation, + if (props.manualLocation) { + set({ + value: { + ...prevValue, + lon: props.position.coords.longitude, + lat: props.position.coords.latitude, + metadata: { + manualLocation: props.manualLocation, + }, }, - }, - }); + }); + } else { + set({ + value: { + ...prevValue, + lon: props.position?.coords?.longitude, + lat: props.position?.coords?.latitude, + metadata: { + ...prevValue.metadata, + position: props.position, + manualLocation: props.manualLocation, + }, + }, + }); + } }, - existingObservationToDraft: observation => { + existingObservationToDraft: (observation, preset) => { set({ value: observation, observationId: observation.docId, photos: observation.attachments.filter( (att): att is SavedPhoto => att.type === 'photo', ), + preset, }); }, newDraft: () => { @@ -116,34 +149,53 @@ const draftObservationSlice: StateCreator = ( }); return; }, - updatePreset: ({tags, fieldRefs}) => { + updatePreset: preset => { const prevValue = get().value; + const prevPreset = get().preset; if (!prevValue) { set({ + preset, value: { - tags: tags, - metadata: {}, - attachments: [], + ...emptyObservation, + tags: { + ...preset.tags, + ...preset.addTags, + }, }, }); return; } - const fieldIds = fieldRefs.map(({docId}) => docId); - // we want to keep any field tags that are the same from the previous preset - const savedFieldTags = Object.fromEntries( - Object.entries(prevValue.tags).filter(([key]) => - fieldIds.includes(key), - ), - ); + if (!prevPreset) { + set({ + preset, + value: { + ...prevValue, + tags: { + ...prevValue.tags, + ...preset.tags, + ...preset.addTags, + }, + }, + }); + return; + } + // Apply tags from new preset and remove tags from previous preset + const newTags: Observation['tags'] = {...preset.tags, ...preset.addTags}; + for (const [key, value] of Object.entries(prevValue.tags)) { + const tagWasFromPrevPreset = + prevPreset.tags[key] === value || prevPreset.addTags[key] === value; + const shouldRemoveTag = preset.removeTags[key] === value; + // Only keep tags that were not from the previous preset and are not removed by the new preset + if (!tagWasFromPrevPreset && !shouldRemoveTag) { + newTags[key] = value; + } + } set({ + preset, value: { ...prevValue, - tags: { - ...tags, - ...savedFieldTags, - ...(prevValue.tags.notes ? {notes: prevValue.tags.notes} : {}), - }, + tags: newTags, }, }); }, @@ -158,7 +210,15 @@ export const usePersistedDraftObservation = createPersistedState( export const usePreset = () => { const {data: presets} = usePresetsQuery(); const tags = usePersistedDraftObservation(store => store.value?.tags); - return !tags ? undefined : matchPreset(tags, presets); + const preset = usePersistedDraftObservation(store => store.preset); + // For a draft observation (in contrast to an existing observation), we + // prioritize the preset explicitly set on the draft, rather than the one that + // we match based on tags. + if (preset) { + return preset; + } else if (tags) { + return matchPreset(tags, presets); + } }; export const _usePersistedDraftObservationActions = () => diff --git a/src/frontend/hooks/persistedState/usePersistedMetricDiagnosticsPermission.ts b/src/frontend/hooks/persistedState/usePersistedMetricDiagnosticsPermission.ts index 184412a55..447357dcb 100644 --- a/src/frontend/hooks/persistedState/usePersistedMetricDiagnosticsPermission.ts +++ b/src/frontend/hooks/persistedState/usePersistedMetricDiagnosticsPermission.ts @@ -9,7 +9,7 @@ type MetricDiagnosticsPermissionSlice = { const metricDiagnosticsPermissionSlice: StateCreator< MetricDiagnosticsPermissionSlice > = set => ({ - isEnabled: false, + isEnabled: true, setIsEnabled: isEnabled => set({isEnabled}), }); diff --git a/src/frontend/hooks/persistedState/usePersistedTrack.ts b/src/frontend/hooks/persistedState/usePersistedTrack.ts index a03afe1ab..5b8e7052e 100644 --- a/src/frontend/hooks/persistedState/usePersistedTrack.ts +++ b/src/frontend/hooks/persistedState/usePersistedTrack.ts @@ -2,7 +2,7 @@ import {calculateTotalDistance} from '../../utils/distance.ts'; import {LocationHistoryPoint} from '../../sharedTypes/location.ts'; import {createPersistedStore} from './createPersistedState.ts'; import {useStore} from 'zustand'; -import {Track} from '@mapeo/schema'; +import {Track} from '@comapeo/schema'; type ObservationRef = Track['observationRefs'][0]; diff --git a/src/frontend/hooks/server/deviceInfo.ts b/src/frontend/hooks/server/deviceInfo.ts index e6126218e..db6ca1c55 100644 --- a/src/frontend/hooks/server/deviceInfo.ts +++ b/src/frontend/hooks/server/deviceInfo.ts @@ -1,4 +1,3 @@ -import {type DeviceInfo} from '@mapeo/schema'; import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query'; import {deviceType, DeviceType} from 'expo-device'; @@ -26,7 +25,7 @@ export const useEditDeviceInfo = () => { mutationFn: async (name: string) => { return mapeoApi.setDeviceInfo({ name, - deviceType: deviceType ? expoToCoreDeviceType(deviceType) : undefined, + deviceType: expoToCoreDeviceType(deviceType), }); }, onSuccess: () => { @@ -35,7 +34,9 @@ export const useEditDeviceInfo = () => { }); }; -function expoToCoreDeviceType(d: DeviceType): DeviceInfo['deviceType'] { +function expoToCoreDeviceType( + d: Readonly, +): 'mobile' | 'tablet' | 'desktop' | 'UNRECOGNIZED' { switch (d) { case DeviceType.PHONE: { return 'mobile'; @@ -43,12 +44,11 @@ function expoToCoreDeviceType(d: DeviceType): DeviceInfo['deviceType'] { case DeviceType.TABLET: { return 'tablet'; } - case DeviceType.TV: { - return undefined; - } case DeviceType.DESKTOP: { return 'desktop'; } + case null: + case DeviceType.TV: case DeviceType.UNKNOWN: { return 'UNRECOGNIZED'; } diff --git a/src/frontend/hooks/server/fields.ts b/src/frontend/hooks/server/fields.ts index 1c868af19..37f72693c 100644 --- a/src/frontend/hooks/server/fields.ts +++ b/src/frontend/hooks/server/fields.ts @@ -1,13 +1,17 @@ import {useQuery} from '@tanstack/react-query'; import {useActiveProject} from '../../contexts/ActiveProjectContext'; +import {usePersistedLocale} from '../persistedState/usePersistedLocale'; + +export const FIELDS_KEY = 'fields'; export const useFieldsQuery = () => { const {projectId, projectApi} = useActiveProject(); + const lang = usePersistedLocale(store => store.locale); return useQuery({ - queryKey: ['fields', projectId], + queryKey: [FIELDS_KEY, projectId, lang], queryFn: async () => { - return projectApi.field.getMany(); + return projectApi.field.getMany({lang}); }, }); }; diff --git a/src/frontend/hooks/server/icons.ts b/src/frontend/hooks/server/icons.ts new file mode 100644 index 000000000..67c0b87df --- /dev/null +++ b/src/frontend/hooks/server/icons.ts @@ -0,0 +1,24 @@ +import {useQuery} from '@tanstack/react-query'; +import {IconSize} from '../../sharedTypes'; +import {useActiveProject} from '../../contexts/ActiveProjectContext'; + +export const ICONS_KEY = 'icons'; + +export function useIconUrl(iconId: string, size: IconSize) { + const {projectId, projectApi} = useActiveProject(); + + return useQuery({ + queryKey: [ICONS_KEY, projectId, iconId, size], + queryFn: async () => { + return projectApi.$icons.getIconUrl(iconId, { + mimeType: 'image/png', + size, + pixelDensity: 3, + }); + }, + // Defaults to 3 if not specified but due to an edge case when pausing and resuming the app + // (see https://github.com/digidem/comapeo-core/issues/821#issuecomment-2344231495), + // we reduce the retry count for the benefit of more immediate UI feedback in that scenario + retry: 2, + }); +} diff --git a/src/frontend/hooks/server/media.ts b/src/frontend/hooks/server/media.ts index ef8fdb45b..6fe1980ee 100644 --- a/src/frontend/hooks/server/media.ts +++ b/src/frontend/hooks/server/media.ts @@ -1,11 +1,11 @@ -import {Observation} from '@mapeo/schema'; -import {BlobVariant} from '@mapeo/core/dist/types'; +import {Observation} from '@comapeo/schema'; +import {BlobVariant} from '@comapeo/core/dist/types'; import {useMutation, useQueries, useQuery} from '@tanstack/react-query'; import {URL} from 'react-native-url-polyfill'; import {useActiveProject} from '../../contexts/ActiveProjectContext'; import {ProcessedDraftPhoto} from '../../contexts/PhotoPromiseContext/types'; -import {MapeoProjectApi} from '@mapeo/ipc'; +import type {MapeoProjectApi} from '@comapeo/ipc'; import {ClientApi} from 'rpc-reflector'; export function useCreateBlobMutation(opts: {retry?: number} = {}) { diff --git a/src/frontend/hooks/server/observations.ts b/src/frontend/hooks/server/observations.ts index 8773a9823..528dbfe16 100644 --- a/src/frontend/hooks/server/observations.ts +++ b/src/frontend/hooks/server/observations.ts @@ -3,7 +3,7 @@ import { useSuspenseQuery, useQueryClient, } from '@tanstack/react-query'; -import {ObservationValue} from '@mapeo/schema'; +import {ObservationValue} from '@comapeo/schema'; import {useActiveProject} from '../../contexts/ActiveProjectContext'; import {ClientGeneratedObservation} from '../../sharedTypes'; diff --git a/src/frontend/hooks/server/presets.ts b/src/frontend/hooks/server/presets.ts index 63c0366c6..76bab637d 100644 --- a/src/frontend/hooks/server/presets.ts +++ b/src/frontend/hooks/server/presets.ts @@ -2,22 +2,22 @@ import { useSuspenseQuery, useMutation, useQueryClient, - useQuery, } from '@tanstack/react-query'; -import {PresetValue} from '@mapeo/schema'; -import {IconSize} from '../../sharedTypes'; +import {PresetValue} from '@comapeo/schema'; import {useActiveProject} from '../../contexts/ActiveProjectContext'; +import {usePersistedLocale} from '../persistedState/usePersistedLocale'; export const PRESETS_KEY = 'presets'; export function usePresetsQuery() { const {projectId, projectApi} = useActiveProject(); + const locale = usePersistedLocale(store => store.locale); return useSuspenseQuery({ - queryKey: [PRESETS_KEY, projectId], + queryKey: [PRESETS_KEY, projectId, locale], queryFn: async () => { - return await projectApi.preset.getMany(); + return await projectApi.preset.getMany({lang: locale}); }, }); } @@ -35,26 +35,3 @@ export function usePresetsMutation() { }, }); } - -export function useGetPresetIcon(size: IconSize, name?: string) { - const {projectId, projectApi} = useActiveProject(); - - return useQuery({ - queryKey: ['presetIcon', projectId, size, name], - enabled: !!name, - queryFn: async () => { - const currentPreset = await projectApi.preset - .getMany() - .then(res => res.find(p => p.name === name)); - - return await projectApi.$icons.getIconUrl( - currentPreset?.iconRef?.docId!, - { - mimeType: 'image/png', - size: size, - pixelDensity: 3, - }, - ); - }, - }); -} diff --git a/src/frontend/hooks/server/projects.ts b/src/frontend/hooks/server/projects.ts index 8cde49bd1..04f4a9ce6 100644 --- a/src/frontend/hooks/server/projects.ts +++ b/src/frontend/hooks/server/projects.ts @@ -2,13 +2,18 @@ import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query'; import {useApi} from '../../contexts/ApiContext'; import {useActiveProject} from '../../contexts/ActiveProjectContext'; +import {PRESETS_KEY} from './presets'; +import {ICONS_KEY} from './icons'; +import {FIELDS_KEY} from './fields'; export const ALL_PROJECTS_KEY = 'all_projects'; export const PROJECT_SETTINGS_KEY = 'project_settings'; export const CREATE_PROJECT_KEY = 'create_project'; export const PROJECT_KEY = 'project'; export const PROJECT_MEMBERS_KEY = 'project_members'; -export const CREATED_BY_TO_DEVICE_ID_KEY = 'createdByToDeviceId'; +export const ORIGINAL_VERSION_ID_TO_DEVICE_ID_KEY = + 'originalVersionIdToDeviceId'; +export const THIS_USERS_ROLE_KEY = 'my_role'; export function useProject(projectId?: string) { const api = useApi(); @@ -56,6 +61,9 @@ export function useCreateProject() { queryClient.invalidateQueries({ queryKey: [ALL_PROJECTS_KEY], }); + queryClient.invalidateQueries({ + queryKey: [PROJECT_SETTINGS_KEY], + }); }, }); } @@ -82,13 +90,17 @@ export function useProjectSettings() { }); } -export const useCreatedByToDeviceId = (createdBy: string) => { +export const useOriginalVersionIdToDeviceId = (originalVersionId: string) => { const {projectId, projectApi} = useActiveProject(); return useQuery({ - queryKey: [CREATED_BY_TO_DEVICE_ID_KEY, projectId, createdBy], + queryKey: [ + ORIGINAL_VERSION_ID_TO_DEVICE_ID_KEY, + projectId, + originalVersionId, + ], queryFn: async () => { - return await projectApi.$createdByToDeviceId(createdBy); + return await projectApi.$originalVersionIdToDeviceId(originalVersionId); }, }); }; @@ -109,3 +121,41 @@ export function useLeaveProject() { }, }); } + +export function useImportProjectConfig() { + const queryClient = useQueryClient(); + const {projectApi} = useActiveProject(); + + return useMutation({ + mutationFn: (configPath: string) => { + return projectApi.importConfig({configPath}); + }, + onSuccess: () => { + return Promise.all([ + queryClient.invalidateQueries({ + queryKey: [FIELDS_KEY], + }), + queryClient.invalidateQueries({ + queryKey: [ICONS_KEY], + }), + queryClient.invalidateQueries({ + queryKey: [PROJECT_SETTINGS_KEY], + }), + queryClient.invalidateQueries({ + queryKey: [PRESETS_KEY], + }), + ]); + }, + }); +} + +export function useGetOwnRole() { + const {projectId, projectApi} = useActiveProject(); + + return useQuery({ + queryKey: [THIS_USERS_ROLE_KEY, projectId], + queryFn: () => { + return projectApi.$getOwnRole(); + }, + }); +} diff --git a/src/frontend/hooks/server/track.ts b/src/frontend/hooks/server/track.ts index c010f17cc..879e757a1 100644 --- a/src/frontend/hooks/server/track.ts +++ b/src/frontend/hooks/server/track.ts @@ -3,7 +3,7 @@ import { useMutation, useSuspenseQuery, } from '@tanstack/react-query'; -import {TrackValue} from '@mapeo/schema'; +import {TrackValue} from '@comapeo/schema'; import {useActiveProject} from '../../contexts/ActiveProjectContext'; @@ -46,6 +46,28 @@ export function useTrackQuery(docId: string) { }); } +export function useEditTrackMutation() { + const queryClient = useQueryClient(); + const {projectId, projectApi} = useActiveProject(); + + return useMutation({ + mutationFn: async ({ + versionId, + updatedTrack, + }: { + versionId: string; + updatedTrack: TrackValue; + }) => { + return projectApi.track.update(versionId, updatedTrack); + }, + onSuccess: data => { + queryClient.invalidateQueries({ + queryKey: [TRACK_KEY, projectId, data.docId], + }); + }, + }); +} + export function useDeleteTrackMutation() { const queryClient = useQueryClient(); const {projectApi} = useActiveProject(); diff --git a/src/frontend/hooks/useDraftObservation.test.tsx b/src/frontend/hooks/useDraftObservation.test.tsx new file mode 100644 index 000000000..6a994c67e --- /dev/null +++ b/src/frontend/hooks/useDraftObservation.test.tsx @@ -0,0 +1,139 @@ +// TODO: Move this into a jest setup file +jest.mock('expo-localization', () => ({ + getLocales: (): Locale[] => [ + { + languageTag: 'en-US', + languageCode: null, + regionCode: null, + currencyCode: null, + currencySymbol: null, + decimalSeparator: null, + digitGroupingSeparator: null, + textDirection: null, + measurementSystem: null, + temperatureUnit: null, + }, + ], +})); + +import React from 'react'; +import {act, renderHook} from '@testing-library/react-native'; +import {PhotoPromiseProvider} from '../contexts/PhotoPromiseContext/index.tsx'; +import {useDraftObservation} from './useDraftObservation.ts'; +import {usePersistedDraftObservation} from './persistedState/usePersistedDraftObservation/index.ts'; +import type {Locale} from 'expo-localization'; +import type {Preset} from '@comapeo/schema'; +import {randomBytes} from 'crypto'; + +test('Updating the preset on a draft observation does not loose user-entered details', () => { + function Wrapper({children}: {children: React.ReactNode}) { + return {children}; + } + + const {result} = renderHook( + () => ({ + ...useDraftObservation(), + ...usePersistedDraftObservation(), + }), + {wrapper: Wrapper}, + ); + + // Draft value should be null initially + expect(result.current.value).toBeNull(); + act(() => { + result.current.newDraft(); + }); + expect(result.current.value).toStrictEqual({ + lat: 0, + lon: 0, + metadata: {manualLocation: false}, + tags: {notes: ''}, + attachments: [], + }); + + const preset1: Preset = { + ...createEmptyPreset(), + name: 'Preset 1', + tags: { + tag1: 'value1', + }, + addTags: { + tag2: 'value2', + }, + }; + + const preset1ExpectedTags = { + ...preset1.tags, + ...preset1.addTags, + notes: '', + }; + + act(() => { + result.current.updatePreset(preset1); + }); + + expect(result.current.preset).toStrictEqual(preset1); + expect(result.current.value?.tags).toStrictEqual(preset1ExpectedTags); + + const obsDetails = { + detail1: 'value1', + detail2: 'value2', + }; + + act(() => { + for (const [key, value] of Object.entries(obsDetails)) { + result.current.updateTags(key, value); + } + result.current.updateTags('notes', 'Some notes'); + }); + + expect(result.current.value?.tags).toStrictEqual({ + ...preset1ExpectedTags, + ...obsDetails, + notes: 'Some notes', + }); + + // TODO: Better mock to also test removeTags behavior + const preset2: Preset = { + ...createEmptyPreset(), + name: 'Preset 2', + tags: { + tag2: 'value4', + tag3: 'value3', + }, + }; + + act(() => { + result.current.updatePreset(preset2); + }); + + expect(result.current.preset).toStrictEqual(preset2); + expect(result.current.value?.tags).toStrictEqual({ + ...preset2.tags, + ...preset2.addTags, + notes: 'Some notes', + detail1: 'value1', + detail2: 'value2', + }); +}); + +function createEmptyPreset(): Preset { + const versionId = randomBytes(16).toString('hex') + '/0'; + return { + schemaName: 'preset', + tags: {}, + addTags: {}, + removeTags: {}, + geometry: ['point'], + docId: randomBytes(16).toString('hex'), + name: '', + fieldRefs: [], + terms: [], + versionId, + originalVersionId: versionId, + updatedAt: new Date().toISOString(), + createdAt: new Date().toISOString(), + links: [], + deleted: false, + }; +} diff --git a/src/frontend/hooks/useLocalPeers.ts b/src/frontend/hooks/useLocalPeers.ts index 765bf85b8..abd1bce9d 100644 --- a/src/frontend/hooks/useLocalPeers.ts +++ b/src/frontend/hooks/useLocalPeers.ts @@ -1,4 +1,4 @@ -import {type MapeoClientApi} from '@mapeo/ipc'; +import {type MapeoClientApi} from '@comapeo/ipc'; import {useSyncExternalStore} from 'react'; import {useApi} from '../contexts/ApiContext'; diff --git a/src/frontend/hooks/useObservationWithPreset.ts b/src/frontend/hooks/useObservationWithPreset.ts index f259399ea..323d70457 100644 --- a/src/frontend/hooks/useObservationWithPreset.ts +++ b/src/frontend/hooks/useObservationWithPreset.ts @@ -7,13 +7,5 @@ export const useObservationWithPreset = (observationId: string) => { const {data: presets} = usePresetsQuery(); const preset = matchPreset(observation.tags, presets); - if (!observation) { - throw new Error('Observation does not exist'); - } - - if (!preset) { - throw new Error('Preset does not exist'); - } - return {observation, preset}; }; diff --git a/src/frontend/hooks/useOnBackgroundedAndForegrounded.ts b/src/frontend/hooks/useOnBackgroundedAndForegrounded.ts index 3b744cbdb..fa4bc9c49 100644 --- a/src/frontend/hooks/useOnBackgroundedAndForegrounded.ts +++ b/src/frontend/hooks/useOnBackgroundedAndForegrounded.ts @@ -1,4 +1,4 @@ -import {type MapeoClientApi} from '@mapeo/ipc'; +import {type MapeoClientApi} from '@comapeo/ipc'; import {useEffect} from 'react'; import {useAppState} from '@react-native-community/hooks'; diff --git a/src/frontend/hooks/useProjectInvitesListener.ts b/src/frontend/hooks/useProjectInvitesListener.ts index 8e16988f6..b4a7a3e06 100644 --- a/src/frontend/hooks/useProjectInvitesListener.ts +++ b/src/frontend/hooks/useProjectInvitesListener.ts @@ -2,8 +2,11 @@ import {useCallback, useEffect, useState} from 'react'; import {useApi} from '../contexts/ApiContext'; import {useQueryClient} from '@tanstack/react-query'; import {INVITE_KEY} from './server/invites'; -import {MapBuffers} from '@mapeo/core/dist/types'; -import {InviteInternal, InviteRemovalReason} from '@mapeo/core/dist/invite-api'; +import {MapBuffers} from '@comapeo/core/dist/types'; +import { + InviteInternal, + InviteRemovalReason, +} from '@comapeo/core/dist/invite-api'; export const useProjectInvitesListener = ({ inviteId, diff --git a/src/frontend/hooks/useSelectFileAndImportConfig.ts b/src/frontend/hooks/useSelectFileAndImportConfig.ts new file mode 100644 index 000000000..379cdae78 --- /dev/null +++ b/src/frontend/hooks/useSelectFileAndImportConfig.ts @@ -0,0 +1,26 @@ +import {useMutation} from '@tanstack/react-query'; +import {selectFile} from '../lib/selectFile'; +import * as FileSystem from 'expo-file-system'; +import {useImportProjectConfig} from './server/projects'; +import {convertFileUriToPosixPath} from '../lib/file-system'; + +export function useSelectFileAndImportConfig() { + const importProjectConfigMutation = useImportProjectConfig(); + + return useMutation({ + mutationFn: async () => { + const asset = await selectFile(['comapeocat']); + if (!asset) return; + + try { + return await importProjectConfigMutation.mutateAsync( + convertFileUriToPosixPath(asset.uri), + ); + } finally { + await FileSystem.deleteAsync(asset.uri).catch((err: unknown) => { + console.log(err); + }); + } + }, + }); +} diff --git a/src/frontend/hooks/useSyncState.ts b/src/frontend/hooks/useSyncState.ts index c3a54adcc..37a9e6cc3 100644 --- a/src/frontend/hooks/useSyncState.ts +++ b/src/frontend/hooks/useSyncState.ts @@ -1,5 +1,5 @@ import {useCallback, useSyncExternalStore} from 'react'; -import {MapeoProjectApi} from '@mapeo/ipc'; +import type {MapeoProjectApi} from '@comapeo/ipc'; import {useActiveProject} from '../contexts/ActiveProjectContext'; import {getDataSyncCountForDevice, type SyncState} from '../lib/sync'; diff --git a/src/frontend/images/QuestionIconCircle.svg b/src/frontend/images/QuestionIconCircle.svg new file mode 100644 index 000000000..887b4381d --- /dev/null +++ b/src/frontend/images/QuestionIconCircle.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/frontend/lib/ObservationMapLayer.ts b/src/frontend/lib/ObservationMapLayer.ts index 59af033a2..c65a93ab9 100644 --- a/src/frontend/lib/ObservationMapLayer.ts +++ b/src/frontend/lib/ObservationMapLayer.ts @@ -1,4 +1,4 @@ -import {Observation, Preset} from '@mapeo/schema'; +import {Observation, Preset} from '@comapeo/schema'; import {validateHTMLColorHex} from 'validate-color'; import {featureCollection as turfFeatureCollection, point} from '@turf/helpers'; import {Feature, Point} from 'geojson'; @@ -13,7 +13,7 @@ export function createObservationMapLayerStyle(presets: Preset[]) { const categoryColorPairs: Array = []; for (const {color, name} of presets) { - // @mapeo/schema only allows hex values for color field + // @comapeo/schema only allows hex values for color field // https://github.com/digidem/mapeo-schema/blob/f6d93ca456f1059d118dff2d094ceed312fcc2e9/schema/preset/v1.json#L100 if (color && validateHTMLColorHex(color)) { categoryColorPairs.push(name, color); diff --git a/src/frontend/lib/selectFile.ts b/src/frontend/lib/selectFile.ts new file mode 100644 index 000000000..c9cc5e26c --- /dev/null +++ b/src/frontend/lib/selectFile.ts @@ -0,0 +1,35 @@ +import * as DocumentPicker from 'expo-document-picker'; +import * as FileSystem from 'expo-file-system'; + +export async function selectFile(validFileTypes: string[]) { + let result; + try { + result = await DocumentPicker.getDocumentAsync({ + copyToCacheDirectory: true, + multiple: false, + }); + } catch (err) { + throw err; + } + + if (result.canceled) return; + + const asset = result.assets[0]; + + // Shouldn't happen based on how the library works + if (!asset) { + return; + } + + const isValidFileType = validFileTypes.some(type => + asset.name.endsWith(type), + ); + + // Only allow importing files with the desired extension + if (isValidFileType) { + return asset; + } else { + FileSystem.deleteAsync(asset.uri); + throw new Error('Invalid file type'); + } +} diff --git a/src/frontend/lib/sync.ts b/src/frontend/lib/sync.ts index 3ad92ecac..e9d233b5a 100644 --- a/src/frontend/lib/sync.ts +++ b/src/frontend/lib/sync.ts @@ -1,4 +1,4 @@ -import {MapeoProjectApi} from '@mapeo/ipc'; +import type {MapeoProjectApi} from '@comapeo/ipc'; export type SyncState = Awaited< ReturnType diff --git a/src/frontend/lib/utils.ts b/src/frontend/lib/utils.ts index bb36ed9bb..e773e4220 100644 --- a/src/frontend/lib/utils.ts +++ b/src/frontend/lib/utils.ts @@ -1,8 +1,10 @@ // import { Alert } from "react-native"; import {fromLatLon} from 'utm'; -import {Preset, Observation, Track} from '@mapeo/schema'; +import {Preset, Observation, Track} from '@comapeo/schema'; import {LocationObject, LocationProviderStatus} from 'expo-location'; import {FeatureCollection, LineString} from 'geojson'; + +import {type CoordinateFormat} from '../sharedTypes'; import {LocationHistoryPoint} from '../sharedTypes/location'; // import type { @@ -169,7 +171,7 @@ export function formatCoords({ }: { lon: number; lat: number; - format?: 'utm' | 'dd' | 'dms'; + format?: CoordinateFormat; }): string { switch (format) { case 'dd': diff --git a/src/frontend/metrics/getMetricsRequestInfo.ts b/src/frontend/metrics/getMetricsRequestInfo.ts index adf2f09e7..b046bcb39 100644 --- a/src/frontend/metrics/getMetricsRequestInfo.ts +++ b/src/frontend/metrics/getMetricsRequestInfo.ts @@ -1,11 +1,5 @@ import {assert} from '../lib/assert'; -const getEnv = (name: string): string => { - const result = process.env[name]; - assert(result, `${name} environment variable should be set`); - return result; -}; - /** * Get the info to send a metrics request. * @@ -14,8 +8,23 @@ const getEnv = (name: string): string => { * * @see {sendMetricsData} */ -export const getMetricsRequestInfo = () => ({ - isDevelopment: __DEV__, - metricsUrl: getEnv('EXPO_PUBLIC_METRICS_URL'), - metricsApiKey: getEnv('EXPO_PUBLIC_METRICS_API_KEY'), -}); +export function getMetricsRequestInfo(): { + isDevelopment: boolean; + metricsUrl: string; + metricsApiKey: string; +} { + const isDevelopment = __DEV__; + const metricsUrl = process.env.COMAPEO_METRICS_URL; + const metricsApiKey = process.env.COMAPEO_METRICS_API_KEY; + + assert( + metricsUrl, + 'EXPO_PUBLICS_METRICS_URL environment variable should be set', + ); + assert( + metricsApiKey, + 'EXPO_PUBLICS_METRICS_API_KEY environment variable should be set', + ); + + return {isDevelopment, metricsUrl, metricsApiKey}; +} diff --git a/src/frontend/packageJson.test.ts b/src/frontend/packageJson.test.ts index 73002d5c2..6e1d54e9e 100644 --- a/src/frontend/packageJson.test.ts +++ b/src/frontend/packageJson.test.ts @@ -48,8 +48,9 @@ async function readMapeoDependencies( ...dependencies, ...devDependencies, }; - const mapeoEntries = Object.entries(allDependencies).filter(([dependency]) => - dependency.startsWith('@mapeo/'), + const mapeoEntries = Object.entries(allDependencies).filter( + ([dependency]) => + dependency.startsWith('@mapeo/') || dependency.startsWith('@comapeo/'), ); return Object.fromEntries(mapeoEntries); } diff --git a/src/frontend/screens/AppPasscode/PasscodeIntro.tsx b/src/frontend/screens/AppPasscode/PasscodeIntro.tsx index c7b52b894..36acb4cf7 100644 --- a/src/frontend/screens/AppPasscode/PasscodeIntro.tsx +++ b/src/frontend/screens/AppPasscode/PasscodeIntro.tsx @@ -19,12 +19,12 @@ const m = defineMessages({ description: { id: 'screens.AppPasscode.PasscodeIntro.description', defaultMessage: - 'App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app. You can define your own 5-digit passcode by turning on the feature below.', + 'App Passcode allows you to add an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app. You can define your own 5-digit passcode by turning on the feature below.', }, warning: { id: 'screens.AppPasscode.PasscodeIntro.warning', defaultMessage: - 'Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open Mapeo and will lose access to any Mapeo data that has not been synced with other project participants.', + 'Please note that forgotten passcodes cannot be recovered! Once this feature is enabled, if you forget or lose your passcode, you will not be able to open CoMapeo and will lose access to any CoMapeo data that has not been synced with other project participants.', }, }); diff --git a/src/frontend/screens/AppPasscode/SetPasscode.tsx b/src/frontend/screens/AppPasscode/SetPasscode.tsx index 63c371b22..dfa19558a 100644 --- a/src/frontend/screens/AppPasscode/SetPasscode.tsx +++ b/src/frontend/screens/AppPasscode/SetPasscode.tsx @@ -20,7 +20,7 @@ const m = defineMessages({ }, subTitleSet: { id: 'screens.AppPasscode.NewPasscode.InputPasscodeScreen.subTitleSet', - defaultMessage: 'This passcode will be required to open the Mapeo App', + defaultMessage: 'This passcode will be required to open the CoMapeo App', }, passwordDoesNotMatch: { id: 'screens.AppPasscode.NewPasscode.InputPasscodeScreen.passwordDoesNotMatch', diff --git a/src/frontend/screens/AppPasscode/TurnOffPasscode.tsx b/src/frontend/screens/AppPasscode/TurnOffPasscode.tsx index 64d656fad..f5373179a 100644 --- a/src/frontend/screens/AppPasscode/TurnOffPasscode.tsx +++ b/src/frontend/screens/AppPasscode/TurnOffPasscode.tsx @@ -49,7 +49,7 @@ const m = defineMessages({ description: { id: 'screens.AppPasscode.TurnOffPasscode.description', defaultMessage: - 'App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the Mapeo app.', + 'App Passcode adds an additional layer of security by requiring that you enter a passcode in order to open the CoMapeo app.', }, currentlyUsing: { id: 'screens.AppPasscode.TurnOffPasscode.currentlyUsing', diff --git a/src/frontend/screens/HowToLeaveProject.tsx b/src/frontend/screens/HowToLeaveProject.tsx new file mode 100644 index 000000000..733e6555d --- /dev/null +++ b/src/frontend/screens/HowToLeaveProject.tsx @@ -0,0 +1,115 @@ +import * as React from 'react'; +import {StyleSheet, View} from 'react-native'; +import {Text} from '../sharedComponents/Text'; +import {defineMessages, useIntl} from 'react-intl'; +import {Button} from '../sharedComponents/Button'; +import {NativeStackScreenProps} from '@react-navigation/native-stack'; +import {AppStackParamsList} from '../sharedTypes/navigation'; +import {LIGHT_GREY} from '../lib/styles'; +import Warning from '../images/Warning.svg'; +import {ScreenContentWithDock} from '../sharedComponents/ScreenContentWithDock'; +import {useProjectMembers} from '../hooks/server/projects'; +import {useDeviceInfo} from '../hooks/server/deviceInfo'; +import {COORDINATOR_ROLE_ID, CREATOR_ROLE_ID} from '../sharedTypes'; +import {UIActivityIndicator} from 'react-native-indicators'; +import {QuestionMarkWithShadow} from '../sharedComponents/icons/QuestionMarkWithShadow'; + +const m = defineMessages({ + howTo: { + id: 'screens.HowToLeaveProject.howTo', + defaultMessage: 'How to Leave Project', + }, + instructions: { + id: 'screens.HowToLeaveProject.instructions', + defaultMessage: + 'To leave this project please uninstall and reinstall CoMapeo. All project data will be removed from this device.', + }, + goBack: { + id: 'screens.HowToLeaveProject.goBack', + defaultMessage: 'Go back', + }, + warning: { + id: 'screens.HowToLeaveProject.warning', + defaultMessage: + 'If you are the only Coordinator on the project no one else will be able to edit project details or invite other devices!', + }, +}); + +export const HowToLeaveProject = ({ + navigation, +}: NativeStackScreenProps) => { + const {formatMessage} = useIntl(); + const membersQuery = useProjectMembers(); + const deviceInfo = useDeviceInfo(); + + const coordinators = !membersQuery.data + ? [] + : membersQuery.data.filter( + member => + member.role.roleId === COORDINATOR_ROLE_ID || + member.role.roleId === CREATOR_ROLE_ID, + ); + + return ( + { + navigation.goBack(); + }}> + {formatMessage(m.goBack)} + + }> + + + {formatMessage(m.howTo)} + + + {formatMessage(m.instructions)} + + + {membersQuery.isPending || deviceInfo.isPending ? ( + + ) : coordinators.some( + coordinator => coordinator.deviceId === deviceInfo.data?.deviceId, + ) ? ( + + + {formatMessage(m.warning)} + + ) : null} + + ); +}; + +const styles = StyleSheet.create({ + container: { + padding: 20, + paddingTop: 80, + alignItems: 'center', + }, + text: { + textAlign: 'center', + }, + greyBox: { + backgroundColor: LIGHT_GREY, + padding: 20, + borderRadius: 6, + borderStyle: 'dashed', + borderColor: LIGHT_GREY, + borderWidth: 1, + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + }, + questionIcon: { + shadowColor: '#000', + backgroundColor: '#fff', + borderRadius: 100, + elevation: 20, + marginBottom: 20, + }, +}); diff --git a/src/frontend/screens/ManualGpsScreen/index.tsx b/src/frontend/screens/ManualGpsScreen/index.tsx index dbc00f312..be59696f1 100644 --- a/src/frontend/screens/ManualGpsScreen/index.tsx +++ b/src/frontend/screens/ManualGpsScreen/index.tsx @@ -24,7 +24,7 @@ import {IconButton} from '../../sharedComponents/IconButton'; import SaveCheck from '../../images/CheckMark.svg'; import {Select} from '../../sharedComponents/Select'; import {Text} from '../../sharedComponents/Text'; -import {type CoordinateFormat} from '../../sharedTypes'; +import type {CoordinateFormat} from '../../sharedTypes'; import { latitudeIsValid, @@ -104,30 +104,27 @@ export const ManualGpsScreen = ({ ); } - if (convertedData.coords) { - const {lon, lat} = convertedData.coords; + const {lon: longitude, lat: latitude} = convertedData.coords || {}; - const lonIsValid = lon !== undefined && longitudeIsValid(lon); - const latIsValid = lat !== undefined && latitudeIsValid(lat); + const lonIsValid = longitude !== undefined && longitudeIsValid(longitude); + const latIsValid = latitude !== undefined && latitudeIsValid(latitude); - if (!lonIsValid || !latIsValid) { - return ToastAndroid.showWithGravity( - t(m.invalidCoordinates), - ToastAndroid.LONG, - ToastAndroid.TOP, - ); - } + if (!lonIsValid || !latIsValid) { + return ToastAndroid.showWithGravity( + t(m.invalidCoordinates), + ToastAndroid.LONG, + ToastAndroid.TOP, + ); } updateObservationPosition({ + manualLocation: true, position: { - mocked: false, coords: { - latitude: convertedData.coords?.lat, - longitude: convertedData.coords?.lon, + longitude, + latitude, }, }, - manualLocation: true, }); navigation.pop(); diff --git a/src/frontend/screens/MapScreen/TracksMapLayer.tsx b/src/frontend/screens/MapScreen/TracksMapLayer.tsx index e801655c6..9c6f986c4 100644 --- a/src/frontend/screens/MapScreen/TracksMapLayer.tsx +++ b/src/frontend/screens/MapScreen/TracksMapLayer.tsx @@ -5,7 +5,7 @@ import {StyleSheet} from 'react-native'; import {FeatureCollection} from 'geojson'; import {BLACK} from '../../lib/styles'; import {useTracks} from '../../hooks/server/track'; -import {Track} from '@mapeo/schema'; +import {Track} from '@comapeo/schema'; import {OnPressEvent} from '@rnmapbox/maps/lib/typescript/src/types/OnPressEvent'; import {useNavigationFromHomeTabs} from '../../hooks/useNavigationWithTypes'; diff --git a/src/frontend/screens/MapScreen/index.tsx b/src/frontend/screens/MapScreen/index.tsx index 2da939080..7468cb0cf 100644 --- a/src/frontend/screens/MapScreen/index.tsx +++ b/src/frontend/screens/MapScreen/index.tsx @@ -1,7 +1,6 @@ import * as React from 'react'; import Mapbox from '@rnmapbox/maps'; -import config from '../../../config.json'; import {IconButton} from '../../sharedComponents/IconButton'; import { LocationFollowingIcon, @@ -23,13 +22,18 @@ import {UserLocation} from './UserLocation'; import {useSharedLocationContext} from '../../contexts/SharedLocationContext'; import {useMapStyleUrl} from '../../hooks/server/mapStyleUrl'; import {TracksMapLayer} from './TracksMapLayer'; +import {assert} from '../../lib/assert.ts'; // This is the default zoom used when the map first loads, and also the zoom // that the map will zoom to if the user clicks the "Locate" button and the // current zoom is < 12. const DEFAULT_ZOOM = 12; -Mapbox.setAccessToken(config.mapboxAccessToken); +assert( + process.env.MAPBOX_ACCESS_TOKEN, + 'MAPBOX_ACCESS_TOKEN environment variable should be set', +); +Mapbox.setAccessToken(process.env.MAPBOX_ACCESS_TOKEN); const MIN_DISPLACEMENT = 3; export const MapScreen = () => { diff --git a/src/frontend/screens/ObscurePasscode.tsx b/src/frontend/screens/ObscurePasscode.tsx index 4ffdeacf5..b944afb1a 100644 --- a/src/frontend/screens/ObscurePasscode.tsx +++ b/src/frontend/screens/ObscurePasscode.tsx @@ -27,12 +27,12 @@ const m = defineMessages({ }, instructions: { id: 'screens.ObscurePasscode.instructions', - defaultMessage: 'Enter the code above to hide your data in Mapeo', + defaultMessage: 'Enter the code above to hide your data in CoMapeo', }, description: { id: 'screens.ObscurePasscode.description', defaultMessage: - 'Obscure Passcode is a security feature that allows you to open Mapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of Mapeo which allows you to create demonstration observations that are not saved to the Mapeo database.', + 'Obscure Passcode is a security feature that allows you to open CoMapeo in a decoy mode that hides all of your data. Entering the Obscure Passcode on the intro screen will display an empty version of CoMapeo which allows you to create demonstration observations that are not saved to the CoMapeo database.', }, }); diff --git a/src/frontend/screens/Observation/Buttons.tsx b/src/frontend/screens/Observation/Buttons.tsx index 3f71c56dc..248783d74 100644 --- a/src/frontend/screens/Observation/Buttons.tsx +++ b/src/frontend/screens/Observation/Buttons.tsx @@ -1,4 +1,6 @@ +import React from 'react'; import {Alert, StyleSheet, TouchableOpacity, View} from 'react-native'; +import {Field, Observation} from '@comapeo/schema'; import {DARK_GREY} from '../../lib/styles'; import MaterialIcons from 'react-native-vector-icons/MaterialIcons'; import {defineMessages, useIntl} from 'react-intl'; @@ -14,6 +16,8 @@ import {convertUrlToBase64} from '../../utils/base64.ts'; import {useState} from 'react'; import {usePersistedSettings} from '../../hooks/persistedState/usePersistedSettings.ts'; import * as Sentry from '@sentry/react-native'; +import {CoordinateFormat} from '../../sharedTypes/index.ts'; +import {getValueLabel} from '../../sharedComponents/FormattedData.tsx'; const m = defineMessages({ delete: { @@ -57,24 +61,36 @@ const m = defineMessages({ defaultMessage: 'Sharing image', description: 'Title of dialog to share an observation with media', }, - shareMessage: { - id: 'screens.Observation.shareMessage', - defaultMessage: - 'CoMapeo Alert — _*{category_name}*_\n' + - '{date, date, full} {time, time, long}\n' + - '{coordinates}', - description: 'Message that will be shared along with image', + shareMessageTitle: { + id: 'screens.Observation.shareMessageTitle', + defaultMessage: 'CoMapeo Alert', + }, + shareMessageFooter: { + id: 'screens.Observation.shareMessageFooter', + defaultMessage: 'Sent from CoMapeo', + }, + fallbackCategoryName: { + id: 'screens.Observation.fallbackCategoryName', + defaultMessage: 'Observation', + description: + 'Fallback name used when category name cannot be determined for observation', + }, + comapeoAlert: { + id: 'screens.Observation.comapeoAlert', + defaultMessage: 'CoMapeo Alert', }, }); export const ButtonFields = ({ + fields, isMine, observationId, }: { + fields: Array; isMine: boolean; observationId: string; }) => { - const {formatMessage: t} = useIntl(); + const {formatMessage: t, formatDate} = useIntl(); const navigation = useNavigationFromRoot(); const deleteObservationMutation = useDeleteObservation(); const {observation, preset} = useObservationWithPreset(observationId); @@ -102,7 +118,7 @@ export const ButtonFields = ({ } async function handlePressShare() { - const {lon, lat, attachments} = observation; + const {attachments} = observation; setShareButtonLoading(true); const getValidUrls = (queries: typeof attachmentUrlQueries) => { const urls = queries @@ -129,18 +145,37 @@ export const ButtonFields = ({ urls.map(url => convertUrlToBase64(url)), ); + const completedFields: Array<{label: string; value: string}> = []; + + for (const field of fields) { + const value = observation.tags[field.tagKey]; + + if (value === undefined || value === null || value === '') { + continue; + } + + const displayedValue = (Array.isArray(value) ? value : [value]) + .map(v => { + return getValueLabel(v, field).trim(); + }) + .join(', '); + + completedFields.push({label: field.label, value: displayedValue}); + } + await Share.open({ + subject: `${t(m.comapeoAlert)} — _*${preset ? preset.name : t(m.fallbackCategoryName)}*_ — ${formatDate(observation.createdAt, {format: 'long'})}`, title: base64Urls.length > 0 ? t(m.shareMediaTitle) : t(m.shareTextTitle), urls: base64Urls, - message: t(m.shareMessage, { - category_name: preset.name, - date: Date.now(), - time: Date.now(), - coordinates: - typeof lon === 'number' && typeof lat === 'number' - ? formatCoords({lon, lat, format}) - : '', + message: createObservationShareMessage({ + categoryName: preset ? preset.name : t(m.fallbackCategoryName), + coordinateFormat: format, + completedFields, + footerText: t(m.shareMessageFooter), + observation, + timestamp: formatDate(observation.createdAt, {format: 'long'}), + titleText: t(m.shareMessageTitle), }), }); } catch (err) { @@ -210,3 +245,59 @@ const styles = StyleSheet.create({ justifyContent: 'space-around', }, }); + +function createObservationShareMessage({ + categoryName, + coordinateFormat, + completedFields, + footerText, + observation, + timestamp, + titleText, +}: { + categoryName?: string; + coordinateFormat: CoordinateFormat; + completedFields: Array<{label: string; value: string}>; + footerText: string; + observation: Observation; + timestamp: string; + titleText: string; +}): string { + const header = titleText + (categoryName ? ` — _*${categoryName}*_` : ''); + + const coordinates = + observation.lat !== undefined && observation.lon !== undefined + ? formatCoords({ + lon: observation.lon, + lat: observation.lat, + format: coordinateFormat, + }) + : ''; + + const notes = + observation.tags.notes !== undefined && observation.tags.notes !== null + ? `${observation.tags.notes}` + : ''; + + const displayedFields = + completedFields.length > 0 + ? completedFields + .map(({label, value}) => { + return `*${label}*\n_${value}_`; + }) + .join('\n\n') + : ''; + + const footer = `— ${footerText} —`; + + // No empty line between each item + const sectionTop = [header, timestamp, coordinates] + .filter(v => !!v) + .join('\n'); + + // One empty line between each item + const sectionMiddle = [notes, displayedFields].filter(v => !!v).join('\n\n'); + + // One empty line between each section + return [sectionTop, sectionMiddle, footer].filter(s => !!s).join('\n\n'); +} diff --git a/src/frontend/screens/Observation/FieldDetails.tsx b/src/frontend/screens/Observation/FieldDetails.tsx index bd4f36bf4..706e5462d 100644 --- a/src/frontend/screens/Observation/FieldDetails.tsx +++ b/src/frontend/screens/Observation/FieldDetails.tsx @@ -5,7 +5,7 @@ import { FormattedFieldProp, FormattedFieldValue, } from '../../sharedComponents/FormattedData'; -import {Field, Observation} from '@mapeo/schema'; +import {Field, Observation} from '@comapeo/schema'; export const FieldDetails = ({ fields, diff --git a/src/frontend/screens/Observation/ObservationHeaderRight.tsx b/src/frontend/screens/Observation/ObservationHeaderRight.tsx index 3d43e0c05..da5282c46 100644 --- a/src/frontend/screens/Observation/ObservationHeaderRight.tsx +++ b/src/frontend/screens/Observation/ObservationHeaderRight.tsx @@ -2,23 +2,23 @@ import * as React from 'react'; import {View, StyleSheet} from 'react-native'; import {IconButton} from '../../sharedComponents/IconButton'; -import {useObservationWithPreset} from '../../hooks/useObservationWithPreset'; import {EditIcon} from '../../sharedComponents/icons'; import {SyncIcon} from '../../sharedComponents/icons/SyncIconCircle'; import {useNavigationFromRoot} from '../../hooks/useNavigationWithTypes'; import {useDeviceInfo} from '../../hooks/server/deviceInfo'; import {UIActivityIndicator} from 'react-native-indicators'; -import {useCreatedByToDeviceId} from '../../hooks/server/projects.ts'; +import {useOriginalVersionIdToDeviceId} from '../../hooks/server/projects.ts'; +import {useObservation} from '../../hooks/server/observations.ts'; export const ObservationHeaderRight = ({ observationId, }: { observationId: string; }) => { - const observationWithPreset = useObservationWithPreset(observationId); + const {data: observation} = useObservation(observationId); const {data: createdByDeviceId, isPending: isCreatedByDeviceIdPending} = - useCreatedByToDeviceId(observationWithPreset.observation.createdBy); + useOriginalVersionIdToDeviceId(observation.originalVersionId); const {data: deviceInfo, isPending: isDeviceInfoPending} = useDeviceInfo(); const navigation = useNavigationFromRoot(); diff --git a/src/frontend/screens/Observation/PresetHeader.tsx b/src/frontend/screens/Observation/PresetHeader.tsx index 95aba62cf..edd8840a0 100644 --- a/src/frontend/screens/Observation/PresetHeader.tsx +++ b/src/frontend/screens/Observation/PresetHeader.tsx @@ -3,14 +3,14 @@ import {View, Text, StyleSheet} from 'react-native'; import {BLACK} from '../../lib/styles'; import {FormattedPresetName} from '../../sharedComponents/FormattedData'; import {PresetCircleIcon} from '../../sharedComponents/icons/PresetIcon'; -import {Preset} from '@mapeo/schema'; +import {Preset} from '@comapeo/schema'; -export const PresetHeader = ({preset}: {preset: Preset}) => { +export const PresetHeader = ({preset}: {preset?: Preset}) => { return ( diff --git a/src/frontend/screens/Observation/index.tsx b/src/frontend/screens/Observation/index.tsx index 7a91a4cac..fe34da5a2 100644 --- a/src/frontend/screens/Observation/index.tsx +++ b/src/frontend/screens/Observation/index.tsx @@ -6,7 +6,7 @@ import {BLACK, WHITE, DARK_GREY, LIGHT_GREY} from '../../lib/styles'; import {UIActivityIndicator} from 'react-native-indicators'; import {FormattedObservationDate} from '../../sharedComponents/FormattedData'; -import {Field} from '@mapeo/schema'; +import {Field} from '@comapeo/schema'; import {PresetHeader} from './PresetHeader'; import {useObservationWithPreset} from '../../hooks/useObservationWithPreset'; import {useFieldsQuery} from '../../hooks/server/fields'; @@ -17,7 +17,7 @@ import {NativeNavigationComponent} from '../../sharedTypes/navigation'; import {ObservationHeaderRight} from './ObservationHeaderRight'; import {MediaScrollView} from '../../sharedComponents/MediaScrollView/index.tsx'; import {useDeviceInfo} from '../../hooks/server/deviceInfo'; -import {useCreatedByToDeviceId} from '../../hooks/server/projects.ts'; +import {useOriginalVersionIdToDeviceId} from '../../hooks/server/projects.ts'; import {SavedPhoto} from '../../contexts/PhotoPromiseContext/types.ts'; import {ButtonFields} from './Buttons.tsx'; @@ -53,18 +53,21 @@ export const ObservationScreen: NativeNavigationComponent<'Observation'> = ({ const {data: fieldData} = useFieldsQuery(); const defaultAcc: Field[] = []; - const fields = fieldData - ? preset.fieldRefs.reduce((acc, pres) => { - const fieldToAdd = fieldData.find(field => field.docId === pres.docId); - if (!fieldToAdd) return acc; - return [...acc, fieldToAdd]; - }, defaultAcc) - : []; + const fields = + preset && fieldData + ? preset.fieldRefs.reduce((acc, pres) => { + const fieldToAdd = fieldData.find( + field => field.docId === pres.docId, + ); + if (!fieldToAdd) return acc; + return [...acc, fieldToAdd]; + }, defaultAcc) + : []; - const {lat, lon, createdBy} = observation; + const {lat, lon, originalVersionId} = observation; const {data: deviceInfo, isPending: isDeviceInfoPending} = useDeviceInfo(); - const {data: convertedDeviceId, isPending: isCreatedByDeviceIdPending} = - useCreatedByToDeviceId(createdBy); + const {data: convertedDeviceId, isPending: isDeviceIdPending} = + useOriginalVersionIdToDeviceId(originalVersionId); const isMine = deviceInfo?.deviceId !== undefined && @@ -92,7 +95,7 @@ export const ObservationScreen: NativeNavigationComponent<'Observation'> = ({ - {preset && } + {typeof observation.tags.notes === 'string' ? ( @@ -110,10 +113,14 @@ export const ObservationScreen: NativeNavigationComponent<'Observation'> = ({ )} - {isDeviceInfoPending || isCreatedByDeviceIdPending ? ( + {isDeviceInfoPending || isDeviceIdPending ? ( ) : ( - + )} diff --git a/src/frontend/screens/ObservationCreate/index.tsx b/src/frontend/screens/ObservationCreate/index.tsx index 4ffd47ad5..4a7945097 100644 --- a/src/frontend/screens/ObservationCreate/index.tsx +++ b/src/frontend/screens/ObservationCreate/index.tsx @@ -15,6 +15,7 @@ import {ErrorBottomSheet} from '../../sharedComponents/ErrorBottomSheet'; import {NativeStackNavigationOptions} from '@react-navigation/native-stack'; import {HeaderLeft} from './HeaderLeft'; import {ActionsRow} from '../../sharedComponents/ActionRow'; +import {Alert, type AlertButton} from 'react-native'; const m = defineMessages({ observation: { @@ -36,8 +37,48 @@ const m = defineMessages({ defaultMessage: 'What is happening here?', description: 'Placeholder for description/notes field', }, + noGpsTitle: { + id: 'screens.ObservationCreate.noGpsTitle', + defaultMessage: 'No GPS signal', + description: 'Title of dialog when trying to save with no GPS coords', + }, + noGpsDesc: { + id: 'screens.ObservationCreate.noGpsDesc', + defaultMessage: + 'This observation does not have a location. You can continue waiting for a GPS signal, save the observation without a location, or enter coordinates manually', + description: 'Description in dialog when trying to save with no GPS coords', + }, + weakGpsTitle: { + id: 'screens.ObservationCreate.weakGpsTitle', + defaultMessage: 'Weak GPS signal', + description: 'Title of dialog when trying to save with low GPS accuracy.', + }, + weakGpsDesc: { + id: 'screens.ObservationCreate.weakGpsDesc', + defaultMessage: + 'GPS accuracy is low. You can continue waiting for better accuracy, save the observation with low accuracy, or enter coordinates manually', + description: + 'Description in dialog when trying to save with low GPS accuracy.', + }, + saveAnyway: { + id: 'screens.ObservationCreate.saveAnyway', + defaultMessage: 'Save', + description: 'Button to save regardless of GPS state', + }, + manualEntry: { + id: 'screens.ObservationCreate.manualEntry', + defaultMessage: 'Manual Coords', + description: 'Button to manually enter GPS coordinates', + }, + keepWaiting: { + id: 'screens.ObservationCreate.keepWaiting', + defaultMessage: 'Continue waiting', + description: 'Button to cancel save and continue waiting for GPS', + }, }); +const MAXIMUM_ACCURACY = 10; + export const ObservationCreate = ({ navigation, }: NativeRootNavigationProps<'ObservationCreate'>) => { @@ -58,7 +99,7 @@ export const ObservationCreate = ({ ); const liveLocation = useMostAccurateLocationForObservation(); - const coordinateInfo = value?.metadata.manualLocation + const coordinateInfo = value?.metadata?.manualLocation ? { lat: value.lat, lon: value.lon, @@ -85,7 +126,14 @@ export const ObservationCreate = ({ if (!savablePhotos) { createObservationMutation.mutate( - {value}, + { + value: { + ...value, + presetRef: preset + ? {docId: preset.docId, versionId: preset.versionId} + : undefined, + }, + }, { onSuccess: () => { clearDraft(); @@ -132,6 +180,9 @@ export const ObservationCreate = ({ value: { ...value, attachments: [...value.attachments, ...newAttachments], + presetRef: preset + ? {docId: preset.docId, versionId: preset.versionId} + : undefined, }, }, { @@ -167,14 +218,71 @@ export const ObservationCreate = ({ navigation, photos, value, + preset, ]); + const checkAccuracyAndLocation = React.useCallback(() => { + const confirmationOptions: AlertButton[] = [ + { + text: formatMessage(m.saveAnyway), + onPress: createObservation, + style: 'default', + }, + { + text: formatMessage(m.manualEntry), + onPress: () => navigation.navigate('ManualGpsScreen'), + style: 'cancel', + }, + { + text: formatMessage(m.keepWaiting), + onPress: () => {}, + }, + ]; + + if (!value) { + return; + } + + // If the user has already inputted a manual location, do not check if location is accurate + if (value.metadata?.manualLocation) { + createObservation(); + return; + } + + const accuracy = value.metadata?.position?.coords?.accuracy; + + if (!liveLocation) { + Alert.alert( + formatMessage(m.noGpsTitle), + formatMessage(m.noGpsDesc), + confirmationOptions, + ); + return; + } + + // If we don't have accuracy, allow save anyway (this is a remnant from mapeo: https://github.com/digidem/mapeo-mobile/blob/0c0ebbb9ef2261e21cd1d1c8bd5ab2fe42017ea3/src/frontend/screens/ObservationEdit/SaveButton.js#L125C3-L125C50) + if ( + accuracy && + typeof accuracy === 'number' && + accuracy >= MAXIMUM_ACCURACY + ) { + Alert.alert( + formatMessage(m.weakGpsTitle), + formatMessage(m.weakGpsDesc), + confirmationOptions, + ); + return; + } + + createObservation(); + }, [createObservation, formatMessage, navigation, liveLocation, value]); + React.useEffect(() => { navigation.setOptions({ // eslint-disable-next-line react/no-unstable-nested-components headerRight: () => ( } diff --git a/src/frontend/screens/ObservationCreate/useMostAccurateLocationForObservation.ts b/src/frontend/screens/ObservationCreate/useMostAccurateLocationForObservation.ts index 386b82e78..e36f6f629 100644 --- a/src/frontend/screens/ObservationCreate/useMostAccurateLocationForObservation.ts +++ b/src/frontend/screens/ObservationCreate/useMostAccurateLocationForObservation.ts @@ -1,4 +1,5 @@ import {useFocusEffect} from '@react-navigation/native'; +import mapObject, {mapObjectSkip} from 'map-obj'; import {useCallback} from 'react'; import { watchPositionAsync, @@ -20,13 +21,13 @@ export function useMostAccurateLocationForObservation() { const locationServicesTurnedOff = providerStatus && !providerStatus.locationServicesEnabled; - const isLocationManuallySet = !!value?.metadata.manualLocation; + const isLocationManuallySet = !!value?.metadata?.manualLocation; // If location services are turned off (and the observation location is not manually set), // we want to immediately update the draft so that this hook does not return a stale position if ( locationServicesTurnedOff && - value?.metadata.position && + value?.metadata?.position && !isLocationManuallySet ) { updateObservationPosition({position: undefined, manualLocation: false}); @@ -43,16 +44,13 @@ export function useMostAccurateLocationForObservation() { }, debounceLocation()(location => { if (ignore) return; - const newCoord = !location - ? undefined - : Object.entries(location.coords).map( - ([key, val]) => [key, val === null ? undefined : val] as const, - ); updateObservationPosition({ position: { - mocked: false, - coords: !newCoord ? undefined : Object.fromEntries(newCoord), - timestamp: location?.timestamp.toString(), + mocked: location.mocked, + coords: mapObject(location.coords, (key, val) => + val == null ? mapObjectSkip : [key, val], + ), + timestamp: new Date(location.timestamp).toISOString(), }, manualLocation: false, }); @@ -72,13 +70,13 @@ export function useMostAccurateLocationForObservation() { }, [permissions, updateObservationPosition, isLocationManuallySet]), ); - return value?.metadata.position; + return value?.metadata?.position; } function debounceLocation() { let lastLocation: LocationObject | undefined; - return function (callback: (location: LocationObject | undefined) => any) { + return function (callback: (location: LocationObject) => unknown) { return function (location: LocationObject) { if (!lastLocation) { lastLocation = location; diff --git a/src/frontend/screens/ObservationEdit/index.tsx b/src/frontend/screens/ObservationEdit/index.tsx index 4c4f200fa..01c7c729f 100644 --- a/src/frontend/screens/ObservationEdit/index.tsx +++ b/src/frontend/screens/ObservationEdit/index.tsx @@ -16,6 +16,7 @@ import {Loading} from '../../sharedComponents/Loading'; import {HeaderLeft} from './HeaderLeft'; import {ProcessedDraftPhoto} from '../../contexts/PhotoPromiseContext/types'; import {CommonActions} from '@react-navigation/native'; +import {matchPreset} from '../../lib/utils.ts'; const m = defineMessages({ observation: { @@ -62,23 +63,44 @@ export const ObservationEdit: NativeNavigationComponent<'ObservationEdit'> = ({ }) : formatMessage(m.observation); + // TODO: This shouldn't be an effect, the logic should happen when the user + // presses the edit button. React.useEffect(() => { - if (!value) { - if (!route.params?.observationId) { - navigation.goBack(); - return; + let cancelled = false; + if (value) return; + if (!route.params?.observationId) { + navigation.goBack(); + return; + } + + async function createDraftFromExistingObservation(docId: string) { + const observation = await projectApi.observation.getByDocId(docId); + if (cancelled) return; + const presets = await projectApi.preset.getMany(); + if (cancelled) return; + let matchingPreset; + if (observation.presetRef) { + matchingPreset = presets.find( + p => p.docId === observation.presetRef?.docId, + ); } - projectApi.observation - .getByDocId(route.params.observationId) - .then(observation => { - existingObservationToDraft(observation); - }); + if (!matchingPreset) { + matchingPreset = matchPreset(observation.tags, presets); + } + existingObservationToDraft(observation, matchingPreset); } + + createDraftFromExistingObservation(route.params?.observationId); + + return () => { + cancelled = true; + }; }, [ value, existingObservationToDraft, route.params?.observationId, projectApi.observation, + projectApi.preset, navigation, ]); @@ -97,7 +119,15 @@ export const ObservationEdit: NativeNavigationComponent<'ObservationEdit'> = ({ if (!newPhotos || !newPhotos.length) { editObservationMutation.mutate( - {versionId: value.versionId, value}, + { + versionId: value.versionId, + value: { + ...value, + presetRef: preset + ? {docId: preset.docId, versionId: preset.versionId} + : undefined, + }, + }, { onSuccess: () => { if (navigation.canGoBack()) { @@ -140,6 +170,9 @@ export const ObservationEdit: NativeNavigationComponent<'ObservationEdit'> = ({ value: { ...value, attachments: [...value.attachments, ...newAttachments], + presetRef: preset + ? {docId: preset.docId, versionId: preset.versionId} + : undefined, }, }, { @@ -164,6 +197,7 @@ export const ObservationEdit: NativeNavigationComponent<'ObservationEdit'> = ({ ); }); }, [ + preset, navigation, clearDraft, value, @@ -192,7 +226,8 @@ export const ObservationEdit: NativeNavigationComponent<'ObservationEdit'> = ({ presetName={presetName} PresetIcon={ } diff --git a/src/frontend/screens/ObservationFields/Question.tsx b/src/frontend/screens/ObservationFields/Question.tsx index d93a3f431..1085e9bf7 100644 --- a/src/frontend/screens/ObservationFields/Question.tsx +++ b/src/frontend/screens/ObservationFields/Question.tsx @@ -3,7 +3,7 @@ import React from 'react'; import {SelectOne} from './SelectOne'; import {SelectMultiple} from './SelectMultiple'; import {TextArea} from './TextArea'; -import {Field} from '@mapeo/schema'; +import {Field} from '@comapeo/schema'; import { SelectMultipleField, SelectOneField, diff --git a/src/frontend/screens/ObservationFields/QuestionLabel.tsx b/src/frontend/screens/ObservationFields/QuestionLabel.tsx index 88231037d..21c5e440a 100644 --- a/src/frontend/screens/ObservationFields/QuestionLabel.tsx +++ b/src/frontend/screens/ObservationFields/QuestionLabel.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import {View, StyleSheet} from 'react-native'; import {FormattedFieldProp} from '../../sharedComponents/FormattedData'; import {Text} from '../../sharedComponents/Text'; -import {Field} from '@mapeo/schema'; +import {Field} from '@comapeo/schema'; interface Props { field: Field; diff --git a/src/frontend/screens/ObservationFields/SelectMultiple.tsx b/src/frontend/screens/ObservationFields/SelectMultiple.tsx index 4c27c921b..843a6c153 100644 --- a/src/frontend/screens/ObservationFields/SelectMultiple.tsx +++ b/src/frontend/screens/ObservationFields/SelectMultiple.tsx @@ -12,7 +12,7 @@ import {SelectMultipleField} from '../../sharedTypes/PresetTypes'; import {ViewStyleProp} from '../../sharedTypes'; import {usePersistedDraftObservation} from '../../hooks/persistedState/usePersistedDraftObservation'; import {useDraftObservation} from '../../hooks/useDraftObservation'; -import {Observation} from '@mapeo/schema'; +import {Observation} from '@comapeo/schema'; interface Props extends QuestionProps { field: SelectMultipleField; diff --git a/src/frontend/screens/ObservationFields/TextArea.tsx b/src/frontend/screens/ObservationFields/TextArea.tsx index 1c400e5d1..ddce30daa 100644 --- a/src/frontend/screens/ObservationFields/TextArea.tsx +++ b/src/frontend/screens/ObservationFields/TextArea.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import {StyleSheet, TextInput} from 'react-native'; import {QuestionLabel} from './QuestionLabel'; -import {Field} from '@mapeo/schema'; +import {Field} from '@comapeo/schema'; import {usePersistedDraftObservation} from '../../hooks/persistedState/usePersistedDraftObservation'; import {useDraftObservation} from '../../hooks/useDraftObservation'; diff --git a/src/frontend/screens/ObservationsList/NoProjectWarning.tsx b/src/frontend/screens/ObservationsList/NoProjectWarning.tsx index fe97593d6..2fb6de88d 100644 --- a/src/frontend/screens/ObservationsList/NoProjectWarning.tsx +++ b/src/frontend/screens/ObservationsList/NoProjectWarning.tsx @@ -7,23 +7,25 @@ import {TouchableOpacity} from 'react-native-gesture-handler'; import {useNavigationFromRoot} from '../../hooks/useNavigationWithTypes'; import {BLACK, DARK_BLUE, LIGHT_GREY} from '../../lib/styles'; import {ViewStyleProp} from '../../sharedTypes'; +import MaterialIcons from 'react-native-vector-icons/MaterialIcons'; const m = defineMessages({ cantShare: { id: 'screens.ObservationsList.NoProjectWarning', - defaultMessage: 'You won’t be able to share observations collected yet.', + defaultMessage: 'You are currently mapping on your own.', }, createOrJoin: { id: 'screens.ObservationsList.createOrJoin', - defaultMessage: 'Create or Join a Project.', + defaultMessage: 'Create or Join a Project ', description: - "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", + "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharingimportant observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", }, toSync: { id: 'screens.ObservationsList.toSync', - defaultMessage: 'To sync and share with other devices,', + defaultMessage: + 'to collect data with a team. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding.', description: - "The full sentence is 'To sync and share with other devices, Create or Join a Project.' The sentence needs to be seperated for styling purposes", + "The full sentence is 'Create or Join a Project to collect data with a team. This action will delete observations you have collected so far. Consider sharing important observations to you email before proceeding.' The sentence needs to be seperated for styling purposes", }, }); @@ -36,10 +38,9 @@ export const NoProjectWarning = ({style}: {style?: ViewStyleProp}) => { {formatMessage(m.cantShare)} navigate('CreateOrJoinProject')}> - {formatMessage(m.toSync) + ' '} { }}> {formatMessage(m.createOrJoin)} + {/* This space has to be added this way as it either effecting the underline styling (if added above) or effecting the rendering of the MaterialIcon if added below */} + + {formatMessage(m.toSync, {icon: })} diff --git a/src/frontend/screens/ObservationsList/ObservationListItem.tsx b/src/frontend/screens/ObservationsList/ObservationListItem.tsx index 32a888019..06023ae84 100644 --- a/src/frontend/screens/ObservationsList/ObservationListItem.tsx +++ b/src/frontend/screens/ObservationsList/ObservationListItem.tsx @@ -5,7 +5,7 @@ import {Text} from '../../sharedComponents/Text'; import {TouchableHighlight} from '../../sharedComponents/Touchables'; import {PresetCircleIcon} from '../../sharedComponents/icons/PresetIcon'; import {Attachment, ViewStyleProp} from '../../sharedTypes'; -import {Observation} from '@mapeo/schema'; +import {Observation} from '@comapeo/schema'; import { FormattedObservationDate, FormattedPresetName, @@ -13,7 +13,7 @@ import { import {PhotoAttachmentView} from '../../sharedComponents/PhotoAttachmentView.tsx'; import {useObservationWithPreset} from '../../hooks/useObservationWithPreset'; import {useDeviceInfo} from '../../hooks/server/deviceInfo'; -import {useCreatedByToDeviceId} from '../../hooks/server/projects.ts'; +import {useOriginalVersionIdToDeviceId} from '../../hooks/server/projects.ts'; interface ObservationListItemProps { style?: ViewStyleProp; @@ -43,12 +43,14 @@ function ObservationListItemNotMemoized({ (attachment): attachment is PhotoAttachment => attachment.type === 'photo', ); - const {data: createdByDeviceId, status: createdByToDeviceIdQueryStatus} = - useCreatedByToDeviceId(observation.createdBy); + const { + data: createdByDeviceId, + status: originalVersionIdToDeviceIdQueryStatus, + } = useOriginalVersionIdToDeviceId(observation.originalVersionId); const isMine = createdByDeviceId === deviceInfo?.deviceId; const queriesSucceeded = deviceInfoQueryStatus === 'success' && - createdByToDeviceIdQueryStatus === 'success'; + originalVersionIdToDeviceIdQueryStatus === 'success'; return ( - {preset && ( - - - - )} + + + - + ) : ( diff --git a/src/frontend/screens/ObservationsList/TrackListItem.tsx b/src/frontend/screens/ObservationsList/TrackListItem.tsx index 3e98df6e9..a79b4213e 100644 --- a/src/frontend/screens/ObservationsList/TrackListItem.tsx +++ b/src/frontend/screens/ObservationsList/TrackListItem.tsx @@ -1,7 +1,7 @@ import React from 'react'; import {StyleSheet, Text, TouchableHighlight, View} from 'react-native'; import {FormattedObservationDate} from '../../sharedComponents/FormattedData.tsx'; -import {Track} from '@mapeo/schema'; +import {Track} from '@comapeo/schema'; import {ViewStyleProp} from '../../sharedTypes/index'; import {defineMessages, useIntl} from 'react-intl'; import TrackIcon from '../../images/Track.svg'; diff --git a/src/frontend/screens/ObservationsList/index.tsx b/src/frontend/screens/ObservationsList/index.tsx index a6624db37..514797ba9 100644 --- a/src/frontend/screens/ObservationsList/index.tsx +++ b/src/frontend/screens/ObservationsList/index.tsx @@ -3,7 +3,7 @@ import {View, FlatList, Dimensions, StyleSheet} from 'react-native'; import {ObservationListItem} from './ObservationListItem'; import ObservationEmptyView from './ObservationsEmptyView'; -import {Observation, Track} from '@mapeo/schema'; +import {Observation, Track} from '@comapeo/schema'; import {MessageDescriptor, defineMessages} from 'react-intl'; import {BottomTabNavigationOptions} from '@react-navigation/bottom-tabs'; import {ObservationsListBarIcon} from '../../Navigation/Tab/TabBar/ObservationsListTabBarIcon'; @@ -28,7 +28,7 @@ const m = defineMessages({ error: { id: 'screens.ObservationsList.error', defaultMessage: - 'Error loading observations. Try quitting and restarting Mapeo.', + 'Error loading observations. Try quitting and restarting CoMapeo.', description: 'message shown when there is an unexpected error when loading observations', }, diff --git a/src/frontend/screens/Onboarding/DeviceNaming.tsx b/src/frontend/screens/Onboarding/DeviceNaming.tsx index 6c23dc8f0..3ec690e43 100644 --- a/src/frontend/screens/Onboarding/DeviceNaming.tsx +++ b/src/frontend/screens/Onboarding/DeviceNaming.tsx @@ -23,7 +23,7 @@ const m = defineMessages({ description: { id: 'screens.DeviceNaming.description', defaultMessage: - 'To create or join a new project you will have to name your device. In a future version of CoMapeo, you will be able to manage the projects you created by changing devices roles, deleting devices and much more.', + 'You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project.', }, addName: { id: 'screens.DeviceNaming.addName', diff --git a/src/frontend/screens/Onboarding/Success.tsx b/src/frontend/screens/Onboarding/Success.tsx index e0470c7f0..c1699ab64 100644 --- a/src/frontend/screens/Onboarding/Success.tsx +++ b/src/frontend/screens/Onboarding/Success.tsx @@ -26,6 +26,16 @@ const m = defineMessages({ id: 'screens.DeviceNaming.Success.goToMap', defaultMessage: 'Go to Map', }, + startMappingInstructions: { + id: 'screens.DeviceNaming.Success.startMappingInstructions', + defaultMessage: + 'You can start mapping alone or start mapping with a team. Create or join a project in order to share data with other devices that are part of the same project.', + }, + findSettings: { + id: 'screens.DeviceNaming.Success.findSettings', + defaultMessage: + 'To find your project settings go to the main menu found on the map screen.', + }, }); export const Success = ({ @@ -45,6 +55,8 @@ export const Success = ({ {deviceName} + {t(m.startMappingInstructions)} + {t(m.findSettings)} + ) : null} + { + selectAndImportConfigMutation.reset(); + }} + tryAgain={importConfigFile} + /> + + ); +}; + +Config.navTitle = m.navTitle; + +const styles = StyleSheet.create({ + container: { + padding: 20, + paddingTop: 40, + flex: 1, + }, +}); + +function formatDate(rfc3339Date: string) { + const date = new Date(rfc3339Date); + + const day = String(date.getDate()).padStart(2, '0'); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const year = date.getFullYear(); + + return `${day}/${month}/${year}`; +} + +function formatHours(rfc3339Date: string) { + const date = new Date(rfc3339Date); + const hours = date.getHours(); + const minutes = String(date.getMinutes()).padStart(2, '0'); + + const ampm = hours >= 12 ? 'pm' : 'am'; + const formattedHours = hours % 12 || 12; + + return `${formattedHours}:${minutes} ${ampm}`; +} diff --git a/src/frontend/screens/Settings/CreateOrJoinProject/CreateProject/index.tsx b/src/frontend/screens/Settings/CreateOrJoinProject/CreateProject/index.tsx index ae62fe616..4024d1180 100644 --- a/src/frontend/screens/Settings/CreateOrJoinProject/CreateProject/index.tsx +++ b/src/frontend/screens/Settings/CreateOrJoinProject/CreateProject/index.tsx @@ -21,6 +21,7 @@ import {ErrorBottomSheet} from '../../../../sharedComponents/ErrorBottomSheet'; import {HookFormTextInput} from '../../../../sharedComponents/HookFormTextInput'; import {Text} from '../../../../sharedComponents/Text'; import {NativeNavigationComponent} from '../../../../sharedTypes/navigation'; +import {selectFile} from '../../../../lib/selectFile'; const m = defineMessages({ title: { @@ -45,7 +46,7 @@ const m = defineMessages({ }, importConfigFileError: { id: 'screens.Settings.CreateOrJoinProject.importConfigFileError', - defaultMessage: 'File name should end with .mapeoconfig', + defaultMessage: 'File name should end with .comapeocat', }, }); @@ -123,12 +124,10 @@ export const CreateProject: NativeNavigationComponent<'CreateProject'> = ({ } async function importConfigFile() { - let result; try { - result = await DocumentPicker.getDocumentAsync({ - copyToCacheDirectory: true, - multiple: false, - }); + const asset = await selectFile(['comapeocat']); + if (!asset) return; + setConfigFileResult({type: 'success', file: asset}); } catch (err) { if (err instanceof Error) { setConfigFileResult({type: 'error', error: err}); @@ -136,26 +135,6 @@ export const CreateProject: NativeNavigationComponent<'CreateProject'> = ({ return; } - - if (result.canceled) return; - - const asset = result.assets[0]; - - // Shouldn't happen based on how the library works - if (!asset) return; - - // Only allow importing files with the desired extension - if (asset.name.endsWith('.mapeosettings')) { - setConfigFileResult({type: 'success', file: asset}); - } else { - setConfigFileResult({ - type: 'error', - error: new Error(t(m.importConfigFileError)), - }); - // No need to block UI on this - // no-op if something fails here. caches can eventually get cleared by the OS automatically. - FileSystem.deleteAsync(asset.uri).catch(noop); - } } const errorSheetProps = diff --git a/src/frontend/screens/Settings/CreateOrJoinProject/index.tsx b/src/frontend/screens/Settings/CreateOrJoinProject/index.tsx index 91f31bed5..ea878ca0f 100644 --- a/src/frontend/screens/Settings/CreateOrJoinProject/index.tsx +++ b/src/frontend/screens/Settings/CreateOrJoinProject/index.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; import {MessageDescriptor, defineMessages, useIntl} from 'react-intl'; +import MaterialIcons from 'react-native-vector-icons/MaterialIcons'; import {Text} from '../../../sharedComponents/Text'; import type {ViewStyleProp} from '../../../sharedTypes'; import type {NativeNavigationComponent} from '../../../sharedTypes/navigation'; @@ -30,7 +31,7 @@ const m = defineMessages({ }, joinExisting: { id: 'screens.Settings.CreateOrJoinProject.joinExisting', - defaultMessage: 'Join an existing Mapeo Project', + defaultMessage: 'Join an existing CoMapeo Project', }, whatIsAProject: { id: 'screens.Settings.CreateOrJoinProject.whatIsAProject', @@ -39,7 +40,7 @@ const m = defineMessages({ projectDescription: { id: 'screens.Settings.CreateOrJoinProject.projectDescription', defaultMessage: - 'A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices.', + 'A project is a secure container for your data. Only devices you invite can enter and share data with you. Create or Join a project in order to share data with other devices. This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding.', }, alreadyOnProject: { id: 'screens.Settings.CreateOrJoinProject.alreadyOnProject', @@ -59,7 +60,11 @@ export const CreateOrJoinProject: NativeNavigationComponent< {t(m.whatIsAProject)} - {t(m.projectDescription)} + + {t(m.projectDescription, { + icon: , + })} + {projects.data.length > 1 ? ( diff --git a/src/frontend/screens/Settings/CreateTestData.tsx b/src/frontend/screens/Settings/CreateTestData.tsx index 001c2015a..fe53f369b 100644 --- a/src/frontend/screens/Settings/CreateTestData.tsx +++ b/src/frontend/screens/Settings/CreateTestData.tsx @@ -17,6 +17,7 @@ import {Button} from '../../sharedComponents/Button'; import {LocationView} from '../../sharedComponents/Editor/LocationView'; import {ScreenContentWithDock} from '../../sharedComponents/ScreenContentWithDock'; import {Text} from '../../sharedComponents/Text'; +import type {Metadata} from '../../sharedTypes'; const DISTANCE_BUFFER_KM = 50; @@ -258,23 +259,35 @@ function useCreateFakeObservationsMutation() { const promises = []; for (let i = 0; i < count; i++) { - const fakeCoordinates = randomPosition({ - bbox, - }); + const [lon, lat] = randomPosition({bbox}); + if (lon === undefined || lat === undefined) { + throw new Error('randomPosition returned invalid position'); + } const randomPreset = presets.at( Math.floor(Math.random() * presets.length), ); - const value = { - attachments: [], - lon: fakeCoordinates[0], - lat: fakeCoordinates[1], - metadata: { + const isManualLocation = Math.random() < 0.25; + let metadata: Metadata; + if (isManualLocation) { + metadata = {manualLocation: true}; + } else { + metadata = { + manualLocation: false, position: { - mocked: !!location.mocked, + mocked: false, + timestamp: new Date().toISOString(), + coords: {latitude: lat, longitude: lon}, }, - }, + }; + } + + const value = { + attachments: [], + lon, + lat, + metadata, schemaName: 'observation' as const, tags: {...randomPreset!.tags, notes}, }; diff --git a/src/frontend/screens/Settings/ProjectSettings/YourTeam/SelectDevice.tsx b/src/frontend/screens/Settings/ProjectSettings/YourTeam/SelectDevice.tsx index a1286bcaf..578b0fd26 100644 --- a/src/frontend/screens/Settings/ProjectSettings/YourTeam/SelectDevice.tsx +++ b/src/frontend/screens/Settings/ProjectSettings/YourTeam/SelectDevice.tsx @@ -27,7 +27,7 @@ const m = defineMessages({ }, sameVersion: { id: 'screen.Settings.ProjectSettings.YourTeam.SelectDevice.sameVersion', - defaultMessage: 'Make sure both devices are on the same version of Mapeo', + defaultMessage: 'Make sure both devices are on the same version of CoMapeo', }, }); diff --git a/src/frontend/screens/Settings/ProjectSettings/YourTeam/SelectInviteeRole.tsx b/src/frontend/screens/Settings/ProjectSettings/YourTeam/SelectInviteeRole.tsx index db6c27e36..0b7a281b8 100644 --- a/src/frontend/screens/Settings/ProjectSettings/YourTeam/SelectInviteeRole.tsx +++ b/src/frontend/screens/Settings/ProjectSettings/YourTeam/SelectInviteeRole.tsx @@ -1,15 +1,15 @@ -import {StyleSheet, View} from 'react-native'; -import type {ViewStyleProp} from '../../../../sharedTypes'; -import type {NativeNavigationComponent} from '../../../../sharedTypes/navigation'; -import {defineMessages, useIntl} from 'react-intl'; -import {Text} from '../../../../sharedComponents/Text'; -import MaterialIcon from 'react-native-vector-icons/MaterialIcons'; -import {DARK_GREY, LIGHT_GREY} from '../../../../lib/styles'; import React from 'react'; +import {defineMessages, useIntl} from 'react-intl'; +import {ScrollView, StyleSheet, View} from 'react-native'; import {TouchableOpacity} from 'react-native-gesture-handler'; +import MaterialIcon from 'react-native-vector-icons/MaterialIcons'; + +import {LIGHT_GREY, MEDIUM_GREY} from '../../../../lib/styles'; import {DeviceNameWithIcon} from '../../../../sharedComponents/DeviceNameWithIcon'; import {RoleWithIcon} from '../../../../sharedComponents/RoleWithIcon'; +import {Text} from '../../../../sharedComponents/Text'; import {COORDINATOR_ROLE_ID, MEMBER_ROLE_ID} from '../../../../sharedTypes'; +import type {NativeNavigationComponent} from '../../../../sharedTypes/navigation'; const m = defineMessages({ title: { @@ -36,58 +36,58 @@ export const SelectInviteeRole: NativeNavigationComponent< 'SelectInviteeRole' > = ({route, navigation}) => { const {formatMessage: t} = useIntl(); + return ( - - - {t(m.selectingDevice)} - - - - navigation.navigate('ReviewAndInvite', { - ...route.params, - role: MEMBER_ROLE_ID, - }) - } - /> - - navigation.navigate('ReviewAndInvite', { - ...route.params, - role: COORDINATOR_ROLE_ID, - }) - } - /> - + + {t(m.selectingDevice)} + + + + + + navigation.navigate('ReviewAndInvite', { + ...route.params, + role: MEMBER_ROLE_ID, + }) + } + /> + + navigation.navigate('ReviewAndInvite', { + ...route.params, + role: COORDINATOR_ROLE_ID, + }) + } + /> + + ); }; type RoleCardProps = { role: 'participant' | 'coordinator'; onPress: () => void; - style?: ViewStyleProp; }; -export const RoleCard = ({role, style, onPress}: RoleCardProps) => { +const RoleCard = ({role, onPress}: RoleCardProps) => { const {formatMessage} = useIntl(); return ( - - - - - - {formatMessage( - role === 'coordinator' - ? m.coordinatorDescription - : m.participantDescription, - )} - + + + + + + + {formatMessage( + role === 'coordinator' + ? m.coordinatorDescription + : m.participantDescription, + )} + + ); @@ -96,19 +96,28 @@ export const RoleCard = ({role, style, onPress}: RoleCardProps) => { SelectInviteeRole.navTitle = m.title; const styles = StyleSheet.create({ - container: { - padding: 20, - paddingTop: 40, - height: '100%', + contentContainer: { + paddingVertical: 40, + paddingHorizontal: 20, + gap: 40, + }, + descriptionText: { + fontSize: 18, + fontWeight: 'bold', }, - flexRow: { + roleOptionsContainer: { + gap: 20, + }, + roleCardContentContainer: { flexDirection: 'row', alignItems: 'center', - }, - cardContainer: { + gap: 20, + padding: 20, borderWidth: 1, borderColor: LIGHT_GREY, - padding: 10, borderRadius: 5, }, + flex: { + flex: 1, + }, }); diff --git a/src/frontend/screens/Settings/ProjectSettings/YourTeam/index.tsx b/src/frontend/screens/Settings/ProjectSettings/YourTeam/index.tsx index e0cddc950..1a20eb13b 100644 --- a/src/frontend/screens/Settings/ProjectSettings/YourTeam/index.tsx +++ b/src/frontend/screens/Settings/ProjectSettings/YourTeam/index.tsx @@ -152,6 +152,7 @@ export const YourTeam: NativeNavigationComponent<'YourTeam'> = ({ style={{marginTop: 10}} name={coordinator.name || ''} deviceId={coordinator.deviceId} + dateAdded={coordinator.joinedAt} deviceType="mobile" thisDevice={deviceInfo.data?.deviceId === coordinator.deviceId} /> @@ -173,10 +174,8 @@ export const YourTeam: NativeNavigationComponent<'YourTeam'> = ({ name={participant.name || ''} deviceId={participant.deviceId} deviceType="mobile" - // This is a weak check. We should be using deviceIds, but those are not exposed - thisDevice={ - deviceInfo.data && deviceInfo.data.name === participant.name - } + dateAdded={participant.joinedAt} + thisDevice={deviceInfo.data?.deviceId === participant.deviceId} /> ))} diff --git a/src/frontend/screens/Settings/ProjectSettings/index.tsx b/src/frontend/screens/Settings/ProjectSettings/index.tsx index ea0672f9f..a3b946025 100644 --- a/src/frontend/screens/Settings/ProjectSettings/index.tsx +++ b/src/frontend/screens/Settings/ProjectSettings/index.tsx @@ -1,3 +1,4 @@ +import * as React from 'react'; import {ScrollView} from 'react-native'; import {List, ListItem, ListItemText} from '../../../sharedComponents/List'; import {FormattedMessage, defineMessages} from 'react-intl'; @@ -16,6 +17,11 @@ const m = defineMessages({ id: 'Screens.Settings.ProjectSettings.yourTeam', defaultMessage: 'Your Team', }, + config: { + id: 'screens.Settings.config', + defaultMessage: 'Project Configuration', + description: 'Primary text for project config settings', + }, }); export const ProjectSettings: NativeNavigationComponent<'ProjectSettings'> = ({ @@ -38,6 +44,13 @@ export const ProjectSettings: NativeNavigationComponent<'ProjectSettings'> = ({ }}> } /> + { + navigation.navigate('Config'); + }} + testID="settingsConfigButton"> + } /> + ); diff --git a/src/frontend/screens/Settings/index.tsx b/src/frontend/screens/Settings/index.tsx index 85c5c9978..b3b53309c 100644 --- a/src/frontend/screens/Settings/index.tsx +++ b/src/frontend/screens/Settings/index.tsx @@ -17,15 +17,15 @@ const m = defineMessages({ defaultMessage: 'Settings', description: 'Title of settings screen', }, - aboutMapeo: { - id: 'screens.Settings.aboutMapeo', - defaultMessage: 'About Mapeo', - description: "Primary text for 'About Mapeo' link (version info)", + aboutCoMapeo: { + id: 'screens.Settings.aboutCoMapeo', + defaultMessage: 'About CoMapeo', + description: "Primary text for 'About CoMapeo' link (version info)", }, - aboutMapeoDesc: { - id: 'screens.Settings.aboutMapeoDesc', + aboutCoMapeoDesc: { + id: 'screens.Settings.aboutCoMapeoDesc', defaultMessage: 'Version and build number', - description: "Description of the 'About Mapeo' page", + description: "Description of the 'About CoMapeo' page", }, createOrJoin: { id: 'screens.Settings.createOrJoin', @@ -106,8 +106,8 @@ export const Settings: NativeNavigationComponent<'Settings'> = () => { testID="settingsAboutButton"> } - secondary={} + primary={} + secondary={} /> {process.env.EXPO_PUBLIC_FEATURE_TEST_DATA_UI && ( diff --git a/src/frontend/screens/Sync/CreateOrJoinProjectDisplay.tsx b/src/frontend/screens/Sync/CreateOrJoinProjectDisplay.tsx index 3440e591c..2e998de0a 100644 --- a/src/frontend/screens/Sync/CreateOrJoinProjectDisplay.tsx +++ b/src/frontend/screens/Sync/CreateOrJoinProjectDisplay.tsx @@ -1,5 +1,7 @@ +import * as React from 'react'; import {StyleSheet, View} from 'react-native'; import {defineMessages, useIntl} from 'react-intl'; +import MaterialIcons from 'react-native-vector-icons/MaterialIcons'; import {Button} from '../../sharedComponents/Button'; import {Text} from '../../sharedComponents/Text'; @@ -7,14 +9,24 @@ import {ScreenContentWithDock} from '../../sharedComponents/ScreenContentWithDoc import {WHITE} from '../../lib/styles'; const m = defineMessages({ - description: { - id: 'screens.Sync.CreateOrJoinProjectDisplay.description', - defaultMessage: 'Create or Join a Project to sync with other devices', + title: { + id: 'screens.Sync.CreateOrJoinProjectDisplay.title', + defaultMessage: 'Create or join a project to collect data with a team', }, buttonText: { id: 'screens.Sync.CreateOrJoinProjectDisplay.buttonText', defaultMessage: 'Create or Join Project', }, + subTitle: { + id: 'screens.Sync.CreateOrJoinProjectDisplay.subTitle', + defaultMessage: + 'You will be able to share data with devices that are part of the same project.', + }, + subText: { + id: 'screens.Sync.CreateOrJoinProjectDisplay.subText', + defaultMessage: + 'This action will delete observations you have collected so far. Consider sharing {icon} important observations to your email before proceeding.', + }, }); export const CreateOrJoinProjectDisplay = ({ @@ -35,7 +47,13 @@ export const CreateOrJoinProjectDisplay = ({ }> - {t(m.description)} + {t(m.title)} + + {t(m.subTitle)} + + + {t(m.subText, {icon: })} + ); diff --git a/src/frontend/screens/Sync/ProjectSyncDisplay.tsx b/src/frontend/screens/Sync/ProjectSyncDisplay.tsx index 227e6958c..e691d4f45 100644 --- a/src/frontend/screens/Sync/ProjectSyncDisplay.tsx +++ b/src/frontend/screens/Sync/ProjectSyncDisplay.tsx @@ -40,8 +40,7 @@ import {Text} from '../../sharedComponents/Text'; const m = defineMessages({ devicesFound: { id: 'screens.Sync.ProjectSyncDisplay.devicesFound', - defaultMessage: - '{count} {count, plural, one {Device} other {Devices}} found', + defaultMessage: 'Devices found', }, noDevicesAvailableToSync: { @@ -50,8 +49,7 @@ const m = defineMessages({ }, devicesAvailableToSync: { id: 'screens.Sync.ProjectSyncDisplay.devicesAvailableToSync', - defaultMessage: - '{count} {count, plural, one {device} other {devices}} available', + defaultMessage: 'Devices available', }, waitingForDevices: { id: 'screens.Sync.ProjectSyncDisplay.waitingForDevices', @@ -59,13 +57,11 @@ const m = defineMessages({ }, syncingWithDevices: { id: 'screens.Sync.ProjectSyncDisplay.syncingWithDevices', - defaultMessage: - 'Syncing with {active} out of {total} {total, plural, one {device} other {devices}}', + defaultMessage: 'You are syncing with your team', }, syncingCompleteButWaitingForOthers: { id: 'screens.Sync.ProjectSyncDisplay.syncingCompleteButWaitingForOthers', - defaultMessage: - 'Complete! Waiting for {count} {count, plural, one {device} other {devices}}', + defaultMessage: 'Complete! Waiting for other devices to join', }, syncingFullyComplete: { id: 'screens.Sync.ProjectSyncDisplay.syncingFullyComplete', @@ -86,13 +82,7 @@ const m = defineMessages({ }, progressLabelWithDeviceCount: { id: 'screens.Sync.ProjectSyncDisplay.progressLabelWithDeviceCount', - defaultMessage: - '{active} out of {total} {total, plural, one {device} other {devices}}…', - }, - progressLabelComplete: { - id: 'screens.Sync.ProjectSyncDisplay.progressLabelComplete', - defaultMessage: - '{count} out of {count} {count, plural, one {device} other {devices}}', + defaultMessage: 'Waiting for other devices', }, progressSyncPercentage: { id: 'screens.Sync.ProjectSyncDisplay.syncProgress', @@ -197,9 +187,7 @@ export const ProjectSyncDisplay = ({ syncInfoContent = ( {syncStage.connectedPeersCount > 0 - ? t(m.devicesAvailableToSync, { - count: syncStage.connectedPeersCount, - }) + ? t(m.devicesAvailableToSync) : t(m.noDevicesAvailableToSync)} ); @@ -251,10 +239,7 @@ export const ProjectSyncDisplay = ({ {syncStage.progress === 0 ? t(m.waitingForDevices) - : t(m.syncingWithDevices, { - active: syncingPeersCount, - total: connectedPeersCount, - })} + : t(m.syncingWithDevices)} @@ -281,10 +266,7 @@ export const ProjectSyncDisplay = ({ syncInfoContent = ( <> - {t(m.syncingCompleteButWaitingForOthers, { - count: - syncStage.connectedPeersCount - syncStage.syncingPeersCount, - })} + {t(m.syncingCompleteButWaitingForOthers)} @@ -343,7 +325,7 @@ export const ProjectSyncDisplay = ({ )} - {t(m.devicesFound, {count: connectedPeersCount})} + {t(m.devicesFound)} {syncInfoContent} @@ -373,16 +355,11 @@ function SyncProgress({ break; } case 'complete-partial': { - progressLabel = t(m.progressLabelWithDeviceCount, { - active: stage.syncingPeersCount, - total: stage.connectedPeersCount, - }); + progressLabel = t(m.progressLabelWithDeviceCount); break; } case 'complete-full': { - progressLabel = t(m.progressLabelComplete, { - count: stage.connectedPeersCount, - }); + progressLabel = ''; break; } default: { diff --git a/src/frontend/screens/Track/MapPreview.tsx b/src/frontend/screens/Track/MapPreview.tsx index d7ee33715..eea43a58c 100644 --- a/src/frontend/screens/Track/MapPreview.tsx +++ b/src/frontend/screens/Track/MapPreview.tsx @@ -4,7 +4,7 @@ import MapboxGL from '@rnmapbox/maps'; import {LocationHistoryPoint} from '../../sharedTypes/location.ts'; import Mapbox from '@rnmapbox/maps'; import {convertToLineString} from '../../lib/utils.ts'; -import {Observation} from '@mapeo/schema'; +import {Observation} from '@comapeo/schema'; import {BLACK} from '../../lib/styles.ts'; import {usePresetsQuery} from '../../hooks/server/presets.ts'; import { diff --git a/src/frontend/screens/Track/ObservationList.tsx b/src/frontend/screens/Track/ObservationList.tsx index 803e0bb64..8dc869134 100644 --- a/src/frontend/screens/Track/ObservationList.tsx +++ b/src/frontend/screens/Track/ObservationList.tsx @@ -10,7 +10,7 @@ import {Text} from '../../sharedComponents/Text.tsx'; import ChainIcon from '../../images/Chain.svg'; import Chevrondown from '../../images/chevrondown.svg'; import ChevrondownDefault from '../../images/chevrondown-expanded.svg'; -import {Observation} from '@mapeo/schema'; +import {Observation} from '@comapeo/schema'; import {ObservationListItem} from '../ObservationsList/ObservationListItem.tsx'; import {useNavigationFromRoot} from '../../hooks/useNavigationWithTypes.ts'; import {defineMessages, useIntl} from 'react-intl'; diff --git a/src/frontend/screens/Track/TrackHeaderRight.tsx b/src/frontend/screens/Track/TrackHeaderRight.tsx new file mode 100644 index 000000000..f0736373f --- /dev/null +++ b/src/frontend/screens/Track/TrackHeaderRight.tsx @@ -0,0 +1,50 @@ +import * as React from 'react'; +import {View, StyleSheet} from 'react-native'; + +import {IconButton} from '../../sharedComponents/IconButton'; +import {useTrackQuery} from '../../hooks/server/track'; +import {useDeviceInfo} from '../../hooks/server/deviceInfo'; +import {UIActivityIndicator} from 'react-native-indicators'; +import {EditIcon} from '../../sharedComponents/icons'; +import {useOriginalVersionIdToDeviceId} from '../../hooks/server/projects.ts'; +import {useNavigationFromRoot} from '../../hooks/useNavigationWithTypes'; + +export const TrackHeaderRight = ({trackId}: {trackId: string}) => { + const {data: track, isLoading: isTrackLoading} = useTrackQuery(trackId); + const {data: createdByDeviceId, isPending: isCreatedByDeviceIdPending} = + useOriginalVersionIdToDeviceId(track?.originalVersionId); + + const {data: deviceInfo, isPending: isDeviceInfoPending} = useDeviceInfo(); + const navigation = useNavigationFromRoot(); + + if (isDeviceInfoPending || isCreatedByDeviceIdPending || isTrackLoading) { + return ( + + ); + } + + const canEdit = createdByDeviceId === deviceInfo?.deviceId; + + return canEdit ? ( + navigation.navigate('TrackEdit', {trackId})} + testID="editButton"> + + + ) : ( + + ); +}; + +const styles = StyleSheet.create({ + syncIconContainer: { + width: 60, + height: 60, + flex: 0, + justifyContent: 'center', + alignItems: 'center', + }, +}); diff --git a/src/frontend/screens/Track/index.tsx b/src/frontend/screens/Track/index.tsx index d655e3fee..12b1588ce 100644 --- a/src/frontend/screens/Track/index.tsx +++ b/src/frontend/screens/Track/index.tsx @@ -1,27 +1,21 @@ import React from 'react'; -import { - StyleSheet, - View, - Text, - SafeAreaView, - TouchableOpacity, -} from 'react-native'; +import {StyleSheet, View, Text, SafeAreaView} from 'react-native'; import {BLACK, DARK_GREY} from '../../lib/styles.ts'; import TrackIcon from '../../images/Track.svg'; -import EditIcon from '../../images/Edit.svg'; -import {FormattedMessage, defineMessages} from 'react-intl'; +import {FormattedMessage, MessageDescriptor, defineMessages} from 'react-intl'; import { useDeleteTrackMutation, useTrackQuery, } from '../../hooks/server/track.ts'; import {useObservations} from '../../hooks/server/observations.ts'; -import {NativeNavigationComponent} from '../../sharedTypes/navigation'; +import {NativeRootNavigationProps} from '../../sharedTypes/navigation'; import {MapPreview} from './MapPreview.tsx'; import {ObservationList} from './ObservationList.tsx'; import {ErrorBottomSheet} from '../../sharedComponents/ErrorBottomSheet.tsx'; import {ActionButtons} from '../../sharedComponents/ActionButtons.tsx'; import {ScreenContentWithDock} from '../../sharedComponents/ScreenContentWithDock.tsx'; +import {TrackHeaderRight} from './TrackHeaderRight'; const m = defineMessages({ title: { @@ -41,35 +35,13 @@ const m = defineMessages({ }, }); -const HIT_SLOP_PADDING = 16; - -export const TrackScreen: NativeNavigationComponent<'Track'> = ({ +export const TrackScreen = ({ route, navigation, -}) => { - const isMine = false; - React.useLayoutEffect(() => { - navigation.setOptions({ - headerRight: isMine - ? () => ( - { - // TODO: navigate to edit track screen - }}> - - - ) - : undefined, - }); - }, [navigation, isMine]); +}: NativeRootNavigationProps<'Track'>) => { + const {trackId} = route.params; - const {data: track} = useTrackQuery(route.params.trackId); + const {data: track} = useTrackQuery(trackId); const {data: observations} = useObservations(); const trackObservations = observations.filter(observation => track.observationRefs.some(ref => ref.docId === observation.docId), @@ -126,7 +98,20 @@ export const TrackScreen: NativeNavigationComponent<'Track'> = ({ ); }; -TrackScreen.navTitle = m.title; +export function createNavigationOptions({ + intl, +}: { + intl: (title: MessageDescriptor) => string; +}) { + return (props: NativeRootNavigationProps<'Track'>) => { + return { + headerTitle: intl(m.title), + headerRight: () => ( + + ), + }; + }; +} export const styles = StyleSheet.create({ positionText: { diff --git a/src/frontend/screens/TrackEdit/HeaderLeft.tsx b/src/frontend/screens/TrackEdit/HeaderLeft.tsx new file mode 100644 index 000000000..2b755b359 --- /dev/null +++ b/src/frontend/screens/TrackEdit/HeaderLeft.tsx @@ -0,0 +1,94 @@ +import * as React from 'react'; +import {HeaderLeftClose} from '../../sharedComponents/HeaderLeftClose'; +import {HeaderBackButtonProps} from '@react-navigation/native-stack/lib/typescript/src/types'; +import { + BottomSheetModal, + useBottomSheetModal, +} from '../../sharedComponents/BottomSheetModal'; +import {ConfirmDiscardBottomSheetContent} from '../../sharedComponents/ConfirmDiscardBottomSheetContent'; +import {defineMessages, useIntl} from 'react-intl'; +import {usePersistedTrack} from '../../hooks/persistedState/usePersistedTrack'; +import {useNavigationFromRoot} from '../../hooks/useNavigationWithTypes'; +import {CommonActions, useFocusEffect} from '@react-navigation/native'; +import {BackHandler} from 'react-native'; + +const m = defineMessages({ + discardTitle: { + id: 'TrackEdit.HeaderLeft.discardTitle', + defaultMessage: 'Discard changes?', + description: 'Title of dialog that shows when cancelling track edits', + }, + discardTrackDescription: { + id: 'TrackEdit.HeaderLeft.discardTrackDescription', + defaultMessage: 'Your changes will not be saved. This cannot be undone.', + }, + discardCancel: { + id: 'TrackEdit.HeaderLeft.discardCancel', + defaultMessage: 'Continue editing', + description: 'Button on dialog to keep editing (cancelling close action)', + }, + discardTrackButton: { + id: 'TrackEdit.HeaderLeft.discardTrackButton', + defaultMessage: 'Discard changes', + description: 'Button to confirm discarding the track', + }, +}); + +type HeaderLeftProps = { + headerBackButtonProps: HeaderBackButtonProps; +}; + +export const HeaderLeft = ({headerBackButtonProps}: HeaderLeftProps) => { + const {closeSheet, openSheet, isOpen, sheetRef} = useBottomSheetModal({ + openOnMount: false, + }); + const {formatMessage} = useIntl(); + const clearCurrentTrack = usePersistedTrack(state => state.clearCurrentTrack); + const navigation = useNavigationFromRoot(); + + useFocusEffect( + React.useCallback(() => { + const onBackPress = () => { + openSheet(); + return true; + }; + + const subscription = BackHandler.addEventListener( + 'hardwareBackPress', + onBackPress, + ); + + return () => subscription.remove(); + }, [openSheet]), + ); + + function handleDiscard() { + clearCurrentTrack(); + closeSheet(); + navigation.dispatch( + CommonActions.reset({ + index: 0, + routes: [{name: 'Home', params: {screen: 'Map'}}], + }), + ); + } + + return ( + <> + + + + + + ); +}; diff --git a/src/frontend/screens/TrackEdit/index.tsx b/src/frontend/screens/TrackEdit/index.tsx new file mode 100644 index 000000000..74114fa94 --- /dev/null +++ b/src/frontend/screens/TrackEdit/index.tsx @@ -0,0 +1,95 @@ +import React, {useEffect, useCallback} from 'react'; +import {defineMessages, useIntl} from 'react-intl'; +import {useFocusEffect} from '@react-navigation/native'; +import {Editor} from '../../sharedComponents/Editor'; +import {TrackDescriptionField} from '../SaveTrack/TrackDescriptionField'; +import {usePersistedTrack} from '../../hooks/persistedState/usePersistedTrack'; +import {NativeNavigationComponent} from '../../sharedTypes/navigation'; +import {HeaderLeft} from './HeaderLeft'; +import {SaveButton} from '../../sharedComponents/SaveButton'; +import TrackIcon from '../../images/Track.svg'; +import {useTrackQuery, useEditTrackMutation} from '../../hooks/server/track'; + +export const m = defineMessages({ + trackEditScreenTitle: { + id: 'screens.TrackEdit.title', + defaultMessage: 'Edit Track', + description: 'Title for editing track screen', + }, + presetTitle: { + id: 'screens.TrackEdit.track', + defaultMessage: 'Track', + description: 'Preset title for new track screen', + }, +}); + +export const TrackEdit: NativeNavigationComponent<'TrackEdit'> = ({ + navigation, + route, +}) => { + const {formatMessage} = useIntl(); + const {trackId} = route.params; + const {data: track} = useTrackQuery(trackId); + const editTrackMutation = useEditTrackMutation(); + const description = usePersistedTrack(state => state.description); + const setDescription = usePersistedTrack(state => state.setDescription); + const clearCurrentTrack = usePersistedTrack(state => state.clearCurrentTrack); + + useEffect(() => { + if (track && typeof track.tags.notes === 'string') { + setDescription(track.tags.notes); + } + }, [track, setDescription]); + + const saveTrack = useCallback(() => { + if (!track) return; + + editTrackMutation.mutate( + { + versionId: track.versionId, + updatedTrack: { + ...track, + tags: {...track.tags, notes: description}, + }, + }, + { + onSuccess: () => { + clearCurrentTrack(); + navigation.goBack(); + }, + }, + ); + }, [track, description, editTrackMutation, clearCurrentTrack, navigation]); + + useFocusEffect( + useCallback(() => { + navigation.setOptions({ + title: formatMessage(m.trackEditScreenTitle), + headerLeft: props => , + headerRight: () => ( + + ), + }); + }, [navigation, formatMessage, saveTrack, editTrackMutation.isPending]), + ); + + return ( + } + PresetIcon={} + isTrack={true} + presetDisabled={true} + /> + ); +}; + +TrackEdit.navTitle = m.trackEditScreenTitle; + +const styles = { + icon: {width: 30, height: 30}, +}; diff --git a/src/frontend/sharedComponents/ActionRow.tsx b/src/frontend/sharedComponents/ActionRow.tsx index 8f64cfc71..41e718ff6 100644 --- a/src/frontend/sharedComponents/ActionRow.tsx +++ b/src/frontend/sharedComponents/ActionRow.tsx @@ -4,7 +4,7 @@ import {ActionTab} from './ActionTab'; import PhotoIcon from '../images/observationEdit/Photo.svg'; import DetailsIcon from '../images/observationEdit/Details.svg'; import {useNavigationFromRoot} from '../hooks/useNavigationWithTypes'; -import {Preset} from '@mapeo/schema'; +import {Preset} from '@comapeo/schema'; const m = defineMessages({ audioButton: { diff --git a/src/frontend/sharedComponents/CustomHeaderLeftClose.tsx b/src/frontend/sharedComponents/CustomHeaderLeftClose.tsx index acb5536b1..f5f974a6b 100644 --- a/src/frontend/sharedComponents/CustomHeaderLeftClose.tsx +++ b/src/frontend/sharedComponents/CustomHeaderLeftClose.tsx @@ -11,7 +11,7 @@ import {useDraftObservation} from '../hooks/useDraftObservation'; import {defineMessages, useIntl} from 'react-intl'; import {useObservationWithPreset} from '../hooks/useObservationWithPreset'; import {ClientGeneratedObservation} from '../sharedTypes'; -import {Observation} from '@mapeo/schema'; +import {Observation} from '@comapeo/schema'; import {usePersistedDraftObservation} from '../hooks/persistedState/usePersistedDraftObservation'; import { CommonActions, diff --git a/src/frontend/sharedComponents/DeviceCard.tsx b/src/frontend/sharedComponents/DeviceCard.tsx index 8c008b6bb..dea5cc37f 100644 --- a/src/frontend/sharedComponents/DeviceCard.tsx +++ b/src/frontend/sharedComponents/DeviceCard.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import {StyleSheet} from 'react-native'; -import {LIGHT_GREY} from '../lib/styles'; +import {StyleSheet, View} from 'react-native'; +import {LIGHT_GREY, MAGENTA, MEDIUM_GREY} from '../lib/styles'; import {ExhaustivenessError} from '../lib/ExhaustivenessError'; import type { DeviceConnectionStatus, @@ -9,6 +9,16 @@ import type { } from '../sharedTypes'; import {TouchableOpacity} from 'react-native-gesture-handler'; import {DeviceNameWithIcon} from './DeviceNameWithIcon'; +import {FormattedDate, defineMessages, useIntl} from 'react-intl'; +import {Text} from './Text'; +import {useNavigationFromRoot} from '../hooks/useNavigationWithTypes'; + +const m = defineMessages({ + leaveProject: { + id: 'sharedComponents.DeviceCard.leaveProject', + defaultMessage: 'Leave Project', + }, +}); type DeviceCardProps = { deviceType: DeviceType; @@ -16,7 +26,7 @@ type DeviceCardProps = { deviceConnectionStatus?: DeviceConnectionStatus; thisDevice?: boolean; deviceId?: string; - dateAdded?: Date; + dateAdded?: string; style?: ViewStyleProp; onPress?: () => void; }; @@ -44,30 +54,60 @@ export const DeviceCard = ({ throw new ExhaustivenessError(deviceConnectionStatus); } + const {navigate} = useNavigationFromRoot(); + const {formatMessage} = useIntl(); + return ( (onPress ? onPress() : {})} - style={[styles.container, style]}> - + style={style}> + + + + {dateAdded && ( + + + + )} + {thisDevice && ( + { + navigate('HowToLeaveProject'); + }}> + + {formatMessage(m.leaveProject)} + + + )} + + ); }; const styles = StyleSheet.create({ container: { + flex: 1, flexDirection: 'row', alignItems: 'center', padding: 20, borderWidth: 1, borderColor: LIGHT_GREY, borderRadius: 3, + justifyContent: 'space-between', }, }); diff --git a/src/frontend/sharedComponents/DeviceNameWithIcon.tsx b/src/frontend/sharedComponents/DeviceNameWithIcon.tsx index 6db1b1ce5..217d66b57 100644 --- a/src/frontend/sharedComponents/DeviceNameWithIcon.tsx +++ b/src/frontend/sharedComponents/DeviceNameWithIcon.tsx @@ -65,15 +65,20 @@ export const DeviceNameWithIcon = ({ ) : ( )} - + {name} {deviceId && ( - + {`${deviceId.slice(0, 12)}...`} )} {thisDevice && ( - + {formatMessage(m.thisDevice)} )} diff --git a/src/frontend/sharedComponents/Editor/PresetView.tsx b/src/frontend/sharedComponents/Editor/PresetView.tsx index c96a533cd..9bdf5b74f 100644 --- a/src/frontend/sharedComponents/Editor/PresetView.tsx +++ b/src/frontend/sharedComponents/Editor/PresetView.tsx @@ -21,19 +21,21 @@ export const PresetView = ({ onPressPreset, presetName, PresetIcon, - presetDisabled, + presetDisabled = false, }: PresetViewProps) => { const {formatMessage} = useIntl(); return ( {PresetIcon} {presetName} - {formatMessage(m.change)} + {!presetDisabled && ( + {formatMessage(m.change)} + )} ); }; diff --git a/src/frontend/sharedComponents/Editor/index.tsx b/src/frontend/sharedComponents/Editor/index.tsx index 3cc2ca553..627c21e17 100644 --- a/src/frontend/sharedComponents/Editor/index.tsx +++ b/src/frontend/sharedComponents/Editor/index.tsx @@ -35,7 +35,6 @@ export const Editor = ({ actionsRow, notesComponent, isTrack = false, - presetDisabled = false, ...presetProps }: EditorProps) => { return ( diff --git a/src/frontend/sharedComponents/FormattedData.tsx b/src/frontend/sharedComponents/FormattedData.tsx index 202c6c770..31766b989 100644 --- a/src/frontend/sharedComponents/FormattedData.tsx +++ b/src/frontend/sharedComponents/FormattedData.tsx @@ -5,7 +5,7 @@ import { defineMessages, useIntl, } from 'react-intl'; -import {Field, Preset} from '@mapeo/schema'; +import {Field, Preset} from '@comapeo/schema'; import {formatCoords} from '../lib/utils'; import {DateDistance} from './DateDistance'; @@ -135,7 +135,7 @@ export const FormattedObservationDate = React.memo( // Format the translated preset name, with a fallback to "Observation" if no // preset is defined -export const FormattedPresetName = ({preset}: {preset: Preset | void}) => { +export const FormattedPresetName = ({preset}: {preset?: Preset}) => { const {formatMessage: t} = useIntl(); const name = preset ? t({id: `presets.${preset.docId}.name`, defaultMessage: preset.name}) @@ -146,7 +146,7 @@ export const FormattedPresetName = ({preset}: {preset: Preset | void}) => { // TODO: Better hangling of boolean and null values (we don't create these // anywhere yet) -function getValueLabel( +export function getValueLabel( value: null | boolean | number | string, field: Field, ): string { diff --git a/src/frontend/sharedComponents/LeaveProjectModalContent/LeaveProject.tsx b/src/frontend/sharedComponents/LeaveProjectModalContent/LeaveProject.tsx index 9a39e4959..3d9de5056 100644 --- a/src/frontend/sharedComponents/LeaveProjectModalContent/LeaveProject.tsx +++ b/src/frontend/sharedComponents/LeaveProjectModalContent/LeaveProject.tsx @@ -14,6 +14,7 @@ import {UIActivityIndicator} from 'react-native-indicators'; import {BottomSheetModalContent} from '../BottomSheetModal'; import {useAcceptInvite} from '../../hooks/server/invites'; import {ErrorBottomSheet} from '../ErrorBottomSheet'; +import {useActiveProject} from '../../contexts/ActiveProjectContext'; const m = defineMessages({ leaveProj: { @@ -70,38 +71,30 @@ export const LeaveProject = ({ const [error, setError] = React.useState(false); const [isChecked, setIsChecked] = React.useState(false); const leaveProject = useLeaveProject(); - const [combinedLoading, setCombinedLoading] = React.useState(false); + const {projectId} = useActiveProject(); function handleLeavePress() { if (!isChecked) { setError(true); return; } - setCombinedLoading(true); - // we want to accept first because the invitor will be able to cancel. this avoids the user leaving a project, and then their invite being cancelled before they were able to join. + // we want to accept first because the invitor will be able to cancel. + // this avoids the user leaving a project, and then their invite being cancelled before they were able to join. accept.mutate( {inviteId}, { onSuccess: () => { - closeSheet(); - setCombinedLoading(false); + leaveProject.mutate(projectId, { + onSuccess: () => { + closeSheet(); + }, + onError: err => { + Sentry.captureException(err); + }, + }); }, - // This is commented out for now and issue created: https://github.com/digidem/comapeo-mobile/issues/525 - // onSuccess: () => { - // leaveProject.mutate(undefined, { - // onSuccess: () => { - // closeSheet(); - // setCombinedLoading(false); - // }, - // onError: err => { - // Sentry.captureException(err) - // setCombinedLoading(false); - // }, - // }); - // }, onError: err => { Sentry.captureException(err); - setCombinedLoading(false); }, }, ); @@ -109,7 +102,11 @@ export const LeaveProject = ({ return ( <> - {combinedLoading ? ( + {accept.status === 'pending' || + leaveProject.status === 'pending' || + // Prevents a flicker back to non-pending UI while the sheet containing this component + // is being closed after both succeed + (accept.status === 'success' && leaveProject.status === 'success') ? ( ) : ( { accept.reset(); reject.reset(); + acceptedInvite?.remove(); }}> {currentInviteCanceled ? ( - ) : accept.isSuccess ? ( + ) : acceptedInvite ? ( ) : ( ); }; + +function useAcceptedInvite() { + const api = useApi(); + const [acceptedInvite, setAcceptedInvite] = + React.useState | null>(null); + + React.useEffect(() => { + function onInviteRemoved( + invite: MapBuffers, + reason: InviteRemovalReason, + ) { + if (reason === 'accepted') { + setAcceptedInvite(invite); + } + } + + api.invite.addListener('invite-removed', onInviteRemoved); + + return () => { + api.invite.removeListener('invite-removed', onInviteRemoved); + }; + }, [api.invite, setAcceptedInvite]); + + return acceptedInvite + ? { + value: acceptedInvite, + remove: () => { + setAcceptedInvite(null); + }, + } + : null; +} diff --git a/src/frontend/sharedComponents/icons/PresetIcon.tsx b/src/frontend/sharedComponents/icons/PresetIcon.tsx index a32f43728..210659840 100644 --- a/src/frontend/sharedComponents/icons/PresetIcon.tsx +++ b/src/frontend/sharedComponents/icons/PresetIcon.tsx @@ -1,15 +1,14 @@ -import React, {memo} from 'react'; +import React from 'react'; import {Image} from 'react-native'; - import {Circle} from './Circle'; -import {IconSize} from '../../sharedTypes'; +import {type IconSize} from '../../sharedTypes'; import {UIActivityIndicator} from 'react-native-indicators'; -import {useGetPresetIcon} from '../../hooks/server/presets'; +import {useIconUrl} from '../../hooks/server/icons'; import MaterialIcon from 'react-native-vector-icons/MaterialIcons'; interface PresetIconProps { - size?: IconSize; - name?: string; + iconId?: string; + size: IconSize; testID?: string; } @@ -25,37 +24,44 @@ const radii = { large: 35, }; -export const PresetIcon = memo( - ({size = 'medium', name, testID}) => { - const iconSize = iconSizes[size] || 35; - const {data, isLoading} = useGetPresetIcon(size, name); - const [error, setError] = React.useState(false); - - if (isLoading) return ; - - // Fallback to a default icon if we can't load the icon from mapeo-server - if (error || !name) return ; - - return ( - setError(true)} - testID={testID} - /> - ); - }, -); - -export const PresetCircleIcon = ({ - name, - size = 'medium', +const LoadedPresetIcon = ({ + iconId, + size, testID, -}: PresetIconProps) => { +}: PresetIconProps & {iconId: string}) => { + const iconSize = iconSizes[size]; + + const iconUrlQuery = useIconUrl(iconId, size); + + if (iconUrlQuery.status === 'pending') + return ; + + if (iconUrlQuery.status === 'error') { + return ; + } + + return ( + + ); +}; + +const PresetIcon = ({iconId, size, testID}: PresetIconProps) => { + return iconId ? ( + + ) : ( + + ); +}; + +export const PresetCircleIcon = ({iconId, size, testID}: PresetIconProps) => { return ( - + ); }; diff --git a/src/frontend/sharedComponents/icons/QuestionMarkWithShadow.tsx b/src/frontend/sharedComponents/icons/QuestionMarkWithShadow.tsx new file mode 100644 index 000000000..9943b27b3 --- /dev/null +++ b/src/frontend/sharedComponents/icons/QuestionMarkWithShadow.tsx @@ -0,0 +1,20 @@ +import * as React from 'react'; +import QuestionIconCircle from '../../images/QuestionIconCircle.svg'; + +export const QuestionMarkWithShadow = ({ + style, + ...props +}: React.ComponentProps) => ( + +); diff --git a/src/frontend/sharedTypes/PresetTypes.ts b/src/frontend/sharedTypes/PresetTypes.ts index 99e182097..7c026ff43 100644 --- a/src/frontend/sharedTypes/PresetTypes.ts +++ b/src/frontend/sharedTypes/PresetTypes.ts @@ -1,4 +1,4 @@ -import {Field} from '@mapeo/schema'; +import {Field} from '@comapeo/schema'; export interface TextField extends Field { appearance: 'singleline' | 'multiline'; diff --git a/src/frontend/sharedTypes/index.ts b/src/frontend/sharedTypes/index.ts index 8ec385cfa..52e5f1401 100644 --- a/src/frontend/sharedTypes/index.ts +++ b/src/frontend/sharedTypes/index.ts @@ -1,6 +1,6 @@ import {ImageStyle, StyleProp, TextStyle, ViewStyle} from 'react-native'; -import {Observation, ObservationValue} from '@mapeo/schema'; -import type {RoleId, RoleIdForNewInvite} from '@mapeo/core/dist/roles'; +import {Observation, ObservationValue} from '@comapeo/schema'; +import type {RoleId, RoleIdForNewInvite} from '@comapeo/core/dist/roles'; export type DeviceConnectionStatus = 'connected' | 'disconnected'; @@ -18,9 +18,11 @@ export type IconSize = 'small' | 'medium' | 'large'; export type Status = 'idle' | 'loading' | 'error' | 'success' | void; -export type Position = Observation['metadata']['position']; +export type Metadata = NonNullable; -export type Provider = Observation['metadata']['positionProvider']; +export type Position = Metadata['position']; + +export type PositionProvider = Metadata['positionProvider']; export type ClientGeneratedObservation = Omit; @@ -30,7 +32,7 @@ export type PhotoVariant = 'original' | 'thumbnail' | 'preview'; export type CoordinateFormat = 'utm' | 'dd' | 'dms'; -// Copied form /@mapeo/core/src/roles.js. Created an issue to eventuall expose this: https://github.com/digidem/mapeo-core-next/issues/532 +// Copied from @comapeo/core/src/roles.js. Created an issue to eventually expose this: https://github.com/digidem/mapeo-core-next/issues/532 export const CREATOR_ROLE_ID = 'a12a6702b93bd7ff'; export const COORDINATOR_ROLE_ID = 'f7c150f5a3a9a855'; export const MEMBER_ROLE_ID = '012fd2d431c0bf60'; diff --git a/src/frontend/sharedTypes/navigation.ts b/src/frontend/sharedTypes/navigation.ts index 8ff9bd189..601f6af35 100644 --- a/src/frontend/sharedTypes/navigation.ts +++ b/src/frontend/sharedTypes/navigation.ts @@ -37,7 +37,7 @@ export type RootStackParamsList = { Home: NavigatorScreenParams; GpsModal: undefined; Settings: undefined; - ProjectConfig: undefined; + Config: undefined; AboutSettings: undefined; LanguageSettings: undefined; CoordinateFormat: undefined; @@ -96,9 +96,11 @@ export type RootStackParamsList = { SaveTrack: undefined; Sync: undefined; Track: {trackId: string}; + TrackEdit: {trackId: string}; CreateTestData: undefined; DataAndPrivacy: undefined; SettingsPrivacyPolicy: undefined; + HowToLeaveProject: undefined; }; export type OnboardingParamsList = { diff --git a/src/frontend/utils/navigation.ts b/src/frontend/utils/navigation.ts index eb58fd4c4..144ef6b94 100644 --- a/src/frontend/utils/navigation.ts +++ b/src/frontend/utils/navigation.ts @@ -1,5 +1,5 @@ import {ClientGeneratedObservation} from '../sharedTypes'; -import {Observation, Preset} from '@mapeo/schema'; +import {Observation, Preset} from '@comapeo/schema'; import {matchPreset} from '../lib/utils'; import { RootStackParamsList,