diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 000000000..174cd77c6 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,47 @@ +You own the docs. Three sources of truth must agree: **docs**, **code**, and **prior user guidance**. When they don't, resolve it. Update `.github/instructions/` docs when your changes shift conventions. Fix obvious factual errors (paths, class names) without asking. Flag ambiguity when sources contradict. + +# client - Flutter/Dart Language Learning Chat App + +## Tech Stack +- **Framework**: Flutter (SDK ≥3.0), Dart +- **Base**: Fork of FluffyChat (package name `fluffychat`) +- **Protocol**: Matrix Client-Server API via `matrix` Dart SDK +- **Subscriptions**: RevenueCat +- **Backend**: 2-step-choreographer (FastAPI) via `PApiUrls` +- **Error Tracking**: Sentry +- **Routing**: GoRouter + +## Quick Reference + +### Project Structure +- `lib/pages/`, `lib/widgets/`, `lib/utils/`, `lib/config/` — FluffyChat base code +- `lib/pangea/` — **All Pangea language-learning code** (~30 feature modules) +- `pangea_packages/` — Shared isolate packages +- Pangea modifications in FluffyChat files marked with `// #Pangea` ... `// Pangea#` + +### Key Files +- **Entry point**: `lib/main.dart` +- **Root state**: `lib/widgets/matrix.dart` (`MatrixState`) +- **Pangea controller**: `lib/pangea/common/controllers/pangea_controller.dart` +- **Routes**: `lib/config/routes.dart` +- **API URLs**: `lib/pangea/common/network/urls.dart` +- **HTTP client**: `lib/pangea/common/network/requests.dart` +- **Environment**: `lib/pangea/common/config/environment.dart` (reads `.env` / `config.sample.json`) +- **Event types**: `lib/pangea/events/constants/pangea_event_types.dart` +- **Choreographer**: `lib/pangea/choreographer/choreographer.dart` + +### Conventions +- Package imports use `package:fluffychat/...` +- Feature modules follow pattern: `models/`, `repo/` (API calls), `widgets/`, `utils/`, `constants/` +- API repo files pair with request/response models (e.g., `igc_repo.dart` + `igc_request_model.dart` + `igc_response_model.dart`) +- Controllers extend `ChangeNotifier` or use `BaseController` (stream-based) + +## Documentation + +Detailed guides auto-load from `.github/instructions/` when editing matching files: + +| File | Applies To | Content | +|------|-----------|---------| +| `modules.instructions.md` | `lib/pangea/**` | Full map of ~30 feature modules | +| `choreographer.instructions.md` | `lib/pangea/choreographer/**` | Writing assistance flow (IGC, IT, text editing) | +| `events-and-tokens.instructions.md` | `lib/pangea/events/**,lib/pangea/extensions/**` | Custom Matrix events, token model, event wrappers | \ No newline at end of file diff --git a/.github/instructions/choreographer.instructions.md b/.github/instructions/choreographer.instructions.md new file mode 100644 index 000000000..3dcebbf2f --- /dev/null +++ b/.github/instructions/choreographer.instructions.md @@ -0,0 +1,161 @@ +--- +applyTo: "lib/pangea/choreographer/**" +--- + +# Choreographer — Writing Assistance Flow + +The choreographer is the client-side orchestrator for real-time writing assistance. It coordinates user text input, API calls to `/grammar_v2`, match display, and the creation of choreo records saved with sent messages. + +> **⚠️ IT (Interactive Translation) is deprecated.** The `it/` directory, `ITController`, and `/it_initialstep` endpoint are still wired into the choreographer but are being phased out. IT will become just another match type returned by IGC. Do not add new IT functionality. + +## Architecture + +``` +Choreographer (ChangeNotifier) +├── PangeaTextController ← Extended TextEditingController (tracks edit types) +├── IgcController ← Grammar check matches (primary flow) +├── ITController ← ⚠️ DEPRECATED — Translation step-by-step flow +├── ChoreographerErrorController ← Error state + backoff +└── ChoreographerStateExtension ← AssistanceStateEnum derivation +``` + +### Key files + +| File | Purpose | +|---|---| +| `choreographer.dart` | Main orchestrator (ChangeNotifier) | +| `choreographer_state_extension.dart` | Derives `AssistanceStateEnum` from current state | +| `assistance_state_enum.dart` | UI states: noSub, noMessage, notFetched, fetching, fetched, complete, error | +| `choreo_mode_enum.dart` | `igc` (active) or `it` (⚠️ deprecated) | +| `choreo_record_model.dart` | Record of edits saved with message | +| `igc/igc_controller.dart` | IGC state management (437 lines) | +| `igc/replacement_type_enum.dart` | Granular match type taxonomy (grammar, surface, word-choice, etc.) | +| `igc/autocorrect_popup.dart` | Undo popup for auto-applied corrections | +| `text_editing/pangea_text_controller.dart` | Text controller with edit type tracking | +| `it/it_controller.dart` | ⚠️ DEPRECATED — IT state | + +## Flow + +### 1. User types → debounce → IGC request + +1. User types in chat input. `PangeaTextController` fires `_onChange`. +2. After debounce (`ChoreoConstants.msBeforeIGCStart`), `requestWritingAssistance()` is called. +3. `IgcController.getIGCTextData()` calls `/grammar_v2` via `IgcRepo`. +4. Response contains a list of `SpanData` (matches) — grammar errors, out-of-target markers, normalization fixes. +5. Auto-apply matches (punct, diacritics, spell, cap) are accepted automatically via `acceptNormalizationMatches()`. Grammar/word-choice matches become `openMatches`. + +### 2. Matches displayed → Span cards + +1. Open matches render as colored underlines in the text field (colors set by `ReplacementTypeEnum.underlineColor()`). +2. Tapping a match opens a **span card** overlay (`span_card.dart`) showing the error category (`ReplacementTypeEnum.displayName()`), choices, and the error message. +3. Auto-applied corrections show an `AutocorrectPopup` with undo capability. + +### 3. User resolves matches + +Each match goes through `PangeaMatchState` with status transitions: + +- `open` → `accepted` (user chose a replacement) +- `open` → `ignored` (user dismissed) +- `open` → `automatic` (auto-apply correction) +- Any → `undo` (user reverted) + +When a match is accepted/ignored, the `IgcController` fires `matchUpdateStream`. The `Choreographer` listens and: + +- Updates the text via `textController.setSystemText()` +- Records the step in `ChoreoRecordModel` + +### 4. Feedback rerun + +If the user is unsatisfied with results, `rerunWithFeedback(feedbackText)` re-calls IGC with user feedback and the previous request/response context (`_lastRequest`, `_lastResponse`). + +### 5. Sending + +On send, `Choreographer.getMessageContent()`: + +1. Calls `/tokenize` to get `PangeaToken` data for the final text (with exponential backoff on errors). +2. Builds `PangeaMessageContentModel` containing: + - The final message text + - `ChoreoRecordModel` (full editing history) + - `PangeaRepresentation` for original written text (if IT was used) + - `PangeaMessageTokens` (token/lemma/morph data) + +## AssistanceStateEnum + +Derived in `choreographer_state_extension.dart`. Drives the send-button color and UI hints: + +| State | Meaning | +|---|---| +| `noSub` | User has no active subscription | +| `noMessage` | Text field is empty | +| `notFetched` | Text entered but IGC hasn't run yet | +| `fetching` | IGC request in flight | +| `fetched` | Matches present — user needs to resolve them | +| `complete` | All matches resolved, ready to send | +| `error` | IGC error (backoff active) | + +## ReplacementTypeEnum — Match Type Taxonomy + +Defined in `igc/replacement_type_enum.dart`. Categories returned by `/grammar_v2`: + +| Category | Types | Behavior | +|---|---|---| +| **Client-only** | `definition`, `practice`, `itStart` | Not from server; `itStart` triggers deprecated IT flow | +| **Grammar** (~21 types) | `verbConjugation`, `verbTense`, `verbMood`, `subjectVerbAgreement`, `genderAgreement`, `numberAgreement`, `caseError`, `article`, `preposition`, `pronoun`, `wordOrder`, `negation`, `questionFormation`, `relativeClause`, `connector`, `possessive`, `comparative`, `passiveVoice`, `conditional`, `infinitiveGerund`, `modal` | Orange underline, user must accept/ignore | +| **Surface corrections** | `punct`, `diacritics`, `spell`, `cap` | Auto-applied (no user interaction), undo via `AutocorrectPopup` | +| **Word choice** | `falseCognate`, `l1Interference`, `collocation`, `semanticConfusion` | Blue underline, user must accept/ignore | +| **Higher-level** | `transcription`, `style`, `fluency`, `didYouMean`, `translation`, `other` | Teal (style/fluency) or error color | + +Key extension helpers: `isAutoApply`, `isGrammarType`, `isWordChoiceType`, `underlineColor()`, `displayName()`, `fromString()` (handles legacy snake_case and old type names like `grammar` → `subjectVerbAgreement`). + +## Key Models + +| Model | File | Purpose | +|---|---|---| +| `SpanData` | `igc/span_data_model.dart` | A match span (offset, length, choices, message, rule, `ReplacementTypeEnum`) | +| `PangeaMatch` | `igc/pangea_match_model.dart` | SpanData + status | +| `PangeaMatchState` | `igc/pangea_match_state_model.dart` | Mutable wrapper tracking original vs updated match state | +| `ChoreoRecordModel` | `choreo_record_model.dart` | Full editing history: steps, open matches, original text | +| `ChoreoRecordStepModel` | `choreo_edit_model.dart` | Single edit step (text before/after, accepted match) | +| `IGCRequestModel` | `igc/igc_request_model.dart` | Request to `/grammar_v2` | +| `IGCResponseModel` | `igc/igc_response_model.dart` | Response from `/grammar_v2` | +| `MatchRuleIdModel` | `igc/match_rule_id_model.dart` | Rule ID constants (⚠️ `tokenNeedsTranslation`, `tokenSpanNeedsTranslation`, `l1SpanAndGrammar` — not currently sent by server) | +| `AutocorrectPopup` | `igc/autocorrect_popup.dart` | Undo widget for auto-applied corrections | + +## API Endpoints + +| Endpoint | Repo File | Status | +|---|---|---| +| `/choreo/grammar_v2` | `igc/igc_repo.dart` | ✅ Active — primary IGC endpoint | +| `/choreo/tokenize` | `events/repo/tokens_repo.dart` | ✅ Active — tokenizes final text on send | +| `/choreo/span_details` | `igc/span_data_repo.dart` | ❌ Dead code — `SpanDataRepo` class is defined but never imported anywhere | +| `/choreo/it_initialstep` | `it/it_repo.dart` | ⚠️ Deprecated — IT flow | +| `/choreo/contextual_definition` | `contextual_definition_repo.dart` | ⚠️ Deprecated — only used by IT's `word_data_card.dart` | + +## Edit Types (`EditTypeEnum`) + +- `keyboard` — User typing +- `igc` — System applying IGC match +- `it` — ⚠️ Deprecated — System applying IT continuance +- `itDismissed` — ⚠️ Deprecated — IT dismissed, restoring source text + +## Deprecated: SpanChoiceTypeEnum + +In `igc/span_choice_type_enum.dart`: +- `bestCorrection` — `@Deprecated('Use suggestion instead')` +- `bestAnswer` — `@Deprecated('Use suggestion instead')` +- `suggestion` — Active replacement + +## Error Handling + +- IGC and token errors trigger exponential backoff (`_igcErrorBackoff *= 2`, `_tokenErrorBackoff *= 2`) +- Backoff resets on next successful request +- Errors surfaced via `ChoreographerErrorController` +- Error state exposed in `AssistanceStateEnum.error` + +## ⚠️ Deprecated: Interactive Translation (IT) + +> **Do not extend.** IT is being deprecated. Translation will become a match type within IGC. + +The `it/` directory still contains `ITController`, `ITRepo`, `ITStepModel`, `CompletedITStepModel`, `GoldRouteTrackerModel`, `it_bar.dart`, `it_feedback_card.dart`, and `word_data_card.dart`. The choreographer still wires up IT via `_onOpenIT()` / `_onCloseIT()` / `_onAcceptContinuance()`, triggered when an `itStart` match is found. The `it_bar.dart` widget is still imported by `chat_input_bar.dart`. + +This entire flow will be removed once testing confirms IT is no longer needed as a separate mode. diff --git a/.github/instructions/events-and-tokens.instructions.md b/.github/instructions/events-and-tokens.instructions.md new file mode 100644 index 000000000..95c0d0ed8 --- /dev/null +++ b/.github/instructions/events-and-tokens.instructions.md @@ -0,0 +1,174 @@ +--- +applyTo: "lib/pangea/events/**,lib/pangea/extensions/**" +--- + +# Events & Tokens — Matrix Event Data Model + +Messages in Pangea carry rich metadata stored as Matrix events related to the main message. This doc covers custom event types, the token model, event wrappers, and how they connect. + +## Event Hierarchy for a Message + +When a user sends a message, the client creates a tree of related Matrix events: + +``` +m.room.message (the chat message) +├── pangea.representation ← PangeaRepresentation (sent text + lang) +│ ├── pangea.tokens ← PangeaMessageTokens (tokenized text) +│ └── pangea.record ← ChoreoRecordModel (editing history) +├── pangea.representation ← (optional: L1 original if IT was used) +│ └── pangea.tokens +├── pangea.translation ← Full-text translation +├── pangea.activity_req ← Request to generate practice activities +├── pangea.activity_res ← Generated practice activity +├── pangea.activity_completion ← User's activity completion record +└── pangea.stt_translation ← Speech-to-text translation +``` + +## Custom Event Types (`PangeaEventTypes`) + +Defined in `lib/pangea/events/constants/pangea_event_types.dart`: + +### Message-related + +| Type | Constant | Purpose | +|---|---|---| +| `pangea.representation` | `representation` | A text representation with language code | +| `pangea.tokens` | `tokens` | Tokenized text (lemmas, POS, morphology) | +| `pangea.record` | `choreoRecord` | Choreographer editing history | +| `pangea.translation` | `translation` | Full-text translation | +| `pangea.stt_translation` | `sttTranslation` | Speech-to-text translation | + +### Activities + +| Type | Constant | Purpose | +|---|---|---| +| `pangea.activity_req` | `activityRequest` | Request server to generate activities | +| `pangea.activity_res` | `pangeaActivity` | A practice activity for a message | +| `pangea.activity_completion` | `activityRecord` | Per-user activity completion record | +| `pangea.activity_plan` | `activityPlan` | Activity plan definition | +| `pangea.activity_roles` | `activityRole` | Roles in a structured activity | +| `pangea.activity_summary` | `activitySummary` | Post-activity summary | + +### Analytics & Learning + +| Type | Constant | Purpose | +|---|---|---| +| `pangea.construct` | `construct` | A tracked learning construct | +| `pangea.construct_summary` | `constructSummary` | Aggregate construct data | +| `pangea.summaryAnalytics` | `summaryAnalytics` | Summary analytics data | +| `pangea.analytics_profile` | `profileAnalytics` | User analytics profile | +| `pangea.activities_profile` | `profileActivities` | User activities profile | +| `pangea.analytics_settings` | `analyticsSettings` | Analytics display settings | +| `p.user_lemma_info` | `userSetLemmaInfo` | User-customized lemma info | +| `p.emoji` | `userChosenEmoji` | User-chosen emoji for a word | + +### Room/Course Settings + +| Type | Constant | Purpose | +|---|---|---| +| `pangea.class` | `languageSettings` | Room language configuration | +| `p.rules` | `rules` | Room rules | +| `pangea.roomtopic` | `roomInfo` | Room topic info | +| `pangea.bot_options` | `botOptions` | Bot behavior configuration | +| `pangea.capacity` | `capacity` | Room capacity limit | +| `pangea.course_plan` | `coursePlan` | Course plan reference | +| `p.course_user` | `courseUser` | User's course enrollment | +| `pangea.teacher_mode` | `teacherMode` | Teacher mode toggle | +| `pangea.course_chat_list` | `courseChatList` | Course chat list | + +### Audio & Media + +| Type | Constant | Purpose | +|---|---|---| +| `p.audio` | `audio` | Audio attachment | +| `pangea.transcript` | `transcript` | Audio transcript | +| `p.rule.text_to_speech` | `textToSpeechRule` | TTS settings | + +### User & Misc + +| Type | Constant | Purpose | +|---|---|---| +| `pangea.user_age` | `userAge` | User age bracket | +| `m.report` | `report` | Content report | +| `p.rule.analytics_invite` | `analyticsInviteRule` | Analytics sharing rules | +| `p.analytics_request` | `analyticsInviteContent` | Analytics sharing request | +| `pangea.regeneration_request` | `regenerationRequest` | Content regeneration request | +| `pangea.activity_room_ids` | `activityRoomIds` | Activity room references | + +## Core Data Models + +### PangeaToken (`events/models/pangea_token_model.dart`) + +The fundamental unit of linguistic analysis. Each token represents one word/unit. + +``` +PangeaToken +├── text: PangeaTokenText ← {content: "running", offset: 5} +├── lemma: Lemma ← {text: "run", saveVocab: true, form: "run"} +├── pos: String ← "VERB" (Universal Dependencies POS tag) +└── morph: Map ← {Tense: "Pres", VerbForm: "Part"} +``` + +- POS tags follow [Universal Dependencies](https://universaldependencies.org/u/pos/) +- Morph features follow [Universal Dependencies features](https://universaldependencies.org/u/feat/) +- Lemma includes `saveVocab` flag for vocab tracking + +### PangeaMessageTokens (`events/models/tokens_event_content_model.dart`) + +Container for a tokenized message, stored as `pangea.tokens` event: + +- `tokens: List` — tokenized words +- `detections: List?` — per-span language detection + +### PangeaRepresentation (`events/models/representation_content_model.dart`) + +A text representation of a message, stored as `pangea.representation` event: + +- `text` — the text content +- `langCode` — detected language +- `originalSent` — true if this is the text that was actually sent +- `originalWritten` — true if this is what the user originally typed + +Interpretation matrix: + +| `originalSent` | `originalWritten` | Meaning | +|:-:|:-:|---| +| ✓ | ✗ | Text went through IGC/IT before sending | +| ✗ | ✗ | Added by another user (e.g., translation) | +| ✓ | ✓ | User wrote and sent as-is (L1 or perfect L2) | +| ✗ | ✓ | User's original L1 that was then translated via IT | + +## Event Wrappers + +### PangeaMessageEvent (`events/event_wrappers/pangea_message_event.dart`) + +Wraps a Matrix `Event` of type `m.room.message` and provides access to all Pangea child events (representations, tokens, choreo records, translations, activities, etc.). This is the primary object used by the toolbar and reading assistance. + +Key capabilities: + +- Access tokens for the message +- Get translations and representations +- Trigger TTS/STT +- Get associated practice activities + +### PangeaRepresentationEvent (`events/event_wrappers/pangea_representation_event.dart`) + +Wraps a `pangea.representation` event. Provides typed access to `PangeaRepresentation` content. + +### PangeaChoreoEvent (`events/event_wrappers/pangea_choreo_event.dart`) + +Wraps a `pangea.record` event. Provides typed access to `ChoreoRecordModel` (editing history). + +## Room Extensions for Events + +`lib/pangea/extensions/room_events_extension.dart` extends Matrix `Room` with methods to: + +- Query child events by type +- Find representations and tokens for a message +- Access pangea-specific event data + +## Token Flow: Writing → Saving → Reading + +1. **Writing**: Choreographer gets tokens from `/tokenize` on send +2. **Saving**: `PangeaMessageContentModel` bundles tokens + choreo record + representations → saved as Matrix child events +3. **Reading**: `PangeaMessageEvent` loads child events → toolbar uses `PangeaToken` list for word cards, practice activities, analytics diff --git a/.github/instructions/modules.instructions.md b/.github/instructions/modules.instructions.md new file mode 100644 index 000000000..d41444ba3 --- /dev/null +++ b/.github/instructions/modules.instructions.md @@ -0,0 +1,127 @@ +--- +applyTo: "lib/pangea/**" +--- + +# Pangea Feature Modules (`lib/pangea/`) + +Each subdirectory is a self-contained feature module. This doc provides the full map. + +## Core Infrastructure + +| Module | Purpose | Key Files | +|---|---|---| +| `common/controllers/` | Central controllers | `pangea_controller.dart` (owns UserController, SubscriptionController, PLanguageStore), `base_controller.dart` (stream-based generic controller) | +| `common/network/` | API communication | `urls.dart` (all choreo API URLs), `requests.dart` (HTTP client) | +| `common/config/` | Environment config | `environment.dart` (reads `.env` / `config.sample.json` for URLs, homeserver, etc.) | +| `common/constants/` | Shared constants | `local.key.dart` (storage keys), `model_keys.dart` | +| `common/models/` | Base models | `base_request_model.dart`, `llm_feedback_model.dart` | +| `common/utils/` | Shared utilities | `error_handler.dart`, `firebase_analytics.dart`, `overlay.dart`, `p_vguard.dart` (route guards) | +| `common/widgets/` | Shared widgets | `pressable_button.dart`, `overlay_container.dart`, `shimmer_background.dart`, ~20 others | +| `design_system/` | Design tokens | `tokens/` | +| `navigation/` | Navigation | `navigation_util.dart` | + +## Writing Assistance (Choreographer) + +| Module | Purpose | Key Files | +|---|---|---| +| `choreographer/` | Writing flow orchestrator | `choreographer.dart` (ChangeNotifier), `choreographer_state_extension.dart`, `assistance_state_enum.dart`, `choreo_record_model.dart`, `choreo_mode_enum.dart` | +| `choreographer/igc/` | Interactive Grammar Correction | `igc_controller.dart`, `igc_repo.dart`, `replacement_type_enum.dart`, `pangea_match_model.dart`, `span_card.dart`, `span_data_model.dart`, `autocorrect_popup.dart`, `autocorrect_span.dart`, `start_igc_button.dart`, `text_normalization_util.dart` | +| `choreographer/it/` | ⚠️ DEPRECATED — Interactive Translation | `it_controller.dart`, `it_repo.dart`, `it_step_model.dart`, `it_feedback_card.dart`, `word_data_card.dart` | +| `choreographer/text_editing/` | Text controller | `pangea_text_controller.dart`, `edit_type_enum.dart` | + +## Message Toolbar (Reading Assistance) + +| Module | Purpose | Key Files | +|---|---|---| +| `toolbar/layout/` | Overlay positioning | `message_selection_positioner.dart`, `over_message_overlay.dart`, `reading_assistance_mode_enum.dart` | +| `toolbar/reading_assistance/` | Token-level reading UX | `underline_text_widget.dart`, `token_rendering_util.dart`, `select_mode_controller.dart`, `new_word_overlay.dart` | +| `toolbar/word_card/` | Word detail card | `word_card_switcher.dart`, `reading_assistance_content.dart`, `lemma_meaning_display.dart`, `token_feedback_button.dart` | +| `toolbar/message_practice/` | In-message practice | `practice_controller.dart`, `practice_activity_card.dart`, `practice_match_card.dart`, `morph_selection.dart` | + +## Events & Data Model + +| Module | Purpose | Key Files | +|---|---|---| +| `events/constants/` | Event type strings | `pangea_event_types.dart` (~30 custom types) | +| `events/event_wrappers/` | Typed event wrappers | `pangea_message_event.dart`, `pangea_choreo_event.dart`, `pangea_representation_event.dart` | +| `events/models/` | Event content models | `pangea_token_model.dart`, `pangea_token_text_model.dart`, `tokens_event_content_model.dart`, `representation_content_model.dart` | +| `events/repo/` | Token/language API | `tokens_repo.dart`, `token_api_models.dart`, `language_detection_repo.dart` | +| `events/extensions/` | Event helpers | `pangea_event_extension.dart` | +| `extensions/` | Room extensions | `pangea_room_extension.dart`, `room_events_extension.dart`, `room_user_permissions_extension.dart`, etc. | + +## Language & Linguistics + +| Module | Purpose | Key Files | +|---|---|---| +| `languages/` | Language data | `language_model.dart`, `language_repo.dart`, `language_service.dart`, `p_language_store.dart`, `locale_provider.dart` | +| `lemmas/` | Lemma (dictionary form) | `lemma.dart`, `lemma_info_repo.dart`, `user_set_lemma_info.dart` | +| `morphs/` | Morphological analysis | `morph_models.dart`, `morph_repo.dart`, `parts_of_speech_enum.dart`, `morph_features_enum.dart` | +| `constructs/` | Grammar/vocab constructs | `construct_identifier.dart`, `construct_repo.dart`, `construct_form.dart` | +| `translation/` | Full-text translation | `full_text_translation_repo.dart` + request/response models | +| `phonetic_transcription/` | IPA transcriptions | repo + models | + +## Practice & Activities + +| Module | Purpose | Key Files | +|---|---|---| +| `practice_activities/` | Activity generation | `practice_activity_model.dart`, `practice_generation_repo.dart`, `multiple_choice_activity_model.dart`, type-specific generators | +| `activity_sessions/` | Session management | `activity_room_extension.dart`, `activity_session_chat/`, `activity_session_start/` | +| `activity_planner/` | Activity planning UI | `activity_plan_model.dart`, `activity_planner_page.dart` | +| `activity_generator/` | Activity creation | `activity_generator.dart`, `activity_plan_generation_repo.dart` | +| `activity_suggestions/` | Activity suggestions | `activity_suggestion_dialog.dart`, `activity_plan_search_repo.dart` | +| `activity_summary/` | Post-activity summary | `activity_summary_model.dart`, `activity_summary_repo.dart` | +| `activity_feedback/` | Activity feedback | `activity_feedback_repo.dart` + request/response | + +## Analytics + +| Module | Purpose | Key Files | +|---|---|---| +| `analytics_data/` | Local DB & sync | `analytics_data_service.dart`, `analytics_database.dart`, `analytics_sync_controller.dart` | +| `analytics_misc/` | Models & utilities | `construct_use_model.dart`, `constructs_model.dart`, `room_analytics_extension.dart`, `level_up/` | +| `analytics_page/` | Analytics UI | `activity_archive.dart` | +| `analytics_summary/` | Summary views | `level_analytics_details_content.dart` | +| `analytics_practice/` | Practice analytics | `analytics_practice_page.dart` | +| `analytics_details_popup/` | Detail popups | `analytics_details_popup.dart` | +| `analytics_settings/` | Analytics config | settings UI | +| `analytics_downloads/` | Analytics export | download utilities | +| `space_analytics/` | Course-level analytics | `space_analytics.dart` | + +## User & Auth + +| Module | Purpose | Key Files | +|---|---|---| +| `user/` | Profile & settings | `user_controller.dart`, `user_model.dart`, `analytics_profile_model.dart`, `style_settings_repo.dart` | +| `authentication/` | Login/logout | `p_login.dart`, `p_logout.dart` | +| `login/` | Signup flow pages | `pages/` — language selection, course code, signup, find course | +| `subscription/` | RevenueCat | `controllers/subscription_controller.dart`, `pages/`, `repo/` | + +## Courses & Spaces + +| Module | Purpose | Key Files | +|---|---|---| +| `spaces/` | Matrix Spaces extensions | `client_spaces_extension.dart`, `space_navigation_column.dart` | +| `course_creation/` | Browse/join courses | `public_course_preview.dart`, `selected_course_page.dart` | +| `course_plans/` | CMS course data | `courses/`, `course_topics/`, `course_activities/`, `course_locations/`, `course_media/` | +| `course_settings/` | Course config | `course_settings.dart`, `teacher_mode_model.dart` | +| `chat_settings/` | Room bot/language config | `models/bot_options_model.dart`, `utils/bot_client_extension.dart` | +| `chat_list/` | Chat list customization | custom chat list logic | +| `chat/` | In-chat customization | `constants/`, `extensions/`, `utils/`, `widgets/` | +| `join_codes/` | Room code invitations | `join_with_link_page.dart` | + +## Media & I/O + +| Module | Purpose | Key Files | +|---|---|---| +| `speech_to_text/` | STT | `speech_to_text_repo.dart` + models | +| `text_to_speech/` | TTS | `tts_controller.dart`, `text_to_speech_repo.dart` | +| `download/` | Room data export | `download_room_extension.dart`, `download_type_enum.dart` | +| `payload_client/` | CMS API client | `payload_client.dart`, `models/course_plan/` | + +## Misc + +| Module | Purpose | Key Files | +|---|---|---| +| `bot/` | Bot UI & utils | `utils/`, `widgets/` | +| `instructions/` | In-app tutorials | tutorial content | +| `token_info_feedback/` | Token feedback dialog | `token_info_feedback_dialog.dart`, `token_info_feedback_repo.dart` | +| `learning_settings/` | Learning preferences | `settings_learning.dart`, `tool_settings_enum.dart` | diff --git a/.gitignore b/.gitignore index 8f566a891..77d0c82a5 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ prime keys.json !/public/.env *.env.local_choreo +assets/.env.local_choreo *.env.prod envs.json # libolm package @@ -50,8 +51,7 @@ venv/ .fvm/ .fvmrc -# copilot-instructions.md -.github/copilot-instructions.md + # Web related docs/tailwind.css diff --git a/lib/l10n/intl_ar.arb b/lib/l10n/intl_ar.arb index 0e8965c04..21deae2ce 100644 --- a/lib/l10n/intl_ar.arb +++ b/lib/l10n/intl_ar.arb @@ -1,6 +1,6 @@ { "@@locale": "ar", - "@@last_modified": "2021-08-14 12:41:10.156221", + "@@last_modified": "2026-02-09 15:31:53.731729", "about": "حول", "@about": { "type": "String", @@ -10942,8 +10942,6 @@ "congratulations": "مبروك!", "anotherRound": "جولة أخرى", "noActivityRequest": "لا يوجد طلب نشاط حالي.", - "quit": "خروج", - "congratulationsYouveCompletedPractice": "تهانينا! لقد أكملت جلسة التدريب.", "mustHave10Words": "يجب أن يكون لديك على الأقل 10 كلمات مفردات لممارستها. حاول التحدث إلى صديق أو بوت بانجيا لاكتشاف المزيد!", "botSettings": "إعدادات البوت", "activitySettingsOverrideWarning": "اللغة ومستوى اللغة محددان بواسطة خطة النشاط", @@ -10992,14 +10990,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11175,6 +11165,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "عنّي", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "تعبير اصطلاحي", "grammarCopyPOSphrasalv": "فعل مركب", "grammarCopyPOScompn": "مركب", @@ -11189,5 +11184,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "ممارسة مثالية!", + "greatPractice": "ممارسة رائعة!", + "usedNoHints": "عمل رائع بعدم استخدام أي تلميحات!", + "youveCompletedPractice": "لقد أكملت الممارسة، استمر في ذلك لتحسين مهاراتك!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "تغيير البريد الإلكتروني", + "withTheseAddressesDescription": "باستخدام هذه العناوين البريدية يمكنك تسجيل الدخول، واستعادة كلمة المرور، وإدارة الاشتراكات.", + "noAddressDescription": "لم تقم بإضافة أي عناوين بريد إلكتروني بعد.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "قواعد اللغة", + "spanTypeWordChoice": "اختيار الكلمات", + "spanTypeSpelling": "التهجئة", + "spanTypePunctuation": "علامات الترقيم", + "spanTypeStyle": "الأسلوب", + "spanTypeFluency": "الطلاقة", + "spanTypeAccents": "اللكنات", + "spanTypeCapitalization": "حروف الجر", + "spanTypeCorrection": "تصحيح", + "spanFeedbackTitle": "الإبلاغ عن مشكلة تصحيح", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_bn.arb b/lib/l10n/intl_bn.arb index 9303a8a7d..8a17c23ed 100644 --- a/lib/l10n/intl_bn.arb +++ b/lib/l10n/intl_bn.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-08-14 12:41:10.154280", + "@@last_modified": "2026-02-09 15:32:17.400141", "about": "সম্পর্কে", "@about": { "type": "String", @@ -11336,8 +11336,6 @@ "congratulations": "অভিনন্দন!", "anotherRound": "আরেকটি রাউন্ড", "noActivityRequest": "বর্তমান কোন কার্যকলাপের অনুরোধ নেই।", - "quit": "বিরতি", - "congratulationsYouveCompletedPractice": "অভিনন্দন! আপনি অনুশীলন সেশন সম্পন্ন করেছেন।", "mustHave10Words": "আপনার অনুশীলনের জন্য অন্তত 10টি শব্দ থাকতে হবে। আরও জানার জন্য একটি বন্ধুর সাথে কথা বলুন বা Pangea Bot এর সাথে কথা বলুন!", "botSettings": "বট সেটিংস", "activitySettingsOverrideWarning": "কার্যকলাপ পরিকল্পনার দ্বারা নির্ধারিত ভাষা এবং ভাষার স্তর", @@ -11386,14 +11384,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11569,6 +11559,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "আমার সম্পর্কে", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "বাগধারা", "grammarCopyPOSphrasalv": "ফ্রেজাল ক্রিয়া", "grammarCopyPOScompn": "যুগ্ম", @@ -11583,5 +11578,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "পারফেক্ট প্র্যাকটিস!", + "greatPractice": "দারুণ প্র্যাকটিস!", + "usedNoHints": "কোনো হিন্ট ব্যবহার না করার জন্য ভালো কাজ!", + "youveCompletedPractice": "আপনি প্র্যাকটিস সম্পন্ন করেছেন, উন্নতির জন্য এভাবে চালিয়ে যান!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "ইমেইল পরিবর্তন করুন", + "withTheseAddressesDescription": "এই ইমেইল ঠিকানাগুলির মাধ্যমে আপনি লগ ইন করতে, আপনার পাসওয়ার্ড পুনরুদ্ধার করতে এবং সাবস্ক্রিপশন পরিচালনা করতে পারেন।", + "noAddressDescription": "আপনি এখনও কোন ইমেইল ঠিকানা যোগ করেননি।", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "ব্যাকরণ", + "spanTypeWordChoice": "শব্দ নির্বাচন", + "spanTypeSpelling": "বানান", + "spanTypePunctuation": "বিরাম চিহ্ন", + "spanTypeStyle": "শৈলী", + "spanTypeFluency": "প্রবাহ", + "spanTypeAccents": "উচ্চারণ", + "spanTypeCapitalization": "বড় হাতের অক্ষর", + "spanTypeCorrection": "সংশোধন", + "spanFeedbackTitle": "সংশোধন সমস্যা রিপোর্ট করুন", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_bo.arb b/lib/l10n/intl_bo.arb index 3e6fc4710..a58aa28ce 100644 --- a/lib/l10n/intl_bo.arb +++ b/lib/l10n/intl_bo.arb @@ -3781,7 +3781,7 @@ "joinPublicTrip": "མི་ཚེས་ལ་ལོག་འབད།", "startOwnTrip": "ངེད་རང་གི་ལོག་ལ་སྦྱོར་བཅོས།", "@@locale": "bo", - "@@last_modified": "2026-02-05 10:10:06.262776", + "@@last_modified": "2026-02-09 15:32:12.071200", "@alwaysUse24HourFormat": { "type": "String", "placeholders": {} @@ -9993,8 +9993,6 @@ "congratulations": "Čestitamo!", "anotherRound": "Još jedan krug", "noActivityRequest": "Ninguna solicitud de actividad actual.", - "quit": "Salir", - "congratulationsYouveCompletedPractice": "¡Felicidades! Has completado la sesión de práctica.", "mustHave10Words": "Debes tener al menos 10 palabras de vocabulario para practicarlas. ¡Intenta hablar con un amigo o con Pangea Bot para descubrir más!", "botSettings": "Configuraciones del Bot", "activitySettingsOverrideWarning": "Idioma y nivel de idioma determinados por el plan de actividad", @@ -10043,14 +10041,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -10226,6 +10216,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Bok o meni", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Phrasal Verb", "grammarCopyPOScompn": "Compound", @@ -10240,5 +10235,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Perfekta praktik!", + "greatPractice": "Stora praktik!", + "usedNoHints": "Bra jobbat utan att använda några ledtrådar!", + "youveCompletedPractice": "Du har slutfört praktiken, fortsätt så för att bli bättre!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Bohor email", + "withTheseAddressesDescription": "S dengan alamat email ini, Anda dapat masuk, memulihkan kata sandi Anda, dan mengelola langganan.", + "noAddressDescription": "Anda belum menambahkan alamat email apa pun.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramatika", + "spanTypeWordChoice": "Izbor reči", + "spanTypeSpelling": "Pravopis", + "spanTypePunctuation": "Interpunkcija", + "spanTypeStyle": "Stil", + "spanTypeFluency": "Tečnost", + "spanTypeAccents": "Akcenti", + "spanTypeCapitalization": "Velika slova", + "spanTypeCorrection": "Ispravka", + "spanFeedbackTitle": "Prijavi problem sa ispravkom", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_ca.arb b/lib/l10n/intl_ca.arb index 4dfa330a6..a7e5b078d 100644 --- a/lib/l10n/intl_ca.arb +++ b/lib/l10n/intl_ca.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2026-02-05 10:09:47.712187", + "@@last_modified": "2026-02-09 15:31:37.024931", "about": "Quant a", "@about": { "type": "String", @@ -10752,8 +10752,6 @@ "congratulations": "Felicitats!", "anotherRound": "Una altra ronda", "noActivityRequest": "No hi ha cap sol·licitud d'activitat actual.", - "quit": "Sortir", - "congratulationsYouveCompletedPractice": "Felicitats! Has completat la sessió de pràctica.", "mustHave10Words": "Has de tenir almenys 10 paraules de vocabulari per practicar-les. Prova a parlar amb un amic o amb el Pangea Bot per descobrir-ne més!", "botSettings": "Configuració del Bot", "activitySettingsOverrideWarning": "Idioma i nivell d'idioma determinats pel pla d'activitat", @@ -10802,14 +10800,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -10985,6 +10975,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Sobre mi", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Verb Phrasal", "grammarCopyPOScompn": "Compost", @@ -10999,5 +10994,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Pràctica perfecta!", + "greatPractice": "Gran pràctica!", + "usedNoHints": "Bon treball sense utilitzar cap pista!", + "youveCompletedPractice": "Has completat la pràctica, continua així per millorar!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Canvia l'email", + "withTheseAddressesDescription": "Amb aquestes adreces de correu electrònic pots iniciar sessió, recuperar la teva contrasenya i gestionar les subscripcions.", + "noAddressDescription": "Encara no has afegit cap adreça de correu electrònic.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramàtica", + "spanTypeWordChoice": "Elecció de paraules", + "spanTypeSpelling": "Ortografia", + "spanTypePunctuation": "Puntuació", + "spanTypeStyle": "Estil", + "spanTypeFluency": "Fluïdesa", + "spanTypeAccents": "Accents", + "spanTypeCapitalization": "Majúscules", + "spanTypeCorrection": "Correcció", + "spanFeedbackTitle": "Informar d'un problema de correcció", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_cs.arb b/lib/l10n/intl_cs.arb index 3f05a91d7..0b48e22a6 100644 --- a/lib/l10n/intl_cs.arb +++ b/lib/l10n/intl_cs.arb @@ -1,6 +1,6 @@ { "@@locale": "cs", - "@@last_modified": "2021-08-14 12:41:10.131133", + "@@last_modified": "2026-02-09 15:31:28.643814", "about": "O aplikaci", "@about": { "type": "String", @@ -11178,8 +11178,6 @@ "congratulations": "Gratulujeme!", "anotherRound": "Další kolo", "noActivityRequest": "Žádná aktuální žádost o aktivitu.", - "quit": "Ukončit", - "congratulationsYouveCompletedPractice": "Gratulujeme! Dokončili jste cvičební sezení.", "mustHave10Words": "Musíte mít alespoň 10 slovní zásoby, abyste je mohli procvičovat. Zkuste si promluvit s přítelem nebo Pangea Botem, abyste objevili více!", "botSettings": "Nastavení bota", "activitySettingsOverrideWarning": "Jazyk a jazyková úroveň určené plánem aktivity", @@ -11228,14 +11226,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11411,6 +11401,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "O mně", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Frázové sloveso", "grammarCopyPOScompn": "Složenina", @@ -11425,5 +11420,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Dokonalá praxe!", + "greatPractice": "Skvělá praxe!", + "usedNoHints": "Dobrá práce, že jsi nepoužil žádné nápovědy!", + "youveCompletedPractice": "Dokončil jsi praxi, pokračuj v tom, abys se zlepšil!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Změnit e-mail", + "withTheseAddressesDescription": "S těmito e-mailovými adresami se můžete přihlásit, obnovit své heslo a spravovat předplatné.", + "noAddressDescription": "Zatím jste nepřidali žádné e-mailové adresy.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramatika", + "spanTypeWordChoice": "Výběr slov", + "spanTypeSpelling": "Pravopis", + "spanTypePunctuation": "Interpunkce", + "spanTypeStyle": "Styl", + "spanTypeFluency": "Plynulost", + "spanTypeAccents": "Přízvuky", + "spanTypeCapitalization": "Velká písmena", + "spanTypeCorrection": "Oprava", + "spanFeedbackTitle": "Nahlásit problém s opravou", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_da.arb b/lib/l10n/intl_da.arb index 8ec565446..dcdf6376b 100644 --- a/lib/l10n/intl_da.arb +++ b/lib/l10n/intl_da.arb @@ -1926,7 +1926,7 @@ "playWithAI": "Leg med AI for nu", "courseStartDesc": "Pangea Bot er klar til at starte når som helst!\n\n...men læring er bedre med venner!", "@@locale": "da", - "@@last_modified": "2026-02-05 10:09:17.541713", + "@@last_modified": "2026-02-09 15:30:41.802679", "@aboutHomeserver": { "type": "String", "placeholders": { @@ -11787,8 +11787,6 @@ "congratulations": "Tillykke!", "anotherRound": "En runde mere", "noActivityRequest": "Ingen aktuelle aktivitetsanmodning.", - "quit": "Afslut", - "congratulationsYouveCompletedPractice": "Tillykke! Du har gennemført øvelsessessionen.", "mustHave10Words": "Du skal have mindst 10 ordforrådsord for at øve dem. Prøv at tale med en ven eller Pangea Bot for at opdage mere!", "botSettings": "Botindstillinger", "activitySettingsOverrideWarning": "Sprog og sprogniveau bestemt af aktivitetsplan", @@ -11837,14 +11835,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -12020,6 +12010,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Om mig", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Phrasal Verb", "grammarCopyPOScompn": "Sammensat", @@ -12034,5 +12029,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Perfekt praksis!", + "greatPractice": "God praksis!", + "usedNoHints": "Godt klaret uden at bruge nogen hints!", + "youveCompletedPractice": "Du har gennemført praksis, bliv ved med det for at blive bedre!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Ændre email", + "withTheseAddressesDescription": "Med disse emailadresser kan du logge ind, gendanne din adgangskode og administrere abonnementer.", + "noAddressDescription": "Du har endnu ikke tilføjet nogen emailadresser.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Grammatik", + "spanTypeWordChoice": "Ordvalg", + "spanTypeSpelling": "Stavning", + "spanTypePunctuation": "Interpunktion", + "spanTypeStyle": "Stil", + "spanTypeFluency": "Flydende", + "spanTypeAccents": "Accenter", + "spanTypeCapitalization": "Versalisering", + "spanTypeCorrection": "Korrektur", + "spanFeedbackTitle": "Rapporter korrektion problem", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index 1ee132f9c..b38c16454 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -401,7 +401,6 @@ "placeholders": {} }, "clearArchive": "Archiv leeren", - "@clearArchive": {}, "close": "Schließen", "@close": { "type": "String", @@ -2082,60 +2081,35 @@ } }, "scanQrCode": "QR-Code scannen", - "@scanQrCode": {}, "chatHasBeenAddedToThisSpace": "Chat wurde zum Space hinzugefügt", - "@chatHasBeenAddedToThisSpace": {}, "autoplayImages": "Animierte Sticker und Emotes automatisch abspielen", "@autoplayImages": { "type": "String", "placeholder": {} }, "addToSpace": "Zum Space hinzufügen", - "@addToSpace": {}, "serverRequiresEmail": "Dieser Server muss deine E-Mail-Adresse für die Registrierung überprüfen.", - "@serverRequiresEmail": {}, "enableMultiAccounts": "(BETA) Aktiviere Multi-Accounts für dieses Gerät", - "@enableMultiAccounts": {}, "bundleName": "Name des Bundles", - "@bundleName": {}, "removeFromBundle": "Von diesem Bundle entfernen", - "@removeFromBundle": {}, "addToBundle": "Zu einem Bundle hinzufügen", - "@addToBundle": {}, "editBundlesForAccount": "Bundles für dieses Konto bearbeiten", - "@editBundlesForAccount": {}, "addAccount": "Konto hinzufügen", - "@addAccount": {}, "oneClientLoggedOut": "Einer deiner Clients wurde abgemeldet", - "@oneClientLoggedOut": {}, "homeserver": "Homeserver", - "@homeserver": {}, "sendOnEnter": "Senden mit Enter", - "@sendOnEnter": {}, "link": "Link", - "@link": {}, "yourChatBackupHasBeenSetUp": "Dein Chat-Backup wurde eingerichtet.", - "@yourChatBackupHasBeenSetUp": {}, "unverified": "Unverifiziert", - "@unverified": {}, "messageInfo": "Nachrichten-Info", - "@messageInfo": {}, "time": "Zeit", - "@time": {}, "messageType": "Nachrichtentyp", - "@messageType": {}, "sender": "Absender:in", - "@sender": {}, "openGallery": "Galerie öffnen", - "@openGallery": {}, "removeFromSpace": "Aus dem Space entfernen", - "@removeFromSpace": {}, "addToSpaceDescription": "Wähle einen Space aus, um diesen Chat hinzuzufügen.", - "@addToSpaceDescription": {}, "start": "Start", - "@start": {}, "repeatPassword": "Passwort wiederholen", - "@repeatPassword": {}, "commandHint_dm": "Starte einen direkten Chat\nBenutze --no-encryption, um die Verschlüsselung auszuschalten", "@commandHint_dm": { "type": "String", @@ -2171,25 +2145,15 @@ } }, "publish": "Veröffentlichen", - "@publish": {}, "pinMessage": "An Raum anheften", - "@pinMessage": {}, "emojis": "Emojis", - "@emojis": {}, "placeCall": "Anruf tätigen", - "@placeCall": {}, "voiceCall": "Sprachanruf", - "@voiceCall": {}, "unsupportedAndroidVersion": "Nicht unterstützte Android-Version", - "@unsupportedAndroidVersion": {}, "videoCallsBetaWarning": "Bitte beachte, dass sich Videoanrufe derzeit in der Beta-Phase befinden. Sie funktionieren möglicherweise nicht wie erwartet oder überhaupt nicht auf allen Plattformen.", - "@videoCallsBetaWarning": {}, "emailOrUsername": "E-Mail oder Benutzername", - "@emailOrUsername": {}, "unsupportedAndroidVersionLong": "Diese Funktion erfordert eine neuere Android-Version. Bitte suche nach Updates oder prüfe die Lineage-OS-Unterstützung.", - "@unsupportedAndroidVersionLong": {}, "experimentalVideoCalls": "Experimentelle Videoanrufe", - "@experimentalVideoCalls": {}, "reactedWith": "{sender} reagierte mit {reaction}", "@reactedWith": { "type": "String", @@ -2203,15 +2167,10 @@ } }, "markAsRead": "Als gelesen markiert", - "@markAsRead": {}, "reportUser": "Benutzer melden", - "@reportUser": {}, "openChat": "Chat öffnen", - "@openChat": {}, "confirmEventUnpin": "Möchtest du das Ereignis wirklich dauerhaft lösen?", - "@confirmEventUnpin": {}, "dismiss": "Verwerfen", - "@dismiss": {}, "switchToAccount": "Zu Konto {number} wechseln", "@switchToAccount": { "type": "number", @@ -2222,32 +2181,21 @@ } }, "nextAccount": "Nächstes Konto", - "@nextAccount": {}, "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, "widgetCustom": "Angepasst", - "@widgetCustom": {}, "widgetEtherpad": "Textnotiz", - "@widgetEtherpad": {}, "addWidget": "Widget hinzufügen", - "@addWidget": {}, "widgetVideo": "Video", - "@widgetVideo": {}, "widgetName": "Name", - "@widgetName": {}, "widgetUrlError": "Das ist keine gültige URL.", - "@widgetUrlError": {}, "errorAddingWidget": "Fehler beim Hinzufügen des Widgets.", - "@errorAddingWidget": {}, "previousAccount": "Vorheriges Konto", - "@previousAccount": {}, "separateChatTypes": "Separate Direktchats und Gruppen", "@separateChatTypes": { "type": "String", "placeholders": {} }, "widgetNameError": "Bitte gib einen Anzeigenamen an.", - "@widgetNameError": {}, "youKicked": "👞 Du hast {user} rausgeworfen", "@youKicked": { "placeholders": { @@ -2273,11 +2221,8 @@ } }, "youRejectedTheInvitation": "Du hast die Einladung abgelehnt", - "@youRejectedTheInvitation": {}, "youJoinedTheChat": "Du bist dem Chat beigetreten", - "@youJoinedTheChat": {}, "youAcceptedTheInvitation": "👍 Du hast die Einladung angenommen", - "@youAcceptedTheInvitation": {}, "youBannedUser": "Du hast den {user} verbannt", "@youBannedUser": { "placeholders": { @@ -2311,41 +2256,23 @@ } }, "recoveryKey": "Wiederherstellungs-Schlüssel", - "@recoveryKey": {}, "recoveryKeyLost": "Wiederherstellungsschlüssel verloren?", - "@recoveryKeyLost": {}, "user": "Benutzer", - "@user": {}, "custom": "Benutzerdefiniert", - "@custom": {}, "storeInAndroidKeystore": "Im Android KeyStore speichern", - "@storeInAndroidKeystore": {}, "storeSecurlyOnThisDevice": "Auf diesem Gerät sicher speichern", - "@storeSecurlyOnThisDevice": {}, "dehydrate": "Sitzung exportieren und Gerät löschen", - "@dehydrate": {}, "dehydrateWarning": "Diese Aktion kann nicht rückgängig gemacht werden. Stelle sicher, dass du die Sicherungsdatei sicher aufbewahrst.", - "@dehydrateWarning": {}, "dehydrateTor": "TOR-Benutzer: Sitzung exportieren", - "@dehydrateTor": {}, "dehydrateTorLong": "Für TOR-Benutzer wird empfohlen, die Sitzung zu exportieren, bevor das Fenster geschlossen wird.", - "@dehydrateTorLong": {}, "hydrateTor": "TOR-Benutzer: Session-Export importieren", - "@hydrateTor": {}, "hydrate": "Aus Sicherungsdatei wiederherstellen", - "@hydrate": {}, "indexedDbErrorTitle": "Probleme im Privatmodus", - "@indexedDbErrorTitle": {}, "unlockOldMessages": "Entsperre alte Nachrichten", - "@unlockOldMessages": {}, "pleaseEnterRecoveryKeyDescription": "Um deine alten Nachrichten zu entsperren, gib bitte den Wiederherstellungsschlüssel ein, der in einer früheren Sitzung generiert wurde. Dein Wiederherstellungsschlüssel ist NICHT dein Passwort.", - "@pleaseEnterRecoveryKeyDescription": {}, "saveKeyManuallyDescription": "Speicher diesen Schlüssel manuell, indem du den Systemfreigabedialog oder die Zwischenablage auslöst.", - "@saveKeyManuallyDescription": {}, "hydrateTorLong": "Hast du deine Sitzung das letzte Mal auf TOR exportiert? Importiere sie schnell und chatte weiter.", - "@hydrateTorLong": {}, "pleaseEnterRecoveryKey": "Bitte gib deinen Wiederherstellungsschlüssel ein:", - "@pleaseEnterRecoveryKey": {}, "countFiles": "{count} Dateien", "@countFiles": { "placeholders": { @@ -2355,15 +2282,10 @@ } }, "users": "Benutzer", - "@users": {}, "storeInSecureStorageDescription": "Speicher den Wiederherstellungsschlüssel im sicheren Speicher dieses Geräts.", - "@storeInSecureStorageDescription": {}, "storeInAppleKeyChain": "Im Apple KeyChain speichern", - "@storeInAppleKeyChain": {}, "indexedDbErrorLong": "Die Nachrichtenspeicherung ist im privaten Modus standardmäßig leider nicht aktiviert.\nBitte besuche\n- about:config\n- Setze dom.indexedDB.privateBrowsing.enabled auf true\nAndernfalls ist es nicht möglich, FluffyChat auszuführen.", - "@indexedDbErrorLong": {}, "confirmMatrixId": "Bitte bestätigen deine Matrix-ID, um dein Konto zu löschen.", - "@confirmMatrixId": {}, "supposedMxid": "das sollte sein {mxid}", "@supposedMxid": { "type": "String", @@ -2374,45 +2296,25 @@ } }, "commandHint_markasdm": "Als Direktnachrichtenraum für die angegebene Matrix-ID markieren", - "@commandHint_markasdm": {}, "commandHint_markasgroup": "Als Gruppe markieren", - "@commandHint_markasgroup": {}, "hideUnimportantStateEvents": "Blende unwichtige Zustandsereignisse aus", - "@hideUnimportantStateEvents": {}, "doNotShowAgain": "Nicht mehr anzeigen", - "@doNotShowAgain": {}, "appearOnTopDetails": "Ermöglicht, dass die App oben angezeigt wird (nicht erforderlich, wenn du Fluffychat bereits als Anrufkonto eingerichtet haben)", - "@appearOnTopDetails": {}, "noKeyForThisMessage": "Dies kann passieren, wenn die Nachricht gesendet wurde, bevor du dich auf diesem Gerät bei deinem Konto angemeldet hast.\n\nEs ist auch möglich, dass der Absender dein Gerät blockiert hat oder etwas mit der Internetverbindung schief gelaufen ist.\n\nKannst du die Nachricht in einer anderen Sitzung lesen? Dann kannst du die Nachricht davon übertragen! Gehe zu den Einstellungen > Geräte und vergewissere dich, dass sich deine Geräte gegenseitig verifiziert haben. Wenn du den Raum das nächste Mal öffnest und beide Sitzungen im Vordergrund sind, werden die Schlüssel automatisch übertragen.\n\nDu möchtest die Schlüssel beim Abmelden oder Gerätewechsel nicht verlieren? Stelle sicher, dass du das Chat-Backup in den Einstellungen aktiviert hast.", - "@noKeyForThisMessage": {}, "foregroundServiceRunning": "Diese Benachrichtigung wird angezeigt, wenn der Vordergrunddienst ausgeführt wird.", - "@foregroundServiceRunning": {}, "screenSharingTitle": "Bildschirm teilen", - "@screenSharingTitle": {}, "callingPermissions": "Anrufberechtigungen", - "@callingPermissions": {}, "callingAccount": "Anrufkonto", - "@callingAccount": {}, "callingAccountDetails": "Ermöglicht FluffyChat, die native Android-Dialer-App zu verwenden.", - "@callingAccountDetails": {}, "appearOnTop": "Oben erscheinen", - "@appearOnTop": {}, "otherCallingPermissions": "Mikrofon, Kamera und andere FluffyChat-Berechtigungen", - "@otherCallingPermissions": {}, "whyIsThisMessageEncrypted": "Warum ist diese Nachricht nicht lesbar?", - "@whyIsThisMessageEncrypted": {}, "newGroup": "Neue Gruppe", - "@newGroup": {}, "newSpace": "Neuer Space", - "@newSpace": {}, "enterSpace": "Raum betreten", - "@enterSpace": {}, "enterRoom": "Raum betreten", - "@enterRoom": {}, "allSpaces": "Alle Spaces", - "@allSpaces": {}, "screenSharingDetail": "Du teilst deinen Bildschirm in FuffyChat", - "@screenSharingDetail": {}, "numChats": "{number} Chats", "@numChats": { "type": "number", @@ -2423,7 +2325,6 @@ } }, "newSpaceDescription": "Mit Spaces kannst du deine Chats zusammenfassen und private oder öffentliche Communities aufbauen.", - "@newSpaceDescription": {}, "wasDirectChatDisplayName": "Leerer Chat (war {oldDisplayName})", "@wasDirectChatDisplayName": { "type": "String", @@ -2434,7 +2335,6 @@ } }, "encryptThisChat": "Diesen Chat verschlüsseln", - "@encryptThisChat": {}, "googlyEyesContent": "{senderName} hat dir Googly Eyes gesendet", "@googlyEyesContent": { "type": "String", @@ -2445,13 +2345,9 @@ } }, "startFirstChat": "Starte deinen ersten Chat", - "@startFirstChat": {}, "deviceKeys": "Geräteschlüssel:", - "@deviceKeys": {}, "commandHint_cuddle": "Umarmung senden", - "@commandHint_cuddle": {}, "commandHint_hug": "Umarmung senden", - "@commandHint_hug": {}, "cuddleContent": "{senderName} knuddelt dich", "@cuddleContent": { "type": "String", @@ -2462,7 +2358,6 @@ } }, "sorryThatsNotPossible": "Sorry ... das ist nicht möglich", - "@sorryThatsNotPossible": {}, "hugContent": "{senderName} umarmt dich", "@hugContent": { "type": "String", @@ -2473,15 +2368,10 @@ } }, "commandHint_googly": "Glupschaugen senden", - "@commandHint_googly": {}, "disableEncryptionWarning": "Aus Sicherheitsgründen kannst du die Verschlüsselung in einem Chat nicht deaktivieren, wo sie zuvor aktiviert wurde.", - "@disableEncryptionWarning": {}, "reopenChat": "Chat wieder eröffnen", - "@reopenChat": {}, "noBackupWarning": "Achtung! Ohne Aktivierung des Chat-Backups verlierst du den Zugriff auf deine verschlüsselten Nachrichten. Vor dem Ausloggen wird dringend empfohlen, das Chat-Backup zu aktivieren.", - "@noBackupWarning": {}, "noOtherDevicesFound": "Keine anderen Geräte anwesend", - "@noOtherDevicesFound": {}, "allRooms": "Alle Gruppenchats", "@allRooms": { "type": "String", @@ -2497,48 +2387,27 @@ } }, "jumpToLastReadMessage": "Zur letzten ungelesenen Nachricht", - "@jumpToLastReadMessage": {}, "readUpToHere": "Bis hier gelesen", - "@readUpToHere": {}, "pleaseTryAgainLaterOrChooseDifferentServer": "Bitte versuche es später noch einmal oder wähle einen anderen Server.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, "jump": "Springen", - "@jump": {}, "openLinkInBrowser": "Link im Browser öffnen", - "@openLinkInBrowser": {}, "reportErrorDescription": "😭 Oh nein. Etwas ist schief gelaufen. Wenn du möchtest, kannst du den Bug bei den Entwicklern melden.", - "@reportErrorDescription": {}, "report": "Melden", - "@report": {}, "signInWithPassword": "Anmelden mit Passwort", - "@signInWithPassword": {}, - "signInWithLabel": "Anmelden mit", + "signInWithLabel": "Anmelden mit:", "importNow": "Jetzt importieren", - "@importNow": {}, "importEmojis": "Emojis importieren", - "@importEmojis": {}, "importFromZipFile": "Aus ZIP-Datei importieren", - "@importFromZipFile": {}, "exportEmotePack": "Emote-Paket als ZIP-Datei exportieren", - "@exportEmotePack": {}, "notAnImage": "Keine Bilddatei.", - "@notAnImage": {}, "replace": "Ersetzen", - "@replace": {}, "sendTypingNotifications": "Tippbenachrichtigungen senden", - "@sendTypingNotifications": {}, "profileNotFound": "Der Benutzer konnte auf dem Server nicht gefunden werden. Vielleicht gibt es ein Verbindungsproblem oder der Benutzer existiert nicht.", - "@profileNotFound": {}, "createGroup": "Gruppe erstellen", - "@createGroup": {}, "shareInviteLink": "Einladungslink teilen", - "@shareInviteLink": {}, "inviteContactToGroupQuestion": "Willst du {contact} zum Chat {groupName} einladen?", - "@inviteContactToGroupQuestion": {}, "tryAgain": "Neuer Versuch", - "@tryAgain": {}, "redactMessageDescription": "Die Nachricht wird für alle Teilnehmer dieses Gesprächs gelöscht. Dies kann nicht rückgängig gemacht werden.", - "@redactMessageDescription": {}, "redactedBy": "Gelöscht von {username}", "@redactedBy": { "type": "String", @@ -2561,37 +2430,21 @@ } }, "setTheme": "Design festlegen:", - "@setTheme": {}, "setColorTheme": "Farbdesign einstellen:", - "@setColorTheme": {}, "invite": "Einladen", - "@invite": {}, "optionalRedactReason": "(Optional) Grund für die Löschung dieser Nachricht...", - "@optionalRedactReason": {}, "messagesStyle": "Nachrichten:", - "@messagesStyle": {}, "chatPermissions": "Chatberechtigungen", - "@chatPermissions": {}, "chatDescription": "Chatbeschreibung", - "@chatDescription": {}, "chatDescriptionHasBeenChanged": "Chatbeschreibung geändert", - "@chatDescriptionHasBeenChanged": {}, "noChatDescriptionYet": "Noch keine Chatbeschreibung vorhanden.", - "@noChatDescriptionYet": {}, "invalidServerName": "Ungültiger Servername", - "@invalidServerName": {}, "directChat": "Privater Chat", - "@directChat": {}, "addChatDescription": "Chatbeschreibung hinzufügen ...", - "@addChatDescription": {}, "setChatDescription": "Chatbeschreibung festlegen", - "@setChatDescription": {}, "inviteGroupChat": "📨 Einladungen zum Gruppenchat", - "@inviteGroupChat": {}, "invitePrivateChat": "📨 Einladungen zum privaten Chat", - "@invitePrivateChat": {}, "invalidInput": "Ungültige Eingabe!", - "@invalidInput": {}, "hasKnocked": "🚪 {user} hat angeklopft", "@hasKnocked": { "placeholders": { @@ -2610,40 +2463,25 @@ } }, "pleaseEnterANumber": "Bitte eine Zahl größer 0 eingeben", - "@pleaseEnterANumber": {}, "emoteKeyboardNoRecents": "Kürzlich verwendete Emotes werden hier angezeigt ...", "@emoteKeyboardNoRecents": { "type": "String", "placeholders": {} }, "banUserDescription": "Der Benutzer wird aus dem Chat gebannt und kann den Chat erst wieder betreten, wenn die Verbannung aufgehoben wird.", - "@banUserDescription": {}, "removeDevicesDescription": "Du wirst von diesem Gerät abgemeldet und kannst dann dort keine Nachrichten mehr empfangen.", - "@removeDevicesDescription": {}, "unbanUserDescription": "Der Benutzer kann den Chat dann wieder betreten, wenn er es versucht.", - "@unbanUserDescription": {}, "pushNotificationsNotAvailable": "Push-Benachrichtigungen nicht verfügbar", - "@pushNotificationsNotAvailable": {}, "makeAdminDescription": "Sobald du diesen Benutzer zum Administrator gemacht hast, kannst du das möglicherweise nicht mehr rückgängig machen, da er dann über dieselben Berechtigungen wie du verfügt.", - "@makeAdminDescription": {}, "archiveRoomDescription": "Der Chat wird in das Archiv verschoben. Andere Benutzer können sehen, dass du den Chat verlassen hast.", - "@archiveRoomDescription": {}, "learnMore": "Erfahre mehr", - "@learnMore": {}, "roomUpgradeDescription": "Der Chat wird dann mit der neuen Raumversion neu erstellt. Alle Teilnehmer werden benachrichtigt, dass sie zum neuen Chat wechseln müssen. Mehr über Raumversionen erfährst du unter https://spec.matrix.org/latest/rooms/", - "@roomUpgradeDescription": {}, "kickUserDescription": "Der Benutzer wird aus dem Chat geworfen, aber nicht gebannt. In öffentlichen Chats kann der Benutzer jederzeit wieder beitreten.", - "@kickUserDescription": {}, "blockListDescription": "Du kannst Benutzer blockieren, die dich stören. Von Benutzern auf deiner persönlichen Blocklierliste kannst du keine Nachrichten oder Raumeinladungen mehr erhalten.", - "@blockListDescription": {}, "createGroupAndInviteUsers": "Gruppe erstellen und Nutzer einladen", - "@createGroupAndInviteUsers": {}, "startConversation": "Unterhaltung starten", - "@startConversation": {}, "blockedUsers": "Blockierte Benutzer", - "@blockedUsers": {}, "groupCanBeFoundViaSearch": "Gruppe kann über die Suche gefunden werden", - "@groupCanBeFoundViaSearch": {}, "noUsersFoundWithQuery": "Leider konnte mit \"{query}\" kein Benutzer gefunden werden. Bitte schau nach, ob dir ein Tippfehler unterlaufen ist.", "@noUsersFoundWithQuery": { "type": "String", @@ -2654,57 +2492,31 @@ } }, "block": "Blockieren", - "@block": {}, "yourGlobalUserIdIs": "Deine globale Benutzer-ID ist: ", - "@yourGlobalUserIdIs": {}, "commandHint_sendraw": "Rohes JSON senden", - "@commandHint_sendraw": {}, "wrongRecoveryKey": "Entschuldigung ... das scheint nicht der richtige Wiederherstellungsschlüssel zu sein.", - "@wrongRecoveryKey": {}, "blockUsername": "Blockiere Benutzername", - "@blockUsername": {}, "groupName": "Gruppenname", - "@groupName": {}, "searchChatsRooms": "Suche nach #Chats, @Nutzer ...", - "@searchChatsRooms": {}, "databaseMigrationTitle": "Datenbank wird optimiert", - "@databaseMigrationTitle": {}, "databaseMigrationBody": "Bitte warten. Dies kann einen Moment dauern.", - "@databaseMigrationBody": {}, "thisDevice": "Dieses Gerät:", - "@thisDevice": {}, "publicSpaces": "Öffentliche Spaces", - "@publicSpaces": {}, "passwordIsWrong": "Dein eingegebenes Passwort ist falsch", - "@passwordIsWrong": {}, "pleaseEnterYourCurrentPassword": "Bitte dein aktuelles Passwort eingeben", - "@pleaseEnterYourCurrentPassword": {}, "publicLink": "Öffentlicher Link", - "@publicLink": {}, "nothingFound": "Nichts gefunden ...", - "@nothingFound": {}, "decline": "Ablehnen", - "@decline": {}, "newPassword": "Neues Passwort", - "@newPassword": {}, "passwordsDoNotMatch": "Passwörter stimmen nicht überein", - "@passwordsDoNotMatch": {}, "subspace": "Sub-Space", - "@subspace": {}, "select": "Auswählen", - "@select": {}, "pleaseChooseAStrongPassword": "Bitte wähle ein starkes Passwort", - "@pleaseChooseAStrongPassword": {}, "addChatOrSubSpace": "Chat oder Sub-Space hinzufügen", - "@addChatOrSubSpace": {}, "leaveEmptyToClearStatus": "Leer lassen, um den Status zu löschen.", - "@leaveEmptyToClearStatus": {}, "joinSpace": "Space beitreten", - "@joinSpace": {}, "searchForUsers": "Suche nach @benutzer ...", - "@searchForUsers": {}, "initAppError": "Beim Starten der App ist ein Fehler aufgetreten", - "@initAppError": {}, "databaseBuildErrorBody": "Die SQlite-Datenbank kann nicht erstellt werden. Die App versucht vorerst, die Legacy-Datenbank zu verwenden. Bitte melde diesen Fehler an die Entwickler unter {url}. Die Fehlermeldung lautet: {error}", "@databaseBuildErrorBody": { "type": "String", @@ -2750,9 +2562,7 @@ } }, "sendReadReceipts": "Lesebestätigungen senden", - "@sendReadReceipts": {}, "formattedMessages": "Formatierte Nachrichten", - "@formattedMessages": {}, "forwardMessageTo": "Nachricht weiterleiten an {roomName}?", "@forwardMessageTo": { "type": "String", @@ -2763,19 +2573,12 @@ } }, "sendTypingNotificationsDescription": "Andere Teilnehmer in einem Chat können sehen, wenn du eine neue Nachricht tippst.", - "@sendTypingNotificationsDescription": {}, "formattedMessagesDescription": "Formatierte Nachrichteninhalte wie fettgedruckten Text mit Markdown anzeigen.", - "@formattedMessagesDescription": {}, "verifyOtherUser": "🔐 Anderen Benutzer verifizieren", - "@verifyOtherUser": {}, "sendReadReceiptsDescription": "Andere Teilnehmer in einem Chat können sehen, ob du eine Nachricht gelesen hast.", - "@sendReadReceiptsDescription": {}, "transparent": "Transparent", - "@transparent": {}, "verifyOtherDevice": "🔐 Anderes Gerät verifizieren", - "@verifyOtherDevice": {}, "verifyOtherUserDescription": "Wenn du einen anderen Benutzer verifizierst, kannst du sicher sein, dass du weißt, an wen du wirklich schreibst. 💪\n\nWenn du eine Verifizierung startest, wird dir und dem anderen Nutzer ein Popup in der App angezeigt. Dort siehst du dann eine Reihe von Emojis oder Zahlen, die ihr miteinander vergleichen müsst.\n\nDas geht am besten, wenn man sich trifft oder einen Videoanruf startet. 👭", - "@verifyOtherUserDescription": {}, "acceptedKeyVerification": "{sender} hat die Schlüsselverifikation akzeptiert", "@acceptedKeyVerification": { "type": "String", @@ -2831,7 +2634,6 @@ } }, "verifyOtherDeviceDescription": "Wenn du ein anderes Gerät verifizierst, können diese Geräte Schlüssel austauschen, was die Sicherheit insgesamt erhöht. 💪Sobald du eine Verifizierung startest, erscheint ein Pop-up in der App auf beiden Geräten. Dort siehst du dann eine Reihe von Emojis oder Zahlen, die du miteinander vergleichen musst. Am besten hältst du beide Geräte bereit, bevor du die Verifizierung startest. 🤳", - "@verifyOtherDeviceDescription": {}, "presenceStyle": "Statusmeldungen:", "@presenceStyle": { "type": "String", @@ -2843,19 +2645,12 @@ "placeholders": {} }, "incomingMessages": "Eingehende Nachrichten", - "@incomingMessages": {}, "commandHint_unignore": "Angegebene Matrix-ID nicht mehr ignorieren", - "@commandHint_unignore": {}, "commandHint_ignore": "Angegebene Matrix-ID ignorieren", - "@commandHint_ignore": {}, "noDatabaseEncryption": "Datenbankverschlüsselung wird auf dieser Plattform nicht unterstützt", - "@noDatabaseEncryption": {}, "hidePresences": "Status-Liste verbergen?", - "@hidePresences": {}, "stickers": "Sticker", - "@stickers": {}, "discover": "Entdecken", - "@discover": {}, "unreadChatsInApp": "{appname}: {unread} ungelesene Chats", "@unreadChatsInApp": { "type": "String", @@ -2869,17 +2664,11 @@ } }, "customEmojisAndStickersBody": "Eigene Emojis oder Sticker zur Nutzung im Chat hinzufügen oder teilen.", - "@customEmojisAndStickersBody": {}, "globalChatId": "Globale Chat-ID", - "@globalChatId": {}, "accessAndVisibility": "Zugang und Sichtbarkeit", - "@accessAndVisibility": {}, "hideMemberChangesInPublicChats": "Mitglieder-Änderungen in öffentlichen Chats ausblenden", - "@hideMemberChangesInPublicChats": {}, "accessAndVisibilityDescription": "Wer darf dem Chat beitreten und wie kann der Chat gefunden werden.", - "@accessAndVisibilityDescription": {}, "hideMemberChangesInPublicChatsBody": "Zeige keine Beitritt- oder Verlassen-Ereignisse von Mitgliedern in der Timeline an, um die Lesbarkeit in öffentlichen Chats zu verbessern.", - "@hideMemberChangesInPublicChatsBody": {}, "userWouldLikeToChangeTheChat": "{user} würde dem Chat gerne beitreten.", "@userWouldLikeToChangeTheChat": { "placeholders": { @@ -2889,7 +2678,6 @@ } }, "noPublicLinkHasBeenCreatedYet": "Es wurde noch kein öffentlicher Link erstellt", - "@noPublicLinkHasBeenCreatedYet": {}, "chatCanBeDiscoveredViaSearchOnServer": "Chat kann über die Suche auf {server} gefunden werden", "@chatCanBeDiscoveredViaSearchOnServer": { "type": "String", @@ -2900,40 +2688,25 @@ } }, "appLockDescription": "App mit einer PIN sperren, wenn sie nicht verwendet wird", - "@appLockDescription": {}, "calls": "Anrufe", - "@calls": {}, "customEmojisAndStickers": "Eigene Emojis und Sticker", - "@customEmojisAndStickers": {}, "hideRedactedMessages": "Geschwärzte Nachrichten verstecken", - "@hideRedactedMessages": {}, "hideRedactedMessagesBody": "Wenn jemand eine Nachricht schwärzt/löscht, dann wird diese Nachricht im Chat nicht mehr sichtbar sein.", - "@hideRedactedMessagesBody": {}, "hideInvalidOrUnknownMessageFormats": "Ungültige und unbekannte Nachrichten-Formate ausblenden", - "@hideInvalidOrUnknownMessageFormats": {}, "overview": "Übersicht", - "@overview": {}, "notifyMeFor": "Benachrichtige mich für", - "@notifyMeFor": {}, "passwordRecoverySettings": "Passwort-Wiederherstellungs-Einstellungen", - "@passwordRecoverySettings": {}, "knock": "Anklopfen", - "@knock": {}, "knocking": "Klopft", - "@knocking": {}, "thereAreCountUsersBlocked": "Im Augenblick werden {count} Benutzer blockiert.", "@thereAreCountUsersBlocked": { "type": "String", "count": {} }, "usersMustKnock": "Benutzer müssen anklopfen", - "@usersMustKnock": {}, "noOneCanJoin": "Niemand kann beitreten", - "@noOneCanJoin": {}, "createNewAddress": "Neue Adresse erstellen", - "@createNewAddress": {}, "userRole": "Benutzerrolle", - "@userRole": {}, "minimumPowerLevel": "{level} is das minimale Power-Level.", "@minimumPowerLevel": { "type": "String", @@ -2944,15 +2717,10 @@ } }, "publicChatAddresses": "Öffentliche Chat-Adressen", - "@publicChatAddresses": {}, "gallery": "Galerie", - "@gallery": {}, "files": "Dateien", - "@files": {}, "restricted": "Beschränkt", - "@restricted": {}, "knockRestricted": "Anklopfen beschränkt", - "@knockRestricted": {}, "searchIn": "In Chat \"{chat}\" suchen ...", "@searchIn": { "type": "String", @@ -2963,26 +2731,18 @@ } }, "searchMore": "Weiter suchen ...", - "@searchMore": {}, "unread": "Ungelesen", - "@unread": {}, "noMoreChatsFound": "Keine weiteren Chats gefunden ...", - "@noMoreChatsFound": {}, "joinedChats": "Beigetretene Chats", - "@joinedChats": {}, "space": "Space", - "@space": {}, "spaces": "Spaces", - "@spaces": {}, "goToSpace": "Geh zum Space: {space}", "@goToSpace": { "type": "String", "space": {} }, "markAsUnread": "Als ungelesen markieren", - "@markAsUnread": {}, "swipeRightToLeftToReply": "Wische von rechts nach links zum Antworten", - "@swipeRightToLeftToReply": {}, "countChatsAndCountParticipants": "{chats} Chats und {participants} Teilnehmer", "@countChatsAndCountParticipants": { "type": "String", @@ -2996,7 +2756,6 @@ } }, "changeGeneralChatSettings": "Allgemeine Chat-Einstellungen ändern", - "@changeGeneralChatSettings": {}, "userLevel": "{level} - Benutzer", "@userLevel": { "type": "String", @@ -3016,11 +2775,8 @@ } }, "changeTheChatPermissions": "Ändere die Chat-Berechtigungen", - "@changeTheChatPermissions": {}, "changeTheVisibilityOfChatHistory": "Wechsele die Sichtbarkeit der Chat-Historie", - "@changeTheVisibilityOfChatHistory": {}, "chatPermissionsDescription": "Einstellen, welches Level für bestimmte Aktionen in diesem Chat erforderlich ist. Die Level 0, 50 und 100 stehen üblicherweise für Benutzer, Moderatoren und Admins, aber jede Abstufung ist möglich.", - "@chatPermissionsDescription": {}, "invitedBy": "📩 Eingeladen von {user}", "@invitedBy": { "placeholders": { @@ -3039,13 +2795,9 @@ } }, "inviteOtherUsers": "Lade andere Benutzer in diesen Chat ein", - "@inviteOtherUsers": {}, "changeTheCanonicalRoomAlias": "Ändern der Hauptadresse für den öffentlichen Chat", - "@changeTheCanonicalRoomAlias": {}, "sendRoomNotifications": "Sende eine @room-Benachrichtigung", - "@sendRoomNotifications": {}, "changeTheDescriptionOfTheGroup": "Chat-Beschreibung ändern", - "@changeTheDescriptionOfTheGroup": {}, "updateInstalled": "🎉 Update {version} installiert!", "@updateInstalled": { "type": "String", @@ -3056,25 +2808,15 @@ } }, "changelog": "Änderungsprotokoll", - "@changelog": {}, "sendCanceled": "Senden abgebrochen", - "@sendCanceled": {}, "noChatsFoundHere": "Hier wurden noch keine Chats gefunden. Starte einen neuen Chat mit jemandem, indem du die Schaltfläche unten verwenden. ⤵️", - "@noChatsFoundHere": {}, "whatIsAHomeserver": "Was ist ein Homeserver?", - "@whatIsAHomeserver": {}, "doesNotSeemToBeAValidHomeserver": "Scheint kein kompatibler Homeserver zu sein. Falsche URL?", - "@doesNotSeemToBeAValidHomeserver": {}, "loginWithMatrixId": "Mit Matrix-ID anmelden", - "@loginWithMatrixId": {}, "discoverHomeservers": "Server suchen", - "@discoverHomeservers": {}, "homeserverDescription": "Alle deine Daten werden auf einem Homeserver gespeichert, so wie bei einem E-Mail Anbieter. Du kannst aussuchen, welchen Homeserver du benutzen willst und kannst trotzdem mit allen kommunizieren. Erfahre mehr auf https://matrix.org.", - "@homeserverDescription": {}, "sendingAttachment": "Anhang wird gesendet ...", - "@sendingAttachment": {}, "generatingVideoThumbnail": "Generiere Video-Vorschaubild ...", - "@generatingVideoThumbnail": {}, "serverLimitReached": "Server-Limit erreicht! Warte {seconds} Sekunden ...", "@serverLimitReached": { "type": "integer", @@ -3085,11 +2827,8 @@ } }, "calculatingFileSize": "Dateigröße wird berechnet ...", - "@calculatingFileSize": {}, "prepareSendingAttachment": "Anhang zum Senden vorbereiten ...", - "@prepareSendingAttachment": {}, "compressVideo": "Video wird komprimiert ...", - "@compressVideo": {}, "sendingAttachmentCountOfCount": "Sende Anhang {index} von {length} ...", "@sendingAttachmentCountOfCount": { "type": "integer", @@ -3112,31 +2851,18 @@ } }, "oneOfYourDevicesIsNotVerified": "Eines deiner Geräte ist nicht verifiziert", - "@oneOfYourDevicesIsNotVerified": {}, "noticeChatBackupDeviceVerification": "Hinweis: Wenn du alle deine Geräte mit dem Chat-Backup verbindest, sind sie automatisch verifiziert.", - "@noticeChatBackupDeviceVerification": {}, "setWallpaper": "Hintergrund ändern", - "@setWallpaper": {}, "opacity": "Deckkraft:", - "@opacity": {}, "welcomeText": "Hey Hey 👋 Das ist FluffyChat. Du kannst sich bei jedem Homeserver anmelden, der mit https://matrix.org kompatibel ist. Und dann mit jedem chatten. Das hier ist ein riesiges dezentrales Nachrichtennetzwerk!", - "@welcomeText": {}, "blur": "Verwischen:", - "@blur": {}, "manageAccount": "Konto verwalten", - "@manageAccount": {}, "continueText": "Fortfahren", - "@continueText": {}, "noContactInformationProvided": "Der Server stellt keine gültigen Kontaktinformationen bereit", - "@noContactInformationProvided": {}, "contactServerAdmin": "Serveradministrator kontaktieren", - "@contactServerAdmin": {}, "name": "Name", - "@name": {}, "version": "Version", - "@version": {}, "website": "Website", - "@website": {}, "aboutHomeserver": "Über {homeserver}", "@aboutHomeserver": { "type": "String", @@ -3147,19 +2873,12 @@ } }, "boldText": "Fetter Text", - "@boldText": {}, "invalidUrl": "Ungültige URL", - "@invalidUrl": {}, "addLink": "Link hinzufügen", - "@addLink": {}, "unableToJoinChat": "Chat kann nicht beigetreten werden. Möglicherweise hat die Gegenseite das Gespräch bereits beendet.", - "@unableToJoinChat": {}, "italicText": "Kursiver Text", - "@italicText": {}, "strikeThrough": "Durchgestrichen", - "@strikeThrough": {}, "pleaseFillOut": "Bitte ausfüllen", - "@pleaseFillOut": {}, "sendImages": "Sende {count} Bilder", "@sendImages": { "type": "String", @@ -3170,17 +2889,11 @@ } }, "contactServerSecurity": "Server-Sicherheit kontaktieren", - "@contactServerSecurity": {}, "compress": "Komprimieren", - "@compress": {}, "supportPage": "Support-Seite", - "@supportPage": {}, "serverInformation": "Server-Informationen:", - "@serverInformation": {}, "appIntroduction": "Mit FluffyChat kannst du über verschiedene Messenger hinweg mit deinen Freunden chatten. Erfahre mehr dazu auf https://matrix.org oder tippe einfach auf *Fortfahren*.", - "@appIntroduction": {}, "newChatRequest": "📩 Neue Chat-Anfrage", - "@newChatRequest": {}, "synchronizingPleaseWaitCounter": " Synchronisierung… ({percentage}%)", "@synchronizingPleaseWaitCounter": { "type": "String", @@ -3191,11 +2904,8 @@ } }, "waitingForServer": "Auf Server warten...", - "@waitingForServer": {}, "previous": "Vorige", - "@previous": {}, "otherPartyNotLoggedIn": "Der User ist aktuell nicht eingeloggt und kann daher keine Nachrichten empfangen!", - "@otherPartyNotLoggedIn": {}, "appWantsToUseForLogin": "Nutze '{server}' um dich einzuloggen", "@appWantsToUseForLogin": { "type": "String", @@ -3206,97 +2916,51 @@ } }, "appWantsToUseForLoginDescription": "Hiermit erlaubst du der App und der Website, Informationen über dich weiterzugeben.", - "@appWantsToUseForLoginDescription": {}, "open": "Offen", - "@open": {}, "notificationRuleContainsUserName": "Enthält Benutzernamen", - "@notificationRuleContainsUserName": {}, "notificationRuleContainsUserNameDescription": "Benachrichtigt den Benutzer, wenn eine Nachricht seinen Benutzernamen enthält.", - "@notificationRuleContainsUserNameDescription": {}, "notificationRuleMaster": "Alle Benachrichtigungen stummschalten", - "@notificationRuleMaster": {}, "notificationRuleSuppressNotices": "Automatisierte Nachrichten unterdrücken", - "@notificationRuleSuppressNotices": {}, "notificationRuleMasterDescription": "Setzt alle anderen Regeln außer Kraft und deaktiviert alle Benachrichtigungen.", - "@notificationRuleMasterDescription": {}, "generalNotificationSettings": "Allgemeine Benachrichtigungseinstellungen", - "@generalNotificationSettings": {}, "otherNotificationSettings": "Andere Benachrichtigungseinstellungen", - "@otherNotificationSettings": {}, "contentNotificationSettings": "Einstellungen für Inhaltsbenachrichtigungen", - "@contentNotificationSettings": {}, "userSpecificNotificationSettings": "Benutzerspezifische Benachrichtigungseinstellungen", - "@userSpecificNotificationSettings": {}, "roomNotificationSettings": "Einstellungen für Raumbenachrichtigungen", - "@roomNotificationSettings": {}, "notificationRuleSuppressNoticesDescription": "Unterdrückt Benachrichtigungen von automatisierten Clients wie Bots.", - "@notificationRuleSuppressNoticesDescription": {}, "notificationRuleInviteForMe": "Einladung für mich", - "@notificationRuleInviteForMe": {}, "notificationRuleReaction": "Reaktion", - "@notificationRuleReaction": {}, "notificationRuleReactionDescription": "Unterdrückt Benachrichtigungen für Reaktionen.", - "@notificationRuleReactionDescription": {}, "notificationRuleSuppressEditsDescription": "Unterdrückt Benachrichtigungen für bearbeitete Nachrichten.", - "@notificationRuleSuppressEditsDescription": {}, "notificationRuleCall": "Anruf", - "@notificationRuleCall": {}, "notificationRuleCallDescription": "Benachrichtigt den Benutzer über Anrufe.", - "@notificationRuleCallDescription": {}, "notificationRuleEncrypted": "Verschlüsselt", - "@notificationRuleEncrypted": {}, "more": "Mehr", - "@more": {}, "notificationRuleSuppressEdits": "Unterdrückt Bearbeitungen", - "@notificationRuleSuppressEdits": {}, "notificationRuleRoomServerAclDescription": "Unterdrückt Benachrichtigungen für Raumserver-Zugriffskontrolllisten (ACL).", - "@notificationRuleRoomServerAclDescription": {}, "notificationRuleMessage": "Nachricht", - "@notificationRuleMessage": {}, "notificationRuleMessageDescription": "Informiert den Benutzer über allgemeine Nachrichten.", - "@notificationRuleMessageDescription": {}, "notificationRuleJitsi": "Jitsi", - "@notificationRuleJitsi": {}, "allDevices": "Alle Geräte", - "@allDevices": {}, "enterNewChat": "Neuen Chat betreten", - "@enterNewChat": {}, "shareKeysWith": "Schlüssel teilen mit...", - "@shareKeysWith": {}, "shareKeysWithDescription": "Welchen Geräten sollte vertraut werden, damit sie deine Nachrichten in verschlüsselten Chats mitlesen können?", - "@shareKeysWithDescription": {}, "verifiedDevicesOnly": "Nur verifizierte Geräte", - "@verifiedDevicesOnly": {}, "takeAPhoto": "Foto aufnehmen", - "@takeAPhoto": {}, "recordAVideo": "Video aufnehmen", - "@recordAVideo": {}, "optionalMessage": "(Optionale) Nachricht...", - "@optionalMessage": {}, "notSupportedOnThisDevice": "Nicht unterstützt auf diesem Gerät", - "@notSupportedOnThisDevice": {}, "ignoreUser": "Nutzer ignorieren", - "@ignoreUser": {}, "notificationRuleEncryptedRoomOneToOneDescription": "Benachrichtigt den Benutzer über Nachrichten in verschlüsselten Eins-zu-Eins-Chats.", - "@notificationRuleEncryptedRoomOneToOneDescription": {}, "commandHint_roomupgrade": "Aktualisieren Sie diesen Raum auf die angegebene Raumversion", - "@commandHint_roomupgrade": {}, "notificationRuleMemberEvent": "Mitgliederveranstaltung", - "@notificationRuleMemberEvent": {}, "notificationRuleInviteForMeDescription": "Benachrichtigt den Benutzer, wenn er in einen Raum eingeladen wird.", - "@notificationRuleInviteForMeDescription": {}, "notificationRuleIsUserMentionDescription": "Benachrichtigt den Benutzer, wenn er in einer Nachricht direkt erwähnt wird.", - "@notificationRuleIsUserMentionDescription": {}, "notificationRuleRoomnotifDescription": "Benachrichtigt den Benutzer, wenn eine Nachricht „@room“ enthält.", - "@notificationRuleRoomnotifDescription": {}, "notificationRuleRoomOneToOneDescription": "Benachrichtigt den Benutzer über Nachrichten in Einzelchats.", - "@notificationRuleRoomOneToOneDescription": {}, "notificationRuleEncryptedDescription": "Benachrichtigt den Benutzer über Nachrichten in verschlüsselten Räumen.", - "@notificationRuleEncryptedDescription": {}, "notificationRuleJitsiDescription": "Benachrichtigt den Benutzer über Jitsi-Widget-Ereignisse.", - "@notificationRuleJitsiDescription": {}, "checkList": "Checkliste", - "@checkList": {}, "countInvited": "{count} invited", "@countInvited": { "type": "String", @@ -3307,23 +2971,14 @@ } }, "notificationRuleIsUserMention": "Benutzererwähnung", - "@notificationRuleIsUserMention": {}, "notificationRuleContainsDisplayName": "Enthält den Anzeigenamen", - "@notificationRuleContainsDisplayName": {}, "notificationRuleContainsDisplayNameDescription": "Benachrichtigt den Benutzer, wenn eine Nachricht seinen Anzeigenamen enthält.", - "@notificationRuleContainsDisplayNameDescription": {}, "notificationRuleIsRoomMention": "Chat-Erwähnung", - "@notificationRuleIsRoomMention": {}, "notificationRuleRoomnotif": "Chat-Benachritigung", - "@notificationRuleRoomnotif": {}, "notificationRuleTombstoneDescription": "Benachrichtigt den Benutzer über Nachrichten zur Raumdeaktivierung.", - "@notificationRuleTombstoneDescription": {}, "notificationRuleEncryptedRoomOneToOne": "Verschlüsselter Einzelchat", - "@notificationRuleEncryptedRoomOneToOne": {}, "notificationRuleRoomOneToOne": "Einzelchat", - "@notificationRuleRoomOneToOne": {}, "notificationRuleServerAclDescription": "Unterdrückt Benachrichtigungen für Server-ACL-Ereignisse.", - "@notificationRuleServerAclDescription": {}, "unknownPushRule": "Unbekannte Push-Regel '{rule}'", "@unknownPushRule": { "type": "String", @@ -3334,19 +2989,12 @@ } }, "deletePushRuleCanNotBeUndone": "Wenn Sie diese Benachrichtigungseinstellung löschen, kann dies nicht rückgängig gemacht werden.", - "@deletePushRuleCanNotBeUndone": {}, "crossVerifiedDevices": "Cross-verifizierte Geräte", - "@crossVerifiedDevices": {}, "notificationRuleIsRoomMentionDescription": "Benachrichtigt den Benutzer, wenn ein Raum erwähnt wird.", - "@notificationRuleIsRoomMentionDescription": {}, "notificationRuleRoomServerAcl": "Raumserver-ACL", - "@notificationRuleRoomServerAcl": {}, "crossVerifiedDevicesIfEnabled": "Cross-verifizierte Geräte, falls aktiviert", - "@crossVerifiedDevicesIfEnabled": {}, "notificationRuleServerAcl": "Unterdrücken von Server-ACL-Ereignissen", - "@notificationRuleServerAcl": {}, "notificationRuleMemberEventDescription": "Unterdrückt Benachrichtigungen zu Mitgliedschaftsereignissen.", - "@notificationRuleMemberEventDescription": {}, "sentVoiceMessage": "🎙️ {duration} - Sprachnachricht von {sender}", "@sentVoiceMessage": { "type": "String", @@ -3360,47 +3008,26 @@ } }, "normalUser": "Normaler Benutzer", - "@normalUser": {}, "setCustomPermissionLevel": "Benutzerdefinierte Berechtigungsstufe festlegen", - "@setCustomPermissionLevel": {}, "setPermissionsLevelDescription": "Bitte wählen Sie unten eine vordefinierte Rolle aus oder geben Sie eine benutzerdefinierte Berechtigungsstufe zwischen 0 und 100 ein.", - "@setPermissionsLevelDescription": {}, "approve": "Genehmigen", - "@approve": {}, "youHaveKnocked": "Du hast geklopft", - "@youHaveKnocked": {}, "pleaseWaitUntilInvited": "Bitte warte nun, bis dich jemand aus dem Raum auffordert.", - "@pleaseWaitUntilInvited": {}, "notificationRuleTombstone": "Tombstone", - "@notificationRuleTombstone": {}, "commandHint_logout": "Aktuelles Gerät abmelden", - "@commandHint_logout": {}, "commandHint_logoutall": "Alle aktiven Geräte abmelden", - "@commandHint_logoutall": {}, "displayNavigationRail": "Navigationsleiste auf dem Smartphone anzeigen", - "@displayNavigationRail": {}, "customReaction": "Benutzerdefinierte Reaktion", - "@customReaction": {}, "moreEvents": "Weitere Ereignisse", - "@moreEvents": {}, "declineInvitation": "Einladung ablehnen", - "@declineInvitation": {}, "noMessagesYet": "Noch keine Nachrichten", - "@noMessagesYet": {}, "longPressToRecordVoiceMessage": "Lange drücken, um eine Sprachnachricht aufzunehmen.", - "@longPressToRecordVoiceMessage": {}, "pause": "Pause", - "@pause": {}, "newSubSpace": "Neuer Sub-Space", - "@newSubSpace": {}, "moveToDifferentSpace": "In einen anderen space wechseln", - "@moveToDifferentSpace": {}, "moveUp": "Nach oben", - "@moveUp": {}, "moveDown": "Nach unten", - "@moveDown": {}, "removeFromSpaceDescription": "Der Chat wird aus dem Space entfernt, erscheint aber weiterhin in Ihrer Chatliste.", - "@removeFromSpaceDescription": {}, "countChats": "{chats} Chats", "@countChats": { "type": "String", @@ -3429,9 +3056,7 @@ } }, "donate": "Spenden", - "@donate": {}, "resume": "Fortsetzen", - "@resume": {}, "startedAPoll": "{username} hat eine Umfrage gestartet.", "@startedAPoll": { "type": "String", @@ -3442,25 +3067,15 @@ } }, "poll": "Umfrage", - "@poll": {}, "startPoll": "Umfrage starten", - "@startPoll": {}, "endPoll": "Umfrage beenden", - "@endPoll": {}, "answersVisible": "Antworten sichtbar", - "@answersVisible": {}, "answersHidden": "Antworten sind verborgen", - "@answersHidden": {}, "pollQuestion": "Frage", - "@pollQuestion": {}, "answerOption": "Antwortmöglichkeit", - "@answerOption": {}, "addAnswerOption": "Antwortoption hinzufügen", - "@addAnswerOption": {}, "allowMultipleAnswers": "Mehrere Antworten zulassen", - "@allowMultipleAnswers": {}, "pollHasBeenEnded": "Umfrage ist beendet", - "@pollHasBeenEnded": {}, "countVotes": "{count, plural, =1{Eine Stimme} other{{count} Stimmen}}", "@countVotes": { "type": "int", @@ -3471,9 +3086,7 @@ } }, "answersWillBeVisibleWhenPollHasEnded": "Die Antworten werden nach Ende der Umfrage sichtbar sein", - "@answersWillBeVisibleWhenPollHasEnded": {}, "replyInThread": "Im Thread antworten", - "@replyInThread": {}, "countReplies": "{count, plural, =1{Eine Antwort} other{{count} Antworten}}", "@countReplies": { "type": "int", @@ -3484,37 +3097,21 @@ } }, "thread": "Thread", - "@thread": {}, "backToMainChat": "Zurück zum Hauptchat", - "@backToMainChat": {}, "changedTheChatDescription": "{username} hat die Chatbeschreibung geändert", - "@changedTheChatDescription": {}, "changedTheChatName": "{username} den Chatnamen geändert", - "@changedTheChatName": {}, "saveChanges": "Änderungen speichern", - "@saveChanges": {}, "skipChatBackup": "Chatsicherung überspringen", - "@skipChatBackup": {}, "skipChatBackupWarning": "Bist du sicher? Ohne die Chatsicherung zu aktivieren, kannst du den Zugriff auf deine Nachrichten verlieren, wenn du dein Gerät wechselst.", - "@skipChatBackupWarning": {}, "loadingMessages": "Nachrichten werden geladen", - "@loadingMessages": {}, "setupChatBackup": "Chatsicherung einrichten", - "@setupChatBackup": {}, "createSticker": "Sticker oder Emoji erstellen", - "@createSticker": {}, "useAsSticker": "Als Sticker verwenden", - "@useAsSticker": {}, "useAsEmoji": "Als Emoji verwenden", - "@useAsEmoji": {}, "stickerPackNameAlreadyExists": "Name des Sticker-Pakets existiert bereits", - "@stickerPackNameAlreadyExists": {}, "newStickerPack": "Neues Sticker-Paket", - "@newStickerPack": {}, "stickerPackName": "Name des Sticker-Pakets", - "@stickerPackName": {}, "noMoreResultsFound": "Keine weiteren Ergebnisse gefunden", - "@noMoreResultsFound": {}, "chatSearchedUntil": "Chat durchsucht bis {time}", "@chatSearchedUntil": { "type": "String", @@ -3524,6 +3121,424 @@ } } }, + "attribution": "Attribuierung", + "identityServer": "Identitätsserver:", + "versionWithNumber": "Version: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Protokolle", + "baseUrl": "Basis-URL", + "advancedConfigs": "Erweiterte Konfigurationen", + "advancedConfigurations": "Erweiterte Konfigurationen", + "@clearArchive": {}, + "@scanQrCode": {}, + "@chatHasBeenAddedToThisSpace": {}, + "@addToSpace": {}, + "@serverRequiresEmail": {}, + "@enableMultiAccounts": {}, + "@bundleName": {}, + "@removeFromBundle": {}, + "@addToBundle": {}, + "@editBundlesForAccount": {}, + "@addAccount": {}, + "@oneClientLoggedOut": {}, + "@homeserver": {}, + "@sendOnEnter": {}, + "@link": {}, + "@yourChatBackupHasBeenSetUp": {}, + "@unverified": {}, + "@messageInfo": {}, + "@time": {}, + "@messageType": {}, + "@sender": {}, + "@openGallery": {}, + "@removeFromSpace": {}, + "@addToSpaceDescription": {}, + "@start": {}, + "@repeatPassword": {}, + "@publish": {}, + "@pinMessage": {}, + "@emojis": {}, + "@placeCall": {}, + "@voiceCall": {}, + "@unsupportedAndroidVersion": {}, + "@videoCallsBetaWarning": {}, + "@emailOrUsername": {}, + "@unsupportedAndroidVersionLong": {}, + "@experimentalVideoCalls": {}, + "@markAsRead": {}, + "@reportUser": {}, + "@openChat": {}, + "@confirmEventUnpin": {}, + "@dismiss": {}, + "@nextAccount": {}, + "@widgetJitsi": {}, + "@widgetCustom": {}, + "@widgetEtherpad": {}, + "@addWidget": {}, + "@widgetVideo": {}, + "@widgetName": {}, + "@widgetUrlError": {}, + "@errorAddingWidget": {}, + "@previousAccount": {}, + "@widgetNameError": {}, + "@youRejectedTheInvitation": {}, + "@youJoinedTheChat": {}, + "@youAcceptedTheInvitation": {}, + "@recoveryKey": {}, + "@recoveryKeyLost": {}, + "@user": {}, + "@custom": {}, + "@storeInAndroidKeystore": {}, + "@storeSecurlyOnThisDevice": {}, + "@dehydrate": {}, + "@dehydrateWarning": {}, + "@dehydrateTor": {}, + "@dehydrateTorLong": {}, + "@hydrateTor": {}, + "@hydrate": {}, + "@indexedDbErrorTitle": {}, + "@unlockOldMessages": {}, + "@pleaseEnterRecoveryKeyDescription": {}, + "@saveKeyManuallyDescription": {}, + "@hydrateTorLong": {}, + "@pleaseEnterRecoveryKey": {}, + "@users": {}, + "@storeInSecureStorageDescription": {}, + "@storeInAppleKeyChain": {}, + "@indexedDbErrorLong": {}, + "@confirmMatrixId": {}, + "@commandHint_markasdm": {}, + "@commandHint_markasgroup": {}, + "@hideUnimportantStateEvents": {}, + "@doNotShowAgain": {}, + "@appearOnTopDetails": {}, + "@noKeyForThisMessage": {}, + "@foregroundServiceRunning": {}, + "@screenSharingTitle": {}, + "@callingPermissions": {}, + "@callingAccount": {}, + "@callingAccountDetails": {}, + "@appearOnTop": {}, + "@otherCallingPermissions": {}, + "@whyIsThisMessageEncrypted": {}, + "@newGroup": {}, + "@newSpace": {}, + "@enterSpace": {}, + "@enterRoom": {}, + "@allSpaces": {}, + "@screenSharingDetail": {}, + "@newSpaceDescription": {}, + "@encryptThisChat": {}, + "@startFirstChat": {}, + "@deviceKeys": {}, + "@commandHint_cuddle": {}, + "@commandHint_hug": {}, + "@sorryThatsNotPossible": {}, + "@commandHint_googly": {}, + "@disableEncryptionWarning": {}, + "@reopenChat": {}, + "@noBackupWarning": {}, + "@noOtherDevicesFound": {}, + "@jumpToLastReadMessage": {}, + "@readUpToHere": {}, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@jump": {}, + "@openLinkInBrowser": {}, + "@reportErrorDescription": {}, + "@report": {}, + "@signInWithPassword": {}, + "@importNow": {}, + "@importEmojis": {}, + "@importFromZipFile": {}, + "@exportEmotePack": {}, + "@notAnImage": {}, + "@replace": {}, + "@sendTypingNotifications": {}, + "@profileNotFound": {}, + "@createGroup": {}, + "@shareInviteLink": {}, + "@inviteContactToGroupQuestion": {}, + "@tryAgain": {}, + "@redactMessageDescription": {}, + "@setTheme": {}, + "@setColorTheme": {}, + "@invite": {}, + "@optionalRedactReason": {}, + "@messagesStyle": {}, + "@chatPermissions": {}, + "@chatDescription": {}, + "@chatDescriptionHasBeenChanged": {}, + "@noChatDescriptionYet": {}, + "@invalidServerName": {}, + "@directChat": {}, + "@addChatDescription": {}, + "@setChatDescription": {}, + "@inviteGroupChat": {}, + "@invitePrivateChat": {}, + "@invalidInput": {}, + "@pleaseEnterANumber": {}, + "@banUserDescription": {}, + "@removeDevicesDescription": {}, + "@unbanUserDescription": {}, + "@pushNotificationsNotAvailable": {}, + "@makeAdminDescription": {}, + "@archiveRoomDescription": {}, + "@learnMore": {}, + "@roomUpgradeDescription": {}, + "@kickUserDescription": {}, + "@blockListDescription": {}, + "@createGroupAndInviteUsers": {}, + "@startConversation": {}, + "@blockedUsers": {}, + "@groupCanBeFoundViaSearch": {}, + "@block": {}, + "@yourGlobalUserIdIs": {}, + "@commandHint_sendraw": {}, + "@wrongRecoveryKey": {}, + "@blockUsername": {}, + "@groupName": {}, + "@searchChatsRooms": {}, + "@databaseMigrationTitle": {}, + "@databaseMigrationBody": {}, + "@thisDevice": {}, + "@publicSpaces": {}, + "@passwordIsWrong": {}, + "@pleaseEnterYourCurrentPassword": {}, + "@publicLink": {}, + "@nothingFound": {}, + "@decline": {}, + "@newPassword": {}, + "@passwordsDoNotMatch": {}, + "@subspace": {}, + "@select": {}, + "@pleaseChooseAStrongPassword": {}, + "@addChatOrSubSpace": {}, + "@leaveEmptyToClearStatus": {}, + "@joinSpace": {}, + "@searchForUsers": {}, + "@initAppError": {}, + "@sendReadReceipts": {}, + "@formattedMessages": {}, + "@sendTypingNotificationsDescription": {}, + "@formattedMessagesDescription": {}, + "@verifyOtherUser": {}, + "@sendReadReceiptsDescription": {}, + "@transparent": {}, + "@verifyOtherDevice": {}, + "@verifyOtherUserDescription": {}, + "@verifyOtherDeviceDescription": {}, + "@incomingMessages": {}, + "@commandHint_unignore": {}, + "@commandHint_ignore": {}, + "@noDatabaseEncryption": {}, + "@hidePresences": {}, + "@stickers": {}, + "@discover": {}, + "@customEmojisAndStickersBody": {}, + "@globalChatId": {}, + "@accessAndVisibility": {}, + "@hideMemberChangesInPublicChats": {}, + "@accessAndVisibilityDescription": {}, + "@hideMemberChangesInPublicChatsBody": {}, + "@noPublicLinkHasBeenCreatedYet": {}, + "@appLockDescription": {}, + "@calls": {}, + "@customEmojisAndStickers": {}, + "@hideRedactedMessages": {}, + "@hideRedactedMessagesBody": {}, + "@hideInvalidOrUnknownMessageFormats": {}, + "@overview": {}, + "@notifyMeFor": {}, + "@passwordRecoverySettings": {}, + "@knock": {}, + "@knocking": {}, + "@usersMustKnock": {}, + "@noOneCanJoin": {}, + "@createNewAddress": {}, + "@userRole": {}, + "@publicChatAddresses": {}, + "@gallery": {}, + "@files": {}, + "@restricted": {}, + "@knockRestricted": {}, + "@searchMore": {}, + "@unread": {}, + "@noMoreChatsFound": {}, + "@joinedChats": {}, + "@space": {}, + "@spaces": {}, + "@markAsUnread": {}, + "@swipeRightToLeftToReply": {}, + "@changeGeneralChatSettings": {}, + "@changeTheChatPermissions": {}, + "@changeTheVisibilityOfChatHistory": {}, + "@chatPermissionsDescription": {}, + "@inviteOtherUsers": {}, + "@changeTheCanonicalRoomAlias": {}, + "@sendRoomNotifications": {}, + "@changeTheDescriptionOfTheGroup": {}, + "@changelog": {}, + "@sendCanceled": {}, + "@noChatsFoundHere": {}, + "@whatIsAHomeserver": {}, + "@doesNotSeemToBeAValidHomeserver": {}, + "@loginWithMatrixId": {}, + "@discoverHomeservers": {}, + "@homeserverDescription": {}, + "@sendingAttachment": {}, + "@generatingVideoThumbnail": {}, + "@calculatingFileSize": {}, + "@prepareSendingAttachment": {}, + "@compressVideo": {}, + "@oneOfYourDevicesIsNotVerified": {}, + "@noticeChatBackupDeviceVerification": {}, + "@setWallpaper": {}, + "@opacity": {}, + "@welcomeText": {}, + "@blur": {}, + "@manageAccount": {}, + "@continueText": {}, + "@noContactInformationProvided": {}, + "@contactServerAdmin": {}, + "@name": {}, + "@version": {}, + "@website": {}, + "@boldText": {}, + "@invalidUrl": {}, + "@addLink": {}, + "@unableToJoinChat": {}, + "@italicText": {}, + "@strikeThrough": {}, + "@pleaseFillOut": {}, + "@contactServerSecurity": {}, + "@compress": {}, + "@supportPage": {}, + "@serverInformation": {}, + "@appIntroduction": {}, + "@newChatRequest": {}, + "@waitingForServer": {}, + "@previous": {}, + "@otherPartyNotLoggedIn": {}, + "@appWantsToUseForLoginDescription": {}, + "@open": {}, + "@notificationRuleContainsUserName": {}, + "@notificationRuleContainsUserNameDescription": {}, + "@notificationRuleMaster": {}, + "@notificationRuleSuppressNotices": {}, + "@notificationRuleMasterDescription": {}, + "@generalNotificationSettings": {}, + "@otherNotificationSettings": {}, + "@contentNotificationSettings": {}, + "@userSpecificNotificationSettings": {}, + "@roomNotificationSettings": {}, + "@notificationRuleSuppressNoticesDescription": {}, + "@notificationRuleInviteForMe": {}, + "@notificationRuleReaction": {}, + "@notificationRuleReactionDescription": {}, + "@notificationRuleSuppressEditsDescription": {}, + "@notificationRuleCall": {}, + "@notificationRuleCallDescription": {}, + "@notificationRuleEncrypted": {}, + "@more": {}, + "@notificationRuleSuppressEdits": {}, + "@notificationRuleRoomServerAclDescription": {}, + "@notificationRuleMessage": {}, + "@notificationRuleMessageDescription": {}, + "@notificationRuleJitsi": {}, + "@allDevices": {}, + "@enterNewChat": {}, + "@shareKeysWith": {}, + "@shareKeysWithDescription": {}, + "@verifiedDevicesOnly": {}, + "@takeAPhoto": {}, + "@recordAVideo": {}, + "@optionalMessage": {}, + "@notSupportedOnThisDevice": {}, + "@ignoreUser": {}, + "@notificationRuleEncryptedRoomOneToOneDescription": {}, + "@commandHint_roomupgrade": {}, + "@notificationRuleMemberEvent": {}, + "@notificationRuleInviteForMeDescription": {}, + "@notificationRuleIsUserMentionDescription": {}, + "@notificationRuleRoomnotifDescription": {}, + "@notificationRuleRoomOneToOneDescription": {}, + "@notificationRuleEncryptedDescription": {}, + "@notificationRuleJitsiDescription": {}, + "@checkList": {}, + "@notificationRuleIsUserMention": {}, + "@notificationRuleContainsDisplayName": {}, + "@notificationRuleContainsDisplayNameDescription": {}, + "@notificationRuleIsRoomMention": {}, + "@notificationRuleRoomnotif": {}, + "@notificationRuleTombstoneDescription": {}, + "@notificationRuleEncryptedRoomOneToOne": {}, + "@notificationRuleRoomOneToOne": {}, + "@notificationRuleServerAclDescription": {}, + "@deletePushRuleCanNotBeUndone": {}, + "@crossVerifiedDevices": {}, + "@notificationRuleIsRoomMentionDescription": {}, + "@notificationRuleRoomServerAcl": {}, + "@crossVerifiedDevicesIfEnabled": {}, + "@notificationRuleServerAcl": {}, + "@notificationRuleMemberEventDescription": {}, + "@normalUser": {}, + "@setCustomPermissionLevel": {}, + "@setPermissionsLevelDescription": {}, + "@approve": {}, + "@youHaveKnocked": {}, + "@pleaseWaitUntilInvited": {}, + "@notificationRuleTombstone": {}, + "@commandHint_logout": {}, + "@commandHint_logoutall": {}, + "@displayNavigationRail": {}, + "@customReaction": {}, + "@moreEvents": {}, + "@declineInvitation": {}, + "@noMessagesYet": {}, + "@longPressToRecordVoiceMessage": {}, + "@pause": {}, + "@newSubSpace": {}, + "@moveToDifferentSpace": {}, + "@moveUp": {}, + "@moveDown": {}, + "@removeFromSpaceDescription": {}, + "@donate": {}, + "@resume": {}, + "@poll": {}, + "@startPoll": {}, + "@endPoll": {}, + "@answersVisible": {}, + "@answersHidden": {}, + "@pollQuestion": {}, + "@answerOption": {}, + "@addAnswerOption": {}, + "@allowMultipleAnswers": {}, + "@pollHasBeenEnded": {}, + "@answersWillBeVisibleWhenPollHasEnded": {}, + "@replyInThread": {}, + "@thread": {}, + "@backToMainChat": {}, + "@changedTheChatDescription": {}, + "@changedTheChatName": {}, + "@saveChanges": {}, + "@skipChatBackup": {}, + "@skipChatBackupWarning": {}, + "@loadingMessages": {}, + "@setupChatBackup": {}, + "@createSticker": {}, + "@useAsSticker": {}, + "@useAsEmoji": {}, + "@stickerPackNameAlreadyExists": {}, + "@newStickerPack": {}, + "@stickerPackName": {}, + "@noMoreResultsFound": {}, "writeAMessageLangCodes": "Geben Sie in {l1} oder {l2} ein...", "requests": "Anfragen", "holdForInfo": "Klicken und halten für Wortinformationen.", diff --git a/lib/l10n/intl_el.arb b/lib/l10n/intl_el.arb index 87b180712..a60bbc725 100644 --- a/lib/l10n/intl_el.arb +++ b/lib/l10n/intl_el.arb @@ -1,12029 +1,11992 @@ { - "hugContent": "{senderName} σε αγκαλιάζει", - "@hugContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "commandHint_cuddle": "Στείλτε μια αγκαλιά", - "@commandHint_cuddle": {}, - "admin": "Διαχειριστής", - "@admin": { - "type": "String", - "placeholders": {} - }, - "blockDevice": "Συσκευή μπλοκ", - "@blockDevice": { - "type": "String", - "placeholders": {} - }, - "supposedMxid": "Αυτό θα πρέπει να είναι {mxid}", - "@supposedMxid": { - "type": "String", - "placeholders": { - "mxid": { - "type": "String" - } - } - }, - "banFromChat": "Απαγόρευση από τη συνομιλία", - "@banFromChat": { - "type": "String", - "placeholders": {} - }, - "askSSSSSign": "Για να μπορέσετε να υπογράψετε το άλλο άτομο, πληκτρολογήστε τη συνθηματική φράση ασφαλούς αποθήκευσης ή το κλειδί ανάκτησης.", - "@askSSSSSign": { - "type": "String", - "placeholders": {} - }, - "remove": "Αφαιρέστε το", - "@remove": { - "type": "String", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Επιτρέπεται στους φιλοξενούμενους χρήστες να συμμετάσχουν", - "@areGuestsAllowedToJoin": { - "type": "String", - "placeholders": {} - }, - "blocked": "Αποκλεισμένο", - "@blocked": { - "type": "String", - "placeholders": {} - }, - "sendOnEnter": "Αποστολή με enter", - "@sendOnEnter": {}, - "answeredTheCall": "{senderName} απάντησε στην κλήση", - "@answeredTheCall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "alias": "ψευδώνυμο", - "@alias": { - "type": "String", - "placeholders": {} - }, - "all": "Όλα", - "@all": { - "type": "String", - "placeholders": {} - }, - "badServerLoginTypesException": "Ο homeserver υποστηρίζει τους τύπους σύνδεσης:\n{serverVersions}\nΑλλά αυτή η εφαρμογή υποστηρίζει μόνο:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "cantOpenUri": "Δεν μπορεί να ανοίξει το URI {uri}", - "@cantOpenUri": { - "type": "String", - "placeholders": { - "uri": { - "type": "String" - } - } - }, - "importFromZipFile": "Εισαγωγή από αρχείο .zip", - "@importFromZipFile": {}, - "autoplayImages": "Αυτόματη αναπαραγωγή κινούμενων αυτοκόλλητων και emotes", - "@autoplayImages": { - "type": "String", - "placeholder": {} - }, - "repeatPassword": "Επανάληψη κωδικού πρόσβασης", - "@repeatPassword": {}, - "acceptedTheInvitation": "👍 {username} αποδέχτηκε την πρόσκληση", - "@acceptedTheInvitation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "banned": "Απαγορευμένο", - "@banned": { - "type": "String", - "placeholders": {} - }, - "exportEmotePack": "Εξαγωγή πακέτου Emote ως .zip", - "@exportEmotePack": {}, - "account": "Λογαριασμός", - "@account": { - "type": "String", - "placeholders": {} - }, - "areYouSure": "Είσαι σίγουρος;", - "@areYouSure": { - "type": "String", - "placeholders": {} - }, - "allChats": "Όλες οι συνομιλίες", - "@allChats": { - "type": "String", - "placeholders": {} - }, - "badServerVersionsException": "Ο homeserver υποστηρίζει τις εκδόσεις Spec:\n{serverVersions}\nΑλλά αυτή η εφαρμογή υποστηρίζει μόνο τις {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "addToSpace": "Προσθήκη στο χώρο", - "@addToSpace": {}, - "about": "Σχετικά με το", - "@about": { - "type": "String", - "placeholders": {} - }, - "activatedEndToEndEncryption": "🔐 {username} ενεργοποίησε κρυπτογράφηση από άκρη σε άκρη", - "@activatedEndToEndEncryption": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "googlyEyesContent": "{senderName} σας στέλνει googly eyes", - "@googlyEyesContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "addChatDescription": "Προσθέστε μια περιγραφή συνομιλίας...", - "@addChatDescription": {}, - "cancel": "Ακύρωση", - "@cancel": { - "type": "String", - "placeholders": {} - }, - "appLock": "Κλείδωμα εφαρμογών", - "@appLock": { - "type": "String", - "placeholders": {} - }, - "sendTypingNotifications": "Αποστολή ειδοποιήσεων δακτυλογράφησης", - "@sendTypingNotifications": {}, - "importEmojis": "Εισαγωγή Emojis", - "@importEmojis": {}, - "confirmMatrixId": "Παρακαλούμε επιβεβαιώστε το Matrix ID σας για να διαγράψετε τον λογαριασμό σας.", - "@confirmMatrixId": {}, - "notAnImage": "Δεν είναι αρχείο εικόνας.", - "@notAnImage": {}, - "areYouSureYouWantToLogout": "Σίγουρα θέλετε να αποσυνδεθείτε;", - "@areYouSureYouWantToLogout": { - "type": "String", - "placeholders": {} - }, - "bannedUser": "{username} banned {targetName}", - "@bannedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "cuddleContent": "{senderName} σε αγκαλιάζει", - "@cuddleContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "askVerificationRequest": "Αποδοχή αυτού του αιτήματος επαλήθευσης από {username};", - "@askVerificationRequest": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "addEmail": "Προσθήκη email", - "@addEmail": { - "type": "String", - "placeholders": {} - }, - "commandHint_hug": "Στείλτε μια αγκαλιά", - "@commandHint_hug": {}, - "replace": "Αντικαταστήστε το", - "@replace": {}, - "archive": "Αρχείο", - "@archive": { - "type": "String", - "placeholders": {} - }, - "accept": "Αποδοχή", - "@accept": { - "type": "String", - "placeholders": {} - }, - "commandHint_googly": "Στείλτε μερικά μάτια", - "@commandHint_googly": {}, - "botMessages": "Μηνύματα bot", - "@botMessages": { - "type": "String", - "placeholders": {} - }, - "importNow": "Εισαγωγή τώρα", - "@importNow": {}, - "anyoneCanJoin": "Οποιοσδήποτε μπορεί να συμμετάσχει", - "@anyoneCanJoin": { - "type": "String", - "placeholders": {} - }, - "alwaysUse24HourFormat": "πραγματικά Χρησιμοποιήστε 24ωρη μορφή", - "@alwaysUse24HourFormat": { - "type": "String", - "placeholders": {} - }, - "setCustomPermissionLevel": "Ορίστε προσαρμοσμένο επίπεδο άδειας", - "@setCustomPermissionLevel": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevelDescription": "Παρακαλώ επιλέξτε έναν προκαθορισμένο ρόλο παρακάτω ή εισάγετε ένα προσαρμοσμένο επίπεδο άδειας μεταξύ 0 και 100.", - "@setPermissionsLevelDescription": { - "type": "String", - "placeholders": {} - }, - "ignoreUser": "Αγνόηση χρήστη", - "@ignoreUser": { - "type": "String", - "placeholders": {} - }, - "normalUser": "Κανονικός χρήστης", - "@normalUser": { - "type": "String", - "placeholders": {} - }, - "aboutHomeserver": "Σχετικά με {homeserver}", - "@aboutHomeserver": { - "type": "String", - "placeholders": { - "homeserver": { - "type": "String" - } - } - }, - "commandHint_roomupgrade": "Αναβαθμίστε αυτό το δωμάτιο στην εκδοχή δωματίου που δίνεται", - "@commandHint_roomupgrade": { - "type": "String", - "placeholders": {} - }, - "appLockDescription": "Κλειδώστε την εφαρμογή όταν δεν τη χρησιμοποιείτε με κωδικό PIN", - "@appLockDescription": { - "type": "String", - "placeholders": {} - }, - "swipeRightToLeftToReply": "Σύρετε δεξιά προς τα αριστερά για απάντηση", - "@swipeRightToLeftToReply": { - "type": "String", - "placeholders": {} - }, - "countChatsAndCountParticipants": "{chats} συνομιλίες και {participants} συμμετέχοντες", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, - "noMoreChatsFound": "Δεν βρέθηκαν άλλες συνομιλίες...", - "@noMoreChatsFound": { - "type": "String", - "placeholders": {} - }, - "noChatsFoundHere": "Δεν βρέθηκαν συνομιλίες εδώ ακόμα. Ξεκινήστε μια νέα συνομιλία με κάποιον χρησιμοποιώντας το κουμπί παρακάτω. ⤵️", - "@noChatsFoundHere": { - "type": "String", - "placeholders": {} - }, - "unread": "Ανεγνωσμένα", - "@unread": { - "type": "String", - "placeholders": {} - }, - "space": "Χώρος", - "@space": { - "type": "String", - "placeholders": {} - }, - "spaces": "Χώροι", - "@spaces": { - "type": "String", - "placeholders": {} - }, - "changeDeviceName": "Αλλάξτε το όνομα της συσκευής", - "@changeDeviceName": { - "type": "String", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} άλλαξε το avatar της συνομιλίας", - "@changedTheChatAvatar": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheChatDescriptionTo": "{username} άλλαξε την περιγραφή της συνομιλίας σε: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "description": { - "type": "String" - } - } - }, - "changedTheChatNameTo": "{username} άλλαξε το όνομα της συνομιλίας σε: '{chatname}'", - "@changedTheChatNameTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "chatname": { - "type": "String" - } - } - }, - "changedTheChatPermissions": "{username} άλλαξε τα δικαιώματα συνομιλίας", - "@changedTheChatPermissions": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheDisplaynameTo": "{username} άλλαξε το όνομά του σε: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "displayname": { - "type": "String" - } - } - }, - "changedTheGuestAccessRules": "{username} άλλαξε τους κανόνες πρόσβασης επισκεπτών", - "@changedTheGuestAccessRules": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheGuestAccessRulesTo": "{username} άλλαξε τους κανόνες πρόσβασης επισκεπτών σε: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "rules": { - "type": "String" - } - } - }, - "changedTheHistoryVisibility": "{username} άλλαξε την ορατότητα ιστορικού", - "@changedTheHistoryVisibility": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheHistoryVisibilityTo": "{username} άλλαξε την ορατότητα ιστορικού σε: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "rules": { - "type": "String" - } - } - }, - "changedTheJoinRules": "{username} άλλαξε τους κανόνες συμμετοχής", - "@changedTheJoinRules": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheJoinRulesTo": "{username} άλλαξε τους κανόνες συμμετοχής σε: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "joinRules": { - "type": "String" - } - } - }, - "changedTheProfileAvatar": "Ο χρήστης {username} άλλαξε την εικόνα προφίλ του", - "@changedTheProfileAvatar": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changePassword": "Αλλαγή κωδικού πρόσβασης", - "@changePassword": { - "type": "String", - "placeholders": {} - }, - "changeTheme": "Άλλαξε το στυλ σου", - "@changeTheme": { - "type": "String", - "placeholders": {} - }, - "changeYourAvatar": "Αλλαγή εικόνας προφιλ", - "@changeYourAvatar": { - "type": "String", - "placeholders": {} - }, - "joinedChats": "Συνδεδεμένες συνομιλίες", - "@joinedChats": {}, - "chatBackup": "Αντίγραφο ασφαλείας συνομιλίας", - "chatDetails": "Λεπτομέρειες συνομιλίας", - "@chatDetails": { - "type": "String", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Η συνομιλία προστέθηκε στο δωμάτιο", - "@chatHasBeenAddedToThisSpace": {}, - "chats": "Συνομιλίες", - "@chats": { - "type": "String", - "placeholders": {} - }, - "chooseAStrongPassword": "Εισάγετε ένα δυνατό κωδικό πρόσβασης", - "@chooseAStrongPassword": { - "type": "String", - "placeholders": {} - }, - "close": "Κλείσιμο", - "@close": { - "type": "String", - "placeholders": {} - }, - "commandHint_ban": "Αποκλεισμός χρήστη από το δωμάτιο", - "@commandHint_ban": { - "type": "String", - "description": "Usage hint for the command /ban" - }, - "commandHint_clearcache": "Εκκαθάριση προσωρινής μνήμης", - "@commandHint_clearcache": { - "type": "String", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_invite": "Πρόσκληση αυτού του χρήστη στο δωμάτιο", - "@commandHint_invite": { - "type": "String", - "description": "Usage hint for the command /invite" - }, - "@showPassword": { - "type": "String", - "placeholders": {} - }, - "@darkTheme": { - "type": "String", - "placeholders": {} - }, - "@passphraseOrKey": { - "type": "String", - "placeholders": {} - }, - "@pleaseEnterYourPassword": { - "type": "String", - "placeholders": {} - }, - "@theyMatch": { - "type": "String", - "placeholders": {} - }, - "@connect": { - "type": "String", - "placeholders": {} - }, - "@jumpToLastReadMessage": { - "type": "String", - "placeholders": {} - }, - "@allRooms": { - "type": "String", - "placeholders": {} - }, - "@obtainingLocation": { - "type": "String", - "placeholders": {} - }, - "@widgetVideo": { - "type": "String", - "placeholders": {} - }, - "@dismiss": { - "type": "String", - "placeholders": {} - }, - "@unknownDevice": { - "type": "String", - "placeholders": {} - }, - "@emoteShortcode": { - "type": "String", - "placeholders": {} - }, - "@noEncryptionForPublicRooms": { - "type": "String", - "placeholders": {} - }, - "@reportErrorDescription": { - "type": "String", - "placeholders": {} - }, - "@directChats": { - "type": "String", - "placeholders": {} - }, - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, - "@inviteContactToGroup": { - "type": "String", - "placeholders": { - "groupName": { - "type": "String" - } - } - }, - "@addAccount": { - "type": "String", - "placeholders": {} - }, - "@configureChat": { - "type": "String", - "placeholders": {} - }, - "@reply": { - "type": "String", - "placeholders": {} - }, - "@currentlyActive": { - "type": "String", - "placeholders": {} - }, - "@removeYourAvatar": { - "type": "String", - "placeholders": {} - }, - "@unsupportedAndroidVersion": { - "type": "String", - "placeholders": {} - }, - "@device": { - "type": "String", - "placeholders": {} - }, - "@commandHint_html": { - "type": "String", - "description": "Usage hint for the command /html" - }, - "@widgetJitsi": { - "type": "String", - "placeholders": {} - }, - "@youAreNoLongerParticipatingInThisChat": { - "type": "String", - "placeholders": {} - }, - "@encryption": { - "type": "String", - "placeholders": {} - }, - "@messageType": { - "type": "String", - "placeholders": {} - }, - "@indexedDbErrorLong": { - "type": "String", - "placeholders": {} - }, - "@oneClientLoggedOut": { - "type": "String", - "placeholders": {} - }, - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "@unsupportedAndroidVersionLong": { - "type": "String", - "placeholders": {} - }, - "@kicked": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "@title": { - "description": "Title for the application", - "type": "String", - "placeholders": {} - }, - "@changeTheNameOfTheGroup": { - "type": "String", - "placeholders": {} - }, - "@verifySuccess": { - "type": "String", - "placeholders": {} - }, - "@sendFile": { - "type": "String", - "placeholders": {} - }, - "@newVerificationRequest": { - "type": "String", - "placeholders": {} - }, - "@startFirstChat": { - "type": "String", - "placeholders": {} - }, - "@callingAccount": { - "type": "String", - "placeholders": {} - }, - "@requestPermission": { - "type": "String", - "placeholders": {} - }, - "@sentAPicture": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@invited": { - "type": "String", - "placeholders": {} - }, - "@setColorTheme": { - "type": "String", - "placeholders": {} - }, - "@nextAccount": { - "type": "String", - "placeholders": {} - }, - "@commandHint_create": { - "type": "String", - "description": "Usage hint for the command /create" - }, - "@singlesignon": { - "type": "String", - "placeholders": {} - }, - "@warning": { - "type": "String", - "placeholders": {} - }, - "@password": { - "type": "String", - "placeholders": {} - }, - "@allSpaces": { - "type": "String", - "placeholders": {} - }, - "@editDisplayname": { - "type": "String", - "placeholders": {} - }, - "@user": { - "type": "String", - "placeholders": {} - }, - "@roomVersion": { - "type": "String", - "placeholders": {} - }, - "@sentAFile": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@videoCall": { - "type": "String", - "placeholders": {} - }, - "@youAcceptedTheInvitation": { - "type": "String", - "placeholders": {} - }, - "@noMatrixServer": { - "type": "String", - "placeholders": { - "server1": { - "type": "String" - }, - "server2": { - "type": "String" - } - } - }, - "@userAndOthersAreTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "@youInvitedBy": { - "placeholders": { - "user": { - "type": "String" + "hugContent": "{senderName} σε αγκαλιάζει", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "Στείλε μια αγκαλιά", + "@commandHint_cuddle": {}, + "admin": "Διαχειριστής", + "@admin": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "Αποκλεισμός Συσκευής", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "supposedMxid": "Αυτό θα πρέπει να είναι {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "banFromChat": "Αποκλεισμός από τη συνομιλία", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Για να μπορέσεις να υπογράψεις το άλλο άτομο, πληκτρολόγησε τη συνθηματική φράση ασφαλούς αποθήκευσης ή το κλειδί ανάκτησης.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "remove": "Αφαίρεση", + "@remove": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Επιτρέπεται στους επισκέπτες χρήστες να συμμετάσχουν", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "blocked": "Αποκλείστηκε", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Αποστολή με enter", + "@sendOnEnter": {}, + "answeredTheCall": "{senderName} απάντησε στην κλήση", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "alias": "ψευδώνυμο", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Όλα", + "@all": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Ο οικιακός διακομιστής υποστηρίζει τους τύπους σύνδεσης:\n{serverVersions}\nΑλλά αυτή η εφαρμογή υποστηρίζει μόνο:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "cantOpenUri": "Δεν μπορεί να ανοίξει το URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "importFromZipFile": "Εισαγωγή από αρχείο .zip", + "@importFromZipFile": {}, + "autoplayImages": "Αυτόματη αναπαραγωγή κινούμενων αυτοκόλλητων και emotes", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "repeatPassword": "Επανάληψη κωδικού πρόσβασης", + "@repeatPassword": {}, + "acceptedTheInvitation": "👍 {username} αποδέχτηκε την πρόσκληση", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banned": "Αποκλείστηκε", + "@banned": { + "type": "String", + "placeholders": {} + }, + "exportEmotePack": "Εξαγωγή πακέτου Emote ως .zip", + "@exportEmotePack": {}, + "account": "Λογαριασμός", + "@account": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Σίγουρα;", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "allChats": "Όλες οι συνομιλίες", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "badServerVersionsException": "Ο οικιακός διακομιστής υποστηρίζει τις εκδόσεις Spec:\n{serverVersions}\nΑλλά αυτή η εφαρμογή υποστηρίζει μόνο {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "addToSpace": "Προσθήκη στο χώρο", + "@addToSpace": {}, + "about": "Σχετικά", + "@about": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} ενεργοποίησε την κρυπτογράφηση από άκρο σε άκρο", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "googlyEyesContent": "{senderName} σού στέλνει αστεία μάτια", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "addChatDescription": "Πρόσθεσε μια περιγραφή συνομιλίας...", + "@addChatDescription": {}, + "cancel": "Ακύρωση", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "appLock": "Κλείδωμα εφαρμογής", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "sendTypingNotifications": "Αποστολή ειδοποιήσεων πληκτρολόγησης", + "@sendTypingNotifications": {}, + "importEmojis": "Εισαγωγή Emojis", + "@importEmojis": {}, + "confirmMatrixId": "Παρακαλούμε επιβεβαίωσε το Matrix ID σου για να διαγράψεις τον λογαριασμό σου.", + "@confirmMatrixId": {}, + "notAnImage": "Δεν είναι αρχείο εικόνας.", + "@notAnImage": {}, + "areYouSureYouWantToLogout": "Σίγουρα θες να αποσυνδεθείς;", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} απέκλεισε {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} σέ αγκαλιάζει", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "askVerificationRequest": "Αποδοχή αυτού του αιτήματος επαλήθευσης από {username};", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Προσθήκη email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "commandHint_hug": "Στείλτε μια αγκαλιά", + "@commandHint_hug": {}, + "replace": "Αντικατάσταση", + "@replace": {}, + "archive": "Αρχείο", + "@archive": { + "type": "String", + "placeholders": {} + }, + "accept": "Αποδοχή", + "@accept": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "Στείλε αστεία μάτια", + "@commandHint_googly": {}, + "botMessages": "Μηνύματα bot", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "importNow": "Εισαγωγή τώρα", + "@importNow": {}, + "anyoneCanJoin": "Οποιοσδήποτε μπορεί να συμμετάσχει", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "alwaysUse24HourFormat": "Ψευδής", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "setCustomPermissionLevel": "Όρισε προσαρμοσμένο επίπεδο άδειας", + "@setCustomPermissionLevel": {}, + "setPermissionsLevelDescription": "Επέλεξε έναν προκαθορισμένο ρόλο παρακάτω ή εισήγαγε ένα προσαρμοσμένο επίπεδο άδειας μεταξύ 0 και 100.", + "@setPermissionsLevelDescription": {}, + "ignoreUser": "Αγνόηση χρήστη", + "@ignoreUser": {}, + "normalUser": "Κανονικός χρήστης", + "@normalUser": {}, + "aboutHomeserver": "Σχετικά με {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "commandHint_roomupgrade": "Αναβάθμιση αυτού του δωματίου στην δεδομένη έκδοση δωματίου", + "@commandHint_roomupgrade": {}, + "appLockDescription": "Κλείδωμα εφαρμογής όταν δεν χρησιμοποιείται με κωδικό PIN", + "@appLockDescription": {}, + "swipeRightToLeftToReply": "Σύρσιμο δεξιά προς αριστερά για απάντηση", + "@swipeRightToLeftToReply": {}, + "countChatsAndCountParticipants": "{chats} συνομιλίες και {participants} συμμετέχοντες", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "Δεν βρέθηκαν άλλες συνομιλίες...", + "@noMoreChatsFound": {}, + "noChatsFoundHere": "Δεν υπάρχουν συνομιλίες ακόμα. Ξεκίνα μια νέα συνομιλία με κάποιον χρησιμοποιώντας το κουμπί παρακάτω. ⤵️", + "@noChatsFoundHere": {}, + "unread": "Μη αναγνωσμένα", + "@unread": {}, + "space": "Χώρος", + "@space": {}, + "spaces": "Χώροι", + "@spaces": {}, + "changeDeviceName": "Αλλαγή ονόματος συσκευής", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} άλλαξε το άβαταρ συνομιλίας", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} άλλαξε την περιγραφή συνομιλίας σε: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} άλλαξε το όνομα συνομιλίας σε: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} άλλαξε τα δικαιώματα συνομιλίας", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} άλλαξε το εμφανιζόμενο όνομά του σε: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} άλλαξε τους κανόνες πρόσβασης των επισκεπτών", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} άλλαξε τους κανόνες πρόσβασης των επισκεπτών σε: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} άλλαξε την ορατότητα ιστορικού", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} άλλαξε την ορατότητα ιστορικού σε: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} άλλαξε τους κανόνες συμμετοχής", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} άλλαξε τους κανόνες συμμετοχής σε: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "Ο χρήστης {username} άλλαξε την εικόνα προφίλ του", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Αλλαγή κωδικού πρόσβασης", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Άλλαξε το στυλ σου", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Αλλαγή εικόνας προφιλ", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "joinedChats": "Συνδεδεμένες συνομιλίες", + "@joinedChats": {}, + "chatBackup": "Αντίγραφο ασφαλείας συνομιλίας", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Λεπτομέρειες συνομιλίας", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Η συνομιλία προστέθηκε στο δωμάτιο", + "@chatHasBeenAddedToThisSpace": {}, + "chats": "Συνομιλίες", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Εισάγετε ένα δυνατό κωδικό πρόσβασης", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Κλείσιμο", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Αποκλεισμός χρήστη από το δωμάτιο", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Εκκαθάριση προσωρινής μνήμης", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_invite": "Πρόσκληση αυτού του χρήστη στο δωμάτιο", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@connect": { + "type": "String", + "placeholders": {} + }, + "@jumpToLastReadMessage": { + "type": "String", + "placeholders": {} + }, + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@widgetVideo": { + "type": "String", + "placeholders": {} + }, + "@dismiss": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@reportErrorDescription": { + "type": "String", + "placeholders": {} + }, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } } }, - "type": "String" - }, - "@userIsTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@openAppToReadMessages": { - "type": "String", - "placeholders": {} - }, - "@sentAVideo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@banUserDescription": { - "type": "String", - "placeholders": {} - }, - "@inviteContact": { - "type": "String", - "placeholders": {} - }, - "@widgetEtherpad": { - "type": "String", - "placeholders": {} - }, - "@waitingPartnerAcceptRequest": { - "type": "String", - "placeholders": {} - }, - "@writeAMessage": { - "type": "String", - "placeholders": {} - }, - "@id": { - "type": "String", - "placeholders": {} - }, - "@removeDevicesDescription": { - "type": "String", - "placeholders": {} - }, - "@countParticipants": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, - "@tryAgain": { - "type": "String", - "placeholders": {} - }, - "@youKickedAndBanned": { - "placeholders": { - "user": { - "type": "String" + "@addAccount": { + "type": "String", + "placeholders": {} + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@unsupportedAndroidVersion": { + "type": "String", + "placeholders": {} + }, + "@device": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@widgetJitsi": { + "type": "String", + "placeholders": {} + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@messageType": { + "type": "String", + "placeholders": {} + }, + "@indexedDbErrorLong": { + "type": "String", + "placeholders": {} + }, + "@oneClientLoggedOut": { + "type": "String", + "placeholders": {} + }, + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "@unsupportedAndroidVersionLong": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } } }, - "type": "String" - }, - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "@removeDevice": { - "type": "String", - "placeholders": {} - }, - "@unbanUserDescription": { - "type": "String", - "placeholders": {} - }, - "@userAndUserAreTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "username2": { - "type": "String" - } - } - }, - "@pleaseClickOnLink": { - "type": "String", - "placeholders": {} - }, - "@saveFile": { - "type": "String", - "placeholders": {} - }, - "@pickImage": { - "type": "String", - "placeholders": {} - }, - "@youRejectedTheInvitation": { - "type": "String", - "placeholders": {} - }, - "@otherCallingPermissions": { - "type": "String", - "placeholders": {} - }, - "@messagesStyle": { - "type": "String", - "placeholders": {} - }, - "@couldNotDecryptMessage": { - "type": "String", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "@invitedUsersOnly": { - "type": "String", - "placeholders": {} - }, - "@link": { - "type": "String", - "placeholders": {} - }, - "@widgetUrlError": { - "type": "String", - "placeholders": {} - }, - "@emailOrUsername": { - "type": "String", - "placeholders": {} - }, - "@newSpaceDescription": { - "type": "String", - "placeholders": {} - }, - "@chatDescription": { - "type": "String", - "placeholders": {} - }, - "@callingAccountDetails": { - "type": "String", - "placeholders": {} - }, - "@next": { - "type": "String", - "placeholders": {} - }, - "@pleaseFollowInstructionsOnWeb": { - "type": "String", - "placeholders": {} - }, - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "@editRoomAliases": { - "type": "String", - "placeholders": {} - }, - "@enterSpace": { - "type": "String", - "placeholders": {} - }, - "@encryptThisChat": { - "type": "String", - "placeholders": {} - }, - "@fileName": { - "type": "String", - "placeholders": {} - }, - "@unavailable": { - "type": "String", - "placeholders": {} - }, - "@previousAccount": { - "type": "String", - "placeholders": {} - }, - "@publicRooms": { - "type": "String", - "placeholders": {} - }, - "@fromTheInvitation": { - "type": "String", - "placeholders": {} - }, - "@sendMessages": { - "type": "String", - "placeholders": {} - }, - "@incorrectPassphraseOrKey": { - "type": "String", - "placeholders": {} - }, - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, - "@reopenChat": { - "type": "String", - "placeholders": {} - }, - "@pleaseEnterRecoveryKey": { - "type": "String", - "placeholders": {} - }, - "@create": { - "type": "String", - "placeholders": {} - }, - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "@no": { - "type": "String", - "placeholders": {} - }, - "@widgetNameError": { - "type": "String", - "placeholders": {} - }, - "@inoffensive": { - "type": "String", - "placeholders": {} - }, - "@unpin": { - "type": "String", - "placeholders": {} - }, - "@addToBundle": { - "type": "String", - "placeholders": {} - }, - "@reportMessage": { - "type": "String", - "placeholders": {} - }, - "@spaceIsPublic": { - "type": "String", - "placeholders": {} - }, - "@addWidget": { - "type": "String", - "placeholders": {} - }, - "@removeAllOtherDevices": { - "type": "String", - "placeholders": {} - }, - "@unblockDevice": { - "type": "String", - "placeholders": {} - }, - "@countFiles": { - "placeholders": { - "count": { - "type": "int" + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@startFirstChat": { + "type": "String", + "placeholders": {} + }, + "@callingAccount": { + "type": "String", + "placeholders": {} + }, + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } } }, - "type": "String" - }, - "@noKeyForThisMessage": { - "type": "String", - "placeholders": {} - }, - "@enableEncryptionWarning": { - "type": "String", - "placeholders": {} - }, - "@inviteText": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "link": { - "type": "String" - } - } - }, - "@shareLocation": { - "type": "String", - "placeholders": {} - }, - "@reason": { - "type": "String", - "placeholders": {} - }, - "@commandHint_markasgroup": { - "type": "String", - "placeholders": {} - }, - "@errorObtainingLocation": { - "type": "String", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "@hydrateTor": { - "type": "String", - "placeholders": {} - }, - "@pushNotificationsNotAvailable": { - "type": "String", - "placeholders": {} - }, - "@passwordRecovery": { - "type": "String", - "placeholders": {} - }, - "@storeInAppleKeyChain": { - "type": "String", - "placeholders": {} - }, - "@replaceRoomWithNewerVersion": { - "type": "String", - "placeholders": {} - }, - "@hydrate": { - "type": "String", - "placeholders": {} - }, - "@invalidServerName": { - "type": "String", - "placeholders": {} - }, - "@chatPermissions": { - "type": "String", - "placeholders": {} - }, - "@voiceMessage": { - "type": "String", - "placeholders": {} - }, - "@wipeChatBackup": { - "type": "String", - "placeholders": {} - }, - "@sender": { - "type": "String", - "placeholders": {} - }, - "@storeInAndroidKeystore": { - "type": "String", - "placeholders": {} - }, - "@hideRedactedEvents": { - "type": "String", - "placeholders": {} - }, - "@online": { - "type": "String", - "placeholders": {} - }, - "@signInWithPassword": { - "type": "String", - "placeholders": {} - }, - "@ignoredUsers": { - "type": "String", - "placeholders": {} - }, - "@lastActiveAgo": { - "type": "String", - "placeholders": { - "localizedTimeShort": { - "type": "String" - } - } - }, - "@weSentYouAnEmail": { - "type": "String", - "placeholders": {} - }, - "@offensive": { - "type": "String", - "placeholders": {} - }, - "@needPantalaimonWarning": { - "type": "String", - "placeholders": {} - }, - "@makeAdminDescription": { - "type": "String", - "placeholders": {} - }, - "@edit": { - "type": "String", - "placeholders": {} - }, - "@loadMore": { - "type": "String", - "placeholders": {} - }, - "@noEmotesFound": { - "type": "String", - "placeholders": {} - }, - "@synchronizingPleaseWait": { - "type": "String", - "placeholders": {} - }, - "@transferFromAnotherDevice": { - "type": "String", - "placeholders": {} - }, - "@passwordHasBeenChanged": { - "type": "String", - "placeholders": {} - }, - "@pushRules": { - "type": "String", - "placeholders": {} - }, - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, - "@loadingPleaseWait": { - "type": "String", - "placeholders": {} - }, - "@copy": { - "type": "String", - "placeholders": {} - }, - "@saveKeyManuallyDescription": { - "type": "String", - "placeholders": {} - }, - "@none": { - "type": "String", - "placeholders": {} - }, - "@editBundlesForAccount": { - "type": "String", - "placeholders": {} - }, - "@enableEncryption": { - "type": "String", - "placeholders": {} - }, - "@whyIsThisMessageEncrypted": { - "type": "String", - "placeholders": {} - }, - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, - "@rejectedTheInvitation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@setChatDescription": { - "type": "String", - "placeholders": {} - }, - "@userLeftTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@spaceName": { - "type": "String", - "placeholders": {} - }, - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, - "@or": { - "type": "String", - "placeholders": {} - }, - "@dehydrateWarning": { - "type": "String", - "placeholders": {} - }, - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "@noOtherDevicesFound": { - "type": "String", - "placeholders": {} - }, - "@whoIsAllowedToJoinThisGroup": { - "type": "String", - "placeholders": {} - }, - "@emptyChat": { - "type": "String", - "placeholders": {} - }, - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@storeSecurlyOnThisDevice": { - "type": "String", - "placeholders": {} - }, - "@yourChatBackupHasBeenSetUp": { - "type": "String", - "placeholders": {} - }, - "@chatBackup": { - "type": "String", - "placeholders": {} - }, - "@redactedBy": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@submit": { - "type": "String", - "placeholders": {} - }, - "@videoCallsBetaWarning": { - "type": "String", - "placeholders": {} - }, - "@unmuteChat": { - "type": "String", - "placeholders": {} - }, - "@createdTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@redactedAnEvent": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@compareEmojiMatch": { - "type": "String", - "placeholders": {} - }, - "@participant": { - "type": "String", - "placeholders": {} - }, - "@logInTo": { - "type": "String", - "placeholders": { - "homeserver": { - "type": "String" - } - } - }, - "@yes": { - "type": "String", - "placeholders": {} - }, - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "@username": { - "type": "String", - "placeholders": {} - }, - "@changedTheRoomAliases": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@fileIsTooBigForServer": { - "type": "String", - "placeholders": { - "max": { - "type": "String" - } - } - }, - "@homeserver": { - "type": "String", - "placeholders": {} - }, - "@help": { - "type": "String", - "placeholders": {} - }, - "@people": { - "type": "String", - "placeholders": {} - }, - "@leftTheChat": { - "type": "String", - "placeholders": {} - }, - "@verified": { - "type": "String", - "placeholders": {} - }, - "@setStatus": { - "type": "String", - "placeholders": {} - }, - "@groupWith": { - "type": "String", - "placeholders": { - "displayname": { - "type": "String" - } - } - }, - "@callingPermissions": { - "type": "String", - "placeholders": {} - }, - "@delete": { - "type": "String", - "placeholders": {} - }, - "@newMessageInFluffyChat": { - "type": "String", - "placeholders": {} - }, - "@readUpToHere": { - "type": "String", - "placeholders": {} - }, - "@start": { - "type": "String", - "placeholders": {} - }, - "@downloadFile": { - "type": "String", - "placeholders": {} - }, - "@deviceId": { - "type": "String", - "placeholders": {} - }, - "@register": { - "type": "String", - "placeholders": {} - }, - "@unlockOldMessages": { - "type": "String", - "placeholders": {} - }, - "@identity": { - "type": "String", - "placeholders": {} - }, - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "@ignore": { - "type": "String", - "placeholders": {} - }, - "@recording": { - "type": "String", - "placeholders": {} - }, - "@moderator": { - "type": "String", - "placeholders": {} - }, - "@optionalRedactReason": { - "type": "String", - "placeholders": {} - }, - "@waitingPartnerEmoji": { - "type": "String", - "placeholders": {} - }, - "@channelCorruptedDecryptError": { - "type": "String", - "placeholders": {} - }, - "@tryToSendAgain": { - "type": "String", - "placeholders": {} - }, - "@guestsCanJoin": { - "type": "String", - "placeholders": {} - }, - "@ok": { - "type": "String", - "placeholders": {} - }, - "@copyToClipboard": { - "type": "String", - "placeholders": {} - }, - "@dehydrate": { - "type": "String", - "placeholders": {} - }, - "@locationPermissionDeniedNotice": { - "type": "String", - "placeholders": {} - }, - "@send": { - "type": "String", - "placeholders": {} - }, - "@hasWithdrawnTheInvitationFor": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "@visibleForAllParticipants": { - "type": "String", - "placeholders": {} - }, - "@noRoomsFound": { - "type": "String", - "placeholders": {} - }, - "@sendAsText": { - "type": "String" - }, - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, - "@archiveRoomDescription": { - "type": "String", - "placeholders": {} - }, - "@sendSticker": { - "type": "String", - "placeholders": {} - }, - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "@commandInvalid": { - "type": "String" - }, - "@setAsCanonicalAlias": { - "type": "String", - "placeholders": {} - }, - "@whyDoYouWantToReportThis": { - "type": "String", - "placeholders": {} - }, - "@locationDisabledNotice": { - "type": "String", - "placeholders": {} - }, - "@placeCall": { - "type": "String", - "placeholders": {} - }, - "@removedBy": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@changedTheRoomInvitationLink": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@newChat": { - "type": "String", - "placeholders": {} - }, - "@notifications": { - "type": "String", - "placeholders": {} - }, - "@commandHint_plain": { - "type": "String", - "description": "Usage hint for the command /plain" - }, - "@emoteSettings": { - "type": "String", - "placeholders": {} - }, - "@experimentalVideoCalls": { - "type": "String", - "placeholders": {} - }, - "@openCamera": { - "type": "String", - "placeholders": {} - }, - "@pleaseEnterRecoveryKeyDescription": { - "type": "String", - "placeholders": {} - }, - "@guestsAreForbidden": { - "type": "String", - "placeholders": {} - }, - "@mention": { - "type": "String", - "placeholders": {} - }, - "@openInMaps": { - "type": "String", - "placeholders": {} - }, - "@withTheseAddressesRecoveryDescription": { - "type": "String", - "placeholders": {} - }, - "@inviteContactToGroupQuestion": { - "type": "String", - "placeholders": { - "contact": {}, - "groupName": {} - } - }, - "@emoteExists": { - "type": "String", - "placeholders": {} - }, - "@redactedByBecause": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "reason": { - "type": "String" - } - } - }, - "@isTyping": { - "type": "String", - "placeholders": {} - }, - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": { - "type": "String" + "@invited": { + "type": "String", + "placeholders": {} + }, + "@setColorTheme": { + "type": "String", + "placeholders": {} + }, + "@nextAccount": { + "type": "String", + "placeholders": {} + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@allSpaces": { + "type": "String", + "placeholders": {} + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@user": { + "type": "String", + "placeholders": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } } }, - "type": "String" - }, - "@chat": { - "type": "String", - "placeholders": {} - }, - "@group": { - "type": "String", - "placeholders": {} - }, - "@leave": { - "type": "String", - "placeholders": {} - }, - "@skip": { - "type": "String", - "placeholders": {} - }, - "@appearOnTopDetails": { - "type": "String", - "placeholders": {} - }, - "@roomHasBeenUpgraded": { - "type": "String", - "placeholders": {} - }, - "@enterRoom": { - "type": "String", - "placeholders": {} - }, - "@enableEmotesGlobally": { - "type": "String", - "placeholders": {} - }, - "@pleaseChooseAPasscode": { - "type": "String", - "placeholders": {} - }, - "@noPasswordRecoveryDescription": { - "type": "String", - "placeholders": {} - }, - "@reportUser": { - "type": "String", - "placeholders": {} - }, - "@sharedTheLocation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@commandHint_send": { - "type": "String", - "description": "Usage hint for the command /send" - }, - "@onlineKeyBackupEnabled": { - "type": "String", - "placeholders": {} - }, - "@unbannedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "@confirmEventUnpin": { - "type": "String", - "placeholders": {} - }, - "@youInvitedUser": { - "placeholders": { - "user": { - "type": "String" + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@youAcceptedTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } } }, - "type": "String" - }, - "@kickedAndBanned": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "@noConnectionToTheServer": { - "type": "String", - "placeholders": {} - }, - "@fileHasBeenSavedAt": { - "type": "String", - "placeholders": { - "path": { - "type": "String" - } - } - }, - "@license": { - "type": "String", - "placeholders": {} - }, - "@unbanFromChat": { - "type": "String", - "placeholders": {} - }, - "@commandMissing": { - "type": "String", - "placeholders": { - "command": { - "type": "String" + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } } }, - "description": "State that {command} is not a valid /command." - }, - "@redactMessageDescription": { - "type": "String", - "placeholders": {} - }, - "@rejoin": { - "type": "String", - "placeholders": {} - }, - "@recoveryKey": { - "type": "String", - "placeholders": {} - }, - "@redactMessage": { - "type": "String", - "placeholders": {} - }, - "@forward": { - "type": "String", - "placeholders": {} - }, - "@commandHint_discardsession": { - "type": "String", - "description": "Usage hint for the command /discardsession" - }, - "@invalidInput": { - "type": "String", - "placeholders": {} - }, - "@hideUnknownEvents": { - "type": "String", - "placeholders": {} - }, - "@dehydrateTorLong": { - "type": "String", - "placeholders": {} - }, - "@yourPublicKey": { - "type": "String", - "placeholders": {} - }, - "@tooManyRequestsWarning": { - "type": "String", - "placeholders": {} - }, - "@invitedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } }, - "targetName": { - "type": "String" - } - } - }, - "@kickFromChat": { - "type": "String", - "placeholders": {} - }, - "@commandHint_myroomnick": { - "type": "String", - "description": "Usage hint for the command /myroomnick" - }, - "@offline": { - "type": "String", - "placeholders": {} - }, - "@noPermission": { - "type": "String", - "placeholders": {} - }, - "@doNotShowAgain": { - "type": "String", - "placeholders": {} - }, - "@report": { - "type": "String", - "placeholders": {} - }, - "@status": { - "type": "String", - "placeholders": {} - }, - "@compareNumbersMatch": { - "type": "String", - "placeholders": {} - }, - "@groupIsPublic": { - "type": "String", - "placeholders": {} - }, - "@verifyStart": { - "type": "String", - "placeholders": {} - }, - "@memberChanges": { - "type": "String", - "placeholders": {} - }, - "@joinRoom": { - "type": "String", - "placeholders": {} - }, - "@unverified": { - "type": "String", - "placeholders": {} - }, - "@fluffychat": { - "type": "String", - "placeholders": {} - }, - "@howOffensiveIsThisContent": { - "type": "String", - "placeholders": {} - }, - "@serverRequiresEmail": { - "type": "String", - "placeholders": {} - }, - "@hideUnimportantStateEvents": { - "type": "String", - "placeholders": {} - }, - "@screenSharingTitle": { - "type": "String", - "placeholders": {} - }, - "@widgetCustom": { - "type": "String", - "placeholders": {} - }, - "@sentCallInformations": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "@addToSpaceDescription": { - "type": "String", - "placeholders": {} - }, - "@youBannedUser": { - "placeholders": { - "user": { - "type": "String" + "type": "String" + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } } }, - "type": "String" - }, - "@theyDontMatch": { - "type": "String", - "placeholders": {} - }, - "@youHaveBeenBannedFromThisChat": { - "type": "String", - "placeholders": {} - }, - "@displaynameHasBeenChanged": { - "type": "String", - "placeholders": {} - }, - "@sentAnAudio": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@editRoomAvatar": { - "type": "String", - "placeholders": {} - }, - "@encrypted": { - "type": "String", - "placeholders": {} - }, - "@commandHint_leave": { - "type": "String", - "description": "Usage hint for the command /leave" - }, - "@commandHint_myroomavatar": { - "type": "String", - "description": "Usage hint for the command /myroomavatar" - }, - "@hasKnocked": { - "placeholders": { - "user": { - "type": "String" + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } } }, - "type": "String" - }, - "@publish": { - "type": "String", - "placeholders": {} - }, - "@openLinkInBrowser": { - "type": "String", - "placeholders": {} - }, - "@clearArchive": { - "type": "String", - "placeholders": {} - }, - "@commandHint_react": { - "type": "String", - "description": "Usage hint for the command /react" - }, - "@commandHint_me": { - "type": "String", - "description": "Usage hint for the command /me" - }, - "@pleaseEnterYourUsername": { - "type": "String", - "placeholders": {} - }, - "@messageInfo": { - "type": "String", - "placeholders": {} - }, - "@disableEncryptionWarning": { - "type": "String", - "placeholders": {} - }, - "@directChat": { - "type": "String", - "placeholders": {} - }, - "@encryptionNotEnabled": { - "type": "String", - "placeholders": {} - }, - "@wrongPinEntered": { - "type": "String", - "placeholders": { - "seconds": { - "type": "int" - } - } - }, - "@lightTheme": { - "type": "String", - "placeholders": {} - }, - "@inviteGroupChat": { - "type": "String", - "placeholders": {} - }, - "@appearOnTop": { - "type": "String", - "placeholders": {} - }, - "@invitePrivateChat": { - "type": "String", - "placeholders": {} - }, - "@verifyTitle": { - "type": "String", - "placeholders": {} - }, - "@foregroundServiceRunning": { - "type": "String", - "placeholders": {} - }, - "@enterAnEmailAddress": { - "type": "String", - "placeholders": {} - }, - "@voiceCall": { - "type": "String", - "placeholders": {} - }, - "@commandHint_kick": { - "type": "String", - "description": "Usage hint for the command /kick" - }, - "@copiedToClipboard": { - "type": "String", - "placeholders": {} - }, - "@createNewSpace": { - "type": "String", - "placeholders": {} - }, - "@commandHint_unban": { - "type": "String", - "description": "Usage hint for the command /unban" - }, - "@unknownEncryptionAlgorithm": { - "type": "String", - "placeholders": {} - }, - "@confirm": { - "type": "String", - "placeholders": {} - }, - "@wasDirectChatDisplayName": { - "type": "String", - "placeholders": { - "oldDisplayName": { - "type": "String" - } - } - }, - "@noChatDescriptionYet": { - "type": "String", - "placeholders": {} - }, - "@defaultPermissionLevel": { - "type": "String", - "placeholders": {} - }, - "@removeFromBundle": { - "type": "String", - "placeholders": {} - }, - "@numUsersTyping": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@fontSize": { - "type": "String", - "placeholders": {} - }, - "@whoCanPerformWhichAction": { - "type": "String", - "placeholders": {} - }, - "@learnMore": { - "type": "String", - "placeholders": {} - }, - "@iHaveClickedOnLink": { - "type": "String", - "placeholders": {} - }, - "@you": { - "type": "String", - "placeholders": {} - }, - "@users": { - "type": "String", - "placeholders": {} - }, - "@openGallery": { - "type": "String", - "placeholders": {} - }, - "@chatDescriptionHasBeenChanged": { - "type": "String", - "placeholders": {} - }, - "@search": { - "type": "String", - "placeholders": {} - }, - "@newGroup": { - "type": "String", - "placeholders": {} - }, - "@bundleName": { - "type": "String", - "placeholders": {} - }, - "@dehydrateTor": { - "type": "String", - "placeholders": {} - }, - "@removeFromSpace": { - "type": "String", - "placeholders": {} - }, - "@dateAndTimeOfDay": { - "type": "String", - "placeholders": { - "date": { - "type": "String" - }, - "timeOfDay": { - "type": "String" - } - } - }, - "@commandHint_op": { - "type": "String", - "description": "Usage hint for the command /op" - }, - "@commandHint_join": { - "type": "String", - "description": "Usage hint for the command /join" - }, - "@sourceCode": { - "type": "String", - "placeholders": {} - }, - "@roomUpgradeDescription": { - "type": "String", - "placeholders": {} - }, - "@userSentUnknownEvent": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "type": { - "type": "String" - } - } - }, - "@scanQrCode": { - "type": "String", - "placeholders": {} - }, - "@logout": { - "type": "String", - "placeholders": {} - }, - "@pleaseEnterANumber": { - "type": "String", - "placeholders": {} - }, - "@contactHasBeenInvitedToTheGroup": { - "type": "String", - "placeholders": {} - }, - "@youKicked": { - "placeholders": { - "user": { - "type": "String" + "@banUserDescription": { + "type": "String", + "placeholders": {} + }, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@widgetEtherpad": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@id": { + "type": "String", + "placeholders": {} + }, + "@removeDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } } }, - "type": "String" - }, - "@profileNotFound": { - "type": "String", - "placeholders": {} - }, - "@jump": { - "type": "String", - "placeholders": {} - }, - "@groups": { - "type": "String", - "placeholders": {} - }, - "@reactedWith": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "@tryAgain": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } }, - "reaction": { - "type": "String" - } - } - }, - "@sorryThatsNotPossible": { - "type": "String", - "placeholders": {} - }, - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "@oopsSomethingWentWrong": { - "type": "String", - "placeholders": {} - }, - "@loadCountMoreParticipants": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@shareInviteLink": { - "type": "String", - "placeholders": {} - }, - "@commandHint_markasdm": { - "type": "String", - "placeholders": {} - }, - "@recoveryKeyLost": { - "type": "String", - "placeholders": {} - }, - "@containsUserName": { - "type": "String", - "placeholders": {} - }, - "@messages": { - "type": "String", - "placeholders": {} - }, - "@login": { - "type": "String", - "placeholders": {} - }, - "@deviceKeys": { - "type": "String", - "placeholders": {} - }, - "@waitingPartnerNumbers": { - "type": "String", - "placeholders": {} - }, - "@noGoogleServicesWarning": { - "type": "String", - "placeholders": {} - }, - "@everythingReady": { - "type": "String", - "placeholders": {} - }, - "@emoteKeyboardNoRecents": { - "type": "String", - "placeholders": {} - }, - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "@startedACall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "@emoteInvalid": { - "type": "String", - "placeholders": {} - }, - "@systemTheme": { - "type": "String", - "placeholders": {} - }, - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, - "@deleteMessage": { - "type": "String", - "placeholders": {} - }, - "@visibilityOfTheChatHistory": { - "type": "String", - "placeholders": {} - }, - "@settings": { - "type": "String", - "placeholders": {} - }, - "@setTheme": { - "type": "String", - "placeholders": {} - }, - "@changeTheHomeserver": { - "type": "String", - "placeholders": {} - }, - "@youJoinedTheChat": { - "type": "String", - "placeholders": {} - }, - "@wallpaper": { - "type": "String", - "placeholders": {} - }, - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "@play": { - "type": "String", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "@chatBackupDescription": { - "type": "String", - "placeholders": {} - }, - "@passwordForgotten": { - "type": "String", - "placeholders": {} - }, - "@statusExampleMessage": { - "type": "String", - "placeholders": {} - }, - "@security": { - "type": "String", - "placeholders": {} - }, - "@markAsRead": { - "type": "String", - "placeholders": {} - }, - "@sendAudio": { - "type": "String", - "placeholders": {} - }, - "@widgetName": { - "type": "String", - "placeholders": {} - }, - "@sentASticker": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@errorAddingWidget": { - "type": "String", - "placeholders": {} - }, - "@commandHint_dm": { - "type": "String", - "description": "Usage hint for the command /dm" - }, - "@reject": { - "type": "String", - "placeholders": {} - }, - "@extremeOffensive": { - "type": "String", - "placeholders": {} - }, - "@editBlockedServers": { - "type": "String", - "placeholders": {} - }, - "@oopsPushError": { - "type": "String", - "placeholders": {} - }, - "@youUnbannedUser": { - "placeholders": { - "user": { - "type": "String" + "type": "String" + }, + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } } }, - "type": "String" - }, - "@deactivateAccountWarning": { - "type": "String", - "placeholders": {} - }, - "@joinedTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "@unbanUserDescription": { + "type": "String", + "placeholders": {} + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } } - } - }, - "@visibleForEveryone": { - "type": "String", - "placeholders": {} - }, - "@pleaseEnter4Digits": { - "type": "String", - "placeholders": {} - }, - "@newSpace": { - "type": "String", - "placeholders": {} - }, - "@devices": { - "type": "String", - "placeholders": {} - }, - "@unknownEvent": { - "type": "String", - "placeholders": { - "type": { - "type": "String" + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "@youRejectedTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@otherCallingPermissions": { + "type": "String", + "placeholders": {} + }, + "@messagesStyle": { + "type": "String", + "placeholders": {} + }, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } } - } - }, - "@emojis": { - "type": "String", - "placeholders": {} - }, - "@pleaseEnterYourPin": { - "type": "String", - "placeholders": {} - }, - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, - "@share": { - "type": "String", - "placeholders": {} - }, - "@pleaseTryAgainLaterOrChooseDifferentServer": { - "type": "String", - "placeholders": {} - }, - "@createGroup": { - "type": "String", - "placeholders": {} - }, - "@privacy": { - "type": "String", - "placeholders": {} - }, - "@sendImage": { - "type": "String", - "placeholders": {} - }, - "@hydrateTorLong": { - "type": "String", - "placeholders": {} - }, - "@time": { - "type": "String", - "placeholders": {} - }, - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, - "@contentHasBeenReported": { - "type": "String", - "placeholders": {} - }, - "@custom": { - "type": "String", - "placeholders": {} - }, - "@noBackupWarning": { - "type": "String", - "placeholders": {} - }, - "@fromJoining": { - "type": "String", - "placeholders": {} - }, - "@verify": { - "type": "String", - "placeholders": {} - }, - "@sendVideo": { - "type": "String", - "placeholders": {} - }, - "@storeInSecureStorageDescription": { - "type": "String", - "placeholders": {} - }, - "@openChat": { - "type": "String", - "placeholders": {} - }, - "@kickUserDescription": { - "type": "String", - "placeholders": {} - }, - "@sendAMessage": { - "type": "String", - "placeholders": {} - }, - "@pin": { - "type": "String", - "placeholders": {} - }, - "@deleteAccount": { - "type": "String", - "placeholders": {} - }, - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "@pinMessage": { - "type": "String", - "placeholders": {} - }, - "@screenSharingDetail": { - "type": "String", - "placeholders": {} - }, - "@muteChat": { - "type": "String", - "placeholders": {} - }, - "@invite": { - "type": "String", - "placeholders": {} - }, - "@enableMultiAccounts": { - "type": "String", - "placeholders": {} - }, - "@emotePacks": { - "type": "String", - "placeholders": {} - }, - "@indexedDbErrorTitle": { - "type": "String", - "placeholders": {} - }, - "@endedTheCall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@link": { + "type": "String", + "placeholders": {} + }, + "@widgetUrlError": { + "type": "String", + "placeholders": {} + }, + "@emailOrUsername": { + "type": "String", + "placeholders": {} + }, + "@newSpaceDescription": { + "type": "String", + "placeholders": {} + }, + "@chatDescription": { + "type": "String", + "placeholders": {} + }, + "@callingAccountDetails": { + "type": "String", + "placeholders": {} + }, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } } - } - }, - "changedTheRoomAliases": "{username} άλλαξε τα ψευδώνυμα του δωματίου", - "changedTheRoomInvitationLink": "{username} άλλαξε τον σύνδεσμο πρόσκλησης", - "changeTheHomeserver": "Αλλαγή του διακομιστή σπιτιού", - "changeTheNameOfTheGroup": "Αλλαγή ονόματος ομάδας", - "channelCorruptedDecryptError": "Ο κρυπτογραφημένος κώδικας έχει καταστραφεί", - "chat": "Συνομιλία", - "yourChatBackupHasBeenSetUp": "Η δημιουργία αντιγράφων ασφαλείας της συνομιλίας σας έχει ρυθμιστεί.", - "chatBackupDescription": "Τα παλιά σας μηνύματα είναι ασφαλή με ένα κλειδί ανάκτησης. Παρακαλώ βεβαιωθείτε ότι δεν το χάνετε.", - "clearArchive": "Διαγραφή αρχείου", - "commandHint_markasdm": "Σημειώστε ως άμεσο μήνυμα για το δοσμένο ID του Matrix", - "commandHint_markasgroup": "Σημειώστε ως ομάδα", - "commandHint_create": "Δημιουργήστε μια κενή ομαδική συνομιλία\nΧρησιμοποιήστε --no-encryption για να απενεργοποιήσετε την κρυπτογράφηση", - "commandHint_discardsession": "Απορρίψτε τη συνεδρία", - "commandHint_dm": "Ξεκινήστε μια άμεση συνομιλία\nΧρησιμοποιήστε --no-encryption για να απενεργοποιήσετε την κρυπτογράφηση", - "commandHint_html": "Αποστείλετε κείμενο μορφοποιημένο σε HTML", - "commandHint_join": "Ενταχθείτε στο δοσμένο δωμάτιο", - "commandHint_kick": "Αφαιρέστε τον δοσμένο χρήστη από αυτό το δωμάτιο", - "commandHint_leave": "Αφήστε αυτό το δωμάτιο", - "commandHint_me": "Περιγράψτε τον εαυτό σας", - "commandHint_myroomavatar": "Ορίστε τη φωτογραφία σας για αυτό το δωμάτιο (με mxc-uri)", - "commandHint_myroomnick": "Ορίστε το όνομα εμφάνισης για αυτό το δωμάτιο", - "commandHint_op": "Ορίστε το επίπεδο ισχύος του χρήστη (προεπιλογή: 50)", - "commandHint_plain": "Αποστολή κειμένου χωρίς μορφοποίηση", - "commandHint_react": "Αποστολή απάντησης ως αντίδραση", - "commandHint_send": "Αποστολή κειμένου", - "commandHint_unban": "Άρση αποκλεισμού του χρήστη από αυτό το δωμάτιο", - "commandInvalid": "Μη έγκυρη εντολή", - "commandMissing": "{command} δεν είναι εντολή.", - "compareEmojiMatch": "Παρακαλώ συγκρίνετε τα emojis", - "compareNumbersMatch": "Παρακαλώ συγκρίνετε τους αριθμούς", - "configureChat": "Ρύθμιση συνομιλίας", - "confirm": "Επιβεβαίωση", - "connect": "Σύνδεση", - "contactHasBeenInvitedToTheGroup": "Ο επαφή έχει προσκληθεί στην ομάδα", - "containsDisplayName": "Περιέχει όνομα εμφάνισης", - "containsUserName": "Περιέχει όνομα χρήστη", - "contentHasBeenReported": "Το περιεχόμενο έχει αναφερθεί στους διαχειριστές του διακομιστή", - "copiedToClipboard": "Αντιγράφηκε στο πρόχειρο", - "copy": "Αντιγραφή", - "copyToClipboard": "Αντιγραφή στο πρόχειρο", - "couldNotDecryptMessage": "Αδύνατη η αποκρυπτογράφηση μηνύματος: {error}", - "checkList": "Λίστα ελέγχου", - "countParticipants": "{count} συμμετέχοντες", - "countInvited": "{count} προσκεκλημένοι", - "create": "Δημιουργία", - "createdTheChat": "💬 {username} δημιούργησε τη συνομιλία", - "createGroup": "Δημιουργία ομάδας", - "createNewSpace": "Νέος χώρος", - "currentlyActive": "Ενεργό αυτήν τη στιγμή", - "darkTheme": "Σκοτεινό", - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "dateWithoutYear": "{month}-{day}", - "dateWithYear": "{year}-{month}-{day}", - "deactivateAccountWarning": "Αυτό θα απενεργοποιήσει τον λογαριασμό σας. Δεν μπορεί να αναιρεθεί! Είστε σίγουροι;", - "defaultPermissionLevel": "Προεπιλεγμένο επίπεδο δικαιωμάτων για νέους χρήστες", - "delete": "Διαγραφή", - "deleteAccount": "Διαγραφή λογαριασμού", - "deleteMessage": "Διαγραφή μηνύματος", - "device": "Συσκευή", - "deviceId": "Ταυτότητα συσκευής", - "devices": "Συσκευές", - "directChats": "Άμεσα μηνύματα", - "allRooms": "Όλες οι ομαδικές συνομιλίες", - "displaynameHasBeenChanged": "Το όνομα εμφανιζόμενου έχει αλλάξει", - "downloadFile": "Λήψη αρχείου", - "edit": "Επεξεργασία", - "editBlockedServers": "Επεξεργασία αποκλεισμένων διακομιστών", - "chatPermissions": "Άδειες συνομιλίας", - "editDisplayname": "Επεξεργασία ονόματος εμφανιζόμενου", - "editRoomAliases": "Επεξεργασία ψευδωνύμων δωματίου", - "editRoomAvatar": "Επεξεργασία εικόνας δωματίου", - "emoteExists": "Το emoji ήδη υπάρχει!", - "emoteInvalid": "Μη έγκυρος κωδικός emoji!", - "emoteKeyboardNoRecents": "Πρόσφατα χρησιμοποιημένα emoji θα εμφανίζονται εδώ...", - "emotePacks": "Πακέτα emoji για το δωμάτιο", - "emoteSettings": "Ρυθμίσεις emoji", - "globalChatId": "Παγκόσμιο ID συνομιλίας", - "accessAndVisibility": "Πρόσβαση και ορατότητα", - "accessAndVisibilityDescription": "Ποιος επιτρέπεται να συμμετάσχει σε αυτήν τη συνομιλία και πώς μπορεί να βρεθεί η συνομιλία.", - "calls": "Κλήσεις", - "customEmojisAndStickers": "Προσαρμοσμένα emojis και αυτοκόλλητα", - "customEmojisAndStickersBody": "Προσθέστε ή μοιραστείτε προσαρμοσμένα emojis ή αυτοκόλλητα που μπορούν να χρησιμοποιηθούν σε οποιαδήποτε συνομιλία.", - "emoteShortcode": "Κωδικός σύντομου emoji", - "emoteWarnNeedToPick": "Πρέπει να επιλέξετε έναν κωδικό emoji και μια εικόνα!", - "emptyChat": "Άδειο chat", - "enableEmotesGlobally": "Ενεργοποίηση πακέτου emoji σε όλο το σύστημα", - "enableEncryption": "Ενεργοποίηση κρυπτογράφησης", - "enableEncryptionWarning": "Δεν θα μπορείτε πλέον να απενεργοποιήσετε την κρυπτογράφηση. Είστε σίγουροι;", - "encrypted": "Κρυπτογραφημένο", - "encryption": "Κρυπτογράφηση", - "encryptionNotEnabled": "Η κρυπτογράφηση δεν είναι ενεργοποιημένη", - "endedTheCall": "{senderName} τερμάτισε την κλήση", - "enterAnEmailAddress": "Εισάγετε μια διεύθυνση email", - "homeserver": "Homeserver", - "enterYourHomeserver": "Εισάγετε το homeserver σας", - "errorObtainingLocation": "Σφάλμα κατά την απόκτηση τοποθεσίας: {error}", - "everythingReady": "Όλα έτοιμα!", - "extremeOffensive": "Απολύτως προσβλητικό", - "fileName": "Όνομα αρχείου", - "fluffychat": "FluffyChat", - "fontSize": "Μέγεθος γραμματοσειράς", - "forward": "Προώθηση", - "fromJoining": "Από την ένταξη", - "fromTheInvitation": "Από την πρόσκληση", - "goToTheNewRoom": "Μεταβείτε στο νέο δωμάτιο", - "group": "Ομάδα", - "chatDescription": "Περιγραφή συνομιλίας", - "chatDescriptionHasBeenChanged": "Η περιγραφή της συνομιλίας άλλαξε", - "groupIsPublic": "Η ομάδα είναι δημόσια", - "groups": "Ομάδες", - "groupWith": "Ομάδα με {displayname}", - "guestsAreForbidden": "Οι επισκέπτες απαγορεύονται", - "guestsCanJoin": "Οι επισκέπτες μπορούν να συμμετάσχουν", - "hasWithdrawnTheInvitationFor": "{username} έχει αποσύρει την πρόσκληση για {targetName}", - "help": "Βοήθεια", - "hideRedactedEvents": "Απόκρυψη επεξεργασμένων γεγονότων", - "hideRedactedMessages": "Απόκρυψη επεξεργασμένων μηνυμάτων", - "hideRedactedMessagesBody": "Αν κάποιος επεξεργαστεί ένα μήνυμα, αυτό το μήνυμα δεν θα είναι πλέον ορατό στη συνομιλία.", - "hideInvalidOrUnknownMessageFormats": "Απόκρυψη μη έγκυρων ή άγνωστων μορφών μηνυμάτων", - "howOffensiveIsThisContent": "Πόσο προσβλητικό είναι αυτό το περιεχόμενο;", - "id": "ID", - "identity": "Ταυτότητα", - "block": "Αποκλεισμός", - "blockedUsers": "Αποκλεισμένοι χρήστες", - "blockListDescription": "Μπορείτε να αποκλείσετε χρήστες που σας ενοχλούν. Δεν θα μπορείτε να λαμβάνετε μηνύματα ή προσκλήσεις δωματίου από τους χρήστες στη λίστα αποκλεισμού σας.", - "blockUsername": "Αγνόηση ονόματος χρήστη", - "iHaveClickedOnLink": "Έχω κάνει κλικ στον σύνδεσμο", - "incorrectPassphraseOrKey": "Λάθος φράση πρόσβασης ή κλειδί ανάκτησης", - "inoffensive": "Ακίνδυνο", - "inviteContact": "Πρόσκληση επαφής", - "inviteContactToGroupQuestion": "Θέλετε να προσκαλέσετε τον {contact} στη συνομιλία \"{groupName}\";", - "inviteContactToGroup": "Πρόσκληση επαφής στο {groupName}", - "noChatDescriptionYet": "Δεν έχει δημιουργηθεί ακόμη περιγραφή συνομιλίας.", - "tryAgain": "Δοκιμάστε ξανά", - "invalidServerName": "Μη έγκυρο όνομα διακομιστή", - "invited": "Προσκαλέστηκε", - "redactMessageDescription": "Το μήνυμα θα διαγραφεί για όλους τους συμμετέχοντες σε αυτή τη συνομιλία. Αυτό δεν μπορεί να αναιρεθεί.", - "optionalRedactReason": "(Προαιρετικό) Λόγος διαγραφής αυτού του μηνύματος...", - "invitedUser": "📩 {username} προσκάλεσε {targetName}", - "invitedUsersOnly": "Μόνο για προσκεκλημένους χρήστες", - "inviteForMe": "Πρόσκληση για μένα", - "inviteText": "{username} σε κάλεσε στο FluffyChat.\n1. Επισκεφθείτε το fluffychat.im και εγκαταστήστε την εφαρμογή \n2. Εγγραφείτε ή συνδεθείτε \n3. Ανοίξτε τον σύνδεσμο πρόσκλησης: \n {link}", - "isTyping": "γράφει…", - "joinedTheChat": "👋 {username} μπήκε στη συζήτηση", - "joinRoom": "Ενταχθείτε στο δωμάτιο", - "kicked": "👞 {username} έδιωξε τον/την {targetName}", - "kickedAndBanned": "🙅 {username} έδιωξε και απαγόρευσε τον/την {targetName}", - "kickFromChat": "Απομάκρυνση από τη συζήτηση", - "lastActiveAgo": "Τελευταία δραστηριότητα: {localizedTimeShort}", - "leave": "Αποχώρηση", - "leftTheChat": "Έφυγε από τη συζήτηση", - "license": "Άδεια", - "lightTheme": "Φωτεινό", - "loadCountMoreParticipants": "Φόρτωση {count} επιπλέον συμμετεχόντων", - "dehydrate": "Εξαγωγή συνεδρίας και διαγραφή συσκευής", - "dehydrateWarning": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Βεβαιωθείτε ότι αποθηκεύετε με ασφάλεια το αρχείο αντιγράφου ασφαλείας.", - "dehydrateTor": "Χρήστες TOR: Εξαγωγή συνεδρίας", - "dehydrateTorLong": "Για χρήστες TOR, συνιστάται να εξάγετε τη συνεδρία πριν κλείσετε το παράθυρο.", - "hydrateTor": "Χρήστες TOR: Εισαγωγή εξαγωγής συνεδρίας", - "hydrateTorLong": "Έχετε εξάγει την συνεδρία σας τελευταία φορά στο TOR; Εισάγετέ το γρήγορα και συνεχίστε τη συνομιλία.", - "hydrate": "Ανάκτηση από αρχείο δημιουργίας αντιγράφων ασφαλείας", - "loadingPleaseWait": "Φόρτωση… Παρακαλώ περιμένετε.", - "loadMore": "Φόρτωση περισσότερων…", - "locationDisabledNotice": "Οι υπηρεσίες τοποθεσίας είναι απενεργοποιημένες. Παρακαλώ ενεργοποιήστε τες για να μπορείτε να μοιραστείτε την τοποθεσία σας.", - "locationPermissionDeniedNotice": "Η άδεια τοποθεσίας απορρίφθηκε. Παρακαλώ δώστε την για να μπορείτε να μοιραστείτε την τοποθεσία σας.", - "login": "Σύνδεση", - "logInTo": "Συνδεθείτε στο {homeserver}", - "logout": "Αποσύνδεση", - "memberChanges": "Αλλαγές μελών", - "mention": "Αναφορά", - "messages": "Μηνύματα", - "messagesStyle": "Μηνύματα:", - "moderator": "Διαχειριστής", - "muteChat": "Αθόρυβη συνομιλία", - "needPantalaimonWarning": "Παρακαλώ να γνωρίζετε ότι χρειάζεστε το Pantalaimon για να χρησιμοποιήσετε κρυπτογράφηση άκρο-σε-άκρο προς το παρόν.", - "newChat": "Νέα συνομιλία", - "newMessageInFluffyChat": "🗨️ Νέο μήνυμα στο FluffyChat", - "newVerificationRequest": "Νέο αίτημα επαλήθευσης!", - "next": "Επόμενο", - "no": "Όχι", - "noConnectionToTheServer": "Δεν υπάρχει σύνδεση με τον διακομιστή", - "noEmotesFound": "Δεν βρέθηκαν εμοτέ. 😝", - "noEncryptionForPublicRooms": "Μπορείτε να ενεργοποιήσετε την κρυπτογράφηση μόνο όταν το δωμάτιο δεν είναι πλέον δημόσια προσβάσιμο.", - "noGoogleServicesWarning": "Το Firebase Cloud Messaging δεν φαίνεται να είναι διαθέσιμο στη συσκευή σας. Για να λαμβάνετε ακόμα ειδοποιήσεις push, προτείνουμε την εγκατάσταση του ntfy. Με το ntfy ή έναν άλλο πάροχο Unified Push μπορείτε να λαμβάνετε ειδοποιήσεις push με ασφαλή τρόπο. Μπορείτε να κατεβάσετε το ntfy από το PlayStore ή από το F-Droid.", - "noMatrixServer": "{server1} δεν είναι διακομιστής matrix, να χρησιμοποιήσω το {server2} αντί αυτού;", - "shareInviteLink": "Μοιραστείτε τον σύνδεσμο πρόσκλησης", - "scanQrCode": "Σάρωση κωδικού QR", - "none": "Κανένα", - "noPasswordRecoveryDescription": "Δεν έχετε προσθέσει ακόμα τρόπο ανάκτησης του κωδικού πρόσβασής σας.", - "noPermission": "Χωρίς άδεια", - "noRoomsFound": "Δεν βρέθηκαν δωμάτια…", - "notifications": "Ειδοποιήσεις", - "notificationsEnabledForThisAccount": "Οι ειδοποιήσεις είναι ενεργοποιημένες για αυτόν τον λογαριασμό", - "numUsersTyping": "{count} χρήστες πληκτρολογούν…", - "obtainingLocation": "Λήψη τοποθεσίας…", - "offensive": "Προσβλητικό", - "offline": "Εκτός σύνδεσης", - "ok": "Εντάξει", - "online": "Σε σύνδεση", - "onlineKeyBackupEnabled": "Ενεργοποιήθηκε η online δημιουργία αντιγράφων ασφαλείας κλειδιών", - "oopsPushError": "Ωχ! Δυστυχώς, προέκυψε σφάλμα κατά την εγκατάσταση των ειδοποιήσεων push.", - "oopsSomethingWentWrong": "Ωχ, κάτι πήγε στραβά...", - "openAppToReadMessages": "Ανοίξτε την εφαρμογή για να διαβάσετε μηνύματα", - "openCamera": "Άνοιγμα κάμερας", - "openVideoCamera": "Άνοιγμα κάμερας για βίντεο", - "oneClientLoggedOut": "Ένας από τους πελάτες σας έχει αποσυνδεθεί", - "addAccount": "Προσθήκη λογαριασμού", - "editBundlesForAccount": "Επεξεργασία πακέτων για αυτόν τον λογαριασμό", - "addToBundle": "Προσθήκη στο πακέτο", - "removeFromBundle": "Αφαίρεση από αυτό το πακέτο", - "bundleName": "Όνομα πακέτου", - "enableMultiAccounts": "(BETA) Ενεργοποίηση πολλαπλών λογαριασμών σε αυτήν τη συσκευή", - "openInMaps": "Άνοιγμα στους χάρτες", - "link": "Σύνδεσμος", - "serverRequiresEmail": "Αυτός ο διακομιστής χρειάζεται να επικυρώσει τη διεύθυνση email σας για εγγραφή.", - "or": "Ή", - "participant": "Συμμετέχων", - "passphraseOrKey": "κωδικός πρόσβασης ή κλειδί ανάκτησης", - "password": "Κωδικός πρόσβασης", - "passwordForgotten": "Ξεχάσατε τον κωδικό πρόσβασης", - "passwordHasBeenChanged": "Ο κωδικός πρόσβασης έχει αλλάξει", - "hideMemberChangesInPublicChats": "Απόκρυψη αλλαγών μελών σε δημόσια chats", - "hideMemberChangesInPublicChatsBody": "Μην εμφανίζετε στο χρονολόγιο του chat αν κάποιος ενταχθεί ή φύγει από ένα δημόσιο chat για βελτίωση της αναγνωσιμότητας.", - "overview": "Επισκόπηση", - "notifyMeFor": "Ειδοποίησέ με για", - "passwordRecoverySettings": "Ρυθμίσεις ανάκτησης κωδικού πρόσβασης", - "passwordRecovery": "Ανάκτηση κωδικού πρόσβασης", - "people": "Άνθρωποι", - "pickImage": "Επιλέξτε μια εικόνα", - "pin": "Καρφίτσωμα", - "play": "Αναπαραγωγή {fileName}", - "pleaseChoose": "Παρακαλώ επιλέξτε", - "pleaseChooseAPasscode": "Παρακαλώ επιλέξτε έναν κωδικό πρόσβασης", - "pleaseClickOnLink": "Παρακαλώ κάντε κλικ στον σύνδεσμο στο email και συνεχίστε.", - "pleaseEnter4Digits": "Παρακαλώ εισάγετε 4 ψηφία ή αφήστε κενό για να απενεργοποιήσετε το κλείδωμα εφαρμογής.", - "pleaseEnterRecoveryKey": "Παρακαλώ εισάγετε το κλειδί ανάκτησης σας:", - "pleaseEnterYourPassword": "Παρακαλώ εισάγετε τον κωδικό πρόσβασής σας", - "pleaseEnterYourPin": "Παρακαλώ εισάγετε το PIN σας", - "pleaseEnterYourUsername": "Παρακαλώ εισάγετε το όνομα χρήστη σας", - "pleaseFollowInstructionsOnWeb": "Παρακαλούμε ακολουθήστε τις οδηγίες στην ιστοσελίδα και πατήστε επόμενο.", - "privacy": "Απόρρητο", - "publicRooms": "Δημόσιες αίθουσες", - "pushRules": "Κανόνες ειδοποιήσεων", - "reason": "Αιτία", - "recording": "Εγγραφή", - "redactedBy": "Επεξεργάστηκε από {username}", - "directChat": "Άμεσο μήνυμα", - "redactedByBecause": "Επεξεργάστηκε από {username} επειδή: \"{reason}\"", - "redactedAnEvent": "{username} επεξεργάστηκε ένα γεγονός", - "redactMessage": "Επεξεργασία μηνύματος", - "register": "Εγγραφή", - "reject": "Απόρριψη", - "rejectedTheInvitation": "{username} απέρριψε την πρόσκληση", - "rejoin": "Επανένταξη", - "removeAllOtherDevices": "Αφαίρεση όλων των άλλων συσκευών", - "removedBy": "Αφαιρέθηκε από {username}", - "removeDevice": "Αφαίρεση συσκευής", - "unbanFromChat": "Άρση αποκλεισμού από τη συνομιλία", - "removeYourAvatar": "Αφαίρεση του προφίλ σας", - "replaceRoomWithNewerVersion": "Αντικαταστήστε το δωμάτιο με νεότερη έκδοση", - "reply": "Απάντηση", - "reportMessage": "Αναφορά μηνύματος", - "requestPermission": "Αίτηση άδειας", - "roomHasBeenUpgraded": "Το δωμάτιο έχει αναβαθμιστεί", - "roomVersion": "Έκδοση δωματίου", - "saveFile": "Αποθήκευση αρχείου", - "search": "Αναζήτηση", - "security": "Ασφάλεια", - "recoveryKey": "Κλειδί ανάκτησης", - "recoveryKeyLost": "Έχετε χάσει το κλειδί ανάκτησης;", - "seenByUser": "Εμφανίστηκε από {username}", - "send": "Αποστολή", - "sendAMessage": "Αποστολή μηνύματος", - "sendAsText": "Αποστολή ως κείμενο", - "sendAudio": "Αποστολή ήχου", - "sendFile": "Αποστολή αρχείου", - "sendImage": "Αποστολή εικόνας", - "sendImages": "Αποστολή {count} εικόνας", - "sendMessages": "Αποστολή μηνυμάτων", - "sendOriginal": "Αποστολή πρωτότυπου", - "sendSticker": "Αποστολή αυτοκόλλητου", - "sendVideo": "Αποστολή βίντεο", - "sentAFile": "📁 {username} έστειλε ένα αρχείο", - "sentAnAudio": "🎤 {username} έστειλε έναν ήχο", - "sentAPicture": "🖼️ {username} έστειλε μια εικόνα", - "sentASticker": "😊 {username} έστειλε ένα αυτοκόλλητο", - "sentAVideo": "🎥 {username} έστειλε ένα βίντεο", - "sentCallInformations": "Ο {senderName} έστειλε πληροφορίες κλήσης", - "separateChatTypes": "Διαχωρισμός άμεσων μηνυμάτων και ομάδων", - "setAsCanonicalAlias": "Ορισμός ως κύριο ψευδώνυμο", - "setCustomEmotes": "Ορισμός προσαρμοσμένων εικονιδίων", - "setChatDescription": "Ορισμός περιγραφής συνομιλίας", - "setInvitationLink": "Ορισμός συνδέσμου πρόσκλησης", - "setPermissionsLevel": "Ορισμός επιπέδου δικαιωμάτων", - "setStatus": "Ορισμός κατάστασης", - "settings": "Ρυθμίσεις", - "share": "Κοινοποίηση", - "sharedTheLocation": "{username} κοινοποίησε την τοποθεσία του", - "shareLocation": "Κοινοποίηση τοποθεσίας", - "showPassword": "Εμφάνιση κωδικού πρόσβασης", - "presenceStyle": "Παρουσία:", - "presencesToggle": "Εμφάνιση μηνυμάτων κατάστασης από άλλους χρήστες", - "singlesignon": "Ενιαία σύνδεση", - "skip": "Παραλείπω", - "sourceCode": "Κώδικας πηγής", - "spaceIsPublic": "Ο χώρος είναι δημόσιος", - "spaceName": "Όνομα χώρου", - "startedACall": "{senderName} ξεκίνησε μια κλήση", - "startFirstChat": "Ξεκινήστε την πρώτη σας συνομιλία", - "status": "Κατάσταση", - "statusExampleMessage": "Πώς είστε σήμερα;", - "submit": "Υποβολή", - "synchronizingPleaseWait": "Συγχρονισμός… Παρακαλώ περιμένετε.", - "synchronizingPleaseWaitCounter": "Συγχρονισμός… ({percentage}%)", - "systemTheme": "Σύστημα", - "theyDontMatch": "Δεν ταιριάζουν", - "theyMatch": "Ταιριάζουν", - "title": "FluffyChat", - "toggleFavorite": "Εναλλαγή Αγαπημένου", - "toggleMuted": "Εναλλαγή σίγασης", - "toggleUnread": "Σήμανση ως διαβασμένο/μη διαβασμένο", - "tooManyRequestsWarning": "Πάρα πολλά αιτήματα. Παρακαλώ δοκιμάστε ξανά αργότερα!", - "transferFromAnotherDevice": "Μεταφορά από άλλη συσκευή", - "tryToSendAgain": "Προσπαθήστε ξανά να στείλετε", - "unavailable": "Μη διαθέσιμο", - "unbannedUser": "{username} άρπαξε τον αποκλεισμό του {targetName}", - "unblockDevice": "Ξεκλειδώστε τη συσκευή", - "unknownDevice": "Άγνωστη συσκευή", - "unknownEncryptionAlgorithm": "Άγνωστος αλγόριθμος κρυπτογράφησης", - "unknownEvent": "Άγνωστο γεγονός '{type}'", - "unmuteChat": "Αναίρεση σίγασης συνομιλίας", - "unpin": "Αφαίρεση από την κορυφή", - "unreadChats": "{unreadCount, plural, =1{1 μη αναγνωσμένο μήνυμα} other{{unreadCount} μη αναγνωσμένα μηνύματα}}", - "userAndOthersAreTyping": "{username} και {count} άλλοι πληκτρολογούν…", - "userAndUserAreTyping": "{username} και {username2} πληκτρολογούν…", - "userIsTyping": "{username} πληκτρολογεί…", - "userLeftTheChat": "🚪 {username} έφυγε από τη συνομιλία", - "username": "Όνομα χρήστη", - "userSentUnknownEvent": "{username} έστειλε ένα γεγονός {type}", - "unverified": "Μη επαληθευμένο", - "verified": "Επαληθευμένο", - "verify": "Επαλήθευση", - "verifyStart": "Ξεκινήστε την επαλήθευση", - "verifySuccess": "Επιτυχής επαλήθευση!", - "verifyTitle": "Επαλήθευση άλλου λογαριασμού", - "videoCall": "Βιντεοκλήση", - "visibilityOfTheChatHistory": "Ορατότητα του ιστορικού συνομιλίας", - "visibleForAllParticipants": "Ορατό για όλους τους συμμετέχοντες", - "visibleForEveryone": "Ορατό για όλους", - "voiceMessage": "Φωνητικό μήνυμα", - "waitingPartnerAcceptRequest": "Αναμονή για αποδοχή του αιτήματος από τον συνεργάτη…", - "waitingPartnerEmoji": "Αναμονή για αποδοχή του emoji από τον συνεργάτη…", - "waitingPartnerNumbers": "Αναμονή για αποδοχή των αριθμών από τον συνεργάτη…", - "wallpaper": "Φόντο:", - "warning": "Προειδοποίηση!", - "weSentYouAnEmail": "Σας στείλαμε ένα email", - "whoCanPerformWhichAction": "Ποιος μπορεί να εκτελέσει ποια ενέργεια", - "whoIsAllowedToJoinThisGroup": "Ποιος επιτρέπεται να συμμετάσχει σε αυτήν την ομάδα", - "whyDoYouWantToReportThis": "Γιατί θέλετε να αναφέρετε αυτό;", - "wipeChatBackup": "Διαγράψτε το αντίγραφο ασφαλείας της συνομιλίας σας για να δημιουργήσετε ένα νέο κλειδί ανάκτησης;", - "withTheseAddressesRecoveryDescription": "Με αυτές τις διευθύνσεις μπορείτε να ανακτήσετε τον κωδικό πρόσβασής σας.", - "writeAMessage": "Γράψτε ένα μήνυμα…", - "yes": "Ναι", - "you": "Εσύ", - "youAreNoLongerParticipatingInThisChat": "Δεν συμμετέχετε πλέον σε αυτήν τη συνομιλία", - "youHaveBeenBannedFromThisChat": "Έχετε αποκλειστεί από αυτήν τη συνομιλία", - "yourPublicKey": "Το δημόσιο κλειδί σας", - "messageInfo": "Πληροφορίες μηνύματος", - "time": "Χρόνος", - "messageType": "Τύπος μηνύματος", - "sender": "Αποστολέας", - "openGallery": "Άνοιγμα γκαλερί", - "removeFromSpace": "Αφαίρεση από τον χώρο", - "addToSpaceDescription": "Επιλέξτε έναν χώρο στον οποίο θα προσθέσετε αυτήν τη συνομιλία.", - "start": "Έναρξη", - "pleaseEnterRecoveryKeyDescription": "Για να ξεκλειδώσετε τα παλιά μηνύματά σας, εισάγετε το κλειδί ανάκτησης που δημιουργήθηκε σε προηγούμενη συνεδρία. Το κλειδί ανάκτησης ΔΕΝ είναι ο κωδικός πρόσβασής σας.", - "publish": "Δημοσίευση", - "videoWithSize": "Βίντεο ({size})", - "openChat": "Άνοιγμα συνομιλίας", - "markAsRead": "Σημείωσε ως διαβασμένο", - "reportUser": "Αναφορά χρήστη", - "dismiss": "Απόρριψη", - "reactedWith": "{sender} αντέδρασε με {reaction}", - "pinMessage": "Καρφίτσωσε στο δωμάτιο", - "confirmEventUnpin": "Είστε βέβαιοι ότι θέλετε να αποσυνδέσετε οριστικά το γεγονός;", - "emojis": "Εμοji", - "placeCall": "Κάντε κλήση", - "voiceCall": "Φωνητική κλήση", - "unsupportedAndroidVersion": "Μη υποστηριζόμενη έκδοση Android", - "unsupportedAndroidVersionLong": "Αυτή η λειτουργία απαιτεί νεότερη έκδοση Android. Παρακαλούμε ελέγξτε για ενημερώσεις ή υποστήριξη Lineage OS.", - "videoCallsBetaWarning": "Παρακαλούμε σημειώστε ότι οι βιντεοκλήσεις βρίσκονται επί του παρόντος σε beta. Μπορεί να μην λειτουργούν όπως αναμένεται ή καθόλου σε όλες τις πλατφόρμες.", - "experimentalVideoCalls": "Πειραματικές βιντεοκλήσεις", - "emailOrUsername": "Email ή όνομα χρήστη", - "indexedDbErrorTitle": "Προβλήματα ιδιωτικής λειτουργίας", - "indexedDbErrorLong": "Η αποθήκευση μηνυμάτων δυστυχώς δεν ενεργοποιείται από προεπιλογή σε ιδιωτική λειτουργία.\nΠαρακαλούμε επισκεφθείτε\n - about:config\n - ορίστε το dom.indexedDB.privateBrowsing.enabled σε true\nΑλλιώς, δεν είναι δυνατή η εκτέλεση του FluffyChat.", - "switchToAccount": "Μεταβείτε στον λογαριασμό {number}", - "nextAccount": "Επόμενος λογαριασμός", - "previousAccount": "Προηγούμενος λογαριασμός", - "addWidget": "Προσθήκη widget", - "widgetVideo": "Βίντεο", - "widgetEtherpad": "Κείμενο σημείωσης", - "widgetJitsi": "Jitsi Meet", - "widgetCustom": "Προσαρμοσμένο", - "widgetName": "Όνομα", - "widgetUrlError": "Αυτό δεν είναι έγκυρη διεύθυνση URL.", - "widgetNameError": "Παρακαλώ δώστε ένα όνομα εμφάνισης.", - "errorAddingWidget": "Σφάλμα κατά την προσθήκη του widget.", - "youRejectedTheInvitation": "Απορρίψατε την πρόσκληση", - "youJoinedTheChat": "Έχετε συμμετάσχει στη συνομιλία", - "youAcceptedTheInvitation": "👍 Έχετε αποδεχθεί την πρόσκληση", - "youBannedUser": "Αποκλείσατε τον {user}", - "youHaveWithdrawnTheInvitationFor": "Έχετε αποσύρει την πρόσκληση για τον {user}", - "youInvitedToBy": "📩 Έχετε προσκληθεί μέσω συνδέσμου στο:\n{alias}", - "youInvitedBy": "📩 Έχετε προσκληθεί από τον {user}", - "invitedBy": "📩 Προσκληθείς από τον {user}", - "youInvitedUser": "📩 Προσκαλέσατε τον {user}", - "youKicked": "👞 Απομακρύνατε τον {user}", - "youKickedAndBanned": "🙅‍♀️ Απομακρύνατε και αποκλείσατε τον {user}", - "youUnbannedUser": "Απελευθερώσατε τον {user}", - "hasKnocked": "🚪 {user} χτύπησε", - "usersMustKnock": "Οι χρήστες πρέπει να χτυπήσουν", - "noOneCanJoin": "Κανείς δεν μπορεί να συμμετάσχει", - "userWouldLikeToChangeTheChat": "{user} θα ήθελε να συμμετάσχει στη συζήτηση.", - "noPublicLinkHasBeenCreatedYet": "Δεν έχει δημιουργηθεί ακόμη δημόσιος σύνδεσμος", - "knock": "Χτύπημα", - "users": "Χρήστες", - "unlockOldMessages": "Ξεκλείδωμα παλαιών μηνυμάτων", - "storeInSecureStorageDescription": "Αποθηκεύστε το κλειδί ανάκαμψης στην ασφαλή αποθήκευση αυτής της συσκευής.", - "saveKeyManuallyDescription": "Αποθηκεύστε αυτό το κλειδί χειροκίνητα ενεργοποιώντας το διάλογο κοινής χρήσης συστήματος ή το πρόχειρο.", - "storeInAndroidKeystore": "Αποθήκευση στο Android KeyStore", - "storeInAppleKeyChain": "Αποθήκευση στο Apple KeyChain", - "storeSecurlyOnThisDevice": "Αποθήκευση με ασφάλεια σε αυτήν τη συσκευή", - "countFiles": "{count} αρχεία", - "user": "Χρήστης", - "custom": "Προσαρμοσμένο", - "foregroundServiceRunning": "Αυτή η ειδοποίηση εμφανίζεται όταν τρέχει η υπηρεσία μπροστά.", - "screenSharingTitle": "κοινή χρήση οθόνης", - "screenSharingDetail": "Μοιράζεστε την οθόνη σας στο FuffyChat", - "callingPermissions": "Άδειες κλήσης", - "callingAccount": "Λογαριασμός κλήσης", - "callingAccountDetails": "Επιτρέπει στο FluffyChat να χρησιμοποιεί την εγγενή εφαρμογή τηλεφωνητή Android.", - "appearOnTop": "Εμφάνιση στην κορυφή", - "appearOnTopDetails": "Επιτρέπει στην εφαρμογή να εμφανίζεται στην κορυφή (δεν χρειάζεται αν έχετε ήδη ρυθμίσει το FluffyChat ως λογαριασμό κλήσης)", - "otherCallingPermissions": "Άδειες μικροφώνου, κάμερας και άλλες άδειες του FluffyChat", - "whyIsThisMessageEncrypted": "Γιατί αυτό το μήνυμα είναι μη αναγνώσιμο;", - "noKeyForThisMessage": "Αυτό μπορεί να συμβεί αν το μήνυμα στάλθηκε πριν συνδεθείτε στον λογαριασμό σας σε αυτήν τη συσκευή.\n\nΕίναι επίσης πιθανό ο αποστολέας να έχει μπλοκάρει τη συσκευή σας ή να υπήρξε κάποιο πρόβλημα με τη σύνδεση στο διαδίκτυο.\n\nΜπορείτε να διαβάσετε το μήνυμα σε μια άλλη συνεδρία; Τότε μπορείτε να μεταφέρετε το μήνυμα από αυτήν! Μεταβείτε στις Ρυθμίσεις > Συσκευές και βεβαιωθείτε ότι οι συσκευές σας έχουν επαληθευτεί η μία την άλλη. Όταν ανοίξετε ξανά το δωμάτιο και και οι δύο συνεδρίες είναι στην μπροστινή γραμμή, τα κλειδιά θα μεταδοθούν αυτόματα.\n\nΔεν θέλετε να χάσετε τα κλειδιά κατά το αποσύνδεση ή την αλλαγή συσκευής; Βεβαιωθείτε ότι έχετε ενεργοποιήσει την εφεδρεία συνομιλίας στις ρυθμίσεις.", - "newGroup": "Νέα ομάδα", - "newSpace": "Νέος χώρος", - "enterSpace": "Εισέλθετε στον χώρο", - "enterRoom": "Εισέλθετε στο δωμάτιο", - "allSpaces": "Όλοι οι χώροι", - "numChats": "{number} συνομιλίες", - "hideUnimportantStateEvents": "Απόκρυψη άσχετων γεγονότων κατάστασης", - "hidePresences": "Απόκρυψη λίστας κατάστασης;", - "doNotShowAgain": "Μην το εμφανίζετε ξανά", - "wasDirectChatDisplayName": "Άδειο chat (ήταν {oldDisplayName})", - "newSpaceDescription": "Οι χώροι σας επιτρέπουν να ενοποιήσετε τις συνομιλίες σας και να δημιουργήσετε ιδιωτικές ή δημόσιες κοινότητες.", - "encryptThisChat": "Κρυπτογραφήστε αυτήν τη συνομιλία", - "disableEncryptionWarning": "Για λόγους ασφαλείας, δεν μπορείτε να απενεργοποιήσετε την κρυπτογράφηση σε μια συνομιλία όπου είχε ενεργοποιηθεί προηγουμένως.", - "sorryThatsNotPossible": "Λυπούμαστε... αυτό δεν είναι δυνατό", - "deviceKeys": "Κλειδιά συσκευής:", - "reopenChat": "Άνοιγμα ξανά συνομιλίας", - "noBackupWarning": "Προειδοποίηση! Χωρίς ενεργοποίηση αντιγράφου ασφαλείας συνομιλίας, θα χάσετε την πρόσβαση στα κρυπτογραφημένα μηνύματά σας. Συνιστάται ιδιαίτερα να ενεργοποιήσετε το αντίγραφο ασφαλείας πριν αποσυνδεθείτε.", - "noOtherDevicesFound": "Δεν βρέθηκαν άλλες συσκευές", - "fileIsTooBigForServer": "Αδύνατη η αποστολή! Ο διακομιστής υποστηρίζει μόνο συνημμένα έως {max}.", - "fileHasBeenSavedAt": "Το αρχείο έχει αποθηκευτεί στο {path}", - "jumpToLastReadMessage": "Μετάβαση στο τελευταίο διαβασμένο μήνυμα", - "readUpToHere": "Διάβασε μέχρι εδώ", - "jump": "Μετάβαση", - "openLinkInBrowser": "Άνοιγμα συνδέσμου στον περιηγητή", - "reportErrorDescription": "😞 Ωχ. Κάτι πήγε στραβά. Αν θέλετε, μπορείτε να αναφέρετε αυτό το σφάλμα στους προγραμματιστές.", - "report": "αναφορά", - "signInWithPassword": "Σύνδεση με κωδικό πρόσβασης", - "pleaseTryAgainLaterOrChooseDifferentServer": "Παρακαλώ δοκιμάστε ξανά αργότερα ή επιλέξτε διαφορετικό διακομιστή.", - "profileNotFound": "Ο χρήστης δεν βρέθηκε στον διακομιστή. Ίσως υπάρχει πρόβλημα σύνδεσης ή ο χρήστης δεν υπάρχει.", - "setTheme": "Ορίστε θέμα:", - "setColorTheme": "Ορίστε χρωματικό θέμα:", - "invite": "Πρόσκληση", - "inviteGroupChat": "📨 Πρόσκληση σε ομαδική συνομιλία", - "invitePrivateChat": "📨 Πρόσκληση σε ιδιωτική συνομιλία", - "invalidInput": "Μη έγκυρη εισαγωγή!", - "wrongPinEntered": "Λάθος PIN εισήχθη! Δοκιμάστε ξανά σε {seconds} δευτερόλεπτα...", - "pleaseEnterANumber": "Παρακαλώ εισάγετε έναν αριθμό μεγαλύτερο από το 0", - "archiveRoomDescription": "Η συνομιλία θα μετακινηθεί στο αρχείο. Άλλοι χρήστες θα μπορούν να δουν ότι έχετε φύγει από τη συνομιλία.", - "roomUpgradeDescription": "Η συνομιλία θα αναδημιουργηθεί με τη νέα έκδοση δωματίου. Όλοι οι συμμετέχοντες θα ειδοποιηθούν ότι πρέπει να μεταβούν στη νέα συνομιλία. Μπορείτε να μάθετε περισσότερα για τις εκδόσεις δωματίων στο https://spec.matrix.org/latest/rooms/", - "removeDevicesDescription": "Θα αποσυνδεθείτε από αυτήν τη συσκευή και δεν θα μπορείτε πλέον να λαμβάνετε μηνύματα.", - "banUserDescription": "Ο χρήστης θα αποκλειστεί από τη συνομιλία και δεν θα μπορεί να εισέλθει ξανά μέχρι να αφαιρεθεί ο αποκλεισμός.", - "unbanUserDescription": "Ο χρήστης θα μπορεί να εισέλθει ξανά στη συνομιλία αν προσπαθήσει.", - "kickUserDescription": "Ο χρήστης αποβάλλεται από τη συνομιλία αλλά δεν αποκλείεται. Στις δημόσιες συνομιλίες, ο χρήστης μπορεί να επανενταχθεί οποιαδήποτε στιγμή.", - "makeAdminDescription": "Αφού κάνετε αυτόν τον χρήστη διαχειριστή, ίσως να μην μπορείτε να αναιρέσετε αυτό, καθώς θα έχει τις ίδιες άδειες με εσάς.", - "pushNotificationsNotAvailable": "Οι ειδοποιήσεις push δεν είναι διαθέσιμες", - "learnMore": "Μάθετε περισσότερα", - "yourGlobalUserIdIs": "Το παγκόσμιο αναγνωριστικό χρήστη σας είναι: ", - "noUsersFoundWithQuery": "Δυστυχώς, δεν βρέθηκε χρήστης με την ερώτηση \"{query}\". Παρακαλώ ελέγξτε αν κάνατε τυπογραφικό λάθος.", - "knocking": "Χτυπάει", - "chatCanBeDiscoveredViaSearchOnServer": "Η συνομιλία μπορεί να βρεθεί μέσω της αναζήτησης στο {server}", - "searchChatsRooms": "Αναζήτηση για #συνομιλίες, @χρήστες...", - "nothingFound": "Δεν βρέθηκε τίποτα...", - "groupName": "Όνομα ομάδας", - "createGroupAndInviteUsers": "Δημιουργήστε μια ομάδα και προσκαλέστε χρήστες", - "groupCanBeFoundViaSearch": "Η ομάδα μπορεί να βρεθεί μέσω αναζήτησης", - "wrongRecoveryKey": "Λυπάμαι... αυτό δεν φαίνεται να είναι το σωστό κλειδί ανάκτησης.", - "startConversation": "Ξεκινήστε συνομιλία", - "commandHint_sendraw": "Αποστολή ακατέργαστου json", - "databaseMigrationTitle": "Η βάση δεδομένων είναι βελτιστοποιημένη", - "databaseMigrationBody": "Παρακαλώ περιμένετε. Αυτό μπορεί να διαρκέσει λίγα λεπτά.", - "leaveEmptyToClearStatus": "Αφήστε κενό για να διαγράψετε την κατάσταση σας.", - "select": "Επιλογή", - "searchForUsers": "Αναζήτηση για @χρήστες...", - "pleaseEnterYourCurrentPassword": "Παρακαλώ εισάγετε τον τρέχοντα κωδικό πρόσβασής σας", - "newPassword": "Νέος κωδικός πρόσβασης", - "pleaseChooseAStrongPassword": "Παρακαλώ επιλέξτε έναν ισχυρό κωδικό πρόσβασης", - "passwordsDoNotMatch": "Οι κωδικοί πρόσβασης δεν ταιριάζουν", - "passwordIsWrong": "Ο εισαγόμενος κωδικός πρόσβασης είναι λανθασμένος", - "publicLink": "Δημόσιος σύνδεσμος", - "publicChatAddresses": "Διευθύνσεις δημόσιων συνομιλιών", - "createNewAddress": "Δημιουργία νέας διεύθυνσης", - "joinSpace": "Συμμετοχή στον χώρο", - "publicSpaces": "Δημόσιοι χώροι", - "addChatOrSubSpace": "Προσθήκη συνομιλίας ή υποχώρου", - "subspace": "Υποχώρος", - "decline": "Απόρριψη", - "thisDevice": "Αυτή η συσκευή:", - "initAppError": "Παρουσιάστηκε σφάλμα κατά την αρχικοποίηση της εφαρμογής", - "userRole": "Ρόλος χρήστη", - "minimumPowerLevel": "{level} είναι το ελάχιστο επίπεδο ισχύος.", - "searchIn": "Αναζήτηση στη συνομιλία \"{chat}\"...", - "searchMore": "Αναζήτηση περισσότερο...", - "gallery": "Πινακοθήκη", - "files": "Αρχεία", - "databaseBuildErrorBody": "Αδυναμία δημιουργίας της βάσης δεδομένων SQLite. Η εφαρμογή προσπαθεί να χρησιμοποιήσει την παλαιά βάση δεδομένων προς το παρόν. Παρακαλούμε αναφέρετε αυτό το σφάλμα στους προγραμματιστές στο {url}. Το μήνυμα σφάλματος είναι: {error}", - "sessionLostBody": "Η συνεδρία σας χάθηκε. Παρακαλούμε αναφέρετε αυτό το σφάλμα στους προγραμματιστές στο {url}. Το μήνυμα σφάλματος είναι: {error}", - "restoreSessionBody": "Η εφαρμογή προσπαθεί τώρα να επαναφέρει τη συνεδρία σας από το αντίγραφο ασφαλείας. Παρακαλούμε αναφέρετε αυτό το σφάλμα στους προγραμματιστές στο {url}. Το μήνυμα σφάλματος είναι: {error}", - "forwardMessageTo": "Αποστολή μηνύματος στο {roomName}?", - "sendReadReceipts": "Αποστολή αποδείξεων ανάγνωσης", - "sendTypingNotificationsDescription": "Οι άλλοι συμμετέχοντες σε μια συνομιλία μπορούν να δουν πότε πληκτρολογείτε ένα νέο μήνυμα.", - "sendReadReceiptsDescription": "Οι άλλοι συμμετέχοντες σε μια συνομιλία μπορούν να δουν πότε έχετε διαβάσει ένα μήνυμα.", - "formattedMessages": "Μορφοποιημένα μηνύματα", - "formattedMessagesDescription": "Εμφάνιση πλούσιου περιεχομένου μηνυμάτων όπως έντονο κείμενο χρησιμοποιώντας markdown.", - "verifyOtherUser": "🔐 Επιβεβαίωση άλλου χρήστη", - "verifyOtherUserDescription": "Αν επιβεβαιώσετε έναν άλλο χρήστη, μπορείτε να είστε σίγουροι ότι γνωρίζετε πραγματικά σε ποιον γράφετε. 💪\n\nΌταν ξεκινάτε μια επιβεβαίωση, εσείς και ο άλλος χρήστης θα δείτε ένα αναδυόμενο παράθυρο στην εφαρμογή. Εκεί θα δείτε μια σειρά από emoji ή αριθμούς που πρέπει να συγκρίνετε μεταξύ σας.\n\nΟ καλύτερος τρόπος να το κάνετε αυτό είναι να συναντηθείτε ή να ξεκινήσετε μια βιντεκλήση. 👭", - "verifyOtherDevice": "🔐 Επιβεβαίωση άλλης συσκευής", - "verifyOtherDeviceDescription": "Όταν επιβεβαιώνετε μια άλλη συσκευή, αυτές οι συσκευές μπορούν να ανταλλάξουν κλειδιά, αυξάνοντας τη συνολική ασφάλειά σας. 💪 Όταν ξεκινάτε μια επιβεβαίωση, θα εμφανιστεί ένα αναδυόμενο παράθυρο στην εφαρμογή και στις δύο συσκευές. Εκεί θα δείτε μια σειρά από emoji ή αριθμούς που πρέπει να συγκρίνετε. Είναι καλύτερο να έχετε και τις δύο συσκευές έτοιμες πριν ξεκινήσετε την επιβεβαίωση. 🤳", - "acceptedKeyVerification": "{sender} αποδέχτηκε την επιβεβαίωση κλειδιού", - "canceledKeyVerification": "{sender} ακύρωσε την επιβεβαίωση κλειδιού", - "completedKeyVerification": "{sender} ολοκλήρωσε την επιβεβαίωση κλειδιού", - "isReadyForKeyVerification": "{sender} είναι έτοιμος/η για επιβεβαίωση κλειδιού", - "requestedKeyVerification": "{sender} ζήτησε επιβεβαίωση κλειδιού", - "startedKeyVerification": "{sender} ξεκίνησε την επιβεβαίωση κλειδιού", - "transparent": "Διαφανές", - "incomingMessages": "Εισερχόμενα μηνύματα", - "stickers": "Αυτοκόλλητα", - "discover": "Ανακάλυψη", - "commandHint_ignore": "Αγνόηση του δοθέντος ταυτότητας matrix", - "commandHint_unignore": "Αναίρεση αγνόησης του δοθέντος ταυτότητας matrix", - "unreadChatsInApp": "{appname}: {unread} μη αναγνωσμένα chats", - "noDatabaseEncryption": "Η κρυπτογράφηση βάσης δεδομένων δεν υποστηρίζεται σε αυτήν την πλατφόρμα", - "thereAreCountUsersBlocked": "Αυτήν τη στιγμή υπάρχουν {count} αποκλεισμένοι χρήστες.", - "restricted": "Περιορισμένο", - "knockRestricted": "Περιορισμός χτυπήματος", - "goToSpace": "Μεταβείτε στον χώρο: {space}", - "markAsUnread": "Σήμανση ως μη αναγνωσμένο", - "userLevel": "{level} - Χρήστης", - "moderatorLevel": "{level} - Διαχειριστής", - "adminLevel": "{level} - Διαχειριστής", - "changeGeneralChatSettings": "Αλλαγή γενικών ρυθμίσεων συνομιλίας", - "inviteOtherUsers": "Πρόσκληση άλλων χρηστών σε αυτήν τη συνομιλία", - "changeTheChatPermissions": "Αλλαγή των δικαιωμάτων συνομιλίας", - "changeTheVisibilityOfChatHistory": "Αλλαγή της ορατότητας του ιστορικού συνομιλίας", - "changeTheCanonicalRoomAlias": "Αλλαγή της κύριας δημόσιας διεύθυνσης συνομιλίας", - "sendRoomNotifications": "Αποστολή ειδοποιήσεων @room", - "changeTheDescriptionOfTheGroup": "Αλλαγή της περιγραφής της συνομιλίας", - "chatPermissionsDescription": "Ορίστε ποιο επίπεδο δύναμης είναι απαραίτητο για ορισμένες ενέργειες σε αυτήν τη συνομιλία. Τα επίπεδα δύναμης 0, 50 και 100 συνήθως αντιπροσωπεύουν χρήστες, διαχειριστές και διαχειριστές, αλλά οποιαδήποτε βαθμίδα είναι δυνατή.", - "updateInstalled": "🎉 Εγκαταστάθηκε η ενημέρωση {version}!", - "changelog": "Αλλαγές", - "sendCanceled": "Η αποστολή ακυρώθηκε", - "loginWithMatrixId": "Σύνδεση με Matrix-ID", - "discoverHomeservers": "Ανακαλύψτε τους διακομιστές", - "whatIsAHomeserver": "Τι είναι ένας διακομιστής σπιτιού;", - "homeserverDescription": "Όλα τα δεδομένα σας αποθηκεύονται στον διακομιστή σπιτιού, όπως και ένας πάροχος email. Μπορείτε να επιλέξετε ποιον διακομιστή σπιτιού θέλετε να χρησιμοποιήσετε, ενώ μπορείτε ακόμα να επικοινωνείτε με όλους. Μάθετε περισσότερα στο https://matrix.org.", - "doesNotSeemToBeAValidHomeserver": "Δεν φαίνεται να είναι συμβατός διακομιστής σπιτιού. Λάθος URL;", - "calculatingFileSize": "Υπολογισμός μεγέθους αρχείου...", - "prepareSendingAttachment": "Ετοιμασία αποστολής συνημμένου...", - "sendingAttachment": "Αποστολή συνημμένου...", - "generatingVideoThumbnail": "Δημιουργία μικρογραφίας βίντεο...", - "compressVideo": "Συμπίεση βίντεο...", - "sendingAttachmentCountOfCount": "Αποστολή συνημμένου {index} από {length}...", - "serverLimitReached": "Έφτασε το όριο του διακομιστή! Περιμένετε {seconds} δευτερόλεπτα...", - "oneOfYourDevicesIsNotVerified": "Ένα από τα συσκευές σας δεν είναι επαληθευμένο", - "noticeChatBackupDeviceVerification": "Σημείωση: Όταν συνδέσετε όλες τις συσκευές σας στο αντίγραφο ασφαλείας συνομιλίας, αυτομάτως επαληθεύονται.", - "continueText": "Συνέχεια", - "welcomeText": "Γεια Γεια 👋 Αυτό είναι το FluffyChat. Μπορείτε να συνδεθείτε σε οποιονδήποτε διακομιστή σπιτιού, ο οποίος είναι συμβατός με το https://matrix.org. Και στη συνέχεια να συνομιλήσετε με οποιονδήποτε. Είναι ένα τεράστιο αποκεντρωμένο δίκτυο μηνυμάτων!", - "blur": "Θάμπωμα:", - "opacity": "Αδιαφάνεια:", - "setWallpaper": "Ορισμός φόντου", - "manageAccount": "Διαχείριση λογαριασμού", - "noContactInformationProvided": "Ο διακομιστής δεν παρέχει έγκυρες πληροφορίες επικοινωνίας", - "contactServerAdmin": "Επικοινωνήστε με τον διαχειριστή του διακομιστή", - "contactServerSecurity": "Επικοινωνία με την ασφάλεια διακομιστή", - "supportPage": "Σελίδα υποστήριξης", - "serverInformation": "Πληροφορίες διακομιστή:", - "name": "Όνομα", - "version": "Έκδοση", - "website": "Ιστοσελίδα", - "compress": "Συμπίεση", - "boldText": "Έντονο κείμενο", - "italicText": "Πλάγιο κείμενο", - "strikeThrough": "Διαγραφή", - "pleaseFillOut": "Παρακαλώ συμπληρώστε", - "invalidUrl": "Μη έγκυρο URL", - "addLink": "Προσθήκη συνδέσμου", - "unableToJoinChat": "Αδύνατη η συμμετοχή στη συνομιλία. Ίσως το άλλο μέρος έχει ήδη κλείσει τη συνομιλία.", - "previous": "Προηγούμενο", - "otherPartyNotLoggedIn": "Το άλλο μέρος δεν είναι αυτήν τη στιγμή συνδεδεμένο και επομένως δεν μπορεί να λάβει μηνύματα!", - "appWantsToUseForLogin": "Χρησιμοποιήστε '{server}' για σύνδεση", - "appWantsToUseForLoginDescription": "Επιτρέπετε στην εφαρμογή και στον ιστότοπο να μοιράζονται πληροφορίες σχετικά με εσάς.", - "open": "Άνοιγμα", - "waitingForServer": "Αναμονή για διακομιστή...", - "appIntroduction": "Το FluffyChat σας επιτρέπει να συνομιλείτε με τους φίλους σας σε διαφορετικά μηνύματα. Μάθετε περισσότερα στο https://matrix.org ή απλώς πατήστε *Συνέχεια*.", - "newChatRequest": "📩 Νέα αίτηση συνομιλίας", - "contentNotificationSettings": "Ρυθμίσεις ειδοποιήσεων περιεχομένου", - "generalNotificationSettings": "Γενικές ρυθμίσεις ειδοποιήσεων", - "roomNotificationSettings": "Ρυθμίσεις ειδοποιήσεων δωματίου", - "userSpecificNotificationSettings": "Εξατομικευμένες ρυθμίσεις ειδοποιήσεων χρήστη", - "otherNotificationSettings": "Άλλες ρυθμίσεις ειδοποιήσεων", - "notificationRuleContainsUserName": "Περιέχει όνομα χρήστη", - "notificationRuleContainsUserNameDescription": "Ειδοποιεί τον χρήστη όταν ένα μήνυμα περιέχει το όνομα χρήστη του.", - "notificationRuleMaster": "Απενεργοποίηση όλων των ειδοποιήσεων", - "notificationRuleMasterDescription": "Παρακάμπτει όλους τους άλλους κανόνες και απενεργοποιεί όλες τις ειδοποιήσεις.", - "notificationRuleSuppressNotices": "Καταστολή αυτόματων μηνυμάτων", - "notificationRuleSuppressNoticesDescription": "Καταστέλλει τις ειδοποιήσεις από αυτοματοποιμένους πελάτες όπως τα bots.", - "notificationRuleInviteForMe": "Πρόσκληση για μένα", - "notificationRuleInviteForMeDescription": "Ειδοποιεί τον χρήστη όταν λαμβάνει πρόσκληση σε δωμάτιο.", - "notificationRuleMemberEvent": "Γεγονός μέλους", - "notificationRuleMemberEventDescription": "Καταστέλλει τις ειδοποιήσεις για γεγονότα μέλους.", - "notificationRuleIsUserMention": "Αναφορά χρήστη", - "notificationRuleIsUserMentionDescription": "Ειδοποιεί τον χρήστη όταν αναφέρεται άμεσα σε μήνυμα.", - "notificationRuleContainsDisplayName": "Περιέχει όνομα εμφάνισης", - "notificationRuleContainsDisplayNameDescription": "Ειδοποιεί τον χρήστη όταν ένα μήνυμα περιέχει το όνομά του.", - "notificationRuleIsRoomMention": "Αναφορά Δωματίου", - "notificationRuleIsRoomMentionDescription": "Ειδοποιεί τον χρήστη όταν υπάρχει αναφορά σε δωμάτιο.", - "notificationRuleRoomnotif": "Ειδοποίηση Δωματίου", - "notificationRuleRoomnotifDescription": "Ειδοποιεί τον χρήστη όταν ένα μήνυμα περιέχει '@room'.", - "notificationRuleTombstone": "Ταφόπλακα", - "notificationRuleTombstoneDescription": "Ειδοποιεί τον χρήστη σχετικά με μηνύματα απενεργοποίησης δωματίου.", - "notificationRuleReaction": "Αντίδραση", - "notificationRuleReactionDescription": "Καταστέλλει τις ειδοποιήσεις για αντιδράσεις.", - "notificationRuleRoomServerAcl": "Πρόσβαση Δωματίου στον Διακομιστή", - "notificationRuleRoomServerAclDescription": "Καταστέλλει τις ειδοποιήσεις για λίστες ελέγχου πρόσβασης (ACL) του διακομιστή δωματίου.", - "notificationRuleSuppressEdits": "Καταστολή Επεξεργασιών", - "notificationRuleSuppressEditsDescription": "Καταστέλλει τις ειδοποιήσεις για επεξεργασμένα μηνύματα.", - "notificationRuleCall": "Κλήση", - "notificationRuleCallDescription": "Ειδοποιεί τον χρήστη σχετικά με κλήσεις.", - "notificationRuleEncryptedRoomOneToOne": "Κρυπτογραφημένο Δωμάτιο Μία προς Μία", - "notificationRuleEncryptedRoomOneToOneDescription": "Ειδοποιεί τον χρήστη σχετικά με μηνύματα σε κρυπτογραφημένα δωμάτια ένα προς ένα.", - "notificationRuleRoomOneToOne": "Δωμάτιο Μία προς Μία", - "notificationRuleRoomOneToOneDescription": "Ειδοποιεί τον χρήστη σχετικά με μηνύματα σε δωμάτια ένα προς ένα.", - "notificationRuleMessage": "Μήνυμα", - "notificationRuleMessageDescription": "Ειδοποιεί τον χρήστη για γενικά μηνύματα.", - "notificationRuleEncrypted": "Κρυπτογραφημένο", - "notificationRuleEncryptedDescription": "Ειδοποιεί τον χρήστη για μηνύματα σε κρυπτογραφημένους δωματίους.", - "notificationRuleJitsi": "Jitsi", - "notificationRuleJitsiDescription": "Ειδοποιεί τον χρήστη για γεγονότα widget Jitsi.", - "notificationRuleServerAcl": "Κατάπνιξε γεγονότα Server ACL", - "notificationRuleServerAclDescription": "Καταπνίγει τις ειδοποιήσεις για γεγονότα Server ACL.", - "unknownPushRule": "Άγνωστος κανόνας ώθησης '{rule}'", - "sentVoiceMessage": "🎙️ {duration} - Φωνητικό μήνυμα από {sender}", - "deletePushRuleCanNotBeUndone": "Εάν διαγράψετε αυτήν τη ρύθμιση ειδοποίησης, αυτό δεν μπορεί να αναιρεθεί.", - "more": "Περισσότερα", - "shareKeysWith": "Μοιραστείτε κλειδιά με...", - "shareKeysWithDescription": "Ποια συσκευές πρέπει να είναι αξιόπιστες ώστε να μπορούν να διαβάσουν τα μηνύματά σας σε κρυπτογραφημένες συνομιλίες;", - "allDevices": "Όλες οι συσκευές", - "crossVerifiedDevicesIfEnabled": "Διασταυρωμένες επαληθευμένες συσκευές αν είναι ενεργοποιημένο", - "crossVerifiedDevices": "Διασταυρωμένες επαληθευμένες συσκευές", - "verifiedDevicesOnly": "Μόνο επαληθευμένες συσκευές", - "takeAPhoto": "Βγάλτε μια φωτογραφία", - "recordAVideo": "Καταγράψτε ένα βίντεο", - "optionalMessage": "(Προαιρετικό) μήνυμα...", - "notSupportedOnThisDevice": "Δεν υποστηρίζεται σε αυτήν τη συσκευή", - "enterNewChat": "Ξεκινήστε νέο chat", - "approve": "Έγκριση", - "youHaveKnocked": "Έχετε χτυπήσει", - "pleaseWaitUntilInvited": "Παρακαλώ περιμένετε τώρα, μέχρι κάποιος από το δωμάτιο να σας προσκαλέσει.", - "commandHint_logout": "Αποσυνδεθείτε από τη τρέχουσα συσκευή σας", - "commandHint_logoutall": "Αποσυνδεθείτε από όλες τις ενεργές συσκευές", - "displayNavigationRail": "Εμφάνιση της γραμμής πλοήγησης σε κινητά", - "customReaction": "Προσαρμοσμένη αντίδραση", - "ignore": "Αποκλεισμός", - "ignoredUsers": "Αποκλεισμένοι χρήστες", - "writeAMessageLangCodes": "Πληκτρολογήστε σε {l1} ή {l2}...", - "requests": "Αιτήματα", - "holdForInfo": "Κάντε κλικ και κρατήστε πατημένο για πληροφορίες λέξης.", - "greenFeedback": "Αυτό θα έβαζα!", - "yellowFeedback": "Χμ, μπορείς να το δοκιμάσεις και να δεις αν λειτουργεί! Για να χρησιμοποιήσεις αυτή τη λέξη, απλώς κάνε κλικ ξανά.", - "redFeedback": "Δεν νομίζω ότι είναι σωστό...", - "itInstructionsTitle": "Μπορώ να σε βοηθήσω με τη μετάφραση!", - "itInstructionsBody": "Μπορείς να κάνεις κλικ και να κρατήσεις πατημένο τις επιλογές για πληροφορίες λέξης.", - "gaTooltip": "L2 χρήση με βοήθεια γραμματικής", - "taTooltip": "L2 χρήση με βοήθεια μετάφρασης", - "unTooltip": "Άλλο", - "interactiveTranslatorSliderHeader": "Διαδραστικός Μεταφραστής", - "interactiveGrammarSliderHeader": "Διαδραστικός Έλεγχος Γραμματικής", - "interactiveTranslatorNotAllowed": "Απενεργοποιημένο", - "interactiveTranslatorAllowed": "Επιλογή Μαθητή", - "interactiveTranslatorRequired": "Απαιτείται", - "notYetSet": "Δεν έχει οριστεί ακόμα", - "waTooltip": "Χρήση L2 χωρίς βοήθεια", - "languageSettings": "Ρυθμίσεις γλώσσας", - "interactiveTranslator": "Βοήθεια μετάφρασης", - "noIdenticalLanguages": "Παρακαλώ επιλέξτε διαφορετικές βασικές και στόχους γλώσσες", - "searchBy": "Αναζήτηση με βάση χώρα και γλώσσες", - "joinWithClassCode": "Εγγραφή στο μάθημα", - "languageLevelPreA1": "Νέος Χαμηλός (Προ Α1)", - "languageLevelA1": "Νέος Μέσος (A1)", - "languageLevelA2": "Αρχάριος Υψηλού Επιπέδου (A2)", - "languageLevelB1": "Μεσαίος Μέτριος (B1)", - "languageLevelB2": "Προχωρημένος Χαμηλού Επιπέδου (B2)", - "languageLevelC1": "Προχωρημένος Μέτριος (C1)", - "languageLevelC2": "Ανώτερος (C2)", - "changeTheNameOfTheClass": "Αλλαγή ονόματος", - "changeTheNameOfTheChat": "Αλλαγή ονόματος της συνομιλίας", - "sorryNoResults": "Λυπούμαστε, δεν βρέθηκαν αποτελέσματα.", - "ignoreInThisText": "Αγνόηση", - "needsItMessage": "Περίμενε, αυτό δεν είναι {targetLanguage}! Χρειάζεστε βοήθεια με τη μετάφραση;", - "countryInformation": "Η χώρα μου", - "targetLanguage": "Γλώσσα στόχος", - "sourceLanguage": "Βασική γλώσσα", - "updateLanguage": "Οι γλώσσες μου", - "whatLanguageYouWantToLearn": "Ποια γλώσσα θέλετε να μάθετε;", - "whatIsYourBaseLanguage": "Ποια είναι η βασική σας γλώσσα;", - "saveChanges": "Αποθήκευση αλλαγών", - "publicProfileTitle": "Να επιτρέπεται η εύρεση του προφίλ μου στην αναζήτηση", - "publicProfileDesc": "Με την ενεργοποίηση, επιτρέπετε σε άλλους χρήστες να βρουν το προφίλ σας στη διεθνή γραμμή αναζήτησης και να στείλουν αιτήματα συνομιλίας. Σε αυτό το σημείο, μπορείτε να επιλέξετε να αποδεχτείτε ή να αρνηθείτε το αίτημα.", - "errorDisableIT": "Η βοήθεια μετάφρασης είναι απενεργοποιημένη.", - "errorDisableIGC": "Η βοήθεια γραμματικής είναι απενεργοποιημένη.", - "errorDisableLanguageAssistance": "Η βοήθεια μετάφρασης και γραμματικής είναι απενεργοποιημένες.", - "errorDisableITUserDesc": "Κάντε κλικ εδώ για να ενημερώσετε τις ρυθμίσεις βοήθειας μετάφρασης", - "errorDisableIGCUserDesc": "Κάντε κλικ εδώ για να ενημερώσετε τις ρυθμίσεις βοήθειας γραμματικής", - "errorDisableLanguageAssistanceUserDesc": "Κάντε κλικ εδώ για να ενημερώσετε τις ρυθμίσεις βοήθειας μετάφρασης και γραμματικής", - "errorDisableITClassDesc": "Η βοήθεια μετάφρασης είναι απενεργοποιημένη για το μάθημα στο οποίο βρίσκεται αυτή η συνομιλία.", - "errorDisableIGCClassDesc": "Η βοήθεια γραμματικής είναι απενεργοποιημένη για το μάθημα στο οποίο βρίσκεται αυτή η συνομιλία.", - "error405Title": "Οι γλώσσες δεν έχουν οριστεί", - "error405Desc": "Ορίστε τις γλώσσες σας στο Μενού > Ρυθμίσεις Μάθησης.", - "termsAndConditions": "Όρους και Προϋποθέσεις", - "andCertifyIAmAtLeast13YearsOfAge": " και πιστοποιώ ότι είμαι τουλάχιστον 16 ετών.", - "error502504Title": "Ω, υπάρχουν πολλοί μαθητές online!", - "error502504Desc": "Τα εργαλεία μετάφρασης και γραμματικής ενδέχεται να είναι αργά ή μη διαθέσιμα ενώ οι bots της Pangea ενημερώνονται.", - "error404Title": "Σφάλμα μετάφρασης!", - "error404Desc": "Ο Pangea Bot δεν είναι σίγουρος πώς να μεταφράσει αυτό...", - "errorPleaseRefresh": "Το ερευνούμε! Παρακαλούμε ανανεώστε και δοκιμάστε ξανά.", - "connectedToStaging": "Συνδεδεμένο με το Staging", - "learningSettings": "Ρυθμίσεις Μάθησης", - "participants": "Συμμετέχοντες", - "clickMessageTitle": "Χρειάζεστε βοήθεια;", - "clickMessageBody": "Κάντε κλικ σε ένα μήνυμα για εργαλεία γλώσσας όπως μετάφραση, αναπαραγωγή και άλλα!", - "allDone": "Ολοκληρώθηκε!", - "vocab": "Λεξιλόγιο", - "low": "Έχουμε αποδείξεις ότι ο χρήστης δεν καταλαβαίνει αυτές τις λέξεις.", - "medium": "Αυτές οι λέξεις έχουν χρησιμοποιηθεί. Δεν είναι σαφές αν οι λέξεις κατανοούνται πλήρως ή όχι.", - "high": "Έχουμε αποδείξεις ότι ο χρήστης καταλαβαίνει αυτές τις λέξεις.", - "subscribe": "Εγγραφή", - "getAccess": "Εγγραφείτε τώρα!", - "subscriptionDesc": "Οι μηνύσεις είναι δωρεάν! Εγγραφείτε για να ξεκλειδώσετε διαδραστική μετάφραση, έλεγχο γραμματικής και αναλυτικά στοιχεία μάθησης.", - "subscriptionManagement": "Διαχείριση Συνδρομής", - "currentSubscription": "Τρέχουσα Συνδρομή", - "cancelSubscription": "Ακυρώστε τη συνδρομή σας", - "selectYourPlan": "Επιλέξτε το πλάνο σας", - "subsciptionPlatformTooltip": "Παρακαλώ συνδεθείτε στη αρχική συσκευή σας για να διαχειριστείτε το πλάνο της συνδρομής σας", - "subscriptionManagementUnavailable": "Η διαχείριση συνδρομής δεν είναι διαθέσιμη", - "paymentMethod": "Μέθοδος Πληρωμής", - "paymentHistory": "Ιστορικό Πληρωμών", - "emptyChatDownloadWarning": "Δεν είναι δυνατή η λήψη κενής συνομιλίας", - "update": "Ενημέρωση", - "toggleImmersionMode": "Λειτουργία Εμβάπτισης", - "toggleImmersionModeDesc": "Όταν ενεργοποιείται, όλα τα μηνύματα εμφανίζονται στη γλώσσα στόχο σας. Αυτή η ρύθμιση είναι πιο χρήσιμη σε ανταλλαγές γλωσσών.", - "itToggleDescription": "Αυτό το εργαλείο εκμάθησης γλωσσών θα εντοπίζει λέξεις στη βασική σας γλώσσα και θα σας βοηθά να τις μεταφράσετε στη γλώσσα στόχο. Αν και σπάνιο, το AI μπορεί να κάνει λάθη στη μετάφραση.", - "igcToggleDescription": "Αυτό το εργαλείο εκμάθησης γλωσσών θα εντοπίζει κοινά ορθογραφικά, γραμματικά και σημεία στίξης λάθη στο μήνυμά σας και θα προτείνει διορθώσεις. Αν και σπάνιο, το AI μπορεί να κάνει λάθη στις διορθώσεις.", - "originalMessage": "Αρχικό Μήνυμα", - "sentMessage": "Αποσταλμένο Μήνυμα", - "useType": "Χρησιμοποιήστε Τύπο", - "notAvailable": "Δεν Διαθέσιμη", - "taAndGaTooltip": "Χρήση L2 με βοήθεια μετάφρασης και γραμματικής", - "definitionsToolName": "Ορισμοί Λέξεων", - "messageTranslationsToolName": "Μεταφράσεις Μηνυμάτων", - "definitionsToolDescription": "Όταν ενεργοποιείται, οι λέξεις με υπογράμμιση μπλε μπορούν να πατηθούν για ορισμούς. Πατήστε μηνύματα για πρόσβαση στους ορισμούς.", - "translationsToolDescrption": "Όταν ενεργοποιείται, πατήστε ένα μήνυμα και το εικονίδιο μετάφρασης για να δείτε ένα μήνυμα στη βασική σας γλώσσα.", - "welcomeBack": "Καλώς ήρθατε ξανά! Αν ήσασταν μέρος του πιλοτικού προγράμματος 2023-2024, παρακαλούμε επικοινωνήστε μαζί μας για τη ειδική σας συνδρομή πιλοτικού προγράμματος. Αν είστε εκπαιδευτικός που έχει αγοράσει (ή η εκπαιδευτική σας ιδιότητα έχει αγοράσει) άδειες για την τάξη σας, επικοινωνήστε μαζί μας για τη συνδρομή εκπαιδευτικού.", - "downloadTxtFile": "Λήψη αρχείου κειμένου", - "downloadCSVFile": "Λήψη αρχείου CSV", - "promotionalSubscriptionDesc": "Έχετε επί του παρόντος μια συνδρομή προώθησης διάρκειας ζωής. Στείλτε μήνυμα στο support@pangea.chat για βοήθεια στην αλλαγή της συνδρομής σας.", - "originalSubscriptionPlatform": "Συνδρομή αγοράστηκε μέσω {purchasePlatform}", - "oneWeekTrial": "Δοκιμαστική περίοδος μιας εβδομάδας", - "downloadXLSXFile": "Λήψη αρχείου Excel", - "unkDisplayName": "Άγνωστο", - "wwCountryDisplayName": "Παγκόσμιος", - "afCountryDisplayName": "Αφγανιστάν", - "axCountryDisplayName": "Νήσοι Αλάντες", - "alCountryDisplayName": "Αλβανία", - "dzCountryDisplayName": "Αλγερία", - "asCountryDisplayName": "Αμερικανική Σαμόα", - "adCountryDisplayName": "Ανδόρα", - "aoCountryDisplayName": "Αγκόλα", - "aiCountryDisplayName": "Ανγκουίλα", - "agCountryDisplayName": "Αντίγκουα και Μπαρμπούντα", - "arCountryDisplayName": "Αργεντινή", - "amCountryDisplayName": "Αρμενία", - "awCountryDisplayName": "Αρούμπα", - "acCountryDisplayName": "Νήσος Ασένσιον", - "auCountryDisplayName": "Αυστραλία", - "atCountryDisplayName": "Αυστρία", - "azCountryDisplayName": "Αζερμπαϊτζάν", - "bsCountryDisplayName": "Μπαχάμες", - "bhCountryDisplayName": "Μπαχρέιν", - "bdCountryDisplayName": "Μπανγκλαντές", - "bbCountryDisplayName": "Μπαρμπάντος", - "byCountryDisplayName": "Λευκορωσία", - "beCountryDisplayName": "Βέλγιο", - "bzCountryDisplayName": "Μπελίζ", - "bjCountryDisplayName": "Μπενίν", - "bmCountryDisplayName": "Βερμούδες", - "btCountryDisplayName": "Μπουτάν", - "boCountryDisplayName": "Βολιβία", - "baCountryDisplayName": "Βοσνία και Ερζεγοβίνη", - "bwCountryDisplayName": "Μποτσουάνα", - "brCountryDisplayName": "Βραζιλία", - "ioCountryDisplayName": "Βρετανικό Εδαφικό Τόξο Ινδικού Ωκεανού", - "vgCountryDisplayName": "Βρετανικές Παρθένοι Νήσοι", - "bnCountryDisplayName": "Μπρουνέι", - "bgCountryDisplayName": "Βουλγαρία", - "bfCountryDisplayName": "Μπουρκίνα Φάσο", - "biCountryDisplayName": "Μπουρούντι", - "khCountryDisplayName": "Καμπότζη", - "cmCountryDisplayName": "Καμερούν", - "caCountryDisplayName": "Καναδάς", - "cvCountryDisplayName": "Πράσινο Ακρωτήρι", - "bqCountryDisplayName": "Καραϊβική Ολλανδία", - "kyCountryDisplayName": "Νήσοι Κέιμαν", - "cfCountryDisplayName": "Κεντροαφρικανική Δημοκρατία", - "tdCountryDisplayName": "Τσαντ", - "clCountryDisplayName": "Χιλή", - "cnCountryDisplayName": "Κίνα", - "cxCountryDisplayName": "Νήσος Χριστουγέννων", - "ccCountryDisplayName": "Νήσοι Κόκος [Κίλιγκ]", - "coCountryDisplayName": "Κολομβία", - "kmCountryDisplayName": "Κομόρες", - "cdCountryDisplayName": "Δημοκρατία του Κονγκό", - "cgCountryDisplayName": "Δημοκρατία του Κονγκό", - "ckCountryDisplayName": "Νήσοι Κουκ", - "crCountryDisplayName": "Κόστα Ρίκα", - "ciCountryDisplayName": "Ακτή Ελεφαντοστού", - "hrCountryDisplayName": "Κροατία", - "cuCountryDisplayName": "Κούβα", - "cwCountryDisplayName": "Κουρασάο", - "cyCountryDisplayName": "Κύπρος", - "czCountryDisplayName": "Τσεχική Δημοκρατία", - "dkCountryDisplayName": "Δανία", - "djCountryDisplayName": "Τζιμπουτί", - "dmCountryDisplayName": "Δομινίκα", - "doCountryDisplayName": "Δομινικανή Δημοκρατία", - "tlCountryDisplayName": "Ανατολικό Τιμόρ", - "ecCountryDisplayName": "Ισημερινός", - "egCountryDisplayName": "Αίγυπτος", - "svCountryDisplayName": "Ελ Σαλβαδόρ", - "gqCountryDisplayName": "Ισημερινή Γουινέα", - "erCountryDisplayName": "Ερυθραία", - "eeCountryDisplayName": "Εσθονία", - "szCountryDisplayName": "Σουαζιλάνδη", - "etCountryDisplayName": "Αιθιοπία", - "fkCountryDisplayName": "Νήσοι Φόκλαντ", - "foCountryDisplayName": "Νήσοι Φερόες", - "fjCountryDisplayName": "Φίτζι", - "fiCountryDisplayName": "Φινλανδία", - "frCountryDisplayName": "Γαλλία", - "gfCountryDisplayName": "Γαλλική Γουιάνα", - "pfCountryDisplayName": "Γαλλική Πολυνησία", - "gaCountryDisplayName": "Γκαμπόν", - "gmCountryDisplayName": "Γκάμπια", - "geCountryDisplayName": "Γεωργία", - "deCountryDisplayName": "Γερμανία", - "ghCountryDisplayName": "Γκάνα", - "giCountryDisplayName": "Γιβραλτάρ", - "grCountryDisplayName": "Ελλάδα", - "glCountryDisplayName": "Γροιλανδία", - "gdCountryDisplayName": "Γρενάδα", - "gpCountryDisplayName": "Γουαδελούπη", - "guCountryDisplayName": "Γκουάμ", - "gtCountryDisplayName": "Γουατεμάλα", - "ggCountryDisplayName": "Γκέρνσεϊ", - "gnCountryDisplayName": "Γουινέα Κονάκρι", - "gwCountryDisplayName": "Γουινέα-Μπισάου", - "gyCountryDisplayName": "Γουιάνα", - "htCountryDisplayName": "Αϊτή", - "hmCountryDisplayName": "Νησί Heard και Νησιά McDonald", - "hnCountryDisplayName": "Ονδούρα", - "hkCountryDisplayName": "Χονγκ Κονγκ", - "huCountryDisplayName": "Ουγγαρία", - "isCountryDisplayName": "Ισλανδία", - "inCountryDisplayName": "Ινδία", - "idCountryDisplayName": "Ινδονησία", - "irCountryDisplayName": "Ιράν", - "iqCountryDisplayName": "Ιράκ", - "ieCountryDisplayName": "Ιρλανδία", - "imCountryDisplayName": "Νήσος του Μαν", - "ilCountryDisplayName": "Ισραήλ", - "itCountryDisplayName": "Ιταλία", - "jmCountryDisplayName": "Τζαμάικα", - "jpCountryDisplayName": "Ιαπωνία", - "jeCountryDisplayName": "Τζέρσεϊ", - "joCountryDisplayName": "Ιορδανία", - "kzCountryDisplayName": "Καζακστάν", - "keCountryDisplayName": "Κένυα", - "kiCountryDisplayName": "Κιριμπάτι", - "xkCountryDisplayName": "Κοσσυφοπέδιο", - "kwCountryDisplayName": "Κουβέιτ", - "kgCountryDisplayName": "Κιργιζία", - "laCountryDisplayName": "Λάος", - "lvCountryDisplayName": "Λετονία", - "lbCountryDisplayName": "Λίβανος", - "lsCountryDisplayName": "Λεσόθο", - "lrCountryDisplayName": "Λιβερία", - "lyCountryDisplayName": "Λιβύη", - "liCountryDisplayName": "Λιχτενστάιν", - "ltCountryDisplayName": "Λιθουανία", - "luCountryDisplayName": "Λουξεμβούργο", - "moCountryDisplayName": "Μακάου", - "mkCountryDisplayName": "Βόρεια Μακεδονία", - "mgCountryDisplayName": "Μαδαγασκάρη", - "mwCountryDisplayName": "Μαλάουι", - "myCountryDisplayName": "Μαλαισία", - "mvCountryDisplayName": "Μαλδίβες", - "mlCountryDisplayName": "Μάλι", - "mtCountryDisplayName": "Μάλτα", - "mhCountryDisplayName": "Νήσοι Μάρσαλ", - "mqCountryDisplayName": "Μαρτινίκα", - "mrCountryDisplayName": "Μαυριτανία", - "muCountryDisplayName": "Μαυρίκιος", - "ytCountryDisplayName": "Μαγιότ", - "mxCountryDisplayName": "Μεξικό", - "fmCountryDisplayName": "Μικρονησία", - "mdCountryDisplayName": "Μολδαβία", - "mcCountryDisplayName": "Μονακό", - "mnCountryDisplayName": "Μογγολία", - "meCountryDisplayName": "Μαυροβούνιο", - "msCountryDisplayName": "Μοντσερράτ", - "maCountryDisplayName": "Μαρόκο", - "mzCountryDisplayName": "Μοζαμβίκη", - "mmCountryDisplayName": "Μιανμάρ (Βιρμανία)", - "naCountryDisplayName": "Ναμίμπια", - "nrCountryDisplayName": "Ναουρού", - "npCountryDisplayName": "Νεπάλ", - "nlCountryDisplayName": "Ολλανδία", - "ncCountryDisplayName": "Νέα Καληδονία", - "nzCountryDisplayName": "Νέα Ζηλανδία", - "niCountryDisplayName": "Νικαράγουα", - "neCountryDisplayName": "Νίγηρας", - "ngCountryDisplayName": "Νιγηρία", - "nuCountryDisplayName": "Νιουέ", - "nfCountryDisplayName": "Νησί Νόρφολκ", - "kpCountryDisplayName": "Βόρεια Κορέα", - "mpCountryDisplayName": "Βόρειες Μαριάνες Νήσοι", - "noCountryDisplayName": "Νορβηγία", - "omCountryDisplayName": "Ομάν", - "pkCountryDisplayName": "Πακιστάν", - "pwCountryDisplayName": "Παλάου", - "psCountryDisplayName": "Παλαιστινιακά Εδάφη", - "paCountryDisplayName": "Παναμάς", - "pgCountryDisplayName": "Παπούα Νέα Γουινέα", - "pyCountryDisplayName": "Παραγουάη", - "peCountryDisplayName": "Περού", - "phCountryDisplayName": "Φιλιππίνες", - "plCountryDisplayName": "Πολωνία", - "ptCountryDisplayName": "Πορτογαλία", - "prCountryDisplayName": "Πουέρτο Ρίκο", - "qaCountryDisplayName": "Κατάρ", - "reCountryDisplayName": "Ρεϋνιόν", - "roCountryDisplayName": "Ρουμανία", - "ruCountryDisplayName": "Ρωσία", - "rwCountryDisplayName": "Ρουάντα", - "blCountryDisplayName": "Άγιος Βαρθολομαίος", - "shCountryDisplayName": "Άγιος Ελένη", - "knCountryDisplayName": "Άγιος Κιτς και Νέβις", - "lcCountryDisplayName": "Άγιος Λουκάς", - "mfCountryDisplayName": "Άγιος Μαρτίνος", - "pmCountryDisplayName": "Άγιος Πέτρος και Μικελόν", - "vcCountryDisplayName": "Άγιος Βικέντιος", - "wsCountryDisplayName": "Σαμόα", - "smCountryDisplayName": "Άγιος Μαρίνος", - "stCountryDisplayName": "Σάο Τόμε και Πρίνσιπε", - "saCountryDisplayName": "Σαουδική Αραβία", - "snCountryDisplayName": "Σενεγάλη", - "rsCountryDisplayName": "Σερβία", - "scCountryDisplayName": "Σεϋχέλλες", - "slCountryDisplayName": "Σιέρα Λεόνε", - "sgCountryDisplayName": "Σιγκαπούρη", - "sxCountryDisplayName": "Σίντ Μαρτέν", - "skCountryDisplayName": "Σλοβακία", - "siCountryDisplayName": "Σλοβενία", - "sbCountryDisplayName": "Νήσοι Σολομώντα", - "soCountryDisplayName": "Σομαλία", - "zaCountryDisplayName": "Νότια Αφρική", - "gsCountryDisplayName": "Νότια Γεωργία και Νότιες Νήσοι Σάντουιτς", - "krCountryDisplayName": "Νότια Κορέα", - "ssCountryDisplayName": "Νότιο Σουδάν", - "esCountryDisplayName": "Ισπανία", - "lkCountryDisplayName": "Σρι Λάνκα", - "sdCountryDisplayName": "Σουδάν", - "srCountryDisplayName": "Σουρινάμ", - "sjCountryDisplayName": "Σβάλμπαρντ και Γιαν Μάγιεν", - "seCountryDisplayName": "Σουηδία", - "chCountryDisplayName": "Ελβετία", - "syCountryDisplayName": "Συρία", - "twCountryDisplayName": "Ταϊβάν", - "tjCountryDisplayName": "Τατζικιστάν", - "tzCountryDisplayName": "Τανζανία", - "thCountryDisplayName": "Ταϊλάνδη", - "tgCountryDisplayName": "Τόγκο", - "tkCountryDisplayName": "Τοκελάου", - "toCountryDisplayName": "Τόνγκα", - "ttCountryDisplayName": "Τρινιντάντ / Τόμπακο", - "tnCountryDisplayName": "Τυνησία", - "trCountryDisplayName": "Τουρκία", - "tmCountryDisplayName": "Τουρκμενιστάν", - "tcCountryDisplayName": "Νησιά Τερκς και Κάικος", - "tvCountryDisplayName": "Τουβαλού", - "viCountryDisplayName": "Αμερικανικές Παρθένοι Νήσοι", - "ugCountryDisplayName": "Ουγκάντα", - "uaCountryDisplayName": "Ουκρανία", - "aeCountryDisplayName": "Ηνωμένα Αραβικά Εμιράτα", - "gbCountryDisplayName": "Ηνωμένο Βασίλειο", - "usCountryDisplayName": "Ηνωμένες Πολιτείες", - "uyCountryDisplayName": "Ουρουγουάη", - "uzCountryDisplayName": "Ουζμπεκιστάν", - "vuCountryDisplayName": "Βανουάτου", - "vaCountryDisplayName": "Βατικανό", - "veCountryDisplayName": "Βενεζουέλα", - "vnCountryDisplayName": "Βιετνάμ", - "wfCountryDisplayName": "Wallis και Futuna", - "ehCountryDisplayName": "Δυτική Σαχάρα", - "yeCountryDisplayName": "Υεμένη", - "zmCountryDisplayName": "Ζάμπια", - "zwCountryDisplayName": "Ζιμπάμπουε", - "pay": "Checkout", - "invitedToSpace": "{user} σας έχει προσκαλέσει να συμμετάσχετε σε ένα μάθημα: {space}! Θέλετε να αποδεχθείτε;", - "youreInvited": "📩 Είστε προσκεκλημένοι!", - "invitedToChat": "{user} σας έχει προσκαλέσει να συμμετάσχετε σε μια συνομιλία: {name}! Θέλετε να αποδεχθείτε;", - "monthlySubscription": "Μηνιαία", - "yearlySubscription": "Ετήσια", - "defaultSubscription": "Συνδρομή Pangea Chat", - "freeTrial": "Δωρεάν Δοκιμή", - "total": "Σύνολο: ", - "noDataFound": "Δεν βρέθηκαν δεδομένα", - "blurMeansTranslateTitle": "Γιατί είναι θολό το μήνυμα;", - "blurMeansTranslateBody": "Ενώ είναι ενεργή η λειτουργία Εμβάθυνσης, τα μηνύματα που αποστέλλονται στη βασική σας γλώσσα θα θολώνουν ενώ το Pangea Bot τα μεταφράζει στη γλώσσα στόχο σας. Η λειτουργία Εμβάθυνσης μπορεί να ενεργοποιείται ή να απενεργοποιείται στις ρυθμίσεις μεμονωμένων και μαθημάτων.", - "bestCorrectionFeedback": "Αυτό είναι σωστό!", - "distractorFeedback": "Δεν είναι ακριβώς σωστό.", - "bestAnswerFeedback": "Αυτό είναι σωστό!", - "definitionDefaultPrompt": "Τι σημαίνει αυτή η λέξη;", - "practiceDefaultPrompt": "Ποια είναι η καλύτερη απάντηση;", - "correctionDefaultPrompt": "Ποια είναι η καλύτερη αντικατάσταση;", - "acceptSelection": "Αποδοχή Διόρθωσης", - "why": "Γιατί;", - "definition": "Ορισμός", - "exampleSentence": "Παράδειγμα πρότασης", - "reportToTeacher": "Σε ποιον θέλετε να αναφέρετε αυτό το μήνυμα;", - "reportMessageTitle": "{reportingUserId} ανέφερε ένα μήνυμα από τον {reportedUserId} στη συνομιλία {roomName}", - "reportMessageBody": "Μήνυμα: {reportedMessage}\nΑιτία: {reason}", - "noTeachersFound": "Δεν βρέθηκαν δάσκαλοι για αναφορά", - "trialExpiration": "Η δωρεάν δοκιμή σας λήγει στις {expiration}", - "freeTrialDesc": "Οι νέοι χρήστες λαμβάνουν μια εβδομάδα δωρεάν δοκιμής του Pangea Chat", - "activateTrial": "Δωρεάν 7-ήμερη Δοκιμή", - "successfullySubscribed": "Έχετε εγγραφεί με επιτυχία!", - "clickToManageSubscription": "Κάντε κλικ εδώ για να διαχειριστείτε τη συνδρομή σας.", - "signUp": "Εγγραφή", - "pleaseChooseAtLeastChars": "Παρακαλώ επιλέξτε τουλάχιστον {min} χαρακτήρες.", - "noEmailWarning": "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση email. Διαφορετικά δεν θα μπορείτε να επαναφέρετε τον κωδικό πρόσβασής σας. Αν δεν θέλετε, πατήστε ξανά το κουμπί για να συνεχίσετε.", - "pleaseEnterValidEmail": "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση email.", - "pleaseChooseAUsername": "Παρακαλώ επιλέξτε ένα όνομα χρήστη", - "define": "Ορίστε", - "listen": "Ακούστε", - "trialPeriodExpired": "Η δοκιμαστική περίοδος σας έχει λήξει", - "translations": "μεταφράσεις", - "messageAudio": "ήχος μηνύματος", - "definitions": "ορισμοί", - "subscribedToUnlockTools": "Εγγραφείτε για να ξεκλειδώσετε διαδραστική μετάφραση και έλεγχο γραμματικής, αναπαραγωγή ήχου, εξατομικευμένες δραστηριότητες πρακτικής και αναλύσεις μάθησης!", - "translationTooltip": "Μετάφραση", - "speechToTextTooltip": "Μεταγραφή", - "kickBotWarning": "Το κλείσιμο του Pangea Bot θα αφαιρέσει το bot συνομιλίας από αυτήν τη συζήτηση.", - "refresh": "Ανανέωση", - "messageAnalytics": "Ανάλυση μηνυμάτων", - "words": "Λέξεις", - "score": "Βαθμολογία", - "accuracy": "Ακρίβεια", - "points": "Βαθμοί", - "noPaymentInfo": "Δεν απαιτείται πληροφορία πληρωμής!", - "updatePhoneOS": "Ίσως χρειαστεί να ενημερώσετε την έκδοση του λειτουργικού συστήματος της συσκευής σας.", - "wordsPerMinute": "Λέξεις ανά λεπτό", - "tooltipInstructionsTitle": "Δεν είστε σίγουροι τι κάνει αυτό;", - "tooltipInstructionsMobileBody": "Πατήστε και κρατήστε πατημένο αντικείμενα για να δείτε τις συμβουλές εργαλείων.", - "tooltipInstructionsBrowserBody": "Τοποθετήστε το δείκτη πάνω από αντικείμενα για να δείτε τις συμβουλές εργαλείων.", - "chatCapacity": "Χωρητικότητα συνομιλίας", - "roomFull": "Αυτή η αίθουσα είναι ήδη γεμάτη.", - "chatCapacityHasBeenChanged": "Η χωρητικότητα της συνομιλίας άλλαξε", - "chatCapacitySetTooLow": "Η χωρητικότητα της συνομιλίας πρέπει να είναι τουλάχιστον {count}.", - "chatCapacityExplanation": "Η χωρητικότητα της συνομιλίας περιορίζει τον αριθμό των μελών που επιτρέπονται σε μια συνομιλία.", - "tooManyRequest": "Πάρα πολλά αιτήματα, παρακαλώ δοκιμάστε ξανά αργότερα.", - "enterNumber": "Παρακαλώ εισάγετε μια ακέραια τιμή.", - "buildTranslation": "Δημιουργήστε τη μετάφρασή σας από τις επιλογές παραπάνω", - "practice": "Εξάσκηση", - "noLanguagesSet": "Δεν έχουν οριστεί γλώσσες", - "speechToTextBody": "Για φωνητικά μηνύματα, μπορείτε να δείτε μια μεταγραφή καθώς και το σκορ Λέξεων ανά Λεπτό του ομιλητή.", - "versionNotFound": "Δεν βρέθηκε έκδοση", - "fetchingVersion": "Λήψη έκδοσης...", - "versionFetchError": "Σφάλμα κατά τη λήψη έκδοσης", - "versionText": "Έκδοση: {version}+{buildNumber}", - "l1TranslationBody": "Τα μηνύματα στη βασική σας γλώσσα δεν θα μεταφραστούν.", - "deleteSubscriptionWarningTitle": "Έχετε ενεργή συνδρομή", - "deleteSubscriptionWarningBody": "Η διαγραφή του λογαριασμού σας δεν θα ακυρώσει αυτόματα τη συνδρομή σας.", - "manageSubscription": "Διαχείριση συνδρομής", - "error520Title": "Παρακαλώ δοκιμάστε ξανά.", - "error520Desc": "Λυπούμαστε, δεν καταλάβαμε το μήνυμά σας...", - "wordsUsed": "Χρησιμοποιημένες λέξεις", - "level": "Επίπεδο", - "morphsUsed": "Χρησιμοποιημένες μορφές", - "translationChoicesBody": "Κάντε κλικ και κρατήστε μια επιλογή για μια υπόδειξη.", - "grammar": "Γραμματική", - "contactHasBeenInvitedToTheChat": "Ο επαφή έχει προσκληθεί στη συνομιλία", - "inviteChat": "📨 Προσκαλέστε στη συνομιλία", - "chatName": "Όνομα συνομιλίας", - "reportContentIssueTitle": "Αναφορά προβλήματος περιεχομένου", - "feedback": "Προαιρετικά σχόλια", - "reportContentIssueDescription": "Ωχ! Η ΤΝ μπορεί να διευκολύνει εξατομικευμένες εκπαιδευτικές εμπειρίες αλλά... επίσης hallucinate. Παρακαλούμε δώστε τυχόν σχόλια και θα προσπαθήσουμε ξανά.", - "clickTheWordAgainToDeselect": "Κάντε κλικ στη επιλεγμένη λέξη για να την αποεπιλέξετε.", - "l2SupportNa": "Μη διαθέσιμο", - "l2SupportAlpha": "Άλφα", - "l2SupportBeta": "Βήτα", - "l2SupportFull": "Πλήρες", - "missingVoiceTitle": "Απουσία φωνής", - "voiceNotAvailable": "Δεν έχετε εγκατεστημένη φωνή για αυτήν τη γλώσσα.", - "openVoiceSettings": "Άνοιγμα ρυθμίσεων φωνής", - "playAudio": "Αναπαραγωγή", - "stop": "Διακοπή", - "grammarCopyPOSsconj": "Υποδεκτική Συζυγία", - "grammarCopyPOSnum": "Αριθμός", - "grammarCopyPOSverb": "Ρήμα", - "grammarCopyPOSaffix": "Επίθημα", - "grammarCopyPOSpart": "Μόριο", - "grammarCopyPOSadj": "Επίθετο", - "grammarCopyPOScconj": "Συντονιστική Συζυγία", - "grammarCopyPOSpunct": "Σημείο Στίξης", - "grammarCopyPOSadv": "Επίρρημα", - "grammarCopyPOSaux": "Βοηθητικό", - "grammarCopyPOSspace": "Κενό", - "grammarCopyPOSsym": "Σύμβολο", - "grammarCopyPOSdet": "Οριστικό", - "grammarCopyPOSpron": "Αντωνυμία", - "grammarCopyPOSadp": "Επιρρηματική Πρόθεση", - "grammarCopyPOSpropn": "Ονόματος Ιδιότητας", - "grammarCopyPOSnoun": "Ουσιαστικό", - "grammarCopyPOSintj": "Επιφώνημα", - "grammarCopyPOSx": "Άλλο", - "grammarCopyGENDERfem": "Θηλυκό", - "grammarCopyPERSON2": "Δεύτερο Πρόσωπο", - "grammarCopyMOODimp": "Υποτακτική", - "grammarCopyPUNCTTYPEqest": "Ερώτηση", - "grammarCopyASPECTperf": "Τελειωμένο", - "grammarCopyCASEaccnom": "Αιτιατική, Ονομαστική", - "grammarCopyCASEobl": "Παρακειμένη", - "grammarCopyVOICEact": "Ενεργητική", - "grammarCopyPUNCTTYPEbrck": "Παρένθεση", - "grammarCopyNOUNTYPEart": "Άρθρο", - "grammarCopyNUMBERsing": "Ενικός", - "grammarCopyGENDERmasc": "Αρσενικό", - "grammarCopyVERBTYPEmod": "Ρήμα Modal", - "grammarCopyADVTYPEadverbial": "Επιρρηματικός", - "grammarCopyTENSEperi": "Περιφραστικός", - "grammarCopyNUMFORMdigit": "Ψηφίο", - "grammarCopyNOUNTYPEnot_proper": "Μη σωστό", - "grammarCopyNUMTYPEcard": "Αριθμητικό", - "grammarCopyNOUNTYPEprop": "Ιδιωτικό", - "grammarCopyPUNCTTYPEdash": "Παύλα", - "grammarCopyPUNCTTYPEyes": "Ναι", - "grammarCopyPUNCTTYPEsemi": "Άνω τελεία", - "grammarCopyPUNCTTYPEcomm": "Κόμμα", - "grammarCopyMOODcnd": "Υποθετικό", - "grammarCopyCASEacc": "Αιτιατική", - "grammarCopyPARTTYPEpart": "Μερικό", - "grammarCopyTENSEpast": "Παρελθόν", - "grammarCopyDEGREEsup": "Υπερθετικός", - "grammarCopyPUNCTTYPEcolo": "Άνω τελεία", - "grammarCopyPERSON3": "Τρίτο πρόσωπο", - "grammarCopyNUMBERplur": "Πληθυντικός", - "grammarCopyPRONTYPEnpr": "Ιδιωτικό ουσιαστικό", - "grammarCopyPRONTYPEinterrogative": "Ερωτηματική", - "grammarCopyPOLITEinfm": "Α informal", - "grammarCopyADVTYPEtim": "Χρόνος", - "grammarCopyPOLARITYneg": "Αρνητικό", - "grammarCopyNUMTYPEtot": "Σύνολο", - "grammarCopyADVTYPEadnomial": "Επιθετικός", - "grammarCopyASPECTprog": "Προοδευτικό", - "grammarCopyMOODsub": "Υποτακτική", - "grammarCopyVERBFORMcomplementive": "Συμπληρωματική", - "grammarCopyCASEnom": "Ονομαστική", - "grammarCopyTENSEfut": "Μέλλοντας", - "grammarCopyCASEdat": "Δοτική", - "grammarCopyTENSEpres": "Ενεστώτας", - "grammarCopyGENDERneut": "Ουδέτερο", - "grammarCopyPRONTYPErel": "Σχετικός", - "grammarCopyVERBFORMfinalEnding": "Τελευταία κατάληξη", - "grammarCopyPRONTYPEdem": "Δεικτικός", - "grammarCopyPREPCASEpre": "Προθετική", - "grammarCopyVERBFORMfin": "Οριστική", - "grammarCopyDEGREEpos": "Θετικό", - "grammarCopyPUNCTTYPEquot": "Παραθέματα", - "grammarCopyVERBFORMger": "Γερουνδικό", - "grammarCopyVOICEpass": "Παθητική", - "grammarCopyCASEgen": "Γενική", - "grammarCopyTENSEprs": "Ενεστώτας", - "grammarCopyDEFINITEdef": "Οριστική", - "grammarCopyNUMTYPEord": "Τακτική", - "grammarCopyCASEins": "Όργανο", - "grammarCopyVERBFORMinf": "Απαρέμφατο", - "grammarCopyVERBFORMaux": "Βοηθητικό", - "grammarCopyNUMFORMlong": "Μακρύ", - "grammarCopyCASEloc": "Τοπική", - "grammarCopyMOODind": "Εγκλιτική", - "grammarCopyDEGREEcmp": "Συγκριτική", - "grammarCopyCASErelativeCase": "Σχετική", - "grammarCopyPUNCTTYPEexcl": "Ευφημιστική", - "grammarCopyPERSON1": "Πρώτο πρόσωπο", - "grammarCopyPUNCTSIDEini": "Αρχικό", - "grammarCopyGENDERperson": "Άτομο", - "grammarCopyFOREIGNyes": "Ξένη", - "grammarCopyVOICEvoice": "Φωνή", - "grammarCopyVERBTYPEverbType": "Ρήμα", - "grammarCopyPOSSpass": "Κτητική", - "grammarCopyPREPCASEprepCase": "Προθετικό", - "grammarCopyNUMTYPEnumType": "Αριθμητικό", - "grammarCopyNOUNTYPEnounType": "Ουσιαστικό", - "grammarCopyREFLEXreflex": "Ανακλαστικό", - "grammarCopyPRONTYPEpronType": "Αντωνυμία", - "grammarCopyPUNCTSIDEpunctSide": "Πλευρά Σημείωσης Στίξης", - "grammarCopyVERBFORMverbForm": "Ρήμα", - "grammarCopyGENDERgender": "Γένος", - "grammarCopyMOODmood": "Τρόπος", - "grammarCopyASPECTaspect": "Πλευρά", - "grammarCopyPUNCTTYPEpunctType": "Στίξη", - "grammarCopyTENSEtense": "Χρόνος", - "grammarCopyDEGREEdegree": "Βαθμός", - "grammarCopyPOLITEpolite": "Ευγένεια", - "grammarCopyADVTYPEadvType": "Επίρρημα", - "grammarCopyNUMFORMnumber": "Αριθμός", - "grammarCopyCONJTYPEconjType": "Σύνδεσμος", - "grammarCopyPOLARITYpolarity": "Πολικότητα", - "grammarCopyCASEcase": "Πτώση", - "grammarCopyDEFINITEdefinite": "Οριστικότητα", - "grammarCopyNUMFORMnumForm": "Αριθμητικό", - "grammarCopyPRONTYPEadn": "Επιθετικό", - "grammarCopyVOCvoc": "Κλητική", - "grammarCopyCMPLcmpl": "Συμπληρωματικός", - "grammarCopyADVadv": "Επιρρηματικός", - "grammarCopyMOODjus": "Επιτακτική", - "grammarCopyGENDERcom": "Κοινό", - "grammarCopyREFLEXrflx": "Ανακλαστικό", - "grammarCopyPARTTYPEpar": "Μερικό", - "grammarCopySPCspc": "Συγκεκριμένο", - "grammarCopyTENSEpqp": "Πλεορισμένο", - "grammarCopyREFLEXref": "Ανακλαστικό", - "grammarCopyPUNCTTYPEnshrt": "Σύντομο", - "grammarCopyNUMBERdual": "Διπλό", - "grammarCopyNUMFORMlng": "Μακρύ", - "grammarCopyVOICEmid": "Μεσαίο", - "grammarCopyINTRELintRel": "Ερωτηματικό, Σχετικό", - "grammarCopyINTint": "Ερωτηματικό", - "grammarCopyVOICEcaus": "Αιτιατικό", - "grammarCopyUnknown": "Άγνωστο", - "grammarCopyEVIDENTevident": "Επικυρωτική", - "grammarCopyNUMFORMnumberPsor": "Αριθμός Κατόχου", - "grammarCopyASPECThab": "Συνήθης", - "grammarCopyCASEabl": "Αποθετική", - "grammarCopyCASEall": "Πολλαπλασιαστική", - "grammarCopyCASEess": "Εξωτική", - "grammarCopyCASEtra": "Μεταβατική", - "grammarCopyCASEequ": "Ισοδύναμη", - "grammarCopyCASEdis": "Διανεμητική", - "grammarCopyCASEabs": "Απόλυτη", - "grammarCopyCASEerg": "Εργατική", - "grammarCopyCASEcau": "Αιτιακή", - "grammarCopyCASEben": "Ωφελική", - "grammarCopyCASEtem": "Χρονική", - "grammarCopyCONJTYPEcoord": "Συντονιστική", - "grammarCopyDEFINITEcons": "Κατασκευαστική Κατάσταση", - "grammarCopyDEGREEabs": "Απόλυτο Βαθμό", - "grammarCopyEVIDENTfh": "Πραγματική Επικυρωτικότητα", - "grammarCopyEVIDENTnfh": "Μη-πραγματική Επικυρωτικότητα", - "grammarCopyMOODopt": "Ευχή", - "grammarCopyMOODadm": "Επιτιμητικό", - "grammarCopyMOODdes": "Επιθυμητικό", - "grammarCopyMOODnec": "Αναγκαστικό", - "grammarCopyMOODpot": "Δυναμικό", - "grammarCopyMOODprp": "Προτατικό", - "grammarCopyMOODqot": "Παραθετικό", - "grammarCopyNUMFORMword": "Μορφή Λέξης", - "grammarCopyNUMFORMroman": "Ρωμαϊκό Αριθμητικό", - "grammarCopyNUMFORMletter": "Μορφή Γράμματος", - "grammarCopyNUMTYPEmult": "Πολλαπλασιαστικό", - "grammarCopyNUMTYPEfrac": "Κλασματικό", - "grammarCopyNUMTYPEsets": "Σετ", - "grammarCopyNUMTYPErange": "Εύρος", - "grammarCopyNUMTYPEdist": "Διανεμητικό", - "grammarCopyNUMBERtri": "Δοκιμαστικό", - "grammarCopyNUMBERpauc": "Ποακού", - "grammarCopyNUMBERgrpa": "Μεγαλύτερο Ποακού", - "grammarCopyNUMBERgrpl": "Μεγαλύτερο Πληθυντικό", - "grammarCopyNUMBERinv": "Αντίστροφο", - "grammarCopyPERSON0": "Μηδέν", - "grammarCopyPERSON4": "Τέταρτος", - "grammarCopyPOLITEform": "Επίσημο", - "grammarCopyPOLITEelev": "Αυξημένο", - "grammarCopyPOLITEhumb": "Ταπεινό", - "grammarCopyPRONTYPEemp": "Διεισδυτικό", - "grammarCopyPRONTYPEexc": "Ερωτηματικό", - "grammarCopyPRONTYPErcp": "Ανταποδοτικό", - "grammarCopyPRONTYPEintRelPronType": "Ερωτηματικό-Σχετικό", - "grammarCopyTENSEaor": "Αόριστος", - "grammarCopyTENSEeps": "Επιδεξιωματικός", - "grammarCopyTENSEprosp": "Προοπτικός", - "grammarCopyVERBFORMpart": "Μέρος", - "grammarCopyVERBFORMconv": "Συνεκδοχή", - "grammarCopyVERBFORMvnoun": "Ρηματικό Ουσιαστικό", - "grammarCopyVOICEantip": "Αντιπαραθετικός", - "grammarCopyVOICEcauVoice": "Αιτιατική", - "grammarCopyVOICedir": "Άμεσος", - "grammarCopyVOICEinvVoice": "Αντίστροφος", - "grammarCopyVOICErcpVoice": "Ανταποδοτικός", - "grammarCopyPOS": "Μέρος του Λόγου", - "grammarCopyGENDER": "Γένος", - "grammarCopyPERSON": "Άτομο", - "grammarCopyMOOD": "Τρόπος", - "grammarCopyPUNCTTYPE": "Τύπος Σημείωσης", - "grammarCopyASPECT": "Πλευρά", - "grammarCopyCASE": "Πτώση", - "grammarCopyVOICE": "Φωνή", - "grammarCopyNOUNTYPE": "Τύπος Ουσιαστικού", - "grammarCopyVERBTYPE": "Τύπος Ρήματος", - "grammarCopyADVTYPE": "Τύπος Επιρρήματος", - "grammarCopyNUMFORM": "Μορφή Αριθμού", - "grammarCopyNUMTYPE": "Τύπος Αριθμού", - "grammarCopyNUMBER": "Αριθμός", - "grammarCopyDEFINITE": "Οριστικότητα", - "grammarCopyDEGREE": "Βαθμός", - "grammarCopyEVIDENT": "Ενδεικτικότητα", - "grammarCopyFOREIGN": "Ξένο", - "grammarCopyPOLARITY": "Πολικότητα", - "grammarCopyPOLITE": "Ευγένεια", - "grammarCopyPREPCASE": "Προθετική Πτώση", - "grammarCopyPRONTYPE": "Τύπος Αντωνυμίας", - "grammarCopyPUNCTSIDE": "Πλευρά Σημείωσης Στίξης", - "grammarCopyREFLEX": "Ανακλαστική", - "grammarCopyTENSE": "Χρόνος", - "grammarCopyVERBFORM": "Μορφή Ρήματος", - "grammarCopyCONJTYPE": "Τύπος Συνδέσμου", - "grammarCopySPC": "Ειδικότητα", - "grammarCopyPARTTYPE": "Τύπος Μερισμού", - "grammarCopyINTREL": "Ερωτηματική-Σχετική", - "grammarCopyUNKNOWN": "Άγνωστο", - "grammarCopyNUMBERPSOR": "Αριθμός Κυριότητας", - "grammarCopyPOSS": "Κτητική", - "grammarCopyASPECTimp": "Ατελής Όψη", - "grammarCopyCASEvoc": "Κλητική", - "grammarCopyCASEcom": "Κοινοτική", - "grammarCopyCASEpar": "Μεριστική", - "grammarCopyCASEadv": "Επιρρηματική", - "grammarCopyCASEref": "Αναφορική", - "grammarCopyCASErel": "Σχετική", - "grammarCopyCASEsub": "Υποθετική", - "grammarCopyCASEsup": "Υπερεστιακή", - "grammarCopyCASEaccdat": "Αιτιατική-Δοτική", - "grammarCopyCASEpre": "Προθετική", - "grammarCopyCONJTYPEsub": "Υποτακτική", - "grammarCopyCONJTYPEcmp": "Συγκριτική", - "grammarCopyDEFINITEind": "Αόριστη", - "grammarCopyMOODint": "Ερωτηματική Έννοια", - "grammarCopyNOUNTYPEcomm": "Κοινό Ουσιαστικό", - "grammarCopyNUMBERPSORsing": "Ενικός του Κατόχου", - "grammarCopyNUMBERPSORplur": "Πληθυντικός του Κατόχου", - "grammarCopyNUMBERPSORdual": "Διπλός του Κατόχου", - "grammarCopyPOLARITYpos": "Θετική Πολικότητα", - "grammarCopyPOSSyes": "Κτητική", - "grammarCopyPREPCASEnpr": "Μη-προθετική", - "grammarCopyPRONTYPEprs": "Προσωπική", - "grammarCopyPRONTYPEint": "Ερωτηματική", - "grammarCopyPRONTYPEtot": "Ολική", - "grammarCopyPRONTYPEneg": "Αρνητική", - "grammarCopyPRONTYPEart": "Άρθρο", - "grammarCopyPRONTYPEind": "Αόριστος", - "grammarCopyPRONTYPEintrel": "Ερωτηματικός-Σχετικός", - "grammarCopyPUNCTSIDEfin": "Τελευταίο Στίξη", - "grammarCopyPUNCTTYPEperi": "Τελεία", - "grammarCopyREFLEXyes": "Ανακλαστικό", - "grammarCopyTENSEimp": "Παρατατικός", - "grammarCopyVERBFORMsup": "Υπερσυντέλικος", - "grammarCopyVERBFORMadn": "Επιθετικός", - "grammarCopyVERBFORMlng": "Μακρύς", - "grammarCopyVERBFORMshrt": "Βραχύς", - "grammarCopyVERBTYPEcaus": "Αιτιατικό Ρήμα", - "grammarCopyVOICEcau": "Αιτιατική", - "grammarCopyVOICEdir": "Άμεση", - "grammarCopyVOICEinv": "Αντίστροφη", - "grammarCopyVOICErcp": "Αμοιβαία", - "other": "Άλλο", - "levelShort": "ΕΠΙΠΕΔΟ {level}", - "clickBestOption": "Επιλέξτε τις καλύτερες επιλογές για να μεταφράσετε το μήνυμά σας!", - "completeActivitiesToUnlock": "Ολοκληρώστε τουλάχιστον μια δραστηριότητα για να ξεκλειδώσετε τη μετάφραση!", - "noCapacityLimit": "Χωρίς όριο χωρητικότητας", - "downloadGroupText": "Λήψη κειμένου ομάδας", - "notificationsOn": "Ειδοποιήσεις ενεργές", - "notificationsOff": "Ειδοποιήσεις απενεργοποιημένες", - "createChatAndInviteUsers": "Δημιουργία συνομιλίας και πρόσκληση χρηστών", - "updatedNewSpaceDescription": "Τα μαθήματα σας επιτρέπουν να ενοποιήσετε τις συνομιλίες σας και να δημιουργήσετε ιδιωτικές ή δημόσιες κοινότητες.", - "joinWithCode": "Συμμετοχή με κωδικό", - "enterCodeToJoin": "Εισάγετε κωδικό για να συμμετάσχετε", - "updateNow": "Ενημέρωση τώρα", - "updateLater": "Αργότερα", - "constructUseWaDesc": "Χρησιμοποιείται χωρίς βοήθεια", - "constructUseGaDesc": "Βοήθεια γραμματικής", - "constructUseTaDesc": "Βοήθεια μετάφρασης", - "constructUseUnkDesc": "Άγνωστο", - "constructUseCorITDesc": "Ορθό στη μετάφραση", - "constructUseIgnITDesc": "Παραβλέπεται στη μετάφραση", - "constructUseIncITDesc": "Λάθος στη μετάφραση", - "constructUseIgnIGCDesc": "Παραβλέπεται στη διόρθωση γραμματικής", - "constructUseCorIGCDesc": "Ορθό στη διόρθωση γραμματικής", - "constructUseIncIGCDesc": "Λάθος στη διόρθωση γραμματικής", - "constructUseCorPADesc": "Ορθό στη δραστηριότητα σημασίας λέξης", - "constructUseIgnPADesc": "Παραβλέπεται στη δραστηριότητα σημασίας λέξης", - "constructUseIncPADesc": "Λάθος στη δραστηριότητα σημασίας λέξης", - "constructUseCorWLDesc": "Ορθό στη δραστηριότητα ακρόασης λέξης", - "constructUseIncWLDesc": "Λάθος στη δραστηριότητα ακρόασης λέξης", - "constructUseIngWLDesc": "Παραβλέπεται στη δραστηριότητα ακρόασης λέξης", - "constructUseCorHWLDesc": "Ορθό στη δραστηριότητα κρυφής λέξης", - "constructUseIncHWLDesc": "Λάθος στην κρυφή δραστηριότητα λέξης", - "constructUseIgnHWLDesc": "Αγνοήθηκε στην κρυφή δραστηριότητα λέξης", - "constructUseCorLDesc": "Σωστό στην δραστηριότητα λήμματος", - "constructUseIncLDesc": "Λάθος στην δραστηριότητα λήμματος", - "constructUseIgnLDesc": "Αγνοήθηκε στην δραστηριότητα λήμματος", - "constructUseCorMDesc": "Σωστό στην δραστηριότητα γραμματικής", - "constructUseIncMDesc": "Λάθος στην δραστηριότητα γραμματικής", - "constructUseIgnMDesc": "Αγνοήθηκε στην δραστηριότητα γραμματικής", - "constructUseEmojiDesc": "Σωστό στην δραστηριότητα emoji", - "constructUseCollected": "Συλλέχθηκε στη συνομιλία", - "constructUseNanDesc": "Μη εφαρμόσιμο", - "xpIntoLevel": "{currentXP} / {maxXP} Πόντοι XP", - "enableTTSToolName": "Ενεργοποιημένη φωνητική ανάγνωση κειμένου", - "enableTTSToolDescription": "Επιτρέψτε στην εφαρμογή να παράγει έξοδο φωνητικής ανάγνωσης για τμήματα κειμένου στη γλώσσα στόχο σας.", - "yourUsername": "Το όνομα χρήστη σας", - "yourEmail": "Το email σας", - "iWantToLearn": "Θέλω να μάθω", - "pleaseEnterEmail": "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση email.", - "myBaseLanguage": "Η βασική μου γλώσσα", - "meaningSectionHeader": "Νόημα:", - "formSectionHeader": "Μορφές που χρησιμοποιούνται στα chat:", - "writingExercisesTooltip": "Γράψιμο", - "listeningExercisesTooltip": "Ακρόαση", - "readingExercisesTooltip": "Ανάγνωση", - "meaningNotFound": "Δεν ήταν δυνατή η εύρεση του νοήματος.", - "chooseBaseForm": "Επιλέξτε τη βασική μορφή", - "notTheCodeError": "Λυπούμαστε, αυτό δεν είναι ο κώδικας!", - "totalXP": "Συνολικά XP", - "numLemmas": "Συνολικός αριθμός λημμάτων", - "numLemmasUsedCorrectly": "Αριθμός λημμάτων που χρησιμοποιήθηκαν σωστά τουλάχιστον μία φορά", - "numLemmasUsedIncorrectly": "Αριθμός λημμάτων που χρησιμοποιήθηκαν σωστά 0 φορές", - "numLemmasSmallXP": "Αριθμός λημμάτων με 0 - 30 XP", - "numLemmasMediumXP": "Αριθμός λημμάτων με 31 - 200 XP", - "numLemmasLargeXP": "Αριθμός λημμάτων με > 200 XP", - "numGrammarConcepts": "Αριθμός γραμματικών εννοιών", - "listGrammarConcepts": "Γραμματικές έννοιες", - "listGrammarConceptsUsedCorrectly": "Γραμματικές έννοιες που χρησιμοποιήθηκαν σωστά σε αρχικά μηνύματα τουλάχιστον το 80% του χρόνου", - "listGrammarConceptsUsedIncorrectly": "Γραμματικές έννοιες που χρησιμοποιήθηκαν σωστά σε αρχικά μηνύματα λιγότερο από το 80% του χρόνου", - "listGrammarConceptsUseCorrectlySystemGenerated": "Γραμματικές έννοιες που επιλέχθηκαν σωστά από προτάσεις συστήματος τουλάχιστον το 80% του χρόνου", - "listGrammarConceptsUseIncorrectlySystemGenerated": "Γραμματικές έννοιες που επιλέχθηκαν σωστά από προτάσεις συστήματος λιγότερο από το 80% του χρόνου", - "listGrammarConceptsSmallXP": "Γλωσσικά concepts με 0-50 XP", - "listGrammarConceptsMediumXP": "Γλωσσικά concepts με 51-200 XP", - "listGrammarConceptsLargeXP": "Γλωσσικά concepts 201-500 XP", - "listGrammarConceptsHugeXP": "Γλωσσικά concepts >500 XP", - "numMessagesSent": "Αριθμός αποστελλόμενων μηνυμάτων", - "numWordsTyped": "Αριθμός πληκτρολογημένων λέξεων στα αρχικά μηνύματα", - "numCorrectChoices": "Αριθμός σωστών λέξεων που επιλέχθηκαν από προτάσεις συστήματος", - "numIncorrectChoices": "Αριθμός λανθασμένων λέξεων που επιλέχθηκαν από προτάσεις συστήματος", - "commaSeparatedFile": "CSV", - "excelFile": "Excel", - "fileType": "Τύπος αρχείου", - "download": "Λήψη", - "analyticsNotAvailable": "Ανάλυση χρήστη δεν διατίθεται", - "downloading": "Λήψη σε εξέλιξη...", - "failedFetchUserAnalytics": "Αποτυχία λήψης ανάλυσης χρήστη", - "downloadComplete": "Η λήψη ολοκληρώθηκε!", - "whatIsTheMorphTag": "Τι είναι το {morphologicalFeature} του '{wordForm}'?", - "dataAvailable": "Διαθεσιμότητα δεδομένων", - "available": "Διαθέσιμο", - "pangeaBotIsFallible": "Ο Pangea Bot κάνει και λάθη!", - "whatIsMeaning": "Τι σημαίνει το '{lemma}'?", - "pickAnEmoji": "Ποιο είναι το αγαπημένο σου emoji για το '{lemma}'?", - "chooseLemmaMeaningInstructionsBody": "Ταιριάξτε τις σημασίες με τις λέξεις στο μήνυμα!", - "doubleClickToEdit": "Διπλό κλικ για επεξεργασία.", - "activityPlannerTitle": "Προγραμματιστής Δραστηριοτήτων", - "topicLabel": "Θέμα", - "topicPlaceholder": "Επιλέξτε ένα θέμα...", - "modeLabel": "Τύπος δραστηριότητας", - "modePlaceholder": "Επιλέξτε μια λειτουργία...", - "learningObjectiveLabel": "Στόχος μάθησης", - "learningObjectivePlaceholder": "Επιλέξτε στόχο μάθησης...", - "languageOfInstructionsLabel": "Γλώσσα οδηγιών δραστηριότητας", - "targetLanguageLabel": "Στόχος γλώσσα", - "cefrLevelLabel": "Επίπεδο CEFR", - "generateActivitiesButton": "Δημιουργία Δραστηριότητας", - "launchActivityButton": "Έναρξη Δραστηριότητας", - "image": "Εικόνα", - "video": "Βίντεο", - "nan": "Μη εφαρμόσιμο", - "activityPlannerOverviewInstructionsBody": "Επιλέξτε ένα θέμα, τρόπο, μαθησιακό στόχο και δημιουργήστε μια δραστηριότητα για τη συνομιλία!", - "activityTitle": "Τίτλος Δραστηριότητας", - "addVocabulary": "Προσθήκη λεξιλογίου", - "instructions": "Οδηγίες", - "numberOfLearners": "Αριθμός μαθητών", - "mustBeInteger": "Πρέπει να είναι ακέραιος π.χ. 1, 2, 3, ...", - "constructUsePvmDesc": "Παράγεται σε φωνητικό μήνυμα", - "leaveSpaceDescription": "Αφήνοντας το μάθημα, θα αφήσετε όλες τις συνομιλίες μέσα σε αυτό. Οι άλλοι χρήστες θα δουν ότι έχετε φύγει από το μάθημα.", - "constructUseCorMmDesc": "Ορθό μήνυμα σημασίας", - "constructUseIncMmDesc": "Λάθος μήνυμα σημασίας", - "constructUseIgnMmDesc": "Αγνοημένο μήνυμα σημασίας", - "clickForMeaningActivity": "Κάντε κλικ εδώ για μια Πρόκληση Νοήματος", - "meaning": "Νόημα", - "chatWith": "Ομάδα με {displayname}", - "clickOnEmailLink": "Παρακαλώ κάντε κλικ στον σύνδεσμο στο email και συνεχίστε.\n\nΕλέγξτε τον φάκελο spam αν το email δεν έχει φτάσει.", - "dontForgetPassword": "Μην ξεχάσετε τον κωδικό πρόσβασής σας!", - "enableAutocorrectToolName": "Ενεργοποίηση αυτόματης διόρθωσης συσκευής", - "enableAutocorrectDescription": "Αν η συσκευή σας υποστηρίζει τη γλώσσα που μαθαίνετε, μπορείτε να ενεργοποιήσετε την αυτόματη διόρθωση για να διορθώνει κοινά λάθη καθώς πληκτρολογείτε.", - "ttsDisbledTitle": "Η φωνητική ανάγνωση απενεργοποιήθηκε", - "ttsDisabledBody": "Μπορείτε να ενεργοποιήσετε τη φωνητική ανάγνωση στις ρυθμίσεις εκμάθησης", - "noSpaceDescriptionYet": "Δεν έχει δημιουργηθεί ακόμη περιγραφή μαθήματος.", - "tooLargeToSend": "Αυτό το μήνυμα είναι πολύ μεγάλο για αποστολή", - "exitWithoutSaving": "Είστε βέβαιοι ότι θέλετε να φύγετε χωρίς να αποθηκεύσετε;", - "enableAutocorrectPopupTitle": "Προσθέστε το πληκτρολόγιο της γλώσσας στόχου πηγαίνοντας στα:", - "enableAutocorrectPopupSteps": " • Ρυθμίσεις\n • Γενικά\n • Πληκτρολόγιο\n • Πληκτρολόγια\n • Προσθήκη νέου πληκτρολογίου", - "enableAutocorrectPopupDescription": "Μόλις επιλεγεί η γλώσσα, μπορείτε να κάνετε κλικ στο μικρό εικονίδιο του κόσμου στο κάτω αριστερό μέρος του πληκτρολογίου σας για να ενεργοποιήσετε το νέο εγκατεστημένο πληκτρολόγιο.", - "downloadGboardTitle": "Κατεβάστε το Gboard από το Google Play Store για να ενεργοποιήσετε την αυτόματη διόρθωση και άλλες λειτουργίες πληκτρολογίου:", - "downloadGboardSteps": " • Κατεβάστε το Gboard\n • Ανοίξτε την εφαρμογή\n • Γλώσσες\n • Προσθήκη πληκτρολογίου\n • Επιλογή γλώσσας\n • Επιλογή τύπου πληκτρολογίου\n • Τέλος", - "downloadGboardDescription": "Μόλις επιλεγεί η γλώσσα, μπορείτε να κάνετε κλικ στο μικρό εικονίδιο του κόσμου στο κάτω αριστερό μέρος του πληκτρολογίου σας για να ενεργοποιήσετε το νέο εγκατεστημένο πληκτρολόγιο.", - "enableAutocorrectWarning": "Προειδοποίηση! Απαιτείται η προσθήκη του πληκτρολογίου της γλώσσας στόχου", - "displayName": "Εμφανιζόμενο όνομα", - "leaveRoomDescription": "Πρόκειται να φύγετε από αυτήν τη συνομιλία. Οι άλλοι χρήστες θα δουν ότι έχετε φύγει.", - "confirmUserId": "Παρακαλούμε επιβεβαιώστε το όνομα χρήστη Pangea Chat για να διαγράψετε τον λογαριασμό σας.", - "startingToday": "Από σήμερα", - "oneWeekFreeTrial": "Μια εβδομάδα δωρεάν δοκιμής", - "paidSubscriptionStarts": "Ξεκινάει {startDate}", - "cancelInSubscriptionSettings": "• Ακύρωση οποιαδήποτε στιγμή στις ρυθμίσεις συνδρομής", - "cancelToAvoidCharges": "• Ακύρωση πριν από {trialEnds} για να αποφύγετε χρεώσεις", - "downloadGboard": "Κατεβάστε το Gboard", - "autocorrectNotAvailable": "Δυστυχώς, η πλατφόρμα σας δεν υποστηρίζεται αυτήν τη στιγμή για αυτήν τη λειτουργία. Μείνετε συντονισμένοι για περαιτέρω ανάπτυξη!", - "pleaseUpdateApp": "Παρακαλούμε ενημερώστε την εφαρμογή για να συνεχίσετε.", - "chooseEmojiInstructionsBody": "Ταιριάξτε emojis με τις λέξεις που καλύτερα αντιπροσωπεύουν. Μην ανησυχείτε! Δεν θα χάσετε πόντους αν διαφωνείτε. 😅", - "analyticsVocabListBody": "Αυτή είναι όλη η λεξιλογική σας λίστα! Καθώς κερδίζετε XP για κάθε λέξη, θα μετατρέπονται από σπορά σε πλήρη άνθιση. Κάντε κλικ σε οποιαδήποτε λέξη για περισσότερες λεπτομέρειες.", - "morphAnalyticsListBody": "Αυτές είναι όλες οι γραμματικές έννοιες στη γλώσσα που μαθαίνετε! Θα τις ξεκλειδώσετε καθώς τις συναντάτε κατά τη διάρκεια της συνομιλίας. Κάντε κλικ για λεπτομέρειες.", - "knockSpaceSuccess": "Έχετε ζητήσει να συμμετάσχετε σε αυτό το μάθημα! Ένας διαχειριστής θα απαντήσει στο αίτημά σας μόλις το λάβει 😀", - "chooseWordAudioInstructionsBody": "Ακούστε το πλήρες μήνυμα. Στη συνέχεια, ταιριάξτε τα ηχητικά με τις λέξεις.", - "chooseMorphsInstructionsBody": "Κάντε κλικ στα κομμάτια παζλ για γραμματικές ερωτήσεις!", - "pleaseEnterInt": "Παρακαλούμε εισάγετε έναν αριθμό", - "home": "Αρχική", - "join": "Συμμετοχή", - "readingAssistanceOverviewBody": "Κάντε κλικ στα κουμπιά παρακάτω για mini-games με αντιστοίχιση emoji, ήχων, σημασιών λέξεων και γραμματικών εννοιών. Ή κάντε κλικ σε οποιαδήποτε λέξη για λεπτομέρειες.", - "levelSummaryPopupTitle": "Περίληψη Επιπέδου {level}", - "resetInstructionTooltipsTitle": "Επαναφορά οδηγιών βοήθειας", - "resetInstructionTooltipsDesc": "Κάντε κλικ για να εμφανίσετε ξανά τις οδηγίες βοήθειας, όπως για έναν ολοκαίνουργιο χρήστη.", - "selectForGrammar": "Επιλέξτε ένα εικονίδιο γραμματικής για δραστηριότητες και λεπτομέρειες.", - "randomize": "Τυχαία επιλογή", - "clear": "Καθαρισμός", - "makeYourOwnActivity": "Δημιουργήστε τη δική σας δραστηριότητα", - "featuredActivities": "Προτεινόμενες", - "save": "Αποθήκευση", - "startChat": "Ξεκίνα μια συνομιλία", - "translationProblem": "Πρόβλημα μετάφρασης", - "askToJoin": "Ζήτησε να συμμετάσχεις", - "emptyChatWarningTitle": "Η συνομιλία είναι κενή", - "emptyChatWarningDesc": "Δεν έχεις προσκαλέσει κανέναν στη συνομιλία σου. Πήγαινε στις ρυθμίσεις συνομιλίας για να προσκαλέσεις τις επαφές σου ή το Bot. Μπορείς επίσης να το κάνεις αργότερα.", - "areYouLikeMe": "Είσαι σαν εμένα;", - "tryAgainLater": "Πολλές προσπάθειες. Παρακαλώ δοκίμασε ξανά σε 5 λεπτά.", - "enterSpaceCode": "Εισάγετε τον κωδικό μαθήματος", - "shareSpaceLink": "Μοιράσου τον σύνδεσμο", - "byUsingPangeaChat": "Χρησιμοποιώντας το Pangea Chat, συμφωνώ με το ", - "details": "Λεπτομέρειες", - "languageLevelPreA1Desc": "Ποτέ δεν έμαθα ή χρησιμοποίησα τη γλώσσα.", - "languageLevelA1Desc": "Μπορώ να καταλάβω και να χρησιμοποιήσω μερικές οικείες καθημερινές εκφράσεις και πολύ βασικές φράσεις.", - "languageLevelA2Desc": "Μπορώ να καταλάβω προτάσεις και συχνά χρησιμοποιούμενες εκφράσεις που σχετίζονται με περιοχές άμεσης σημασίας.", - "languageLevelB1Desc": "Μπορώ να αντιμετωπίσω τις περισσότερες οικείες καταστάσεις και μπορώ να παράγω απλό συνδεδεμένο κείμενο σε οικεία θέματα.", - "languageLevelB2Desc": "Μπορώ να καταλάβω τις κύριες ιδέες σύνθετων κειμένων και να αλληλεπιδράσω με βαθμό ευφράδειας και αυθορμητισμού.", - "languageLevelC1Desc": "Μπορώ να εκφράσω ιδέες με ευφράδεια και αυθορμητισμό χωρίς μεγάλη δυσκολία και να καταλάβω ένα ευρύ φάσμα απαιτητικών κειμένων.", - "languageLevelC2Desc": "Μπορώ να καταλάβω σχεδόν τα πάντα που ακούω ή διαβάζω και να εκφράζομαι με ευφράδεια και ακρίβεια.", - "newVocab": "Νέες λέξεις", - "newGrammar": "Νέες γραμματικές έννοιες", - "choosePracticeMode": "Κάνε κλικ σε μία από τις παραπάνω επιλογές για να ξεκινήσεις μια δραστηριότητα εξάσκησης", - "ban": "Απαγόρευση", - "unban": "Άρση απαγόρευσης", - "kick": "Απομάκρυνση", - "lemma": "Λήμμα", - "grammarFeature": "Χαρακτηριστικό γραμματικής", - "grammarTag": "Ετικέτα γραμματικής", - "forms": "Μορφές", - "exampleMessages": "Παραδείγματα μηνυμάτων", - "timesUsedIndependently": "Χρησιμοποιήθηκε αυτόνομα", - "timesUsedWithAssistance": "Χρησιμοποιήθηκε με βοήθεια", - "shareInviteCode": "Μοιραστείτε τον κωδικό πρόσκλησης: {code}", - "leaderboard": "Κατάταξη", - "skipForNow": "Παραλείψτε προς το παρόν", - "permissions": "Άδειες", - "spaceChildPermission": "Ποιος μπορεί να προσθέσει νέες συνομιλίες σε αυτό το μάθημα", - "addEnvironmentOverride": "Προσθήκη παραμέτρου περιβάλλοντος", - "defaultOption": "Προεπιλογή", - "deleteChatDesc": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτήν τη συνομιλία; Θα διαγραφεί για όλους τους συμμετέχοντες και όλα τα μηνύματα μέσα στη συνομιλία δεν θα είναι πλέον διαθέσιμα για πρακτική ή αναλυτικά δεδομένα μάθησης.", - "deleteSpaceDesc": "Το μάθημα και οποιεσδήποτε επιλεγμένες συνομιλίες θα διαγραφούν για όλους τους συμμετέχοντες και όλα τα μηνύματα μέσα στη συνομιλία δεν θα είναι πλέον διαθέσιμα για πρακτική ή αναλυτικά δεδομένα μάθησης. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.", - "launch": "Έναρξη", - "searchChats": "Αναζήτηση συνομιλιών", - "maxFifty": "Μέγιστο 50", - "configureSpace": "Διαμόρφωση μαθήματος", - "pinMessages": "Καρφιτσώστε μηνύματα", - "setJoinRules": "Ορίστε κανόνες συμμετοχής", - "changeGeneralSettings": "Αλλάξτε τις γενικές ρυθμίσεις", - "inviteOtherUsersToRoom": "Προσκαλέστε άλλους χρήστες", - "changeTheNameOfTheSpace": "Αλλάξτε το όνομα του μαθήματος", - "changeTheDescription": "Αλλάξτε την περιγραφή", - "changeThePermissions": "Αλλάξτε τα δικαιώματα", - "introductions": "Εισαγωγές", - "announcements": "Ανακοινώσεις", - "activities": "Δραστηριότητες", - "access": "Πρόσβαση", - "activitySuggestionTimeoutMessage": "Δουλεύουμε σκληρά για να δημιουργήσουμε περισσότερες δραστηριότητες για εσάς, παρακαλούμε ελέγξτε ξανά σε ένα λεπτό", - "howSpaceCanBeFound": "Πώς μπορεί να βρεθεί αυτό το μάθημα", - "private": "Ιδιωτικό", - "cannotBeFoundInSearch": "Δεν μπορεί να βρεθεί στην αναζήτηση", - "public": "Δημόσιο", - "visibleToCommunity": "Ορατό στην ευρύτερη κοινότητα Pangea Chat μέσω \"Βρες ένα μάθημα\"", - "howSpaceCanBeJoined": "Πώς μπορεί να ενταχθεί αυτό το μάθημα", - "canBeFoundVia": "Μπορεί να βρεθεί μέσω:", - "canBeFoundViaInvitation": "• πρόσκληση", - "canBeFoundViaCodeOrLink": "• κωδικός ή σύνδεσμος", - "canBeFoundViaKnock": "• αίτημα συμμετοχής και έγκριση διαχειριστή", - "youHaveLeveledUp": "Έχετε ανέβει επίπεδο!", - "sendActivities": "Αποστολή δραστηριοτήτων", - "groupChat": "Ομαδική Συνομιλία", - "directMessage": "Άμεσο μήνυμα", - "newDirectMessage": "Νέο άμεσο μήνυμα", - "speakingExercisesTooltip": "Ομιλία", - "noChatsFoundHereYet": "Δεν βρέθηκαν συνομιλίες εδώ ακόμα", - "duration": "Διάρκεια", - "transcriptionFailed": "Αποτυχία μεταγραφής ήχου", - "aUserIsKnocking": "Ένας χρήστης ζητά να συμμετάσχει στο μάθημά σας", - "usersAreKnocking": "{users} χρήστες ζητούν να συμμετάσχουν στο μάθημά σας", - "failedToFetchTranscription": "Αποτυχία λήψης μεταγραφής", - "deleteEmptySpaceDesc": "Το μάθημα θα διαγραφεί για όλους τους συμμετέχοντες. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.", - "regenerate": "Αναδημιουργία", - "mySavedActivities": "Αποθηκευμένες Δραστηριότητες μου", - "noSavedActivities": "Δεν υπάρχουν αποθηκευμένες δραστηριότητες", - "saveActivity": "Αποθήκευση αυτής της δραστηριότητας", - "failedToPlayVideo": "Αποτυχία αναπαραγωγής βίντεο", - "done": "Ολοκληρώθηκε", - "inThisSpace": "Σε αυτό το μάθημα", - "myContacts": "Οι επαφές μου", - "inviteAllInSpace": "Πρόσκληση όλων στο μάθημα", - "spaceParticipantsHaveBeenInvitedToTheChat": "Όλοι οι συμμετέχοντες στο μάθημα έχουν προσκληθεί στη συνομιλία", - "numKnocking": "{count} χτυπήματα", - "numInvited": "{count} προσκεκλημένοι", - "saved": "Αποθηκευμένο", - "reset": "Επαναφορά", - "errorGenerateActivityMessage": "Αποτυχία δημιουργίας δραστηριότητας", - "errorRegenerateActivityMessage": "Αποτυχία αναδημιουργίας δραστηριότητας", - "errorLaunchActivityMessage": "Αποτυχία εκκίνησης δραστηριότητας", - "errorFetchingActivitiesMessage": "Αποτυχία λήψης δραστηριοτήτων", - "errorFetchingDefinition": "Αποτυχία λήψης ορισμού", - "errorProcessAnalytics": "Αποτυχία επεξεργασίας αναλυτικών στοιχείων", - "errorDownloading": "Η λήψη απέτυχε", - "errorFetchingLevelSummary": "Αποτυχία λήψης περίληψης επιπέδου", - "errorLoadingSpaceChildren": "Αποτυχία φόρτωσης συνομιλιών εντός αυτού του μαθήματος", - "unexpectedError": "Απρόβλεπτο σφάλμα.", - "pleaseReload": "Παρακαλώ επαναφορτώστε και δοκιμάστε ξανά.", - "translationError": "Σφάλμα μετάφρασης", - "errorFetchingTranslation": "Αποτυχία λήψης μετάφρασης", - "errorFetchingActivity": "Αποτυχία λήψης δραστηριότητας", - "check": "Έλεγχος", - "unableToFindRoom": "Δεν βρέθηκε συνομιλία ή μάθημα με αυτόν τον κωδικό. Παρακαλώ δοκιμάστε ξανά.", - "numCompletedActivities": "Αριθμός ολοκληρωμένων δραστηριοτήτων", - "viewingAnalytics": "Προβολή {visible}/{users} Αναλύσεων", - "request": "Αίτημα", - "requestAll": "Ζήτηση Όλα", - "confirmMessageUnpin": "Είστε σίγουροι ότι θέλετε να αποσυνδέσετε αυτό το μήνυμα;", - "createActivityPlan": "Δημιουργία νέου σχεδίου δραστηριότητας", - "saveAndLaunch": "Αποθήκευση και Εκκίνηση", - "launchToSpace": "Εκκίνηση στην πορεία", - "numberOfActivities": "Αριθμός συνεδριών δραστηριότητας", - "maximumActivityParticipants": "Κάθε δραστηριότητα μπορεί να έχει το μέγιστο {count} συμμετέχοντα(ους).", - "pending": "Εκκρεμεί", - "inactive": "Ανενεργό", - "confirmRole": "Επιβεβαίωση ρόλου", - "openRoleLabel": "ΑΝΟΙΧΤΟ", - "joinedTheActivity": "👋 {username} συμμετείχε ως {role}", - "finishedTheActivity": "🎯 {username} ολοκλήρωσε αυτήν τη δραστηριότητα", - "archiveToAnalytics": "Προσθήκη στις Ολοκληρωμένες Δραστηριότητες μου", - "activitySummaryError": "Οι περιλήψεις δραστηριοτήτων δεν είναι διαθέσιμες", - "requestSummaries": "Αιτήματα περιλήψεων", - "generatingNewActivities": "Είστε ο πρώτος χρήστης αυτής της ζεύξης γλωσσών! Παρακαλούμε δώστε μας ένα λεπτό, ετοιμάζουμε δραστηριότητες αποκλειστικά για εσάς.", - "requestAccessTitle": "Ζητήστε πρόσβαση σε αναλύσεις;", - "requestAccessDesc": "Θα θέλατε να ζητήσετε πρόσβαση για να δείτε τα αναλυτικά στοιχεία των συμμετεχόντων;\n\nΑν οι συμμετέχοντες συμφωνήσουν, οι διαχειριστές αυτού του μαθήματος θα μπορούν να δουν:\n • συνολικό λεξιλόγιο\n • συνολικές γραμματικές έννοιες\n • συνολικές συνεδρίες δραστηριότητας που ολοκληρώθηκαν\n • τις συγκεκριμένες γραμματικές έννοιες που χρησιμοποιήθηκαν, σωστά και λανθασμένα\n\nΔεν θα μπορούν να δουν:\n • μηνύματα σε συνομιλίες εκτός του μαθήματος\n • λίστα λεξιλογίου", - "requestAccess": "Αίτηση πρόσβασης ({count})", - "analyticsInactiveTitle": "Οι αιτήσεις σε ανενεργούς χρήστες δεν μπορούν να σταλούν", - "analyticsInactiveDesc": "Οι ανενεργοί χρήστες που δεν έχουν συνδεθεί από τότε που εισήχθη αυτή η λειτουργία δεν θα δουν το αίτημά σας.\n\nΤο κουμπί Αίτημα θα εμφανιστεί μόλις επιστρέψουν. Μπορείτε να ξαναστείλετε το αίτημα αργότερα κάνοντας κλικ στο κουμπί Αίτημα κάτω από το όνομά τους όταν είναι διαθέσιμο.", - "accessRequestedTitle": "Αίτημα πρόσβασης στα αναλυτικά στοιχεία", - "accessRequestedDesc": "Ζητώντας admin(s): {admin} \n\nΟι διαχειριστές από το «{space}» ζητούν να δουν τις αναλύσεις μάθησής σας.\n\nΑν συμφωνείτε, θα μπορούν να δουν:\n • το συνολικό λεξιλόγιο\n • τις συνολικές έννοιες γραμματικής\n • τις συνολικές συνεδρίες δραστηριότητας που ολοκληρώθηκαν\n • τις συγκεκριμένες έννοιες γραμματικής που χρησιμοποιήθηκαν, σωστά και λανθασμένα\n\nΔεν θα μπορούν να δουν:\n • μηνύματα σε συνομιλίες εκτός του μαθήματος\n • τη λίστα λεξιλογίου", - "adminRequestedAccess": "Οι διαχειριστές ζήτησαν να δουν τα αναλυτικά σας στοιχεία.", - "lastUpdated": "Ενημερώθηκε\n{time}", - "activityFinishedMessage": "Όλα Ολοκληρώθηκαν!", - "endForAll": "Τέλος για όλους", - "newCourse": "Νέο μάθημα", - "numModules": "{num} ενότητες", - "coursePlan": "Πλάνο Μαθήματος", - "editCourseLater": "Μπορείτε να επεξεργαστείτε τον τίτλο, τις περιγραφές και την εικόνα του μαθήματος αργότερα.", - "createCourse": "Δημιουργία μαθήματος", - "stats": "Στατιστικά", - "createGroupChat": "Δημιουργία ομαδικής συνομιλίας", - "editCourse": "Επεξεργασία μαθήματος", - "inviteDesc": "Με όνομα χρήστη, με κωδικό ή σύνδεσμο", - "editCourseDesc": "Εδώ μπορείτε να επεξεργαστείτε τον τίτλο, την περιγραφή και άλλα στοιχεία του μαθήματος.", - "permissionsDesc": "Ορίστε δικαιώματα, όπως ποιος μπορεί να προσκαλεί χρήστες, να στέλνει μηνύματα, να δημιουργεί συνομιλίες κ.λπ.", - "accessDesc": "Μπορείτε να κάνετε το μάθημά σας ανοιχτό στον κόσμο! Ή, να το κρατήσετε ιδιωτικό και ασφαλές.", - "createGroupChatDesc": "Ενώ οι συνεδρίες δραστηριοτήτων ξεκινούν και τελειώνουν, οι ομαδικές συνομιλίες θα παραμένουν ανοιχτές για τακτική επικοινωνία.", - "deleteDesc": "Μόνο διαχειριστές μπορούν να διαγράψουν ένα μάθημα. Αυτή είναι μια καταστροφική ενέργεια που αφαιρεί όλους τους χρήστες και διαγράφει όλες τις επιλεγμένες συνομιλίες εντός του μαθήματος. Προχωρήστε με προσοχή.", - "noCourseFound": "Ωχ, αυτό το μάθημα χρειάζεται ένα πλάνο!\n\nΤα πλάνα μαθημάτων είναι μια σειρά θεμάτων και δραστηριοτήτων συζήτησης.", - "additionalParticipants": "+ {num} άλλοι", - "directMessages": "Άμεσες Μηνύσεις", - "whatNow": "Τι τώρα;", - "chooseNextActivity": "Επιλέξτε την επόμενη δραστηριότητά σας!", - "letsGo": "Πάμε", - "chooseRole": "Επιλέξτε ρόλο!", - "chooseRoleToParticipate": "Επιλέξτε ρόλο για συμμετοχή!", - "waitingToFillRole": "Αναμονή για συμπλήρωση {num} ρόλων...", - "pingParticipants": "Ειδοποιήστε τους συμμετέχοντες του μαθήματος", - "playWithBot": "Παίξτε με το Pangea Bot", - "inviteFriends": "Προσκαλέστε φίλους", - "waitNotDone": "Περίμενε, δεν έχω τελειώσει!", - "waitingForOthersToFinish": "Αναμονή για τους υπόλοιπους να τελειώσουν...", - "generatingSummary": "Ανάλυση συνομιλίας και δημιουργία αποτελεσμάτων", - "findCourse": "Βρείτε ένα μάθημα", - "pingParticipantsNotification": "{user} ψάχνει χρήστες να συμμετάσχουν στη συνεδρία δραστηριότητας στο {room}", - "course": "Μάθημα", - "courses": "Μαθήματα", - "courseName": "Όνομα μαθήματος", - "createNewCourse": "Νέο μάθημα", - "goToCourse": "Πήγαινε στο μάθημα: {course}", - "activityComplete": "Αυτή η δραστηριότητα έχει ολοκληρωθεί. Η περίληψη της δραστηριότητας θα πρέπει να είναι διαθέσιμη παρακάτω.", - "startNewSession": "Ξεκινήστε νέα συνεδρία", - "joinOpenSession": "Συμμετοχή σε ανοιχτή συνεδρία", - "less": "λιγότερο", - "activityNotFound": "Δεν βρέθηκε δραστηριότητα", - "levelUp": "Επίπεδο πάνω", - "myActivities": "Οι δραστηριότητές μου", - "openToJoin": "Ανοιχτό για συμμετοχή", - "results": "Αποτελέσματα", - "activityDone": "Ολοκληρώθηκε η δραστηριότητα!", - "promoCodeInfo": "Οι κωδικοί προώθησης μπορούν να εισαχθούν στη σελίδα που ακολουθεί", - "editsComingSoon": "Η δυνατότητα επεξεργασίας πόλεων και δραστηριοτήτων έρχεται σύντομα.", - "editing": "Επεξεργασία", - "activityNeedsOneMember": "Ωχ! Αυτή η δραστηριότητα χρειάζεται 1 ακόμη άτομο.", - "activityNeedsMembers": "Ωχ! Αυτή η δραστηριότητα χρειάζεται {num} ακόμη άτομα.", - "inviteFriendsToCourse": "Πρόσκληση φίλων στο μάθημά μου", - "subscribeToUnlockActivitySummaries": "Εγγραφή για ξεκλείδωμα περιλήψεων δραστηριοτήτων", - "subscribeToUnlockDefinitions": "Εγγραφή για ξεκλείδωμα ορισμών", - "subscribeToUnlockTranscriptions": "Εγγραφή για ξεκλείδωμα μεταγραφών", - "pingSent": "🔔 Η ειδοποίηση μαθήματος εστάλη! 🔔", - "courseTitle": "Τίτλος μαθήματος", - "courseDesc": "Περιγραφή μαθήματος", - "courseSavedSuccessfully": "Το μάθημα αποθηκεύτηκε με επιτυχία", - "addCoursePlan": "Προσθήκη σχεδίου μαθήματος", - "activityStatsButtonInstruction": "Κάντε κλικ εδώ για να δείτε τα στατιστικά της δραστηριότητάς σας και να κλείσετε τη δραστηριότητα όταν τελειώσετε", - "loginToAccount": "Συνδεθείτε στον λογαριασμό μου", - "appDescription": "Μάθε μια γλώσσα\nενώ στέλνεις μηνύματα στους φίλους σου.", - "languages": "Γλώσσες", - "chooseLanguage": "Επιλέξτε μια γλώσσα στόχου.", - "planTrip": "Προγραμματίστε το ταξίδι σας", - "howAreYouTraveling": "Πώς ταξιδεύετε;", - "unlockPrivateTrip": "Ξεκλειδώστε ένα ιδιωτικό ταξίδι", - "joinPublicTrip": "Συμμετάσχετε σε ένα δημόσιο ταξίδι", - "startOwnTrip": "Ξεκινήστε το δικό μου", - "tripPlanDesc": "Τα ταξίδια είναι μαθήματα. Κάθε ένα έχει 8-10 διαδοχικά θέματα με μια σειρά δραστηριοτήτων μάθησης γλώσσας με βάση τις εργασίες.", - "unlockPrivateTripTitle": "Ξεκλειδώστε ιδιωτικό ταξίδι", - "browsePublicTrips": "Περιηγηθείτε σε δημόσια ταξίδια", - "startOwnTripTitle": "Ξεκινήστε το δικό μου ταξίδι", - "courseCode": "Ποιος είναι ο μυστικός κωδικός;", - "courseCodeHint": "Κωδικός ή σύνδεσμος ταξιδιού", - "unlockMyTrip": "Ξεκλειδώστε το ταξίδι μου", - "signupOption": "Πώς θέλετε να εγγραφείτε;", - "withApple": "Με την Apple", - "withGoogle": "Με Google", - "withEmail": "Με Email", - "createAccount": "Δημιουργία λογαριασμού", - "loginWithEmail": "Σύνδεση με email", - "usernameOrEmail": "Όνομα χρήστη ή email", - "email": "Email", - "forgotPassword": "Ξεχάσατε τον κωδικό;", - "endActivity": "Τέλος δραστηριότητας", - "allLanguages": "Όλες οι γλώσσες", - "chatListTooltip": "Εδώ θα βρείτε τα άμεσα μηνύματά σας! Κάντε κλικ σε οποιονδήποτε avatar χρήστη και \"ξεκινήστε συνομιλία\" για να στείλετε ένα DM.", - "directMessageBotTitle": "Άμεσο μήνυμα Pangea Bot", - "feedbackTitle": "Ανατροφοδότηση δραστηριότητας", - "feedbackHint": "Η ανατροφοδότησή σας", - "feedbackButton": "Υποβολή ανατροφοδότησης", - "directMessageBotDesc": "Το να μιλάς με ανθρώπους είναι πιο διασκεδαστικό, αλλά... η ΤΝ είναι πάντα έτοιμη!", - "inviteYourFriends": "Προσκαλέστε τους φίλους σας", - "playWithAI": "Παίξτε με την Τεχνητή Νοημοσύνη προς το παρόν", - "courseStartDesc": "Ο Pangea Bot είναι έτοιμος να ξεκινήσει οποιαδήποτε στιγμή!\n\n...αλλά η μάθηση είναι καλύτερη με φίλους!", - "@@locale": "el", - "@@last_modified": "2026-02-05 10:10:14.390437", - "@checkList": { - "type": "String", - "placeholders": {} - }, - "@countInvited": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@globalChatId": { - "type": "String", - "placeholders": {} - }, - "@accessAndVisibility": { - "type": "String", - "placeholders": {} - }, - "@accessAndVisibilityDescription": { - "type": "String", - "placeholders": {} - }, - "@calls": { - "type": "String", - "placeholders": {} - }, - "@customEmojisAndStickers": { - "type": "String", - "placeholders": {} - }, - "@customEmojisAndStickersBody": { - "type": "String", - "placeholders": {} - }, - "@hideRedactedMessages": { - "type": "String", - "placeholders": {} - }, - "@hideRedactedMessagesBody": { - "type": "String", - "placeholders": {} - }, - "@hideInvalidOrUnknownMessageFormats": { - "type": "String", - "placeholders": {} - }, - "@block": { - "type": "String", - "placeholders": {} - }, - "@blockedUsers": { - "type": "String", - "placeholders": {} - }, - "@blockListDescription": { - "type": "String", - "placeholders": {} - }, - "@blockUsername": { - "type": "String", - "placeholders": {} - }, - "@hideMemberChangesInPublicChats": { - "type": "String", - "placeholders": {} - }, - "@hideMemberChangesInPublicChatsBody": { - "type": "String", - "placeholders": {} - }, - "@overview": { - "type": "String", - "placeholders": {} - }, - "@notifyMeFor": { - "type": "String", - "placeholders": {} - }, - "@passwordRecoverySettings": { - "type": "String", - "placeholders": {} - }, - "@sendImages": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, - "@presencesToggle": { - "type": "String", - "placeholders": {} - }, - "@synchronizingPleaseWaitCounter": { - "type": "String", - "placeholders": { - "percentage": { - "type": "String" - } - } - }, - "@youInvitedToBy": { - "type": "String", - "placeholders": { - "alias": { - "type": "String" - } - } - }, - "@invitedBy": { - "type": "String", - "placeholders": { - "user": { - "type": "String" - } - } - }, - "@usersMustKnock": { - "type": "String", - "placeholders": {} - }, - "@noOneCanJoin": { - "type": "String", - "placeholders": {} - }, - "@userWouldLikeToChangeTheChat": { - "type": "String", - "placeholders": { - "user": { - "type": "String" - } - } - }, - "@noPublicLinkHasBeenCreatedYet": { - "type": "String", - "placeholders": {} - }, - "@knock": { - "type": "String", - "placeholders": {} - }, - "@hidePresences": { - "type": "String", - "placeholders": {} - }, - "@yourGlobalUserIdIs": { - "type": "String", - "placeholders": {} - }, - "@noUsersFoundWithQuery": { - "type": "String", - "placeholders": { - "query": { - "type": "String" - } - } - }, - "@knocking": { - "type": "String", - "placeholders": {} - }, - "@chatCanBeDiscoveredViaSearchOnServer": { - "type": "String", - "placeholders": { - "server": { - "type": "String" - } - } - }, - "@searchChatsRooms": { - "type": "String", - "placeholders": {} - }, - "@nothingFound": { - "type": "String", - "placeholders": {} - }, - "@groupName": { - "type": "String", - "placeholders": {} - }, - "@createGroupAndInviteUsers": { - "type": "String", - "placeholders": {} - }, - "@groupCanBeFoundViaSearch": { - "type": "String", - "placeholders": {} - }, - "@wrongRecoveryKey": { - "type": "String", - "placeholders": {} - }, - "@startConversation": { - "type": "String", - "placeholders": {} - }, - "@commandHint_sendraw": { - "type": "String", - "placeholders": {} - }, - "@databaseMigrationTitle": { - "type": "String", - "placeholders": {} - }, - "@databaseMigrationBody": { - "type": "String", - "placeholders": {} - }, - "@leaveEmptyToClearStatus": { - "type": "String", - "placeholders": {} - }, - "@select": { - "type": "String", - "placeholders": {} - }, - "@searchForUsers": { - "type": "String", - "placeholders": {} - }, - "@pleaseEnterYourCurrentPassword": { - "type": "String", - "placeholders": {} - }, - "@newPassword": { - "type": "String", - "placeholders": {} - }, - "@pleaseChooseAStrongPassword": { - "type": "String", - "placeholders": {} - }, - "@passwordsDoNotMatch": { - "type": "String", - "placeholders": {} - }, - "@passwordIsWrong": { - "type": "String", - "placeholders": {} - }, - "@publicLink": { - "type": "String", - "placeholders": {} - }, - "@publicChatAddresses": { - "type": "String", - "placeholders": {} - }, - "@createNewAddress": { - "type": "String", - "placeholders": {} - }, - "@joinSpace": { - "type": "String", - "placeholders": {} - }, - "@publicSpaces": { - "type": "String", - "placeholders": {} - }, - "@addChatOrSubSpace": { - "type": "String", - "placeholders": {} - }, - "@subspace": { - "type": "String", - "placeholders": {} - }, - "@decline": { - "type": "String", - "placeholders": {} - }, - "@thisDevice": { - "type": "String", - "placeholders": {} - }, - "@initAppError": { - "type": "String", - "placeholders": {} - }, - "@userRole": { - "type": "String", - "placeholders": {} - }, - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, - "@searchIn": { - "type": "String", - "placeholders": { - "chat": { - "type": "String" - } - } - }, - "@searchMore": { - "type": "String", - "placeholders": {} - }, - "@gallery": { - "type": "String", - "placeholders": {} - }, - "@files": { - "type": "String", - "placeholders": {} - }, - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@enterSpace": { + "type": "String", + "placeholders": {} + }, + "@encryptThisChat": { + "type": "String", + "placeholders": {} + }, + "@fileName": { + "type": "String", + "placeholders": {} + }, + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "@previousAccount": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "@reopenChat": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterRecoveryKey": { + "type": "String", + "placeholders": {} + }, + "@create": { + "type": "String", + "placeholders": {} + }, + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@widgetNameError": { + "type": "String", + "placeholders": {} + }, + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@addToBundle": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@addWidget": { + "type": "String", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } }, - "error": { - "type": "String" + "type": "String" + }, + "@noKeyForThisMessage": { + "type": "String", + "placeholders": {} + }, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } } - } - }, - "@sessionLostBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@commandHint_markasgroup": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@hydrateTor": { + "type": "String", + "placeholders": {} + }, + "@pushNotificationsNotAvailable": { + "type": "String", + "placeholders": {} + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@storeInAppleKeyChain": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@hydrate": { + "type": "String", + "placeholders": {} + }, + "@invalidServerName": { + "type": "String", + "placeholders": {} + }, + "@chatPermissions": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "@sender": { + "type": "String", + "placeholders": {} + }, + "@storeInAndroidKeystore": { + "type": "String", + "placeholders": {} + }, + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "@online": { + "type": "String", + "placeholders": {} + }, + "@signInWithPassword": { + "type": "String", + "placeholders": {} + }, + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@offensive": { + "type": "String", + "placeholders": {} + }, + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "@makeAdminDescription": { + "type": "String", + "placeholders": {} + }, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@copy": { + "type": "String", + "placeholders": {} + }, + "@saveKeyManuallyDescription": { + "type": "String", + "placeholders": {} + }, + "@none": { + "type": "String", + "placeholders": {} + }, + "@editBundlesForAccount": { + "type": "String", + "placeholders": {} + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": { + "type": "String", + "placeholders": {} + }, + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@setChatDescription": { + "type": "String", + "placeholders": {} + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@dehydrateWarning": { + "type": "String", + "placeholders": {} + }, + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "@noOtherDevicesFound": { + "type": "String", + "placeholders": {} + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@storeSecurlyOnThisDevice": { + "type": "String", + "placeholders": {} + }, + "@yourChatBackupHasBeenSetUp": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@videoCallsBetaWarning": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "@username": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@homeserver": { + "type": "String", + "placeholders": {} + }, + "@help": { + "type": "String", + "placeholders": {} + }, + "@people": { + "type": "String", + "placeholders": {} + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@callingPermissions": { + "type": "String", + "placeholders": {} + }, + "@delete": { + "type": "String", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@readUpToHere": { + "type": "String", + "placeholders": {} + }, + "@start": { + "type": "String", + "placeholders": {} + }, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "@register": { + "type": "String", + "placeholders": {} + }, + "@unlockOldMessages": { + "type": "String", + "placeholders": {} + }, + "@identity": { + "type": "String", + "placeholders": {} + }, + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "@ignore": { + "type": "String", + "placeholders": {} + }, + "@recording": { + "type": "String", + "placeholders": {} + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@optionalRedactReason": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@dehydrate": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@sendAsText": { + "type": "String" + }, + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "@archiveRoomDescription": { + "type": "String", + "placeholders": {} + }, + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@placeCall": { + "type": "String", + "placeholders": {} + }, + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@experimentalVideoCalls": { + "type": "String", + "placeholders": {} + }, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterRecoveryKeyDescription": { + "type": "String", + "placeholders": {} + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroupQuestion": { + "type": "String", + "placeholders": { + "contact": {}, + "groupName": {} + } + }, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } }, - "error": { - "type": "String" + "type": "String" + }, + "@chat": { + "type": "String", + "placeholders": {} + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@appearOnTopDetails": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enterRoom": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@reportUser": { + "type": "String", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } } - } - }, - "@restoreSessionBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@confirmEventUnpin": { + "type": "String", + "placeholders": {} + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } }, - "error": { - "type": "String" + "type": "String" + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } } - } - }, - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } } - } - }, - "@sendReadReceipts": { - "type": "String", - "placeholders": {} - }, - "@sendTypingNotificationsDescription": { - "type": "String", - "placeholders": {} - }, - "@sendReadReceiptsDescription": { - "type": "String", - "placeholders": {} - }, - "@formattedMessages": { - "type": "String", - "placeholders": {} - }, - "@formattedMessagesDescription": { - "type": "String", - "placeholders": {} - }, - "@verifyOtherUser": { - "type": "String", - "placeholders": {} - }, - "@verifyOtherUserDescription": { - "type": "String", - "placeholders": {} - }, - "@verifyOtherDevice": { - "type": "String", - "placeholders": {} - }, - "@verifyOtherDeviceDescription": { - "type": "String", - "placeholders": {} - }, - "@acceptedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "@canceledKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "@completedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "@isReadyForKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "@requestedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "@startedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "@transparent": { - "type": "String", - "placeholders": {} - }, - "@incomingMessages": { - "type": "String", - "placeholders": {} - }, - "@stickers": { - "type": "String", - "placeholders": {} - }, - "@discover": { - "type": "String", - "placeholders": {} - }, - "@commandHint_ignore": { - "type": "String", - "placeholders": {} - }, - "@commandHint_unignore": { - "type": "String", - "placeholders": {} - }, - "@unreadChatsInApp": { - "type": "String", - "placeholders": { - "appname": { - "type": "String" + }, + "@license": { + "type": "String", + "placeholders": {} + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } }, - "unread": { - "type": "String" + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": { + "type": "String", + "placeholders": {} + }, + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "@recoveryKey": { + "type": "String", + "placeholders": {} + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": { + "type": "String", + "placeholders": {} + }, + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "@dehydrateTorLong": { + "type": "String", + "placeholders": {} + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } } - } - }, - "@noDatabaseEncryption": { - "type": "String", - "placeholders": {} - }, - "@thereAreCountUsersBlocked": { - "type": "String", - "count": {} - }, - "@restricted": { - "type": "String", - "placeholders": {} - }, - "@knockRestricted": { - "type": "String", - "placeholders": {} - }, - "@goToSpace": { - "type": "String", - "placeholders": { - "space": {} - } - }, - "@markAsUnread": { - "type": "String", - "placeholders": {} - }, - "@userLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "int" + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "String", + "placeholders": {} + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@doNotShowAgain": { + "type": "String", + "placeholders": {} + }, + "@report": { + "type": "String", + "placeholders": {} + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@unverified": { + "type": "String", + "placeholders": {} + }, + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "@serverRequiresEmail": { + "type": "String", + "placeholders": {} + }, + "@hideUnimportantStateEvents": { + "type": "String", + "placeholders": {} + }, + "@screenSharingTitle": { + "type": "String", + "placeholders": {} + }, + "@widgetCustom": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } } - } - }, - "@moderatorLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "int" - } - } - }, - "@adminLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "int" - } - } - }, - "@changeGeneralChatSettings": { - "type": "String", - "placeholders": {} - }, - "@inviteOtherUsers": { - "type": "String", - "placeholders": {} - }, - "@changeTheChatPermissions": { - "type": "String", - "placeholders": {} - }, - "@changeTheVisibilityOfChatHistory": { - "type": "String", - "placeholders": {} - }, - "@changeTheCanonicalRoomAlias": { - "type": "String", - "placeholders": {} - }, - "@sendRoomNotifications": { - "type": "String", - "placeholders": {} - }, - "@changeTheDescriptionOfTheGroup": { - "type": "String", - "placeholders": {} - }, - "@chatPermissionsDescription": { - "type": "String", - "placeholders": {} - }, - "@updateInstalled": { - "type": "String", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "@changelog": { - "type": "String", - "placeholders": {} - }, - "@sendCanceled": { - "type": "String", - "placeholders": {} - }, - "@loginWithMatrixId": { - "type": "String", - "placeholders": {} - }, - "@discoverHomeservers": { - "type": "String", - "placeholders": {} - }, - "@whatIsAHomeserver": { - "type": "String", - "placeholders": {} - }, - "@homeserverDescription": { - "type": "String", - "placeholders": {} - }, - "@doesNotSeemToBeAValidHomeserver": { - "type": "String", - "placeholders": {} - }, - "@calculatingFileSize": { - "type": "String", - "placeholders": {} - }, - "@prepareSendingAttachment": { - "type": "String", - "placeholders": {} - }, - "@sendingAttachment": { - "type": "String", - "placeholders": {} - }, - "@generatingVideoThumbnail": { - "type": "String", - "placeholders": {} - }, - "@compressVideo": { - "type": "String", - "placeholders": {} - }, - "@sendingAttachmentCountOfCount": { - "type": "integer", - "placeholders": { - "index": { - "type": "int" + }, + "@addToSpaceDescription": { + "type": "String", + "placeholders": {} + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } }, - "length": { - "type": "int" + "type": "String" + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } } - } - }, - "@serverLimitReached": { - "type": "integer", - "placeholders": { - "seconds": { - "type": "int" - } - } - }, - "@oneOfYourDevicesIsNotVerified": { - "type": "String", - "placeholders": {} - }, - "@noticeChatBackupDeviceVerification": { - "type": "String", - "placeholders": {} - }, - "@continueText": { - "type": "String", - "placeholders": {} - }, - "@welcomeText": { - "type": "String", - "placeholders": {} - }, - "@blur": { - "type": "String", - "placeholders": {} - }, - "@opacity": { - "type": "String", - "placeholders": {} - }, - "@setWallpaper": { - "type": "String", - "placeholders": {} - }, - "@manageAccount": { - "type": "String", - "placeholders": {} - }, - "@noContactInformationProvided": { - "type": "String", - "placeholders": {} - }, - "@contactServerAdmin": { - "type": "String", - "placeholders": {} - }, - "@contactServerSecurity": { - "type": "String", - "placeholders": {} - }, - "@supportPage": { - "type": "String", - "placeholders": {} - }, - "@serverInformation": { - "type": "String", - "placeholders": {} - }, - "@name": { - "type": "String", - "placeholders": {} - }, - "@version": { - "type": "String", - "placeholders": {} - }, - "@website": { - "type": "String", - "placeholders": {} - }, - "@compress": { - "type": "String", - "placeholders": {} - }, - "@boldText": { - "type": "String", - "placeholders": {} - }, - "@italicText": { - "type": "String", - "placeholders": {} - }, - "@strikeThrough": { - "type": "String", - "placeholders": {} - }, - "@pleaseFillOut": { - "type": "String", - "placeholders": {} - }, - "@invalidUrl": { - "type": "String", - "placeholders": {} - }, - "@addLink": { - "type": "String", - "placeholders": {} - }, - "@unableToJoinChat": { - "type": "String", - "placeholders": {} - }, - "@previous": { - "type": "String", - "placeholders": {} - }, - "@otherPartyNotLoggedIn": { - "type": "String", - "placeholders": {} - }, - "@appWantsToUseForLogin": { - "type": "String", - "placeholders": { - "server": { - "type": "String" - } - } - }, - "@appWantsToUseForLoginDescription": { - "type": "String", - "placeholders": {} - }, - "@open": { - "type": "String", - "placeholders": {} - }, - "@waitingForServer": { - "type": "String", - "placeholders": {} - }, - "@appIntroduction": { - "type": "String", - "placeholders": {} - }, - "@newChatRequest": { - "type": "String", - "placeholders": {} - }, - "@contentNotificationSettings": { - "type": "String", - "placeholders": {} - }, - "@generalNotificationSettings": { - "type": "String", - "placeholders": {} - }, - "@roomNotificationSettings": { - "type": "String", - "placeholders": {} - }, - "@userSpecificNotificationSettings": { - "type": "String", - "placeholders": {} - }, - "@otherNotificationSettings": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleContainsUserName": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleContainsUserNameDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleMaster": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleMasterDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleSuppressNotices": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleSuppressNoticesDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleInviteForMe": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleInviteForMeDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleMemberEvent": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleMemberEventDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleIsUserMention": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleIsUserMentionDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleContainsDisplayName": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleContainsDisplayNameDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleIsRoomMention": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleIsRoomMentionDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleRoomnotif": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleRoomnotifDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleTombstone": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleTombstoneDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleReaction": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleReactionDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleRoomServerAcl": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleRoomServerAclDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleSuppressEdits": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleSuppressEditsDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleCall": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleCallDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleEncryptedRoomOneToOne": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleEncryptedRoomOneToOneDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleRoomOneToOne": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleRoomOneToOneDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleMessage": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleMessageDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleEncrypted": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleEncryptedDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleJitsi": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleJitsiDescription": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleServerAcl": { - "type": "String", - "placeholders": {} - }, - "@notificationRuleServerAclDescription": { - "type": "String", - "placeholders": {} - }, - "@unknownPushRule": { - "type": "String", - "placeholders": { - "rule": { - "type": "String" - } - } - }, - "@sentVoiceMessage": { - "type": "String", - "placeholders": { - "duration": { - "type": "String" + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } }, - "sender": { - "type": "String" + "type": "String" + }, + "@publish": { + "type": "String", + "placeholders": {} + }, + "@openLinkInBrowser": { + "type": "String", + "placeholders": {} + }, + "@clearArchive": { + "type": "String", + "placeholders": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@messageInfo": { + "type": "String", + "placeholders": {} + }, + "@disableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@directChat": { + "type": "String", + "placeholders": {} + }, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } } - } - }, - "@deletePushRuleCanNotBeUndone": { - "type": "String", - "placeholders": {} - }, - "@more": { - "type": "String", - "placeholders": {} - }, - "@shareKeysWith": { - "type": "String", - "placeholders": {} - }, - "@shareKeysWithDescription": { - "type": "String", - "placeholders": {} - }, - "@allDevices": { - "type": "String", - "placeholders": {} - }, - "@crossVerifiedDevicesIfEnabled": { - "type": "String", - "placeholders": {} - }, - "@crossVerifiedDevices": { - "type": "String", - "placeholders": {} - }, - "@verifiedDevicesOnly": { - "type": "String", - "placeholders": {} - }, - "@takeAPhoto": { - "type": "String", - "placeholders": {} - }, - "@recordAVideo": { - "type": "String", - "placeholders": {} - }, - "@optionalMessage": { - "type": "String", - "placeholders": {} - }, - "@notSupportedOnThisDevice": { - "type": "String", - "placeholders": {} - }, - "@enterNewChat": { - "type": "String", - "placeholders": {} - }, - "@approve": { - "type": "String", - "placeholders": {} - }, - "@youHaveKnocked": { - "type": "String", - "placeholders": {} - }, - "@pleaseWaitUntilInvited": { - "type": "String", - "placeholders": {} - }, - "@commandHint_logout": { - "type": "String", - "placeholders": {} - }, - "@commandHint_logoutall": { - "type": "String", - "placeholders": {} - }, - "@displayNavigationRail": { - "type": "String", - "placeholders": {} - }, - "@customReaction": { - "type": "String", - "placeholders": {} - }, - "@writeAMessageLangCodes": { - "type": "String", - "placeholders": { - "l1": { - "type": "String" + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@inviteGroupChat": { + "type": "String", + "placeholders": {} + }, + "@appearOnTop": { + "type": "String", + "placeholders": {} + }, + "@invitePrivateChat": { + "type": "String", + "placeholders": {} + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@foregroundServiceRunning": { + "type": "String", + "placeholders": {} + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@voiceCall": { + "type": "String", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@confirm": { + "type": "String", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@noChatDescriptionYet": { + "type": "String", + "placeholders": {} + }, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@removeFromBundle": { + "type": "String", + "placeholders": {} + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@learnMore": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@users": { + "type": "String", + "placeholders": {} + }, + "@openGallery": { + "type": "String", + "placeholders": {} + }, + "@chatDescriptionHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@search": { + "type": "String", + "placeholders": {} + }, + "@newGroup": { + "type": "String", + "placeholders": {} + }, + "@bundleName": { + "type": "String", + "placeholders": {} + }, + "@dehydrateTor": { + "type": "String", + "placeholders": {} + }, + "@removeFromSpace": { + "type": "String", + "placeholders": {} + }, + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@roomUpgradeDescription": { + "type": "String", + "placeholders": {} + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@scanQrCode": { + "type": "String", + "placeholders": {} + }, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterANumber": { + "type": "String", + "placeholders": {} + }, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } }, - "l2": { - "type": "String" + "type": "String" + }, + "@profileNotFound": { + "type": "String", + "placeholders": {} + }, + "@jump": { + "type": "String", + "placeholders": {} + }, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } } - } - }, - "@requests": { - "type": "String", - "placeholders": {} - }, - "@holdForInfo": { - "type": "String", - "placeholders": {} - }, - "@greenFeedback": { - "type": "String", - "placeholders": {} - }, - "@yellowFeedback": { - "type": "String", - "placeholders": {} - }, - "@redFeedback": { - "type": "String", - "placeholders": {} - }, - "@itInstructionsTitle": { - "type": "String", - "placeholders": {} - }, - "@itInstructionsBody": { - "type": "String", - "placeholders": {} - }, - "@gaTooltip": { - "type": "String", - "placeholders": {} - }, - "@taTooltip": { - "type": "String", - "placeholders": {} - }, - "@unTooltip": { - "type": "String", - "placeholders": {} - }, - "@interactiveTranslatorSliderHeader": { - "type": "String", - "placeholders": {} - }, - "@interactiveGrammarSliderHeader": { - "type": "String", - "placeholders": {} - }, - "@interactiveTranslatorNotAllowed": { - "type": "String", - "placeholders": {} - }, - "@interactiveTranslatorAllowed": { - "type": "String", - "placeholders": {} - }, - "@interactiveTranslatorRequired": { - "type": "String", - "placeholders": {} - }, - "@notYetSet": { - "type": "String", - "placeholders": {} - }, - "@waTooltip": { - "type": "String", - "placeholders": {} - }, - "@languageSettings": { - "type": "String", - "placeholders": {} - }, - "@interactiveTranslator": { - "type": "String", - "placeholders": {} - }, - "@noIdenticalLanguages": { - "type": "String", - "placeholders": {} - }, - "@searchBy": { - "type": "String", - "placeholders": {} - }, - "@joinWithClassCode": { - "type": "String", - "placeholders": {} - }, - "@languageLevelPreA1": { - "type": "String", - "placeholders": {} - }, - "@languageLevelA1": { - "type": "String", - "placeholders": {} - }, - "@languageLevelA2": { - "type": "String", - "placeholders": {} - }, - "@languageLevelB1": { - "type": "String", - "placeholders": {} - }, - "@languageLevelB2": { - "type": "String", - "placeholders": {} - }, - "@languageLevelC1": { - "type": "String", - "placeholders": {} - }, - "@languageLevelC2": { - "type": "String", - "placeholders": {} - }, - "@changeTheNameOfTheClass": { - "type": "String", - "placeholders": {} - }, - "@changeTheNameOfTheChat": { - "type": "String", - "placeholders": {} - }, - "@sorryNoResults": { - "type": "String", - "placeholders": {} - }, - "@ignoreInThisText": { - "type": "String", - "placeholders": {} - }, - "@needsItMessage": { - "type": "String", - "placeholders": { - "targetLanguage": { - "type": "String" + }, + "@sorryThatsNotPossible": { + "type": "String", + "placeholders": {} + }, + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } } - } - }, - "@countryInformation": { - "type": "String", - "placeholders": {} - }, - "@targetLanguage": { - "type": "String", - "placeholders": {} - }, - "@sourceLanguage": { - "type": "String", - "placeholders": {} - }, - "@updateLanguage": { - "type": "String", - "placeholders": {} - }, - "@whatLanguageYouWantToLearn": { - "type": "String", - "placeholders": {} - }, - "@whatIsYourBaseLanguage": { - "type": "String", - "placeholders": {} - }, - "@saveChanges": { - "type": "String", - "placeholders": {} - }, - "@publicProfileTitle": { - "type": "String", - "placeholders": {} - }, - "@publicProfileDesc": { - "type": "String", - "placeholders": {} - }, - "@errorDisableIT": { - "type": "String", - "placeholders": {} - }, - "@errorDisableIGC": { - "type": "String", - "placeholders": {} - }, - "@errorDisableLanguageAssistance": { - "type": "String", - "placeholders": {} - }, - "@errorDisableITUserDesc": { - "type": "String", - "placeholders": {} - }, - "@errorDisableIGCUserDesc": { - "type": "String", - "placeholders": {} - }, - "@errorDisableLanguageAssistanceUserDesc": { - "type": "String", - "placeholders": {} - }, - "@errorDisableITClassDesc": { - "type": "String", - "placeholders": {} - }, - "@errorDisableIGCClassDesc": { - "type": "String", - "placeholders": {} - }, - "@error405Title": { - "type": "String", - "placeholders": {} - }, - "@error405Desc": { - "type": "String", - "placeholders": {} - }, - "@termsAndConditions": { - "type": "String", - "placeholders": {} - }, - "@andCertifyIAmAtLeast13YearsOfAge": { - "type": "String", - "placeholders": {} - }, - "@error502504Title": { - "type": "String", - "placeholders": {} - }, - "@error502504Desc": { - "type": "String", - "placeholders": {} - }, - "@error404Title": { - "type": "String", - "placeholders": {} - }, - "@error404Desc": { - "type": "String", - "placeholders": {} - }, - "@errorPleaseRefresh": { - "type": "String", - "placeholders": {} - }, - "@connectedToStaging": { - "type": "String", - "placeholders": {} - }, - "@learningSettings": { - "type": "String", - "placeholders": {} - }, - "@participants": { - "type": "String", - "placeholders": {} - }, - "@clickMessageTitle": { - "type": "String", - "placeholders": {} - }, - "@clickMessageBody": { - "type": "String", - "placeholders": {} - }, - "@allDone": { - "type": "String", - "placeholders": {} - }, - "@vocab": { - "type": "String", - "placeholders": {} - }, - "@low": { - "type": "String", - "placeholders": {} - }, - "@medium": { - "type": "String", - "placeholders": {} - }, - "@high": { - "type": "String", - "placeholders": {} - }, - "@subscribe": { - "type": "String", - "placeholders": {} - }, - "@getAccess": { - "type": "String", - "placeholders": {} - }, - "@subscriptionDesc": { - "type": "String", - "placeholders": {} - }, - "@subscriptionManagement": { - "type": "String", - "placeholders": {} - }, - "@currentSubscription": { - "type": "String", - "placeholders": {} - }, - "@cancelSubscription": { - "type": "String", - "placeholders": {} - }, - "@selectYourPlan": { - "type": "String", - "placeholders": {} - }, - "@subsciptionPlatformTooltip": { - "type": "String", - "placeholders": {} - }, - "@subscriptionManagementUnavailable": { - "type": "String", - "placeholders": {} - }, - "@paymentMethod": { - "type": "String", - "placeholders": {} - }, - "@paymentHistory": { - "type": "String", - "placeholders": {} - }, - "@emptyChatDownloadWarning": { - "type": "String", - "placeholders": {} - }, - "@update": { - "type": "String", - "placeholders": {} - }, - "@toggleImmersionMode": { - "type": "String", - "placeholders": {} - }, - "@toggleImmersionModeDesc": { - "type": "String", - "placeholders": {} - }, - "@itToggleDescription": { - "type": "String", - "placeholders": {} - }, - "@igcToggleDescription": { - "type": "String", - "placeholders": {} - }, - "@originalMessage": { - "type": "String", - "placeholders": {} - }, - "@sentMessage": { - "type": "String", - "placeholders": {} - }, - "@useType": { - "type": "String", - "placeholders": {} - }, - "@notAvailable": { - "type": "String", - "placeholders": {} - }, - "@taAndGaTooltip": { - "type": "String", - "placeholders": {} - }, - "@definitionsToolName": { - "type": "String", - "placeholders": {} - }, - "@messageTranslationsToolName": { - "type": "String", - "placeholders": {} - }, - "@definitionsToolDescription": { - "type": "String", - "placeholders": {} - }, - "@translationsToolDescrption": { - "type": "String", - "placeholders": {} - }, - "@welcomeBack": { - "type": "String", - "placeholders": {} - }, - "@downloadTxtFile": { - "type": "String", - "placeholders": {} - }, - "@downloadCSVFile": { - "type": "String", - "placeholders": {} - }, - "@promotionalSubscriptionDesc": { - "type": "String", - "placeholders": {} - }, - "@originalSubscriptionPlatform": { - "type": "String", - "placeholders": { - "purchasePlatform": { - "type": "String" + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } } - } - }, - "@oneWeekTrial": { - "type": "String", - "placeholders": {} - }, - "@downloadXLSXFile": { - "type": "String", - "placeholders": {} - }, - "@unkDisplayName": { - "type": "String", - "placeholders": {} - }, - "@wwCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@afCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@axCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@alCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@dzCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@asCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@adCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@aoCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@aiCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@agCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@arCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@amCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@awCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@acCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@auCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@atCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@azCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bsCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bhCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bdCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bbCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@byCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@beCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bzCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bjCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bmCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@btCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@boCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@baCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bwCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@brCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ioCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@vgCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bnCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bgCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bfCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@biCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@khCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@cmCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@caCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@cvCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bqCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@kyCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@cfCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tdCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@clCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@cnCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@cxCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ccCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@coCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@kmCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@cdCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@cgCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ckCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@crCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ciCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@hrCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@cuCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@cwCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@cyCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@czCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@dkCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@djCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@dmCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@doCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tlCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ecCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@egCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@svCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gqCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@erCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@eeCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@szCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@etCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@fkCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@foCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@fjCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@fiCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@frCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gfCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@pfCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gaCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gmCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@geCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@deCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ghCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@giCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@grCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@glCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gdCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gpCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@guCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gtCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ggCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gnCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gwCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gyCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@htCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@hmCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@hnCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@hkCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@huCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@isCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@inCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@idCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@irCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@iqCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ieCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@imCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ilCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@itCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@jmCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@jpCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@jeCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@joCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@kzCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@keCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@kiCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@xkCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@kwCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@kgCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@laCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@lvCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@lbCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@lsCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@lrCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@lyCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@liCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ltCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@luCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@moCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mkCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mgCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mwCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@myCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mvCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mlCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mtCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mhCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mqCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mrCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@muCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ytCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mxCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@fmCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mdCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mcCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mnCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@meCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@msCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@maCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mzCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mmCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@naCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@nrCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@npCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@nlCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ncCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@nzCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@niCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@neCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ngCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@nuCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@nfCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@kpCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mpCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@noCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@omCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@pkCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@pwCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@psCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@paCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@pgCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@pyCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@peCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@phCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@plCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ptCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@prCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@qaCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@reCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@roCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ruCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@rwCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@blCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@shCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@knCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@lcCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mfCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@pmCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@vcCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@wsCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@smCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@stCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@saCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@snCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@rsCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@scCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@slCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@sgCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@sxCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@skCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@siCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@sbCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@soCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@zaCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gsCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@krCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ssCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@esCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@lkCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@sdCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@srCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@sjCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@seCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@chCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@syCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@twCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tjCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tzCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@thCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tgCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tkCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@toCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ttCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tnCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@trCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tmCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tcCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tvCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@viCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ugCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@uaCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@aeCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gbCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@usCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@uyCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@uzCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@vuCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@vaCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@veCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@vnCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@wfCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ehCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@yeCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@zmCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@zwCountryDisplayName": { - "type": "String", - "placeholders": {} - }, - "@pay": { - "type": "String", - "placeholders": {} - }, - "@invitedToSpace": { - "type": "String", - "placeholders": { - "user": { - "type": "String" + }, + "@shareInviteLink": { + "type": "String", + "placeholders": {} + }, + "@commandHint_markasdm": { + "type": "String", + "placeholders": {} + }, + "@recoveryKeyLost": { + "type": "String", + "placeholders": {} + }, + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@deviceKeys": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@setTheme": { + "type": "String", + "placeholders": {} + }, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@youJoinedTheChat": { + "type": "String", + "placeholders": {} + }, + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@markAsRead": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@widgetName": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@errorAddingWidget": { + "type": "String", + "placeholders": {} + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } }, - "space": { - "type": "String" + "type": "String" + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } } - } - }, - "@youreInvited": { - "type": "String", - "placeholders": {} - }, - "@invitedToChat": { - "type": "String", - "placeholders": { - "user": { - "type": "String" - }, - "name": { - "type": "String" + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "@newSpace": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } } - } - }, - "@monthlySubscription": { - "type": "String", - "placeholders": {} - }, - "@yearlySubscription": { - "type": "String", - "placeholders": {} - }, - "@defaultSubscription": { - "type": "String", - "placeholders": {} - }, - "@freeTrial": { - "type": "String", - "placeholders": {} - }, - "@total": { - "type": "String", - "placeholders": {} - }, - "@noDataFound": { - "type": "String", - "placeholders": {} - }, - "@blurMeansTranslateTitle": { - "type": "String", - "placeholders": {} - }, - "@blurMeansTranslateBody": { - "type": "String", - "placeholders": {} - }, - "@bestCorrectionFeedback": { - "type": "String", - "placeholders": {} - }, - "@distractorFeedback": { - "type": "String", - "placeholders": {} - }, - "@bestAnswerFeedback": { - "type": "String", - "placeholders": {} - }, - "@definitionDefaultPrompt": { - "type": "String", - "placeholders": {} - }, - "@practiceDefaultPrompt": { - "type": "String", - "placeholders": {} - }, - "@correctionDefaultPrompt": { - "type": "String", - "placeholders": {} - }, - "@acceptSelection": { - "type": "String", - "placeholders": {} - }, - "@why": { - "type": "String", - "placeholders": {} - }, - "@definition": { - "type": "String", - "placeholders": {} - }, - "@exampleSentence": { - "type": "String", - "placeholders": {} - }, - "@reportToTeacher": { - "type": "String", - "placeholders": {} - }, - "@reportMessageTitle": { - "type": "String", - "placeholders": { - "reportingUserId": { - "type": "String" - }, - "reportedUserId": { - "type": "String" - }, - "roomName": { - "type": "String" + }, + "@emojis": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@pleaseTryAgainLaterOrChooseDifferentServer": { + "type": "String", + "placeholders": {} + }, + "@createGroup": { + "type": "String", + "placeholders": {} + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@hydrateTorLong": { + "type": "String", + "placeholders": {} + }, + "@time": { + "type": "String", + "placeholders": {} + }, + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@custom": { + "type": "String", + "placeholders": {} + }, + "@noBackupWarning": { + "type": "String", + "placeholders": {} + }, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@verify": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@storeInSecureStorageDescription": { + "type": "String", + "placeholders": {} + }, + "@openChat": { + "type": "String", + "placeholders": {} + }, + "@kickUserDescription": { + "type": "String", + "placeholders": {} + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "@pinMessage": { + "type": "String", + "placeholders": {} + }, + "@screenSharingDetail": { + "type": "String", + "placeholders": {} + }, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@invite": { + "type": "String", + "placeholders": {} + }, + "@enableMultiAccounts": { + "type": "String", + "placeholders": {} + }, + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "@indexedDbErrorTitle": { + "type": "String", + "placeholders": {} + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } } - } - }, - "@reportMessageBody": { - "type": "String", - "placeholders": { - "reportedMessage": { - "type": "String" - }, - "reason": { - "type": "String" + }, + "changedTheRoomAliases": "{username} άλλαξε τα ψευδώνυμα του δωματίου", + "changedTheRoomInvitationLink": "{username} άλλαξε τον σύνδεσμο πρόσκλησης", + "changeTheHomeserver": "Αλλαγή του διακομιστή σπιτιού", + "changeTheNameOfTheGroup": "Αλλαγή ονόματος ομάδας", + "channelCorruptedDecryptError": "Ο κρυπτογραφημένος κώδικας έχει καταστραφεί", + "chat": "Συνομιλία", + "yourChatBackupHasBeenSetUp": "Η δημιουργία αντιγράφων ασφαλείας της συνομιλίας σας έχει ρυθμιστεί.", + "chatBackupDescription": "Τα παλιά σας μηνύματα είναι ασφαλή με ένα κλειδί ανάκτησης. Παρακαλώ βεβαιωθείτε ότι δεν το χάνετε.", + "clearArchive": "Διαγραφή αρχείου", + "commandHint_markasdm": "Σημειώστε ως άμεσο μήνυμα για το δοσμένο ID του Matrix", + "commandHint_markasgroup": "Σημειώστε ως ομάδα", + "commandHint_create": "Δημιουργήστε μια κενή ομαδική συνομιλία\nΧρησιμοποιήστε --no-encryption για να απενεργοποιήσετε την κρυπτογράφηση", + "commandHint_discardsession": "Απορρίψτε τη συνεδρία", + "commandHint_dm": "Ξεκινήστε μια άμεση συνομιλία\nΧρησιμοποιήστε --no-encryption για να απενεργοποιήσετε την κρυπτογράφηση", + "commandHint_html": "Αποστείλετε κείμενο μορφοποιημένο σε HTML", + "commandHint_join": "Ενταχθείτε στο δοσμένο δωμάτιο", + "commandHint_kick": "Αφαιρέστε τον δοσμένο χρήστη από αυτό το δωμάτιο", + "commandHint_leave": "Αφήστε αυτό το δωμάτιο", + "commandHint_me": "Περιγράψτε τον εαυτό σας", + "commandHint_myroomavatar": "Ορίστε τη φωτογραφία σας για αυτό το δωμάτιο (με mxc-uri)", + "commandHint_myroomnick": "Ορίστε το όνομα εμφάνισης για αυτό το δωμάτιο", + "commandHint_op": "Ορίστε το επίπεδο ισχύος του χρήστη (προεπιλογή: 50)", + "commandHint_plain": "Αποστολή κειμένου χωρίς μορφοποίηση", + "commandHint_react": "Αποστολή απάντησης ως αντίδραση", + "commandHint_send": "Αποστολή κειμένου", + "commandHint_unban": "Άρση αποκλεισμού του χρήστη από αυτό το δωμάτιο", + "commandInvalid": "Μη έγκυρη εντολή", + "commandMissing": "{command} δεν είναι εντολή.", + "compareEmojiMatch": "Παρακαλώ συγκρίνετε τα emojis", + "compareNumbersMatch": "Παρακαλώ συγκρίνετε τους αριθμούς", + "configureChat": "Ρύθμιση συνομιλίας", + "confirm": "Επιβεβαίωση", + "connect": "Σύνδεση", + "contactHasBeenInvitedToTheGroup": "Ο επαφή έχει προσκληθεί στην ομάδα", + "containsDisplayName": "Περιέχει όνομα εμφάνισης", + "containsUserName": "Περιέχει όνομα χρήστη", + "contentHasBeenReported": "Το περιεχόμενο έχει αναφερθεί στους διαχειριστές του διακομιστή", + "copiedToClipboard": "Αντιγράφηκε στο πρόχειρο", + "copy": "Αντιγραφή", + "copyToClipboard": "Αντιγραφή στο πρόχειρο", + "couldNotDecryptMessage": "Αδύνατη η αποκρυπτογράφηση μηνύματος: {error}", + "checkList": "Λίστα ελέγχου", + "countParticipants": "{count} συμμετέχοντες", + "countInvited": "{count} προσκεκλημένοι", + "create": "Δημιουργία", + "createdTheChat": "💬 {username} δημιούργησε τη συνομιλία", + "createGroup": "Δημιουργία ομάδας", + "createNewSpace": "Νέος χώρος", + "currentlyActive": "Ενεργό αυτήν τη στιγμή", + "darkTheme": "Σκοτεινό", + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "dateWithoutYear": "{month}-{day}", + "dateWithYear": "{year}-{month}-{day}", + "deactivateAccountWarning": "Αυτό θα απενεργοποιήσει τον λογαριασμό σας. Δεν μπορεί να αναιρεθεί! Είστε σίγουροι;", + "defaultPermissionLevel": "Προεπιλεγμένο επίπεδο δικαιωμάτων για νέους χρήστες", + "delete": "Διαγραφή", + "deleteAccount": "Διαγραφή λογαριασμού", + "deleteMessage": "Διαγραφή μηνύματος", + "device": "Συσκευή", + "deviceId": "Ταυτότητα συσκευής", + "devices": "Συσκευές", + "directChats": "Άμεσα μηνύματα", + "allRooms": "Όλες οι ομαδικές συνομιλίες", + "displaynameHasBeenChanged": "Το όνομα εμφανιζόμενου έχει αλλάξει", + "downloadFile": "Λήψη αρχείου", + "edit": "Επεξεργασία", + "editBlockedServers": "Επεξεργασία αποκλεισμένων διακομιστών", + "chatPermissions": "Άδειες συνομιλίας", + "editDisplayname": "Επεξεργασία ονόματος εμφανιζόμενου", + "editRoomAliases": "Επεξεργασία ψευδωνύμων δωματίου", + "editRoomAvatar": "Επεξεργασία εικόνας δωματίου", + "emoteExists": "Το emoji ήδη υπάρχει!", + "emoteInvalid": "Μη έγκυρος κωδικός emoji!", + "emoteKeyboardNoRecents": "Πρόσφατα χρησιμοποιημένα emoji θα εμφανίζονται εδώ...", + "emotePacks": "Πακέτα emoji για το δωμάτιο", + "emoteSettings": "Ρυθμίσεις emoji", + "globalChatId": "Παγκόσμιο ID συνομιλίας", + "accessAndVisibility": "Πρόσβαση και ορατότητα", + "accessAndVisibilityDescription": "Ποιος επιτρέπεται να συμμετάσχει σε αυτήν τη συνομιλία και πώς μπορεί να βρεθεί η συνομιλία.", + "calls": "Κλήσεις", + "customEmojisAndStickers": "Προσαρμοσμένα emojis και αυτοκόλλητα", + "customEmojisAndStickersBody": "Προσθέστε ή μοιραστείτε προσαρμοσμένα emojis ή αυτοκόλλητα που μπορούν να χρησιμοποιηθούν σε οποιαδήποτε συνομιλία.", + "emoteShortcode": "Κωδικός σύντομου emoji", + "emoteWarnNeedToPick": "Πρέπει να επιλέξετε έναν κωδικό emoji και μια εικόνα!", + "emptyChat": "Άδειο chat", + "enableEmotesGlobally": "Ενεργοποίηση πακέτου emoji σε όλο το σύστημα", + "enableEncryption": "Ενεργοποίηση κρυπτογράφησης", + "enableEncryptionWarning": "Δεν θα μπορείτε πλέον να απενεργοποιήσετε την κρυπτογράφηση. Είστε σίγουροι;", + "encrypted": "Κρυπτογραφημένο", + "encryption": "Κρυπτογράφηση", + "encryptionNotEnabled": "Η κρυπτογράφηση δεν είναι ενεργοποιημένη", + "endedTheCall": "{senderName} τερμάτισε την κλήση", + "enterAnEmailAddress": "Εισάγετε μια διεύθυνση email", + "homeserver": "Homeserver", + "enterYourHomeserver": "Εισάγετε το homeserver σας", + "errorObtainingLocation": "Σφάλμα κατά την απόκτηση τοποθεσίας: {error}", + "everythingReady": "Όλα έτοιμα!", + "extremeOffensive": "Απολύτως προσβλητικό", + "fileName": "Όνομα αρχείου", + "fluffychat": "FluffyChat", + "fontSize": "Μέγεθος γραμματοσειράς", + "forward": "Προώθηση", + "fromJoining": "Από την ένταξη", + "fromTheInvitation": "Από την πρόσκληση", + "goToTheNewRoom": "Μεταβείτε στο νέο δωμάτιο", + "group": "Ομάδα", + "chatDescription": "Περιγραφή συνομιλίας", + "chatDescriptionHasBeenChanged": "Η περιγραφή της συνομιλίας άλλαξε", + "groupIsPublic": "Η ομάδα είναι δημόσια", + "groups": "Ομάδες", + "groupWith": "Ομάδα με {displayname}", + "guestsAreForbidden": "Οι επισκέπτες απαγορεύονται", + "guestsCanJoin": "Οι επισκέπτες μπορούν να συμμετάσχουν", + "hasWithdrawnTheInvitationFor": "{username} έχει αποσύρει την πρόσκληση για {targetName}", + "help": "Βοήθεια", + "hideRedactedEvents": "Απόκρυψη επεξεργασμένων γεγονότων", + "hideRedactedMessages": "Απόκρυψη επεξεργασμένων μηνυμάτων", + "hideRedactedMessagesBody": "Αν κάποιος επεξεργαστεί ένα μήνυμα, αυτό το μήνυμα δεν θα είναι πλέον ορατό στη συνομιλία.", + "hideInvalidOrUnknownMessageFormats": "Απόκρυψη μη έγκυρων ή άγνωστων μορφών μηνυμάτων", + "howOffensiveIsThisContent": "Πόσο προσβλητικό είναι αυτό το περιεχόμενο;", + "id": "ID", + "identity": "Ταυτότητα", + "block": "Αποκλεισμός", + "blockedUsers": "Αποκλεισμένοι χρήστες", + "blockListDescription": "Μπορείτε να αποκλείσετε χρήστες που σας ενοχλούν. Δεν θα μπορείτε να λαμβάνετε μηνύματα ή προσκλήσεις δωματίου από τους χρήστες στη λίστα αποκλεισμού σας.", + "blockUsername": "Αγνόηση ονόματος χρήστη", + "iHaveClickedOnLink": "Έχω κάνει κλικ στον σύνδεσμο", + "incorrectPassphraseOrKey": "Λάθος φράση πρόσβασης ή κλειδί ανάκτησης", + "inoffensive": "Ακίνδυνο", + "inviteContact": "Πρόσκληση επαφής", + "inviteContactToGroupQuestion": "Θέλετε να προσκαλέσετε τον {contact} στη συνομιλία \"{groupName}\";", + "inviteContactToGroup": "Πρόσκληση επαφής στο {groupName}", + "noChatDescriptionYet": "Δεν έχει δημιουργηθεί ακόμη περιγραφή συνομιλίας.", + "tryAgain": "Δοκιμάστε ξανά", + "invalidServerName": "Μη έγκυρο όνομα διακομιστή", + "invited": "Προσκαλέστηκε", + "redactMessageDescription": "Το μήνυμα θα διαγραφεί για όλους τους συμμετέχοντες σε αυτή τη συνομιλία. Αυτό δεν μπορεί να αναιρεθεί.", + "optionalRedactReason": "(Προαιρετικό) Λόγος διαγραφής αυτού του μηνύματος...", + "invitedUser": "📩 {username} προσκάλεσε {targetName}", + "invitedUsersOnly": "Μόνο για προσκεκλημένους χρήστες", + "inviteForMe": "Πρόσκληση για μένα", + "inviteText": "{username} σε κάλεσε στο FluffyChat.\n1. Επισκεφθείτε το fluffychat.im και εγκαταστήστε την εφαρμογή \n2. Εγγραφείτε ή συνδεθείτε \n3. Ανοίξτε τον σύνδεσμο πρόσκλησης: \n {link}", + "isTyping": "γράφει…", + "joinedTheChat": "👋 {username} μπήκε στη συζήτηση", + "joinRoom": "Ενταχθείτε στο δωμάτιο", + "kicked": "👞 {username} έδιωξε τον/την {targetName}", + "kickedAndBanned": "🙅 {username} έδιωξε και απαγόρευσε τον/την {targetName}", + "kickFromChat": "Απομάκρυνση από τη συζήτηση", + "lastActiveAgo": "Τελευταία δραστηριότητα: {localizedTimeShort}", + "leave": "Αποχώρηση", + "leftTheChat": "Έφυγε από τη συζήτηση", + "license": "Άδεια", + "lightTheme": "Φωτεινό", + "loadCountMoreParticipants": "Φόρτωση {count} επιπλέον συμμετεχόντων", + "dehydrate": "Εξαγωγή συνεδρίας και διαγραφή συσκευής", + "dehydrateWarning": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Βεβαιωθείτε ότι αποθηκεύετε με ασφάλεια το αρχείο αντιγράφου ασφαλείας.", + "dehydrateTor": "Χρήστες TOR: Εξαγωγή συνεδρίας", + "dehydrateTorLong": "Για χρήστες TOR, συνιστάται να εξάγετε τη συνεδρία πριν κλείσετε το παράθυρο.", + "hydrateTor": "Χρήστες TOR: Εισαγωγή εξαγωγής συνεδρίας", + "hydrateTorLong": "Έχετε εξάγει την συνεδρία σας τελευταία φορά στο TOR; Εισάγετέ το γρήγορα και συνεχίστε τη συνομιλία.", + "hydrate": "Ανάκτηση από αρχείο δημιουργίας αντιγράφων ασφαλείας", + "loadingPleaseWait": "Φόρτωση… Παρακαλώ περιμένετε.", + "loadMore": "Φόρτωση περισσότερων…", + "locationDisabledNotice": "Οι υπηρεσίες τοποθεσίας είναι απενεργοποιημένες. Παρακαλώ ενεργοποιήστε τες για να μπορείτε να μοιραστείτε την τοποθεσία σας.", + "locationPermissionDeniedNotice": "Η άδεια τοποθεσίας απορρίφθηκε. Παρακαλώ δώστε την για να μπορείτε να μοιραστείτε την τοποθεσία σας.", + "login": "Σύνδεση", + "logInTo": "Συνδεθείτε στο {homeserver}", + "logout": "Αποσύνδεση", + "memberChanges": "Αλλαγές μελών", + "mention": "Αναφορά", + "messages": "Μηνύματα", + "messagesStyle": "Μηνύματα:", + "moderator": "Διαχειριστής", + "muteChat": "Αθόρυβη συνομιλία", + "needPantalaimonWarning": "Παρακαλώ να γνωρίζετε ότι χρειάζεστε το Pantalaimon για να χρησιμοποιήσετε κρυπτογράφηση άκρο-σε-άκρο προς το παρόν.", + "newChat": "Νέα συνομιλία", + "newMessageInFluffyChat": "🗨️ Νέο μήνυμα στο FluffyChat", + "newVerificationRequest": "Νέο αίτημα επαλήθευσης!", + "next": "Επόμενο", + "no": "Όχι", + "noConnectionToTheServer": "Δεν υπάρχει σύνδεση με τον διακομιστή", + "noEmotesFound": "Δεν βρέθηκαν εμοτέ. 😝", + "noEncryptionForPublicRooms": "Μπορείτε να ενεργοποιήσετε την κρυπτογράφηση μόνο όταν το δωμάτιο δεν είναι πλέον δημόσια προσβάσιμο.", + "noGoogleServicesWarning": "Το Firebase Cloud Messaging δεν φαίνεται να είναι διαθέσιμο στη συσκευή σας. Για να λαμβάνετε ακόμα ειδοποιήσεις push, προτείνουμε την εγκατάσταση του ntfy. Με το ntfy ή έναν άλλο πάροχο Unified Push μπορείτε να λαμβάνετε ειδοποιήσεις push με ασφαλή τρόπο. Μπορείτε να κατεβάσετε το ntfy από το PlayStore ή από το F-Droid.", + "noMatrixServer": "{server1} δεν είναι διακομιστής matrix, να χρησιμοποιήσω το {server2} αντί αυτού;", + "shareInviteLink": "Μοιραστείτε τον σύνδεσμο πρόσκλησης", + "scanQrCode": "Σάρωση κωδικού QR", + "none": "Κανένα", + "noPasswordRecoveryDescription": "Δεν έχετε προσθέσει ακόμα τρόπο ανάκτησης του κωδικού πρόσβασής σας.", + "noPermission": "Χωρίς άδεια", + "noRoomsFound": "Δεν βρέθηκαν δωμάτια…", + "notifications": "Ειδοποιήσεις", + "notificationsEnabledForThisAccount": "Οι ειδοποιήσεις είναι ενεργοποιημένες για αυτόν τον λογαριασμό", + "numUsersTyping": "{count} χρήστες πληκτρολογούν…", + "obtainingLocation": "Λήψη τοποθεσίας…", + "offensive": "Προσβλητικό", + "offline": "Εκτός σύνδεσης", + "ok": "Εντάξει", + "online": "Σε σύνδεση", + "onlineKeyBackupEnabled": "Ενεργοποιήθηκε η online δημιουργία αντιγράφων ασφαλείας κλειδιών", + "oopsPushError": "Ωχ! Δυστυχώς, προέκυψε σφάλμα κατά την εγκατάσταση των ειδοποιήσεων push.", + "oopsSomethingWentWrong": "Ωχ, κάτι πήγε στραβά...", + "openAppToReadMessages": "Ανοίξτε την εφαρμογή για να διαβάσετε μηνύματα", + "openCamera": "Άνοιγμα κάμερας", + "openVideoCamera": "Άνοιγμα κάμερας για βίντεο", + "oneClientLoggedOut": "Ένας από τους πελάτες σας έχει αποσυνδεθεί", + "addAccount": "Προσθήκη λογαριασμού", + "editBundlesForAccount": "Επεξεργασία πακέτων για αυτόν τον λογαριασμό", + "addToBundle": "Προσθήκη στο πακέτο", + "removeFromBundle": "Αφαίρεση από αυτό το πακέτο", + "bundleName": "Όνομα πακέτου", + "enableMultiAccounts": "(BETA) Ενεργοποίηση πολλαπλών λογαριασμών σε αυτήν τη συσκευή", + "openInMaps": "Άνοιγμα στους χάρτες", + "link": "Σύνδεσμος", + "serverRequiresEmail": "Αυτός ο διακομιστής χρειάζεται να επικυρώσει τη διεύθυνση email σας για εγγραφή.", + "or": "Ή", + "participant": "Συμμετέχων", + "passphraseOrKey": "κωδικός πρόσβασης ή κλειδί ανάκτησης", + "password": "Κωδικός πρόσβασης", + "passwordForgotten": "Ξεχάσατε τον κωδικό πρόσβασης", + "passwordHasBeenChanged": "Ο κωδικός πρόσβασης έχει αλλάξει", + "hideMemberChangesInPublicChats": "Απόκρυψη αλλαγών μελών σε δημόσια chats", + "hideMemberChangesInPublicChatsBody": "Μην εμφανίζετε στο χρονολόγιο του chat αν κάποιος ενταχθεί ή φύγει από ένα δημόσιο chat για βελτίωση της αναγνωσιμότητας.", + "overview": "Επισκόπηση", + "notifyMeFor": "Ειδοποίησέ με για", + "passwordRecoverySettings": "Ρυθμίσεις ανάκτησης κωδικού πρόσβασης", + "passwordRecovery": "Ανάκτηση κωδικού πρόσβασης", + "people": "Άνθρωποι", + "pickImage": "Επιλέξτε μια εικόνα", + "pin": "Καρφίτσωμα", + "play": "Αναπαραγωγή {fileName}", + "pleaseChoose": "Παρακαλώ επιλέξτε", + "pleaseChooseAPasscode": "Παρακαλώ επιλέξτε έναν κωδικό πρόσβασης", + "pleaseClickOnLink": "Παρακαλώ κάντε κλικ στον σύνδεσμο στο email και συνεχίστε.", + "pleaseEnter4Digits": "Παρακαλώ εισάγετε 4 ψηφία ή αφήστε κενό για να απενεργοποιήσετε το κλείδωμα εφαρμογής.", + "pleaseEnterRecoveryKey": "Παρακαλώ εισάγετε το κλειδί ανάκτησης σας:", + "pleaseEnterYourPassword": "Παρακαλώ εισάγετε τον κωδικό πρόσβασής σας", + "pleaseEnterYourPin": "Παρακαλώ εισάγετε το PIN σας", + "pleaseEnterYourUsername": "Παρακαλώ εισάγετε το όνομα χρήστη σας", + "pleaseFollowInstructionsOnWeb": "Παρακαλούμε ακολουθήστε τις οδηγίες στην ιστοσελίδα και πατήστε επόμενο.", + "privacy": "Απόρρητο", + "publicRooms": "Δημόσιες αίθουσες", + "pushRules": "Κανόνες ειδοποιήσεων", + "reason": "Αιτία", + "recording": "Εγγραφή", + "redactedBy": "Επεξεργάστηκε από {username}", + "directChat": "Άμεσο μήνυμα", + "redactedByBecause": "Επεξεργάστηκε από {username} επειδή: \"{reason}\"", + "redactedAnEvent": "{username} επεξεργάστηκε ένα γεγονός", + "redactMessage": "Επεξεργασία μηνύματος", + "register": "Εγγραφή", + "reject": "Απόρριψη", + "rejectedTheInvitation": "{username} απέρριψε την πρόσκληση", + "rejoin": "Επανένταξη", + "removeAllOtherDevices": "Αφαίρεση όλων των άλλων συσκευών", + "removedBy": "Αφαιρέθηκε από {username}", + "removeDevice": "Αφαίρεση συσκευής", + "unbanFromChat": "Άρση αποκλεισμού από τη συνομιλία", + "removeYourAvatar": "Αφαίρεση του προφίλ σας", + "replaceRoomWithNewerVersion": "Αντικαταστήστε το δωμάτιο με νεότερη έκδοση", + "reply": "Απάντηση", + "reportMessage": "Αναφορά μηνύματος", + "requestPermission": "Αίτηση άδειας", + "roomHasBeenUpgraded": "Το δωμάτιο έχει αναβαθμιστεί", + "roomVersion": "Έκδοση δωματίου", + "saveFile": "Αποθήκευση αρχείου", + "search": "Αναζήτηση", + "security": "Ασφάλεια", + "recoveryKey": "Κλειδί ανάκτησης", + "recoveryKeyLost": "Έχετε χάσει το κλειδί ανάκτησης;", + "seenByUser": "Εμφανίστηκε από {username}", + "send": "Αποστολή", + "sendAMessage": "Αποστολή μηνύματος", + "sendAsText": "Αποστολή ως κείμενο", + "sendAudio": "Αποστολή ήχου", + "sendFile": "Αποστολή αρχείου", + "sendImage": "Αποστολή εικόνας", + "sendImages": "Αποστολή {count} εικόνας", + "sendMessages": "Αποστολή μηνυμάτων", + "sendOriginal": "Αποστολή πρωτότυπου", + "sendSticker": "Αποστολή αυτοκόλλητου", + "sendVideo": "Αποστολή βίντεο", + "sentAFile": "📁 {username} έστειλε ένα αρχείο", + "sentAnAudio": "🎤 {username} έστειλε έναν ήχο", + "sentAPicture": "🖼️ {username} έστειλε μια εικόνα", + "sentASticker": "😊 {username} έστειλε ένα αυτοκόλλητο", + "sentAVideo": "🎥 {username} έστειλε ένα βίντεο", + "sentCallInformations": "Ο {senderName} έστειλε πληροφορίες κλήσης", + "separateChatTypes": "Διαχωρισμός άμεσων μηνυμάτων και ομάδων", + "setAsCanonicalAlias": "Ορισμός ως κύριο ψευδώνυμο", + "setCustomEmotes": "Ορισμός προσαρμοσμένων εικονιδίων", + "setChatDescription": "Ορισμός περιγραφής συνομιλίας", + "setInvitationLink": "Ορισμός συνδέσμου πρόσκλησης", + "setPermissionsLevel": "Ορισμός επιπέδου δικαιωμάτων", + "setStatus": "Ορισμός κατάστασης", + "settings": "Ρυθμίσεις", + "share": "Κοινοποίηση", + "sharedTheLocation": "{username} κοινοποίησε την τοποθεσία του", + "shareLocation": "Κοινοποίηση τοποθεσίας", + "showPassword": "Εμφάνιση κωδικού πρόσβασης", + "presenceStyle": "Παρουσία:", + "presencesToggle": "Εμφάνιση μηνυμάτων κατάστασης από άλλους χρήστες", + "singlesignon": "Ενιαία σύνδεση", + "skip": "Παραλείπω", + "sourceCode": "Κώδικας πηγής", + "spaceIsPublic": "Ο χώρος είναι δημόσιος", + "spaceName": "Όνομα χώρου", + "startedACall": "{senderName} ξεκίνησε μια κλήση", + "startFirstChat": "Ξεκινήστε την πρώτη σας συνομιλία", + "status": "Κατάσταση", + "statusExampleMessage": "Πώς είστε σήμερα;", + "submit": "Υποβολή", + "synchronizingPleaseWait": "Συγχρονισμός… Παρακαλώ περιμένετε.", + "synchronizingPleaseWaitCounter": "Συγχρονισμός… ({percentage}%)", + "systemTheme": "Σύστημα", + "theyDontMatch": "Δεν ταιριάζουν", + "theyMatch": "Ταιριάζουν", + "title": "FluffyChat", + "toggleFavorite": "Εναλλαγή Αγαπημένου", + "toggleMuted": "Εναλλαγή σίγασης", + "toggleUnread": "Σήμανση ως διαβασμένο/μη διαβασμένο", + "tooManyRequestsWarning": "Πάρα πολλά αιτήματα. Παρακαλώ δοκιμάστε ξανά αργότερα!", + "transferFromAnotherDevice": "Μεταφορά από άλλη συσκευή", + "tryToSendAgain": "Προσπαθήστε ξανά να στείλετε", + "unavailable": "Μη διαθέσιμο", + "unbannedUser": "{username} άρπαξε τον αποκλεισμό του {targetName}", + "unblockDevice": "Ξεκλειδώστε τη συσκευή", + "unknownDevice": "Άγνωστη συσκευή", + "unknownEncryptionAlgorithm": "Άγνωστος αλγόριθμος κρυπτογράφησης", + "unknownEvent": "Άγνωστο γεγονός '{type}'", + "unmuteChat": "Αναίρεση σίγασης συνομιλίας", + "unpin": "Αφαίρεση από την κορυφή", + "unreadChats": "{unreadCount, plural, =1{1 μη αναγνωσμένο μήνυμα} other{{unreadCount} μη αναγνωσμένα μηνύματα}}", + "userAndOthersAreTyping": "{username} και {count} άλλοι πληκτρολογούν…", + "userAndUserAreTyping": "{username} και {username2} πληκτρολογούν…", + "userIsTyping": "{username} πληκτρολογεί…", + "userLeftTheChat": "🚪 {username} έφυγε από τη συνομιλία", + "username": "Όνομα χρήστη", + "userSentUnknownEvent": "{username} έστειλε ένα γεγονός {type}", + "unverified": "Μη επαληθευμένο", + "verified": "Επαληθευμένο", + "verify": "Επαλήθευση", + "verifyStart": "Ξεκινήστε την επαλήθευση", + "verifySuccess": "Επιτυχής επαλήθευση!", + "verifyTitle": "Επαλήθευση άλλου λογαριασμού", + "videoCall": "Βιντεοκλήση", + "visibilityOfTheChatHistory": "Ορατότητα του ιστορικού συνομιλίας", + "visibleForAllParticipants": "Ορατό για όλους τους συμμετέχοντες", + "visibleForEveryone": "Ορατό για όλους", + "voiceMessage": "Φωνητικό μήνυμα", + "waitingPartnerAcceptRequest": "Αναμονή για αποδοχή του αιτήματος από τον συνεργάτη…", + "waitingPartnerEmoji": "Αναμονή για αποδοχή του emoji από τον συνεργάτη…", + "waitingPartnerNumbers": "Αναμονή για αποδοχή των αριθμών από τον συνεργάτη…", + "wallpaper": "Φόντο:", + "warning": "Προειδοποίηση!", + "weSentYouAnEmail": "Σας στείλαμε ένα email", + "whoCanPerformWhichAction": "Ποιος μπορεί να εκτελέσει ποια ενέργεια", + "whoIsAllowedToJoinThisGroup": "Ποιος επιτρέπεται να συμμετάσχει σε αυτήν την ομάδα", + "whyDoYouWantToReportThis": "Γιατί θέλετε να αναφέρετε αυτό;", + "wipeChatBackup": "Διαγράψτε το αντίγραφο ασφαλείας της συνομιλίας σας για να δημιουργήσετε ένα νέο κλειδί ανάκτησης;", + "withTheseAddressesRecoveryDescription": "Με αυτές τις διευθύνσεις μπορείτε να ανακτήσετε τον κωδικό πρόσβασής σας.", + "writeAMessage": "Γράψτε ένα μήνυμα…", + "yes": "Ναι", + "you": "Εσύ", + "youAreNoLongerParticipatingInThisChat": "Δεν συμμετέχετε πλέον σε αυτήν τη συνομιλία", + "youHaveBeenBannedFromThisChat": "Έχετε αποκλειστεί από αυτήν τη συνομιλία", + "yourPublicKey": "Το δημόσιο κλειδί σας", + "messageInfo": "Πληροφορίες μηνύματος", + "time": "Χρόνος", + "messageType": "Τύπος μηνύματος", + "sender": "Αποστολέας", + "openGallery": "Άνοιγμα γκαλερί", + "removeFromSpace": "Αφαίρεση από τον χώρο", + "addToSpaceDescription": "Επιλέξτε έναν χώρο στον οποίο θα προσθέσετε αυτήν τη συνομιλία.", + "start": "Έναρξη", + "pleaseEnterRecoveryKeyDescription": "Για να ξεκλειδώσετε τα παλιά μηνύματά σας, εισάγετε το κλειδί ανάκτησης που δημιουργήθηκε σε προηγούμενη συνεδρία. Το κλειδί ανάκτησης ΔΕΝ είναι ο κωδικός πρόσβασής σας.", + "publish": "Δημοσίευση", + "videoWithSize": "Βίντεο ({size})", + "openChat": "Άνοιγμα συνομιλίας", + "markAsRead": "Σημείωσε ως διαβασμένο", + "reportUser": "Αναφορά χρήστη", + "dismiss": "Απόρριψη", + "reactedWith": "{sender} αντέδρασε με {reaction}", + "pinMessage": "Καρφίτσωσε στο δωμάτιο", + "confirmEventUnpin": "Είστε βέβαιοι ότι θέλετε να αποσυνδέσετε οριστικά το γεγονός;", + "emojis": "Εμοji", + "placeCall": "Κάντε κλήση", + "voiceCall": "Φωνητική κλήση", + "unsupportedAndroidVersion": "Μη υποστηριζόμενη έκδοση Android", + "unsupportedAndroidVersionLong": "Αυτή η λειτουργία απαιτεί νεότερη έκδοση Android. Παρακαλούμε ελέγξτε για ενημερώσεις ή υποστήριξη Lineage OS.", + "videoCallsBetaWarning": "Παρακαλούμε σημειώστε ότι οι βιντεοκλήσεις βρίσκονται επί του παρόντος σε beta. Μπορεί να μην λειτουργούν όπως αναμένεται ή καθόλου σε όλες τις πλατφόρμες.", + "experimentalVideoCalls": "Πειραματικές βιντεοκλήσεις", + "emailOrUsername": "Email ή όνομα χρήστη", + "indexedDbErrorTitle": "Προβλήματα ιδιωτικής λειτουργίας", + "indexedDbErrorLong": "Η αποθήκευση μηνυμάτων δυστυχώς δεν ενεργοποιείται από προεπιλογή σε ιδιωτική λειτουργία.\nΠαρακαλούμε επισκεφθείτε\n - about:config\n - ορίστε το dom.indexedDB.privateBrowsing.enabled σε true\nΑλλιώς, δεν είναι δυνατή η εκτέλεση του FluffyChat.", + "switchToAccount": "Μεταβείτε στον λογαριασμό {number}", + "nextAccount": "Επόμενος λογαριασμός", + "previousAccount": "Προηγούμενος λογαριασμός", + "addWidget": "Προσθήκη widget", + "widgetVideo": "Βίντεο", + "widgetEtherpad": "Κείμενο σημείωσης", + "widgetJitsi": "Jitsi Meet", + "widgetCustom": "Προσαρμοσμένο", + "widgetName": "Όνομα", + "widgetUrlError": "Αυτό δεν είναι έγκυρη διεύθυνση URL.", + "widgetNameError": "Παρακαλώ δώστε ένα όνομα εμφάνισης.", + "errorAddingWidget": "Σφάλμα κατά την προσθήκη του widget.", + "youRejectedTheInvitation": "Απορρίψατε την πρόσκληση", + "youJoinedTheChat": "Έχετε συμμετάσχει στη συνομιλία", + "youAcceptedTheInvitation": "👍 Έχετε αποδεχθεί την πρόσκληση", + "youBannedUser": "Αποκλείσατε τον {user}", + "youHaveWithdrawnTheInvitationFor": "Έχετε αποσύρει την πρόσκληση για τον {user}", + "youInvitedToBy": "📩 Έχετε προσκληθεί μέσω συνδέσμου στο:\n{alias}", + "youInvitedBy": "📩 Έχετε προσκληθεί από τον {user}", + "invitedBy": "📩 Προσκληθείς από τον {user}", + "youInvitedUser": "📩 Προσκαλέσατε τον {user}", + "youKicked": "👞 Απομακρύνατε τον {user}", + "youKickedAndBanned": "🙅‍♀️ Απομακρύνατε και αποκλείσατε τον {user}", + "youUnbannedUser": "Απελευθερώσατε τον {user}", + "hasKnocked": "🚪 {user} χτύπησε", + "usersMustKnock": "Οι χρήστες πρέπει να χτυπήσουν", + "noOneCanJoin": "Κανείς δεν μπορεί να συμμετάσχει", + "userWouldLikeToChangeTheChat": "{user} θα ήθελε να συμμετάσχει στη συζήτηση.", + "noPublicLinkHasBeenCreatedYet": "Δεν έχει δημιουργηθεί ακόμη δημόσιος σύνδεσμος", + "knock": "Χτύπημα", + "users": "Χρήστες", + "unlockOldMessages": "Ξεκλείδωμα παλαιών μηνυμάτων", + "storeInSecureStorageDescription": "Αποθηκεύστε το κλειδί ανάκαμψης στην ασφαλή αποθήκευση αυτής της συσκευής.", + "saveKeyManuallyDescription": "Αποθηκεύστε αυτό το κλειδί χειροκίνητα ενεργοποιώντας το διάλογο κοινής χρήσης συστήματος ή το πρόχειρο.", + "storeInAndroidKeystore": "Αποθήκευση στο Android KeyStore", + "storeInAppleKeyChain": "Αποθήκευση στο Apple KeyChain", + "storeSecurlyOnThisDevice": "Αποθήκευση με ασφάλεια σε αυτήν τη συσκευή", + "countFiles": "{count} αρχεία", + "user": "Χρήστης", + "custom": "Προσαρμοσμένο", + "foregroundServiceRunning": "Αυτή η ειδοποίηση εμφανίζεται όταν τρέχει η υπηρεσία μπροστά.", + "screenSharingTitle": "κοινή χρήση οθόνης", + "screenSharingDetail": "Μοιράζεστε την οθόνη σας στο FuffyChat", + "callingPermissions": "Άδειες κλήσης", + "callingAccount": "Λογαριασμός κλήσης", + "callingAccountDetails": "Επιτρέπει στο FluffyChat να χρησιμοποιεί την εγγενή εφαρμογή τηλεφωνητή Android.", + "appearOnTop": "Εμφάνιση στην κορυφή", + "appearOnTopDetails": "Επιτρέπει στην εφαρμογή να εμφανίζεται στην κορυφή (δεν χρειάζεται αν έχετε ήδη ρυθμίσει το FluffyChat ως λογαριασμό κλήσης)", + "otherCallingPermissions": "Άδειες μικροφώνου, κάμερας και άλλες άδειες του FluffyChat", + "whyIsThisMessageEncrypted": "Γιατί αυτό το μήνυμα είναι μη αναγνώσιμο;", + "noKeyForThisMessage": "Αυτό μπορεί να συμβεί αν το μήνυμα στάλθηκε πριν συνδεθείτε στον λογαριασμό σας σε αυτήν τη συσκευή.\n\nΕίναι επίσης πιθανό ο αποστολέας να έχει μπλοκάρει τη συσκευή σας ή να υπήρξε κάποιο πρόβλημα με τη σύνδεση στο διαδίκτυο.\n\nΜπορείτε να διαβάσετε το μήνυμα σε μια άλλη συνεδρία; Τότε μπορείτε να μεταφέρετε το μήνυμα από αυτήν! Μεταβείτε στις Ρυθμίσεις > Συσκευές και βεβαιωθείτε ότι οι συσκευές σας έχουν επαληθευτεί η μία την άλλη. Όταν ανοίξετε ξανά το δωμάτιο και και οι δύο συνεδρίες είναι στην μπροστινή γραμμή, τα κλειδιά θα μεταδοθούν αυτόματα.\n\nΔεν θέλετε να χάσετε τα κλειδιά κατά το αποσύνδεση ή την αλλαγή συσκευής; Βεβαιωθείτε ότι έχετε ενεργοποιήσει την εφεδρεία συνομιλίας στις ρυθμίσεις.", + "newGroup": "Νέα ομάδα", + "newSpace": "Νέος χώρος", + "enterSpace": "Εισέλθετε στον χώρο", + "enterRoom": "Εισέλθετε στο δωμάτιο", + "allSpaces": "Όλοι οι χώροι", + "numChats": "{number} συνομιλίες", + "hideUnimportantStateEvents": "Απόκρυψη άσχετων γεγονότων κατάστασης", + "hidePresences": "Απόκρυψη λίστας κατάστασης;", + "doNotShowAgain": "Μην το εμφανίζετε ξανά", + "wasDirectChatDisplayName": "Άδειο chat (ήταν {oldDisplayName})", + "newSpaceDescription": "Οι χώροι σας επιτρέπουν να ενοποιήσετε τις συνομιλίες σας και να δημιουργήσετε ιδιωτικές ή δημόσιες κοινότητες.", + "encryptThisChat": "Κρυπτογραφήστε αυτήν τη συνομιλία", + "disableEncryptionWarning": "Για λόγους ασφαλείας, δεν μπορείτε να απενεργοποιήσετε την κρυπτογράφηση σε μια συνομιλία όπου είχε ενεργοποιηθεί προηγουμένως.", + "sorryThatsNotPossible": "Λυπούμαστε... αυτό δεν είναι δυνατό", + "deviceKeys": "Κλειδιά συσκευής:", + "reopenChat": "Άνοιγμα ξανά συνομιλίας", + "noBackupWarning": "Προειδοποίηση! Χωρίς ενεργοποίηση αντιγράφου ασφαλείας συνομιλίας, θα χάσετε την πρόσβαση στα κρυπτογραφημένα μηνύματά σας. Συνιστάται ιδιαίτερα να ενεργοποιήσετε το αντίγραφο ασφαλείας πριν αποσυνδεθείτε.", + "noOtherDevicesFound": "Δεν βρέθηκαν άλλες συσκευές", + "fileIsTooBigForServer": "Αδύνατη η αποστολή! Ο διακομιστής υποστηρίζει μόνο συνημμένα έως {max}.", + "fileHasBeenSavedAt": "Το αρχείο έχει αποθηκευτεί στο {path}", + "jumpToLastReadMessage": "Μετάβαση στο τελευταίο διαβασμένο μήνυμα", + "readUpToHere": "Διάβασε μέχρι εδώ", + "jump": "Μετάβαση", + "openLinkInBrowser": "Άνοιγμα συνδέσμου στον περιηγητή", + "reportErrorDescription": "😞 Ωχ. Κάτι πήγε στραβά. Αν θέλετε, μπορείτε να αναφέρετε αυτό το σφάλμα στους προγραμματιστές.", + "report": "αναφορά", + "signInWithPassword": "Σύνδεση με κωδικό πρόσβασης", + "pleaseTryAgainLaterOrChooseDifferentServer": "Παρακαλώ δοκιμάστε ξανά αργότερα ή επιλέξτε διαφορετικό διακομιστή.", + "profileNotFound": "Ο χρήστης δεν βρέθηκε στον διακομιστή. Ίσως υπάρχει πρόβλημα σύνδεσης ή ο χρήστης δεν υπάρχει.", + "setTheme": "Ορίστε θέμα:", + "setColorTheme": "Ορίστε χρωματικό θέμα:", + "invite": "Πρόσκληση", + "inviteGroupChat": "📨 Πρόσκληση σε ομαδική συνομιλία", + "invitePrivateChat": "📨 Πρόσκληση σε ιδιωτική συνομιλία", + "invalidInput": "Μη έγκυρη εισαγωγή!", + "wrongPinEntered": "Λάθος PIN εισήχθη! Δοκιμάστε ξανά σε {seconds} δευτερόλεπτα...", + "pleaseEnterANumber": "Παρακαλώ εισάγετε έναν αριθμό μεγαλύτερο από το 0", + "archiveRoomDescription": "Η συνομιλία θα μετακινηθεί στο αρχείο. Άλλοι χρήστες θα μπορούν να δουν ότι έχετε φύγει από τη συνομιλία.", + "roomUpgradeDescription": "Η συνομιλία θα αναδημιουργηθεί με τη νέα έκδοση δωματίου. Όλοι οι συμμετέχοντες θα ειδοποιηθούν ότι πρέπει να μεταβούν στη νέα συνομιλία. Μπορείτε να μάθετε περισσότερα για τις εκδόσεις δωματίων στο https://spec.matrix.org/latest/rooms/", + "removeDevicesDescription": "Θα αποσυνδεθείτε από αυτήν τη συσκευή και δεν θα μπορείτε πλέον να λαμβάνετε μηνύματα.", + "banUserDescription": "Ο χρήστης θα αποκλειστεί από τη συνομιλία και δεν θα μπορεί να εισέλθει ξανά μέχρι να αφαιρεθεί ο αποκλεισμός.", + "unbanUserDescription": "Ο χρήστης θα μπορεί να εισέλθει ξανά στη συνομιλία αν προσπαθήσει.", + "kickUserDescription": "Ο χρήστης αποβάλλεται από τη συνομιλία αλλά δεν αποκλείεται. Στις δημόσιες συνομιλίες, ο χρήστης μπορεί να επανενταχθεί οποιαδήποτε στιγμή.", + "makeAdminDescription": "Αφού κάνετε αυτόν τον χρήστη διαχειριστή, ίσως να μην μπορείτε να αναιρέσετε αυτό, καθώς θα έχει τις ίδιες άδειες με εσάς.", + "pushNotificationsNotAvailable": "Οι ειδοποιήσεις push δεν είναι διαθέσιμες", + "learnMore": "Μάθετε περισσότερα", + "yourGlobalUserIdIs": "Το παγκόσμιο αναγνωριστικό χρήστη σας είναι: ", + "noUsersFoundWithQuery": "Δυστυχώς, δεν βρέθηκε χρήστης με την ερώτηση \"{query}\". Παρακαλώ ελέγξτε αν κάνατε τυπογραφικό λάθος.", + "knocking": "Χτυπάει", + "chatCanBeDiscoveredViaSearchOnServer": "Η συνομιλία μπορεί να βρεθεί μέσω της αναζήτησης στο {server}", + "searchChatsRooms": "Αναζήτηση για #συνομιλίες, @χρήστες...", + "nothingFound": "Δεν βρέθηκε τίποτα...", + "groupName": "Όνομα ομάδας", + "createGroupAndInviteUsers": "Δημιουργήστε μια ομάδα και προσκαλέστε χρήστες", + "groupCanBeFoundViaSearch": "Η ομάδα μπορεί να βρεθεί μέσω αναζήτησης", + "wrongRecoveryKey": "Λυπάμαι... αυτό δεν φαίνεται να είναι το σωστό κλειδί ανάκτησης.", + "startConversation": "Ξεκινήστε συνομιλία", + "commandHint_sendraw": "Αποστολή ακατέργαστου json", + "databaseMigrationTitle": "Η βάση δεδομένων είναι βελτιστοποιημένη", + "databaseMigrationBody": "Παρακαλώ περιμένετε. Αυτό μπορεί να διαρκέσει λίγα λεπτά.", + "leaveEmptyToClearStatus": "Αφήστε κενό για να διαγράψετε την κατάσταση σας.", + "select": "Επιλογή", + "searchForUsers": "Αναζήτηση για @χρήστες...", + "pleaseEnterYourCurrentPassword": "Παρακαλώ εισάγετε τον τρέχοντα κωδικό πρόσβασής σας", + "newPassword": "Νέος κωδικός πρόσβασης", + "pleaseChooseAStrongPassword": "Παρακαλώ επιλέξτε έναν ισχυρό κωδικό πρόσβασης", + "passwordsDoNotMatch": "Οι κωδικοί πρόσβασης δεν ταιριάζουν", + "passwordIsWrong": "Ο εισαγόμενος κωδικός πρόσβασης είναι λανθασμένος", + "publicLink": "Δημόσιος σύνδεσμος", + "publicChatAddresses": "Διευθύνσεις δημόσιων συνομιλιών", + "createNewAddress": "Δημιουργία νέας διεύθυνσης", + "joinSpace": "Συμμετοχή στον χώρο", + "publicSpaces": "Δημόσιοι χώροι", + "addChatOrSubSpace": "Προσθήκη συνομιλίας ή υποχώρου", + "subspace": "Υποχώρος", + "decline": "Απόρριψη", + "thisDevice": "Αυτή η συσκευή:", + "initAppError": "Παρουσιάστηκε σφάλμα κατά την αρχικοποίηση της εφαρμογής", + "userRole": "Ρόλος χρήστη", + "minimumPowerLevel": "{level} είναι το ελάχιστο επίπεδο ισχύος.", + "searchIn": "Αναζήτηση στη συνομιλία \"{chat}\"...", + "searchMore": "Αναζήτηση περισσότερο...", + "gallery": "Πινακοθήκη", + "files": "Αρχεία", + "databaseBuildErrorBody": "Αδυναμία δημιουργίας της βάσης δεδομένων SQLite. Η εφαρμογή προσπαθεί να χρησιμοποιήσει την παλαιά βάση δεδομένων προς το παρόν. Παρακαλούμε αναφέρετε αυτό το σφάλμα στους προγραμματιστές στο {url}. Το μήνυμα σφάλματος είναι: {error}", + "sessionLostBody": "Η συνεδρία σας χάθηκε. Παρακαλούμε αναφέρετε αυτό το σφάλμα στους προγραμματιστές στο {url}. Το μήνυμα σφάλματος είναι: {error}", + "restoreSessionBody": "Η εφαρμογή προσπαθεί τώρα να επαναφέρει τη συνεδρία σας από το αντίγραφο ασφαλείας. Παρακαλούμε αναφέρετε αυτό το σφάλμα στους προγραμματιστές στο {url}. Το μήνυμα σφάλματος είναι: {error}", + "forwardMessageTo": "Αποστολή μηνύματος στο {roomName}?", + "sendReadReceipts": "Αποστολή αποδείξεων ανάγνωσης", + "sendTypingNotificationsDescription": "Οι άλλοι συμμετέχοντες σε μια συνομιλία μπορούν να δουν πότε πληκτρολογείτε ένα νέο μήνυμα.", + "sendReadReceiptsDescription": "Οι άλλοι συμμετέχοντες σε μια συνομιλία μπορούν να δουν πότε έχετε διαβάσει ένα μήνυμα.", + "formattedMessages": "Μορφοποιημένα μηνύματα", + "formattedMessagesDescription": "Εμφάνιση πλούσιου περιεχομένου μηνυμάτων όπως έντονο κείμενο χρησιμοποιώντας markdown.", + "verifyOtherUser": "🔐 Επιβεβαίωση άλλου χρήστη", + "verifyOtherUserDescription": "Αν επιβεβαιώσετε έναν άλλο χρήστη, μπορείτε να είστε σίγουροι ότι γνωρίζετε πραγματικά σε ποιον γράφετε. 💪\n\nΌταν ξεκινάτε μια επιβεβαίωση, εσείς και ο άλλος χρήστης θα δείτε ένα αναδυόμενο παράθυρο στην εφαρμογή. Εκεί θα δείτε μια σειρά από emoji ή αριθμούς που πρέπει να συγκρίνετε μεταξύ σας.\n\nΟ καλύτερος τρόπος να το κάνετε αυτό είναι να συναντηθείτε ή να ξεκινήσετε μια βιντεκλήση. 👭", + "verifyOtherDevice": "🔐 Επιβεβαίωση άλλης συσκευής", + "verifyOtherDeviceDescription": "Όταν επιβεβαιώνετε μια άλλη συσκευή, αυτές οι συσκευές μπορούν να ανταλλάξουν κλειδιά, αυξάνοντας τη συνολική ασφάλειά σας. 💪 Όταν ξεκινάτε μια επιβεβαίωση, θα εμφανιστεί ένα αναδυόμενο παράθυρο στην εφαρμογή και στις δύο συσκευές. Εκεί θα δείτε μια σειρά από emoji ή αριθμούς που πρέπει να συγκρίνετε. Είναι καλύτερο να έχετε και τις δύο συσκευές έτοιμες πριν ξεκινήσετε την επιβεβαίωση. 🤳", + "acceptedKeyVerification": "{sender} αποδέχτηκε την επιβεβαίωση κλειδιού", + "canceledKeyVerification": "{sender} ακύρωσε την επιβεβαίωση κλειδιού", + "completedKeyVerification": "{sender} ολοκλήρωσε την επιβεβαίωση κλειδιού", + "isReadyForKeyVerification": "{sender} είναι έτοιμος/η για επιβεβαίωση κλειδιού", + "requestedKeyVerification": "{sender} ζήτησε επιβεβαίωση κλειδιού", + "startedKeyVerification": "{sender} ξεκίνησε την επιβεβαίωση κλειδιού", + "transparent": "Διαφανές", + "incomingMessages": "Εισερχόμενα μηνύματα", + "stickers": "Αυτοκόλλητα", + "discover": "Ανακάλυψη", + "commandHint_ignore": "Αγνόηση του δοθέντος ταυτότητας matrix", + "commandHint_unignore": "Αναίρεση αγνόησης του δοθέντος ταυτότητας matrix", + "unreadChatsInApp": "{appname}: {unread} μη αναγνωσμένα chats", + "noDatabaseEncryption": "Η κρυπτογράφηση βάσης δεδομένων δεν υποστηρίζεται σε αυτήν την πλατφόρμα", + "thereAreCountUsersBlocked": "Αυτήν τη στιγμή υπάρχουν {count} αποκλεισμένοι χρήστες.", + "restricted": "Περιορισμένο", + "knockRestricted": "Περιορισμός χτυπήματος", + "goToSpace": "Μεταβείτε στον χώρο: {space}", + "markAsUnread": "Σήμανση ως μη αναγνωσμένο", + "userLevel": "{level} - Χρήστης", + "moderatorLevel": "{level} - Διαχειριστής", + "adminLevel": "{level} - Διαχειριστής", + "changeGeneralChatSettings": "Αλλαγή γενικών ρυθμίσεων συνομιλίας", + "inviteOtherUsers": "Πρόσκληση άλλων χρηστών σε αυτήν τη συνομιλία", + "changeTheChatPermissions": "Αλλαγή των δικαιωμάτων συνομιλίας", + "changeTheVisibilityOfChatHistory": "Αλλαγή της ορατότητας του ιστορικού συνομιλίας", + "changeTheCanonicalRoomAlias": "Αλλαγή της κύριας δημόσιας διεύθυνσης συνομιλίας", + "sendRoomNotifications": "Αποστολή ειδοποιήσεων @room", + "changeTheDescriptionOfTheGroup": "Αλλαγή της περιγραφής της συνομιλίας", + "chatPermissionsDescription": "Ορίστε ποιο επίπεδο δύναμης είναι απαραίτητο για ορισμένες ενέργειες σε αυτήν τη συνομιλία. Τα επίπεδα δύναμης 0, 50 και 100 συνήθως αντιπροσωπεύουν χρήστες, διαχειριστές και διαχειριστές, αλλά οποιαδήποτε βαθμίδα είναι δυνατή.", + "updateInstalled": "🎉 Εγκαταστάθηκε η ενημέρωση {version}!", + "changelog": "Αλλαγές", + "sendCanceled": "Η αποστολή ακυρώθηκε", + "loginWithMatrixId": "Σύνδεση με Matrix-ID", + "discoverHomeservers": "Ανακαλύψτε τους διακομιστές", + "whatIsAHomeserver": "Τι είναι ένας διακομιστής σπιτιού;", + "homeserverDescription": "Όλα τα δεδομένα σας αποθηκεύονται στον διακομιστή σπιτιού, όπως και ένας πάροχος email. Μπορείτε να επιλέξετε ποιον διακομιστή σπιτιού θέλετε να χρησιμοποιήσετε, ενώ μπορείτε ακόμα να επικοινωνείτε με όλους. Μάθετε περισσότερα στο https://matrix.org.", + "doesNotSeemToBeAValidHomeserver": "Δεν φαίνεται να είναι συμβατός διακομιστής σπιτιού. Λάθος URL;", + "calculatingFileSize": "Υπολογισμός μεγέθους αρχείου...", + "prepareSendingAttachment": "Ετοιμασία αποστολής συνημμένου...", + "sendingAttachment": "Αποστολή συνημμένου...", + "generatingVideoThumbnail": "Δημιουργία μικρογραφίας βίντεο...", + "compressVideo": "Συμπίεση βίντεο...", + "sendingAttachmentCountOfCount": "Αποστολή συνημμένου {index} από {length}...", + "serverLimitReached": "Έφτασε το όριο του διακομιστή! Περιμένετε {seconds} δευτερόλεπτα...", + "oneOfYourDevicesIsNotVerified": "Ένα από τα συσκευές σας δεν είναι επαληθευμένο", + "noticeChatBackupDeviceVerification": "Σημείωση: Όταν συνδέσετε όλες τις συσκευές σας στο αντίγραφο ασφαλείας συνομιλίας, αυτομάτως επαληθεύονται.", + "continueText": "Συνέχεια", + "welcomeText": "Γεια Γεια 👋 Αυτό είναι το FluffyChat. Μπορείτε να συνδεθείτε σε οποιονδήποτε διακομιστή σπιτιού, ο οποίος είναι συμβατός με το https://matrix.org. Και στη συνέχεια να συνομιλήσετε με οποιονδήποτε. Είναι ένα τεράστιο αποκεντρωμένο δίκτυο μηνυμάτων!", + "blur": "Θάμπωμα:", + "opacity": "Αδιαφάνεια:", + "setWallpaper": "Ορισμός φόντου", + "manageAccount": "Διαχείριση λογαριασμού", + "noContactInformationProvided": "Ο διακομιστής δεν παρέχει έγκυρες πληροφορίες επικοινωνίας", + "contactServerAdmin": "Επικοινωνήστε με τον διαχειριστή του διακομιστή", + "contactServerSecurity": "Επικοινωνία με την ασφάλεια διακομιστή", + "supportPage": "Σελίδα υποστήριξης", + "serverInformation": "Πληροφορίες διακομιστή:", + "name": "Όνομα", + "version": "Έκδοση", + "website": "Ιστοσελίδα", + "compress": "Συμπίεση", + "boldText": "Έντονο κείμενο", + "italicText": "Πλάγιο κείμενο", + "strikeThrough": "Διαγραφή", + "pleaseFillOut": "Παρακαλώ συμπληρώστε", + "invalidUrl": "Μη έγκυρο URL", + "addLink": "Προσθήκη συνδέσμου", + "unableToJoinChat": "Αδύνατη η συμμετοχή στη συνομιλία. Ίσως το άλλο μέρος έχει ήδη κλείσει τη συνομιλία.", + "previous": "Προηγούμενο", + "otherPartyNotLoggedIn": "Το άλλο μέρος δεν είναι αυτήν τη στιγμή συνδεδεμένο και επομένως δεν μπορεί να λάβει μηνύματα!", + "appWantsToUseForLogin": "Χρησιμοποιήστε '{server}' για σύνδεση", + "appWantsToUseForLoginDescription": "Επιτρέπετε στην εφαρμογή και στον ιστότοπο να μοιράζονται πληροφορίες σχετικά με εσάς.", + "open": "Άνοιγμα", + "waitingForServer": "Αναμονή για διακομιστή...", + "appIntroduction": "Το FluffyChat σας επιτρέπει να συνομιλείτε με τους φίλους σας σε διαφορετικά μηνύματα. Μάθετε περισσότερα στο https://matrix.org ή απλώς πατήστε *Συνέχεια*.", + "newChatRequest": "📩 Νέα αίτηση συνομιλίας", + "contentNotificationSettings": "Ρυθμίσεις ειδοποιήσεων περιεχομένου", + "generalNotificationSettings": "Γενικές ρυθμίσεις ειδοποιήσεων", + "roomNotificationSettings": "Ρυθμίσεις ειδοποιήσεων δωματίου", + "userSpecificNotificationSettings": "Εξατομικευμένες ρυθμίσεις ειδοποιήσεων χρήστη", + "otherNotificationSettings": "Άλλες ρυθμίσεις ειδοποιήσεων", + "notificationRuleContainsUserName": "Περιέχει όνομα χρήστη", + "notificationRuleContainsUserNameDescription": "Ειδοποιεί τον χρήστη όταν ένα μήνυμα περιέχει το όνομα χρήστη του.", + "notificationRuleMaster": "Απενεργοποίηση όλων των ειδοποιήσεων", + "notificationRuleMasterDescription": "Παρακάμπτει όλους τους άλλους κανόνες και απενεργοποιεί όλες τις ειδοποιήσεις.", + "notificationRuleSuppressNotices": "Καταστολή αυτόματων μηνυμάτων", + "notificationRuleSuppressNoticesDescription": "Καταστέλλει τις ειδοποιήσεις από αυτοματοποιμένους πελάτες όπως τα bots.", + "notificationRuleInviteForMe": "Πρόσκληση για μένα", + "notificationRuleInviteForMeDescription": "Ειδοποιεί τον χρήστη όταν λαμβάνει πρόσκληση σε δωμάτιο.", + "notificationRuleMemberEvent": "Γεγονός μέλους", + "notificationRuleMemberEventDescription": "Καταστέλλει τις ειδοποιήσεις για γεγονότα μέλους.", + "notificationRuleIsUserMention": "Αναφορά χρήστη", + "notificationRuleIsUserMentionDescription": "Ειδοποιεί τον χρήστη όταν αναφέρεται άμεσα σε μήνυμα.", + "notificationRuleContainsDisplayName": "Περιέχει όνομα εμφάνισης", + "notificationRuleContainsDisplayNameDescription": "Ειδοποιεί τον χρήστη όταν ένα μήνυμα περιέχει το όνομά του.", + "notificationRuleIsRoomMention": "Αναφορά Δωματίου", + "notificationRuleIsRoomMentionDescription": "Ειδοποιεί τον χρήστη όταν υπάρχει αναφορά σε δωμάτιο.", + "notificationRuleRoomnotif": "Ειδοποίηση Δωματίου", + "notificationRuleRoomnotifDescription": "Ειδοποιεί τον χρήστη όταν ένα μήνυμα περιέχει '@room'.", + "notificationRuleTombstone": "Ταφόπλακα", + "notificationRuleTombstoneDescription": "Ειδοποιεί τον χρήστη σχετικά με μηνύματα απενεργοποίησης δωματίου.", + "notificationRuleReaction": "Αντίδραση", + "notificationRuleReactionDescription": "Καταστέλλει τις ειδοποιήσεις για αντιδράσεις.", + "notificationRuleRoomServerAcl": "Πρόσβαση Δωματίου στον Διακομιστή", + "notificationRuleRoomServerAclDescription": "Καταστέλλει τις ειδοποιήσεις για λίστες ελέγχου πρόσβασης (ACL) του διακομιστή δωματίου.", + "notificationRuleSuppressEdits": "Καταστολή Επεξεργασιών", + "notificationRuleSuppressEditsDescription": "Καταστέλλει τις ειδοποιήσεις για επεξεργασμένα μηνύματα.", + "notificationRuleCall": "Κλήση", + "notificationRuleCallDescription": "Ειδοποιεί τον χρήστη σχετικά με κλήσεις.", + "notificationRuleEncryptedRoomOneToOne": "Κρυπτογραφημένο Δωμάτιο Μία προς Μία", + "notificationRuleEncryptedRoomOneToOneDescription": "Ειδοποιεί τον χρήστη σχετικά με μηνύματα σε κρυπτογραφημένα δωμάτια ένα προς ένα.", + "notificationRuleRoomOneToOne": "Δωμάτιο Μία προς Μία", + "notificationRuleRoomOneToOneDescription": "Ειδοποιεί τον χρήστη σχετικά με μηνύματα σε δωμάτια ένα προς ένα.", + "notificationRuleMessage": "Μήνυμα", + "notificationRuleMessageDescription": "Ειδοποιεί τον χρήστη για γενικά μηνύματα.", + "notificationRuleEncrypted": "Κρυπτογραφημένο", + "notificationRuleEncryptedDescription": "Ειδοποιεί τον χρήστη για μηνύματα σε κρυπτογραφημένους δωματίους.", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "Ειδοποιεί τον χρήστη για γεγονότα widget Jitsi.", + "notificationRuleServerAcl": "Κατάπνιξε γεγονότα Server ACL", + "notificationRuleServerAclDescription": "Καταπνίγει τις ειδοποιήσεις για γεγονότα Server ACL.", + "unknownPushRule": "Άγνωστος κανόνας ώθησης '{rule}'", + "sentVoiceMessage": "🎙️ {duration} - Φωνητικό μήνυμα από {sender}", + "deletePushRuleCanNotBeUndone": "Εάν διαγράψετε αυτήν τη ρύθμιση ειδοποίησης, αυτό δεν μπορεί να αναιρεθεί.", + "more": "Περισσότερα", + "shareKeysWith": "Μοιραστείτε κλειδιά με...", + "shareKeysWithDescription": "Ποια συσκευές πρέπει να είναι αξιόπιστες ώστε να μπορούν να διαβάσουν τα μηνύματά σας σε κρυπτογραφημένες συνομιλίες;", + "allDevices": "Όλες οι συσκευές", + "crossVerifiedDevicesIfEnabled": "Διασταυρωμένες επαληθευμένες συσκευές αν είναι ενεργοποιημένο", + "crossVerifiedDevices": "Διασταυρωμένες επαληθευμένες συσκευές", + "verifiedDevicesOnly": "Μόνο επαληθευμένες συσκευές", + "takeAPhoto": "Βγάλτε μια φωτογραφία", + "recordAVideo": "Καταγράψτε ένα βίντεο", + "optionalMessage": "(Προαιρετικό) μήνυμα...", + "notSupportedOnThisDevice": "Δεν υποστηρίζεται σε αυτήν τη συσκευή", + "enterNewChat": "Ξεκινήστε νέο chat", + "approve": "Έγκριση", + "youHaveKnocked": "Έχετε χτυπήσει", + "pleaseWaitUntilInvited": "Παρακαλώ περιμένετε τώρα, μέχρι κάποιος από το δωμάτιο να σας προσκαλέσει.", + "commandHint_logout": "Αποσυνδεθείτε από τη τρέχουσα συσκευή σας", + "commandHint_logoutall": "Αποσυνδεθείτε από όλες τις ενεργές συσκευές", + "displayNavigationRail": "Εμφάνιση της γραμμής πλοήγησης σε κινητά", + "customReaction": "Προσαρμοσμένη αντίδραση", + "ignore": "Αποκλεισμός", + "ignoredUsers": "Αποκλεισμένοι χρήστες", + "writeAMessageLangCodes": "Πληκτρολογήστε σε {l1} ή {l2}...", + "requests": "Αιτήματα", + "holdForInfo": "Κάντε κλικ και κρατήστε πατημένο για πληροφορίες λέξης.", + "greenFeedback": "Αυτό θα έβαζα!", + "yellowFeedback": "Χμ, μπορείς να το δοκιμάσεις και να δεις αν λειτουργεί! Για να χρησιμοποιήσεις αυτή τη λέξη, απλώς κάνε κλικ ξανά.", + "redFeedback": "Δεν νομίζω ότι είναι σωστό...", + "itInstructionsTitle": "Μπορώ να σε βοηθήσω με τη μετάφραση!", + "itInstructionsBody": "Μπορείς να κάνεις κλικ και να κρατήσεις πατημένο τις επιλογές για πληροφορίες λέξης.", + "gaTooltip": "L2 χρήση με βοήθεια γραμματικής", + "taTooltip": "L2 χρήση με βοήθεια μετάφρασης", + "unTooltip": "Άλλο", + "interactiveTranslatorSliderHeader": "Διαδραστικός Μεταφραστής", + "interactiveGrammarSliderHeader": "Διαδραστικός Έλεγχος Γραμματικής", + "interactiveTranslatorNotAllowed": "Απενεργοποιημένο", + "interactiveTranslatorAllowed": "Επιλογή Μαθητή", + "interactiveTranslatorRequired": "Απαιτείται", + "notYetSet": "Δεν έχει οριστεί ακόμα", + "waTooltip": "Χρήση L2 χωρίς βοήθεια", + "languageSettings": "Ρυθμίσεις γλώσσας", + "interactiveTranslator": "Βοήθεια μετάφρασης", + "noIdenticalLanguages": "Παρακαλώ επιλέξτε διαφορετικές βασικές και στόχους γλώσσες", + "searchBy": "Αναζήτηση με βάση χώρα και γλώσσες", + "joinWithClassCode": "Εγγραφή στο μάθημα", + "languageLevelPreA1": "Νέος Χαμηλός (Προ Α1)", + "languageLevelA1": "Νέος Μέσος (A1)", + "languageLevelA2": "Αρχάριος Υψηλού Επιπέδου (A2)", + "languageLevelB1": "Μεσαίος Μέτριος (B1)", + "languageLevelB2": "Προχωρημένος Χαμηλού Επιπέδου (B2)", + "languageLevelC1": "Προχωρημένος Μέτριος (C1)", + "languageLevelC2": "Ανώτερος (C2)", + "changeTheNameOfTheClass": "Αλλαγή ονόματος", + "changeTheNameOfTheChat": "Αλλαγή ονόματος της συνομιλίας", + "sorryNoResults": "Λυπούμαστε, δεν βρέθηκαν αποτελέσματα.", + "ignoreInThisText": "Αγνόηση", + "needsItMessage": "Περίμενε, αυτό δεν είναι {targetLanguage}! Χρειάζεστε βοήθεια με τη μετάφραση;", + "countryInformation": "Η χώρα μου", + "targetLanguage": "Γλώσσα στόχος", + "sourceLanguage": "Βασική γλώσσα", + "updateLanguage": "Οι γλώσσες μου", + "whatLanguageYouWantToLearn": "Ποια γλώσσα θέλετε να μάθετε;", + "whatIsYourBaseLanguage": "Ποια είναι η βασική σας γλώσσα;", + "saveChanges": "Αποθήκευση αλλαγών", + "publicProfileTitle": "Να επιτρέπεται η εύρεση του προφίλ μου στην αναζήτηση", + "publicProfileDesc": "Με την ενεργοποίηση, επιτρέπετε σε άλλους χρήστες να βρουν το προφίλ σας στη διεθνή γραμμή αναζήτησης και να στείλουν αιτήματα συνομιλίας. Σε αυτό το σημείο, μπορείτε να επιλέξετε να αποδεχτείτε ή να αρνηθείτε το αίτημα.", + "errorDisableIT": "Η βοήθεια μετάφρασης είναι απενεργοποιημένη.", + "errorDisableIGC": "Η βοήθεια γραμματικής είναι απενεργοποιημένη.", + "errorDisableLanguageAssistance": "Η βοήθεια μετάφρασης και γραμματικής είναι απενεργοποιημένες.", + "errorDisableITUserDesc": "Κάντε κλικ εδώ για να ενημερώσετε τις ρυθμίσεις βοήθειας μετάφρασης", + "errorDisableIGCUserDesc": "Κάντε κλικ εδώ για να ενημερώσετε τις ρυθμίσεις βοήθειας γραμματικής", + "errorDisableLanguageAssistanceUserDesc": "Κάντε κλικ εδώ για να ενημερώσετε τις ρυθμίσεις βοήθειας μετάφρασης και γραμματικής", + "errorDisableITClassDesc": "Η βοήθεια μετάφρασης είναι απενεργοποιημένη για το μάθημα στο οποίο βρίσκεται αυτή η συνομιλία.", + "errorDisableIGCClassDesc": "Η βοήθεια γραμματικής είναι απενεργοποιημένη για το μάθημα στο οποίο βρίσκεται αυτή η συνομιλία.", + "error405Title": "Οι γλώσσες δεν έχουν οριστεί", + "error405Desc": "Ορίστε τις γλώσσες σας στο Μενού > Ρυθμίσεις Μάθησης.", + "termsAndConditions": "Όρους και Προϋποθέσεις", + "andCertifyIAmAtLeast13YearsOfAge": " και πιστοποιώ ότι είμαι τουλάχιστον 16 ετών.", + "error502504Title": "Ω, υπάρχουν πολλοί μαθητές online!", + "error502504Desc": "Τα εργαλεία μετάφρασης και γραμματικής ενδέχεται να είναι αργά ή μη διαθέσιμα ενώ οι bots της Pangea ενημερώνονται.", + "error404Title": "Σφάλμα μετάφρασης!", + "error404Desc": "Ο Pangea Bot δεν είναι σίγουρος πώς να μεταφράσει αυτό...", + "errorPleaseRefresh": "Το ερευνούμε! Παρακαλούμε ανανεώστε και δοκιμάστε ξανά.", + "connectedToStaging": "Συνδεδεμένο με το Staging", + "learningSettings": "Ρυθμίσεις Μάθησης", + "participants": "Συμμετέχοντες", + "clickMessageTitle": "Χρειάζεστε βοήθεια;", + "clickMessageBody": "Κάντε κλικ σε ένα μήνυμα για εργαλεία γλώσσας όπως μετάφραση, αναπαραγωγή και άλλα!", + "allDone": "Ολοκληρώθηκε!", + "vocab": "Λεξιλόγιο", + "low": "Έχουμε αποδείξεις ότι ο χρήστης δεν καταλαβαίνει αυτές τις λέξεις.", + "medium": "Αυτές οι λέξεις έχουν χρησιμοποιηθεί. Δεν είναι σαφές αν οι λέξεις κατανοούνται πλήρως ή όχι.", + "high": "Έχουμε αποδείξεις ότι ο χρήστης καταλαβαίνει αυτές τις λέξεις.", + "subscribe": "Εγγραφή", + "getAccess": "Εγγραφείτε τώρα!", + "subscriptionDesc": "Οι μηνύσεις είναι δωρεάν! Εγγραφείτε για να ξεκλειδώσετε διαδραστική μετάφραση, έλεγχο γραμματικής και αναλυτικά στοιχεία μάθησης.", + "subscriptionManagement": "Διαχείριση Συνδρομής", + "currentSubscription": "Τρέχουσα Συνδρομή", + "cancelSubscription": "Ακυρώστε τη συνδρομή σας", + "selectYourPlan": "Επιλέξτε το πλάνο σας", + "subsciptionPlatformTooltip": "Παρακαλώ συνδεθείτε στη αρχική συσκευή σας για να διαχειριστείτε το πλάνο της συνδρομής σας", + "subscriptionManagementUnavailable": "Η διαχείριση συνδρομής δεν είναι διαθέσιμη", + "paymentMethod": "Μέθοδος Πληρωμής", + "paymentHistory": "Ιστορικό Πληρωμών", + "emptyChatDownloadWarning": "Δεν είναι δυνατή η λήψη κενής συνομιλίας", + "update": "Ενημέρωση", + "toggleImmersionMode": "Λειτουργία Εμβάπτισης", + "toggleImmersionModeDesc": "Όταν ενεργοποιείται, όλα τα μηνύματα εμφανίζονται στη γλώσσα στόχο σας. Αυτή η ρύθμιση είναι πιο χρήσιμη σε ανταλλαγές γλωσσών.", + "itToggleDescription": "Αυτό το εργαλείο εκμάθησης γλωσσών θα εντοπίζει λέξεις στη βασική σας γλώσσα και θα σας βοηθά να τις μεταφράσετε στη γλώσσα στόχο. Αν και σπάνιο, το AI μπορεί να κάνει λάθη στη μετάφραση.", + "igcToggleDescription": "Αυτό το εργαλείο εκμάθησης γλωσσών θα εντοπίζει κοινά ορθογραφικά, γραμματικά και σημεία στίξης λάθη στο μήνυμά σας και θα προτείνει διορθώσεις. Αν και σπάνιο, το AI μπορεί να κάνει λάθη στις διορθώσεις.", + "originalMessage": "Αρχικό Μήνυμα", + "sentMessage": "Αποσταλμένο Μήνυμα", + "useType": "Χρησιμοποιήστε Τύπο", + "notAvailable": "Δεν Διαθέσιμη", + "taAndGaTooltip": "Χρήση L2 με βοήθεια μετάφρασης και γραμματικής", + "definitionsToolName": "Ορισμοί Λέξεων", + "messageTranslationsToolName": "Μεταφράσεις Μηνυμάτων", + "definitionsToolDescription": "Όταν ενεργοποιείται, οι λέξεις με υπογράμμιση μπλε μπορούν να πατηθούν για ορισμούς. Πατήστε μηνύματα για πρόσβαση στους ορισμούς.", + "translationsToolDescrption": "Όταν ενεργοποιείται, πατήστε ένα μήνυμα και το εικονίδιο μετάφρασης για να δείτε ένα μήνυμα στη βασική σας γλώσσα.", + "welcomeBack": "Καλώς ήρθατε ξανά! Αν ήσασταν μέρος του πιλοτικού προγράμματος 2023-2024, παρακαλούμε επικοινωνήστε μαζί μας για τη ειδική σας συνδρομή πιλοτικού προγράμματος. Αν είστε εκπαιδευτικός που έχει αγοράσει (ή η εκπαιδευτική σας ιδιότητα έχει αγοράσει) άδειες για την τάξη σας, επικοινωνήστε μαζί μας για τη συνδρομή εκπαιδευτικού.", + "downloadTxtFile": "Λήψη αρχείου κειμένου", + "downloadCSVFile": "Λήψη αρχείου CSV", + "promotionalSubscriptionDesc": "Έχετε επί του παρόντος μια συνδρομή προώθησης διάρκειας ζωής. Στείλτε μήνυμα στο support@pangea.chat για βοήθεια στην αλλαγή της συνδρομής σας.", + "originalSubscriptionPlatform": "Συνδρομή αγοράστηκε μέσω {purchasePlatform}", + "oneWeekTrial": "Δοκιμαστική περίοδος μιας εβδομάδας", + "downloadXLSXFile": "Λήψη αρχείου Excel", + "unkDisplayName": "Άγνωστο", + "wwCountryDisplayName": "Παγκόσμιος", + "afCountryDisplayName": "Αφγανιστάν", + "axCountryDisplayName": "Νήσοι Αλάντες", + "alCountryDisplayName": "Αλβανία", + "dzCountryDisplayName": "Αλγερία", + "asCountryDisplayName": "Αμερικανική Σαμόα", + "adCountryDisplayName": "Ανδόρα", + "aoCountryDisplayName": "Αγκόλα", + "aiCountryDisplayName": "Ανγκουίλα", + "agCountryDisplayName": "Αντίγκουα και Μπαρμπούντα", + "arCountryDisplayName": "Αργεντινή", + "amCountryDisplayName": "Αρμενία", + "awCountryDisplayName": "Αρούμπα", + "acCountryDisplayName": "Νήσος Ασένσιον", + "auCountryDisplayName": "Αυστραλία", + "atCountryDisplayName": "Αυστρία", + "azCountryDisplayName": "Αζερμπαϊτζάν", + "bsCountryDisplayName": "Μπαχάμες", + "bhCountryDisplayName": "Μπαχρέιν", + "bdCountryDisplayName": "Μπανγκλαντές", + "bbCountryDisplayName": "Μπαρμπάντος", + "byCountryDisplayName": "Λευκορωσία", + "beCountryDisplayName": "Βέλγιο", + "bzCountryDisplayName": "Μπελίζ", + "bjCountryDisplayName": "Μπενίν", + "bmCountryDisplayName": "Βερμούδες", + "btCountryDisplayName": "Μπουτάν", + "boCountryDisplayName": "Βολιβία", + "baCountryDisplayName": "Βοσνία και Ερζεγοβίνη", + "bwCountryDisplayName": "Μποτσουάνα", + "brCountryDisplayName": "Βραζιλία", + "ioCountryDisplayName": "Βρετανικό Εδαφικό Τόξο Ινδικού Ωκεανού", + "vgCountryDisplayName": "Βρετανικές Παρθένοι Νήσοι", + "bnCountryDisplayName": "Μπρουνέι", + "bgCountryDisplayName": "Βουλγαρία", + "bfCountryDisplayName": "Μπουρκίνα Φάσο", + "biCountryDisplayName": "Μπουρούντι", + "khCountryDisplayName": "Καμπότζη", + "cmCountryDisplayName": "Καμερούν", + "caCountryDisplayName": "Καναδάς", + "cvCountryDisplayName": "Πράσινο Ακρωτήρι", + "bqCountryDisplayName": "Καραϊβική Ολλανδία", + "kyCountryDisplayName": "Νήσοι Κέιμαν", + "cfCountryDisplayName": "Κεντροαφρικανική Δημοκρατία", + "tdCountryDisplayName": "Τσαντ", + "clCountryDisplayName": "Χιλή", + "cnCountryDisplayName": "Κίνα", + "cxCountryDisplayName": "Νήσος Χριστουγέννων", + "ccCountryDisplayName": "Νήσοι Κόκος [Κίλιγκ]", + "coCountryDisplayName": "Κολομβία", + "kmCountryDisplayName": "Κομόρες", + "cdCountryDisplayName": "Δημοκρατία του Κονγκό", + "cgCountryDisplayName": "Δημοκρατία του Κονγκό", + "ckCountryDisplayName": "Νήσοι Κουκ", + "crCountryDisplayName": "Κόστα Ρίκα", + "ciCountryDisplayName": "Ακτή Ελεφαντοστού", + "hrCountryDisplayName": "Κροατία", + "cuCountryDisplayName": "Κούβα", + "cwCountryDisplayName": "Κουρασάο", + "cyCountryDisplayName": "Κύπρος", + "czCountryDisplayName": "Τσεχική Δημοκρατία", + "dkCountryDisplayName": "Δανία", + "djCountryDisplayName": "Τζιμπουτί", + "dmCountryDisplayName": "Δομινίκα", + "doCountryDisplayName": "Δομινικανή Δημοκρατία", + "tlCountryDisplayName": "Ανατολικό Τιμόρ", + "ecCountryDisplayName": "Ισημερινός", + "egCountryDisplayName": "Αίγυπτος", + "svCountryDisplayName": "Ελ Σαλβαδόρ", + "gqCountryDisplayName": "Ισημερινή Γουινέα", + "erCountryDisplayName": "Ερυθραία", + "eeCountryDisplayName": "Εσθονία", + "szCountryDisplayName": "Σουαζιλάνδη", + "etCountryDisplayName": "Αιθιοπία", + "fkCountryDisplayName": "Νήσοι Φόκλαντ", + "foCountryDisplayName": "Νήσοι Φερόες", + "fjCountryDisplayName": "Φίτζι", + "fiCountryDisplayName": "Φινλανδία", + "frCountryDisplayName": "Γαλλία", + "gfCountryDisplayName": "Γαλλική Γουιάνα", + "pfCountryDisplayName": "Γαλλική Πολυνησία", + "gaCountryDisplayName": "Γκαμπόν", + "gmCountryDisplayName": "Γκάμπια", + "geCountryDisplayName": "Γεωργία", + "deCountryDisplayName": "Γερμανία", + "ghCountryDisplayName": "Γκάνα", + "giCountryDisplayName": "Γιβραλτάρ", + "grCountryDisplayName": "Ελλάδα", + "glCountryDisplayName": "Γροιλανδία", + "gdCountryDisplayName": "Γρενάδα", + "gpCountryDisplayName": "Γουαδελούπη", + "guCountryDisplayName": "Γκουάμ", + "gtCountryDisplayName": "Γουατεμάλα", + "ggCountryDisplayName": "Γκέρνσεϊ", + "gnCountryDisplayName": "Γουινέα Κονάκρι", + "gwCountryDisplayName": "Γουινέα-Μπισάου", + "gyCountryDisplayName": "Γουιάνα", + "htCountryDisplayName": "Αϊτή", + "hmCountryDisplayName": "Νησί Heard και Νησιά McDonald", + "hnCountryDisplayName": "Ονδούρα", + "hkCountryDisplayName": "Χονγκ Κονγκ", + "huCountryDisplayName": "Ουγγαρία", + "isCountryDisplayName": "Ισλανδία", + "inCountryDisplayName": "Ινδία", + "idCountryDisplayName": "Ινδονησία", + "irCountryDisplayName": "Ιράν", + "iqCountryDisplayName": "Ιράκ", + "ieCountryDisplayName": "Ιρλανδία", + "imCountryDisplayName": "Νήσος του Μαν", + "ilCountryDisplayName": "Ισραήλ", + "itCountryDisplayName": "Ιταλία", + "jmCountryDisplayName": "Τζαμάικα", + "jpCountryDisplayName": "Ιαπωνία", + "jeCountryDisplayName": "Τζέρσεϊ", + "joCountryDisplayName": "Ιορδανία", + "kzCountryDisplayName": "Καζακστάν", + "keCountryDisplayName": "Κένυα", + "kiCountryDisplayName": "Κιριμπάτι", + "xkCountryDisplayName": "Κοσσυφοπέδιο", + "kwCountryDisplayName": "Κουβέιτ", + "kgCountryDisplayName": "Κιργιζία", + "laCountryDisplayName": "Λάος", + "lvCountryDisplayName": "Λετονία", + "lbCountryDisplayName": "Λίβανος", + "lsCountryDisplayName": "Λεσόθο", + "lrCountryDisplayName": "Λιβερία", + "lyCountryDisplayName": "Λιβύη", + "liCountryDisplayName": "Λιχτενστάιν", + "ltCountryDisplayName": "Λιθουανία", + "luCountryDisplayName": "Λουξεμβούργο", + "moCountryDisplayName": "Μακάου", + "mkCountryDisplayName": "Βόρεια Μακεδονία", + "mgCountryDisplayName": "Μαδαγασκάρη", + "mwCountryDisplayName": "Μαλάουι", + "myCountryDisplayName": "Μαλαισία", + "mvCountryDisplayName": "Μαλδίβες", + "mlCountryDisplayName": "Μάλι", + "mtCountryDisplayName": "Μάλτα", + "mhCountryDisplayName": "Νήσοι Μάρσαλ", + "mqCountryDisplayName": "Μαρτινίκα", + "mrCountryDisplayName": "Μαυριτανία", + "muCountryDisplayName": "Μαυρίκιος", + "ytCountryDisplayName": "Μαγιότ", + "mxCountryDisplayName": "Μεξικό", + "fmCountryDisplayName": "Μικρονησία", + "mdCountryDisplayName": "Μολδαβία", + "mcCountryDisplayName": "Μονακό", + "mnCountryDisplayName": "Μογγολία", + "meCountryDisplayName": "Μαυροβούνιο", + "msCountryDisplayName": "Μοντσερράτ", + "maCountryDisplayName": "Μαρόκο", + "mzCountryDisplayName": "Μοζαμβίκη", + "mmCountryDisplayName": "Μιανμάρ (Βιρμανία)", + "naCountryDisplayName": "Ναμίμπια", + "nrCountryDisplayName": "Ναουρού", + "npCountryDisplayName": "Νεπάλ", + "nlCountryDisplayName": "Ολλανδία", + "ncCountryDisplayName": "Νέα Καληδονία", + "nzCountryDisplayName": "Νέα Ζηλανδία", + "niCountryDisplayName": "Νικαράγουα", + "neCountryDisplayName": "Νίγηρας", + "ngCountryDisplayName": "Νιγηρία", + "nuCountryDisplayName": "Νιουέ", + "nfCountryDisplayName": "Νησί Νόρφολκ", + "kpCountryDisplayName": "Βόρεια Κορέα", + "mpCountryDisplayName": "Βόρειες Μαριάνες Νήσοι", + "noCountryDisplayName": "Νορβηγία", + "omCountryDisplayName": "Ομάν", + "pkCountryDisplayName": "Πακιστάν", + "pwCountryDisplayName": "Παλάου", + "psCountryDisplayName": "Παλαιστινιακά Εδάφη", + "paCountryDisplayName": "Παναμάς", + "pgCountryDisplayName": "Παπούα Νέα Γουινέα", + "pyCountryDisplayName": "Παραγουάη", + "peCountryDisplayName": "Περού", + "phCountryDisplayName": "Φιλιππίνες", + "plCountryDisplayName": "Πολωνία", + "ptCountryDisplayName": "Πορτογαλία", + "prCountryDisplayName": "Πουέρτο Ρίκο", + "qaCountryDisplayName": "Κατάρ", + "reCountryDisplayName": "Ρεϋνιόν", + "roCountryDisplayName": "Ρουμανία", + "ruCountryDisplayName": "Ρωσία", + "rwCountryDisplayName": "Ρουάντα", + "blCountryDisplayName": "Άγιος Βαρθολομαίος", + "shCountryDisplayName": "Άγιος Ελένη", + "knCountryDisplayName": "Άγιος Κιτς και Νέβις", + "lcCountryDisplayName": "Άγιος Λουκάς", + "mfCountryDisplayName": "Άγιος Μαρτίνος", + "pmCountryDisplayName": "Άγιος Πέτρος και Μικελόν", + "vcCountryDisplayName": "Άγιος Βικέντιος", + "wsCountryDisplayName": "Σαμόα", + "smCountryDisplayName": "Άγιος Μαρίνος", + "stCountryDisplayName": "Σάο Τόμε και Πρίνσιπε", + "saCountryDisplayName": "Σαουδική Αραβία", + "snCountryDisplayName": "Σενεγάλη", + "rsCountryDisplayName": "Σερβία", + "scCountryDisplayName": "Σεϋχέλλες", + "slCountryDisplayName": "Σιέρα Λεόνε", + "sgCountryDisplayName": "Σιγκαπούρη", + "sxCountryDisplayName": "Σίντ Μαρτέν", + "skCountryDisplayName": "Σλοβακία", + "siCountryDisplayName": "Σλοβενία", + "sbCountryDisplayName": "Νήσοι Σολομώντα", + "soCountryDisplayName": "Σομαλία", + "zaCountryDisplayName": "Νότια Αφρική", + "gsCountryDisplayName": "Νότια Γεωργία και Νότιες Νήσοι Σάντουιτς", + "krCountryDisplayName": "Νότια Κορέα", + "ssCountryDisplayName": "Νότιο Σουδάν", + "esCountryDisplayName": "Ισπανία", + "lkCountryDisplayName": "Σρι Λάνκα", + "sdCountryDisplayName": "Σουδάν", + "srCountryDisplayName": "Σουρινάμ", + "sjCountryDisplayName": "Σβάλμπαρντ και Γιαν Μάγιεν", + "seCountryDisplayName": "Σουηδία", + "chCountryDisplayName": "Ελβετία", + "syCountryDisplayName": "Συρία", + "twCountryDisplayName": "Ταϊβάν", + "tjCountryDisplayName": "Τατζικιστάν", + "tzCountryDisplayName": "Τανζανία", + "thCountryDisplayName": "Ταϊλάνδη", + "tgCountryDisplayName": "Τόγκο", + "tkCountryDisplayName": "Τοκελάου", + "toCountryDisplayName": "Τόνγκα", + "ttCountryDisplayName": "Τρινιντάντ / Τόμπακο", + "tnCountryDisplayName": "Τυνησία", + "trCountryDisplayName": "Τουρκία", + "tmCountryDisplayName": "Τουρκμενιστάν", + "tcCountryDisplayName": "Νησιά Τερκς και Κάικος", + "tvCountryDisplayName": "Τουβαλού", + "viCountryDisplayName": "Αμερικανικές Παρθένοι Νήσοι", + "ugCountryDisplayName": "Ουγκάντα", + "uaCountryDisplayName": "Ουκρανία", + "aeCountryDisplayName": "Ηνωμένα Αραβικά Εμιράτα", + "gbCountryDisplayName": "Ηνωμένο Βασίλειο", + "usCountryDisplayName": "Ηνωμένες Πολιτείες", + "uyCountryDisplayName": "Ουρουγουάη", + "uzCountryDisplayName": "Ουζμπεκιστάν", + "vuCountryDisplayName": "Βανουάτου", + "vaCountryDisplayName": "Βατικανό", + "veCountryDisplayName": "Βενεζουέλα", + "vnCountryDisplayName": "Βιετνάμ", + "wfCountryDisplayName": "Wallis και Futuna", + "ehCountryDisplayName": "Δυτική Σαχάρα", + "yeCountryDisplayName": "Υεμένη", + "zmCountryDisplayName": "Ζάμπια", + "zwCountryDisplayName": "Ζιμπάμπουε", + "pay": "Checkout", + "invitedToSpace": "{user} σας έχει προσκαλέσει να συμμετάσχετε σε ένα μάθημα: {space}! Θέλετε να αποδεχθείτε;", + "youreInvited": "📩 Είστε προσκεκλημένοι!", + "invitedToChat": "{user} σας έχει προσκαλέσει να συμμετάσχετε σε μια συνομιλία: {name}! Θέλετε να αποδεχθείτε;", + "monthlySubscription": "Μηνιαία", + "yearlySubscription": "Ετήσια", + "defaultSubscription": "Συνδρομή Pangea Chat", + "freeTrial": "Δωρεάν Δοκιμή", + "total": "Σύνολο: ", + "noDataFound": "Δεν βρέθηκαν δεδομένα", + "blurMeansTranslateTitle": "Γιατί είναι θολό το μήνυμα;", + "blurMeansTranslateBody": "Ενώ είναι ενεργή η λειτουργία Εμβάθυνσης, τα μηνύματα που αποστέλλονται στη βασική σας γλώσσα θα θολώνουν ενώ το Pangea Bot τα μεταφράζει στη γλώσσα στόχο σας. Η λειτουργία Εμβάθυνσης μπορεί να ενεργοποιείται ή να απενεργοποιείται στις ρυθμίσεις μεμονωμένων και μαθημάτων.", + "bestCorrectionFeedback": "Αυτό είναι σωστό!", + "distractorFeedback": "Δεν είναι ακριβώς σωστό.", + "bestAnswerFeedback": "Αυτό είναι σωστό!", + "definitionDefaultPrompt": "Τι σημαίνει αυτή η λέξη;", + "practiceDefaultPrompt": "Ποια είναι η καλύτερη απάντηση;", + "correctionDefaultPrompt": "Ποια είναι η καλύτερη αντικατάσταση;", + "acceptSelection": "Αποδοχή Διόρθωσης", + "why": "Γιατί;", + "definition": "Ορισμός", + "exampleSentence": "Παράδειγμα πρότασης", + "reportToTeacher": "Σε ποιον θέλετε να αναφέρετε αυτό το μήνυμα;", + "reportMessageTitle": "{reportingUserId} ανέφερε ένα μήνυμα από τον {reportedUserId} στη συνομιλία {roomName}", + "reportMessageBody": "Μήνυμα: {reportedMessage}\nΑιτία: {reason}", + "noTeachersFound": "Δεν βρέθηκαν δάσκαλοι για αναφορά", + "trialExpiration": "Η δωρεάν δοκιμή σας λήγει στις {expiration}", + "freeTrialDesc": "Οι νέοι χρήστες λαμβάνουν μια εβδομάδα δωρεάν δοκιμής του Pangea Chat", + "activateTrial": "Δωρεάν 7-ήμερη Δοκιμή", + "successfullySubscribed": "Έχετε εγγραφεί με επιτυχία!", + "clickToManageSubscription": "Κάντε κλικ εδώ για να διαχειριστείτε τη συνδρομή σας.", + "signUp": "Εγγραφή", + "pleaseChooseAtLeastChars": "Παρακαλώ επιλέξτε τουλάχιστον {min} χαρακτήρες.", + "noEmailWarning": "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση email. Διαφορετικά δεν θα μπορείτε να επαναφέρετε τον κωδικό πρόσβασής σας. Αν δεν θέλετε, πατήστε ξανά το κουμπί για να συνεχίσετε.", + "pleaseEnterValidEmail": "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση email.", + "pleaseChooseAUsername": "Παρακαλώ επιλέξτε ένα όνομα χρήστη", + "define": "Ορίστε", + "listen": "Ακούστε", + "trialPeriodExpired": "Η δοκιμαστική περίοδος σας έχει λήξει", + "translations": "μεταφράσεις", + "messageAudio": "ήχος μηνύματος", + "definitions": "ορισμοί", + "subscribedToUnlockTools": "Εγγραφείτε για να ξεκλειδώσετε διαδραστική μετάφραση και έλεγχο γραμματικής, αναπαραγωγή ήχου, εξατομικευμένες δραστηριότητες πρακτικής και αναλύσεις μάθησης!", + "translationTooltip": "Μετάφραση", + "speechToTextTooltip": "Μεταγραφή", + "kickBotWarning": "Το κλείσιμο του Pangea Bot θα αφαιρέσει το bot συνομιλίας από αυτήν τη συζήτηση.", + "refresh": "Ανανέωση", + "messageAnalytics": "Ανάλυση μηνυμάτων", + "words": "Λέξεις", + "score": "Βαθμολογία", + "accuracy": "Ακρίβεια", + "points": "Βαθμοί", + "noPaymentInfo": "Δεν απαιτείται πληροφορία πληρωμής!", + "updatePhoneOS": "Ίσως χρειαστεί να ενημερώσετε την έκδοση του λειτουργικού συστήματος της συσκευής σας.", + "wordsPerMinute": "Λέξεις ανά λεπτό", + "tooltipInstructionsTitle": "Δεν είστε σίγουροι τι κάνει αυτό;", + "tooltipInstructionsMobileBody": "Πατήστε και κρατήστε πατημένο αντικείμενα για να δείτε τις συμβουλές εργαλείων.", + "tooltipInstructionsBrowserBody": "Τοποθετήστε το δείκτη πάνω από αντικείμενα για να δείτε τις συμβουλές εργαλείων.", + "chatCapacity": "Χωρητικότητα συνομιλίας", + "roomFull": "Αυτή η αίθουσα είναι ήδη γεμάτη.", + "chatCapacityHasBeenChanged": "Η χωρητικότητα της συνομιλίας άλλαξε", + "chatCapacitySetTooLow": "Η χωρητικότητα της συνομιλίας πρέπει να είναι τουλάχιστον {count}.", + "chatCapacityExplanation": "Η χωρητικότητα της συνομιλίας περιορίζει τον αριθμό των μελών που επιτρέπονται σε μια συνομιλία.", + "tooManyRequest": "Πάρα πολλά αιτήματα, παρακαλώ δοκιμάστε ξανά αργότερα.", + "enterNumber": "Παρακαλώ εισάγετε μια ακέραια τιμή.", + "buildTranslation": "Δημιουργήστε τη μετάφρασή σας από τις επιλογές παραπάνω", + "practice": "Εξάσκηση", + "noLanguagesSet": "Δεν έχουν οριστεί γλώσσες", + "speechToTextBody": "Για φωνητικά μηνύματα, μπορείτε να δείτε μια μεταγραφή καθώς και το σκορ Λέξεων ανά Λεπτό του ομιλητή.", + "versionNotFound": "Δεν βρέθηκε έκδοση", + "fetchingVersion": "Λήψη έκδοσης...", + "versionFetchError": "Σφάλμα κατά τη λήψη έκδοσης", + "versionText": "Έκδοση: {version}+{buildNumber}", + "l1TranslationBody": "Τα μηνύματα στη βασική σας γλώσσα δεν θα μεταφραστούν.", + "deleteSubscriptionWarningTitle": "Έχετε ενεργή συνδρομή", + "deleteSubscriptionWarningBody": "Η διαγραφή του λογαριασμού σας δεν θα ακυρώσει αυτόματα τη συνδρομή σας.", + "manageSubscription": "Διαχείριση συνδρομής", + "error520Title": "Παρακαλώ δοκιμάστε ξανά.", + "error520Desc": "Λυπούμαστε, δεν καταλάβαμε το μήνυμά σας...", + "wordsUsed": "Χρησιμοποιημένες λέξεις", + "level": "Επίπεδο", + "morphsUsed": "Χρησιμοποιημένες μορφές", + "translationChoicesBody": "Κάντε κλικ και κρατήστε μια επιλογή για μια υπόδειξη.", + "grammar": "Γραμματική", + "contactHasBeenInvitedToTheChat": "Ο επαφή έχει προσκληθεί στη συνομιλία", + "inviteChat": "📨 Προσκαλέστε στη συνομιλία", + "chatName": "Όνομα συνομιλίας", + "reportContentIssueTitle": "Αναφορά προβλήματος περιεχομένου", + "feedback": "Προαιρετικά σχόλια", + "reportContentIssueDescription": "Ωχ! Η ΤΝ μπορεί να διευκολύνει εξατομικευμένες εκπαιδευτικές εμπειρίες αλλά... επίσης hallucinate. Παρακαλούμε δώστε τυχόν σχόλια και θα προσπαθήσουμε ξανά.", + "clickTheWordAgainToDeselect": "Κάντε κλικ στη επιλεγμένη λέξη για να την αποεπιλέξετε.", + "l2SupportNa": "Μη διαθέσιμο", + "l2SupportAlpha": "Άλφα", + "l2SupportBeta": "Βήτα", + "l2SupportFull": "Πλήρες", + "missingVoiceTitle": "Απουσία φωνής", + "voiceNotAvailable": "Δεν έχετε εγκατεστημένη φωνή για αυτήν τη γλώσσα.", + "openVoiceSettings": "Άνοιγμα ρυθμίσεων φωνής", + "playAudio": "Αναπαραγωγή", + "stop": "Διακοπή", + "grammarCopyPOSsconj": "Υποδεκτική Συζυγία", + "grammarCopyPOSnum": "Αριθμός", + "grammarCopyPOSverb": "Ρήμα", + "grammarCopyPOSaffix": "Επίθημα", + "grammarCopyPOSpart": "Μόριο", + "grammarCopyPOSadj": "Επίθετο", + "grammarCopyPOScconj": "Συντονιστική Συζυγία", + "grammarCopyPOSpunct": "Σημείο Στίξης", + "grammarCopyPOSadv": "Επίρρημα", + "grammarCopyPOSaux": "Βοηθητικό", + "grammarCopyPOSspace": "Κενό", + "grammarCopyPOSsym": "Σύμβολο", + "grammarCopyPOSdet": "Οριστικό", + "grammarCopyPOSpron": "Αντωνυμία", + "grammarCopyPOSadp": "Επιρρηματική Πρόθεση", + "grammarCopyPOSpropn": "Ονόματος Ιδιότητας", + "grammarCopyPOSnoun": "Ουσιαστικό", + "grammarCopyPOSintj": "Επιφώνημα", + "grammarCopyPOSx": "Άλλο", + "grammarCopyGENDERfem": "Θηλυκό", + "grammarCopyPERSON2": "Δεύτερο Πρόσωπο", + "grammarCopyMOODimp": "Υποτακτική", + "grammarCopyPUNCTTYPEqest": "Ερώτηση", + "grammarCopyASPECTperf": "Τελειωμένο", + "grammarCopyCASEaccnom": "Αιτιατική, Ονομαστική", + "grammarCopyCASEobl": "Παρακειμένη", + "grammarCopyVOICEact": "Ενεργητική", + "grammarCopyPUNCTTYPEbrck": "Παρένθεση", + "grammarCopyNOUNTYPEart": "Άρθρο", + "grammarCopyNUMBERsing": "Ενικός", + "grammarCopyGENDERmasc": "Αρσενικό", + "grammarCopyVERBTYPEmod": "Ρήμα Modal", + "grammarCopyADVTYPEadverbial": "Επιρρηματικός", + "grammarCopyTENSEperi": "Περιφραστικός", + "grammarCopyNUMFORMdigit": "Ψηφίο", + "grammarCopyNOUNTYPEnot_proper": "Μη σωστό", + "grammarCopyNUMTYPEcard": "Αριθμητικό", + "grammarCopyNOUNTYPEprop": "Ιδιωτικό", + "grammarCopyPUNCTTYPEdash": "Παύλα", + "grammarCopyPUNCTTYPEyes": "Ναι", + "grammarCopyPUNCTTYPEsemi": "Άνω τελεία", + "grammarCopyPUNCTTYPEcomm": "Κόμμα", + "grammarCopyMOODcnd": "Υποθετικό", + "grammarCopyCASEacc": "Αιτιατική", + "grammarCopyPARTTYPEpart": "Μερικό", + "grammarCopyTENSEpast": "Παρελθόν", + "grammarCopyDEGREEsup": "Υπερθετικός", + "grammarCopyPUNCTTYPEcolo": "Άνω τελεία", + "grammarCopyPERSON3": "Τρίτο πρόσωπο", + "grammarCopyNUMBERplur": "Πληθυντικός", + "grammarCopyPRONTYPEnpr": "Ιδιωτικό ουσιαστικό", + "grammarCopyPRONTYPEinterrogative": "Ερωτηματική", + "grammarCopyPOLITEinfm": "Α informal", + "grammarCopyADVTYPEtim": "Χρόνος", + "grammarCopyPOLARITYneg": "Αρνητικό", + "grammarCopyNUMTYPEtot": "Σύνολο", + "grammarCopyADVTYPEadnomial": "Επιθετικός", + "grammarCopyASPECTprog": "Προοδευτικό", + "grammarCopyMOODsub": "Υποτακτική", + "grammarCopyVERBFORMcomplementive": "Συμπληρωματική", + "grammarCopyCASEnom": "Ονομαστική", + "grammarCopyTENSEfut": "Μέλλοντας", + "grammarCopyCASEdat": "Δοτική", + "grammarCopyTENSEpres": "Ενεστώτας", + "grammarCopyGENDERneut": "Ουδέτερο", + "grammarCopyPRONTYPErel": "Σχετικός", + "grammarCopyVERBFORMfinalEnding": "Τελευταία κατάληξη", + "grammarCopyPRONTYPEdem": "Δεικτικός", + "grammarCopyPREPCASEpre": "Προθετική", + "grammarCopyVERBFORMfin": "Οριστική", + "grammarCopyDEGREEpos": "Θετικό", + "grammarCopyPUNCTTYPEquot": "Παραθέματα", + "grammarCopyVERBFORMger": "Γερουνδικό", + "grammarCopyVOICEpass": "Παθητική", + "grammarCopyCASEgen": "Γενική", + "grammarCopyTENSEprs": "Ενεστώτας", + "grammarCopyDEFINITEdef": "Οριστική", + "grammarCopyNUMTYPEord": "Τακτική", + "grammarCopyCASEins": "Όργανο", + "grammarCopyVERBFORMinf": "Απαρέμφατο", + "grammarCopyVERBFORMaux": "Βοηθητικό", + "grammarCopyNUMFORMlong": "Μακρύ", + "grammarCopyCASEloc": "Τοπική", + "grammarCopyMOODind": "Εγκλιτική", + "grammarCopyDEGREEcmp": "Συγκριτική", + "grammarCopyCASErelativeCase": "Σχετική", + "grammarCopyPUNCTTYPEexcl": "Ευφημιστική", + "grammarCopyPERSON1": "Πρώτο πρόσωπο", + "grammarCopyPUNCTSIDEini": "Αρχικό", + "grammarCopyGENDERperson": "Άτομο", + "grammarCopyFOREIGNyes": "Ξένη", + "grammarCopyVOICEvoice": "Φωνή", + "grammarCopyVERBTYPEverbType": "Ρήμα", + "grammarCopyPOSSpass": "Κτητική", + "grammarCopyPREPCASEprepCase": "Προθετικό", + "grammarCopyNUMTYPEnumType": "Αριθμητικό", + "grammarCopyNOUNTYPEnounType": "Ουσιαστικό", + "grammarCopyREFLEXreflex": "Ανακλαστικό", + "grammarCopyPRONTYPEpronType": "Αντωνυμία", + "grammarCopyPUNCTSIDEpunctSide": "Πλευρά Σημείωσης Στίξης", + "grammarCopyVERBFORMverbForm": "Ρήμα", + "grammarCopyGENDERgender": "Γένος", + "grammarCopyMOODmood": "Τρόπος", + "grammarCopyASPECTaspect": "Πλευρά", + "grammarCopyPUNCTTYPEpunctType": "Στίξη", + "grammarCopyTENSEtense": "Χρόνος", + "grammarCopyDEGREEdegree": "Βαθμός", + "grammarCopyPOLITEpolite": "Ευγένεια", + "grammarCopyADVTYPEadvType": "Επίρρημα", + "grammarCopyNUMFORMnumber": "Αριθμός", + "grammarCopyCONJTYPEconjType": "Σύνδεσμος", + "grammarCopyPOLARITYpolarity": "Πολικότητα", + "grammarCopyCASEcase": "Πτώση", + "grammarCopyDEFINITEdefinite": "Οριστικότητα", + "grammarCopyNUMFORMnumForm": "Αριθμητικό", + "grammarCopyPRONTYPEadn": "Επιθετικό", + "grammarCopyVOCvoc": "Κλητική", + "grammarCopyCMPLcmpl": "Συμπληρωματικός", + "grammarCopyADVadv": "Επιρρηματικός", + "grammarCopyMOODjus": "Επιτακτική", + "grammarCopyGENDERcom": "Κοινό", + "grammarCopyREFLEXrflx": "Ανακλαστικό", + "grammarCopyPARTTYPEpar": "Μερικό", + "grammarCopySPCspc": "Συγκεκριμένο", + "grammarCopyTENSEpqp": "Πλεορισμένο", + "grammarCopyREFLEXref": "Ανακλαστικό", + "grammarCopyPUNCTTYPEnshrt": "Σύντομο", + "grammarCopyNUMBERdual": "Διπλό", + "grammarCopyNUMFORMlng": "Μακρύ", + "grammarCopyVOICEmid": "Μεσαίο", + "grammarCopyINTRELintRel": "Ερωτηματικό, Σχετικό", + "grammarCopyINTint": "Ερωτηματικό", + "grammarCopyVOICEcaus": "Αιτιατικό", + "grammarCopyUnknown": "Άγνωστο", + "grammarCopyEVIDENTevident": "Επικυρωτική", + "grammarCopyNUMFORMnumberPsor": "Αριθμός Κατόχου", + "grammarCopyASPECThab": "Συνήθης", + "grammarCopyCASEabl": "Αποθετική", + "grammarCopyCASEall": "Πολλαπλασιαστική", + "grammarCopyCASEess": "Εξωτική", + "grammarCopyCASEtra": "Μεταβατική", + "grammarCopyCASEequ": "Ισοδύναμη", + "grammarCopyCASEdis": "Διανεμητική", + "grammarCopyCASEabs": "Απόλυτη", + "grammarCopyCASEerg": "Εργατική", + "grammarCopyCASEcau": "Αιτιακή", + "grammarCopyCASEben": "Ωφελική", + "grammarCopyCASEtem": "Χρονική", + "grammarCopyCONJTYPEcoord": "Συντονιστική", + "grammarCopyDEFINITEcons": "Κατασκευαστική Κατάσταση", + "grammarCopyDEGREEabs": "Απόλυτο Βαθμό", + "grammarCopyEVIDENTfh": "Πραγματική Επικυρωτικότητα", + "grammarCopyEVIDENTnfh": "Μη-πραγματική Επικυρωτικότητα", + "grammarCopyMOODopt": "Ευχή", + "grammarCopyMOODadm": "Επιτιμητικό", + "grammarCopyMOODdes": "Επιθυμητικό", + "grammarCopyMOODnec": "Αναγκαστικό", + "grammarCopyMOODpot": "Δυναμικό", + "grammarCopyMOODprp": "Προτατικό", + "grammarCopyMOODqot": "Παραθετικό", + "grammarCopyNUMFORMword": "Μορφή Λέξης", + "grammarCopyNUMFORMroman": "Ρωμαϊκό Αριθμητικό", + "grammarCopyNUMFORMletter": "Μορφή Γράμματος", + "grammarCopyNUMTYPEmult": "Πολλαπλασιαστικό", + "grammarCopyNUMTYPEfrac": "Κλασματικό", + "grammarCopyNUMTYPEsets": "Σετ", + "grammarCopyNUMTYPErange": "Εύρος", + "grammarCopyNUMTYPEdist": "Διανεμητικό", + "grammarCopyNUMBERtri": "Δοκιμαστικό", + "grammarCopyNUMBERpauc": "Ποακού", + "grammarCopyNUMBERgrpa": "Μεγαλύτερο Ποακού", + "grammarCopyNUMBERgrpl": "Μεγαλύτερο Πληθυντικό", + "grammarCopyNUMBERinv": "Αντίστροφο", + "grammarCopyPERSON0": "Μηδέν", + "grammarCopyPERSON4": "Τέταρτος", + "grammarCopyPOLITEform": "Επίσημο", + "grammarCopyPOLITEelev": "Αυξημένο", + "grammarCopyPOLITEhumb": "Ταπεινό", + "grammarCopyPRONTYPEemp": "Διεισδυτικό", + "grammarCopyPRONTYPEexc": "Ερωτηματικό", + "grammarCopyPRONTYPErcp": "Ανταποδοτικό", + "grammarCopyPRONTYPEintRelPronType": "Ερωτηματικό-Σχετικό", + "grammarCopyTENSEaor": "Αόριστος", + "grammarCopyTENSEeps": "Επιδεξιωματικός", + "grammarCopyTENSEprosp": "Προοπτικός", + "grammarCopyVERBFORMpart": "Μέρος", + "grammarCopyVERBFORMconv": "Συνεκδοχή", + "grammarCopyVERBFORMvnoun": "Ρηματικό Ουσιαστικό", + "grammarCopyVOICEantip": "Αντιπαραθετικός", + "grammarCopyVOICEcauVoice": "Αιτιατική", + "grammarCopyVOICedir": "Άμεσος", + "grammarCopyVOICEinvVoice": "Αντίστροφος", + "grammarCopyVOICErcpVoice": "Ανταποδοτικός", + "grammarCopyPOS": "Μέρος του Λόγου", + "grammarCopyGENDER": "Γένος", + "grammarCopyPERSON": "Άτομο", + "grammarCopyMOOD": "Τρόπος", + "grammarCopyPUNCTTYPE": "Τύπος Σημείωσης", + "grammarCopyASPECT": "Πλευρά", + "grammarCopyCASE": "Πτώση", + "grammarCopyVOICE": "Φωνή", + "grammarCopyNOUNTYPE": "Τύπος Ουσιαστικού", + "grammarCopyVERBTYPE": "Τύπος Ρήματος", + "grammarCopyADVTYPE": "Τύπος Επιρρήματος", + "grammarCopyNUMFORM": "Μορφή Αριθμού", + "grammarCopyNUMTYPE": "Τύπος Αριθμού", + "grammarCopyNUMBER": "Αριθμός", + "grammarCopyDEFINITE": "Οριστικότητα", + "grammarCopyDEGREE": "Βαθμός", + "grammarCopyEVIDENT": "Ενδεικτικότητα", + "grammarCopyFOREIGN": "Ξένο", + "grammarCopyPOLARITY": "Πολικότητα", + "grammarCopyPOLITE": "Ευγένεια", + "grammarCopyPREPCASE": "Προθετική Πτώση", + "grammarCopyPRONTYPE": "Τύπος Αντωνυμίας", + "grammarCopyPUNCTSIDE": "Πλευρά Σημείωσης Στίξης", + "grammarCopyREFLEX": "Ανακλαστική", + "grammarCopyTENSE": "Χρόνος", + "grammarCopyVERBFORM": "Μορφή Ρήματος", + "grammarCopyCONJTYPE": "Τύπος Συνδέσμου", + "grammarCopySPC": "Ειδικότητα", + "grammarCopyPARTTYPE": "Τύπος Μερισμού", + "grammarCopyINTREL": "Ερωτηματική-Σχετική", + "grammarCopyUNKNOWN": "Άγνωστο", + "grammarCopyNUMBERPSOR": "Αριθμός Κυριότητας", + "grammarCopyPOSS": "Κτητική", + "grammarCopyASPECTimp": "Ατελής Όψη", + "grammarCopyCASEvoc": "Κλητική", + "grammarCopyCASEcom": "Κοινοτική", + "grammarCopyCASEpar": "Μεριστική", + "grammarCopyCASEadv": "Επιρρηματική", + "grammarCopyCASEref": "Αναφορική", + "grammarCopyCASErel": "Σχετική", + "grammarCopyCASEsub": "Υποθετική", + "grammarCopyCASEsup": "Υπερεστιακή", + "grammarCopyCASEaccdat": "Αιτιατική-Δοτική", + "grammarCopyCASEpre": "Προθετική", + "grammarCopyCONJTYPEsub": "Υποτακτική", + "grammarCopyCONJTYPEcmp": "Συγκριτική", + "grammarCopyDEFINITEind": "Αόριστη", + "grammarCopyMOODint": "Ερωτηματική Έννοια", + "grammarCopyNOUNTYPEcomm": "Κοινό Ουσιαστικό", + "grammarCopyNUMBERPSORsing": "Ενικός του Κατόχου", + "grammarCopyNUMBERPSORplur": "Πληθυντικός του Κατόχου", + "grammarCopyNUMBERPSORdual": "Διπλός του Κατόχου", + "grammarCopyPOLARITYpos": "Θετική Πολικότητα", + "grammarCopyPOSSyes": "Κτητική", + "grammarCopyPREPCASEnpr": "Μη-προθετική", + "grammarCopyPRONTYPEprs": "Προσωπική", + "grammarCopyPRONTYPEint": "Ερωτηματική", + "grammarCopyPRONTYPEtot": "Ολική", + "grammarCopyPRONTYPEneg": "Αρνητική", + "grammarCopyPRONTYPEart": "Άρθρο", + "grammarCopyPRONTYPEind": "Αόριστος", + "grammarCopyPRONTYPEintrel": "Ερωτηματικός-Σχετικός", + "grammarCopyPUNCTSIDEfin": "Τελευταίο Στίξη", + "grammarCopyPUNCTTYPEperi": "Τελεία", + "grammarCopyREFLEXyes": "Ανακλαστικό", + "grammarCopyTENSEimp": "Παρατατικός", + "grammarCopyVERBFORMsup": "Υπερσυντέλικος", + "grammarCopyVERBFORMadn": "Επιθετικός", + "grammarCopyVERBFORMlng": "Μακρύς", + "grammarCopyVERBFORMshrt": "Βραχύς", + "grammarCopyVERBTYPEcaus": "Αιτιατικό Ρήμα", + "grammarCopyVOICEcau": "Αιτιατική", + "grammarCopyVOICEdir": "Άμεση", + "grammarCopyVOICEinv": "Αντίστροφη", + "grammarCopyVOICErcp": "Αμοιβαία", + "other": "Άλλο", + "levelShort": "ΕΠΙΠΕΔΟ {level}", + "clickBestOption": "Επιλέξτε τις καλύτερες επιλογές για να μεταφράσετε το μήνυμά σας!", + "completeActivitiesToUnlock": "Ολοκληρώστε τουλάχιστον μια δραστηριότητα για να ξεκλειδώσετε τη μετάφραση!", + "noCapacityLimit": "Χωρίς όριο χωρητικότητας", + "downloadGroupText": "Λήψη κειμένου ομάδας", + "notificationsOn": "Ειδοποιήσεις ενεργές", + "notificationsOff": "Ειδοποιήσεις απενεργοποιημένες", + "createChatAndInviteUsers": "Δημιουργία συνομιλίας και πρόσκληση χρηστών", + "updatedNewSpaceDescription": "Τα μαθήματα σας επιτρέπουν να ενοποιήσετε τις συνομιλίες σας και να δημιουργήσετε ιδιωτικές ή δημόσιες κοινότητες.", + "joinWithCode": "Συμμετοχή με κωδικό", + "enterCodeToJoin": "Εισάγετε κωδικό για να συμμετάσχετε", + "updateNow": "Ενημέρωση τώρα", + "updateLater": "Αργότερα", + "constructUseWaDesc": "Χρησιμοποιείται χωρίς βοήθεια", + "constructUseGaDesc": "Βοήθεια γραμματικής", + "constructUseTaDesc": "Βοήθεια μετάφρασης", + "constructUseUnkDesc": "Άγνωστο", + "constructUseCorITDesc": "Ορθό στη μετάφραση", + "constructUseIgnITDesc": "Παραβλέπεται στη μετάφραση", + "constructUseIncITDesc": "Λάθος στη μετάφραση", + "constructUseIgnIGCDesc": "Παραβλέπεται στη διόρθωση γραμματικής", + "constructUseCorIGCDesc": "Ορθό στη διόρθωση γραμματικής", + "constructUseIncIGCDesc": "Λάθος στη διόρθωση γραμματικής", + "constructUseCorPADesc": "Ορθό στη δραστηριότητα σημασίας λέξης", + "constructUseIgnPADesc": "Παραβλέπεται στη δραστηριότητα σημασίας λέξης", + "constructUseIncPADesc": "Λάθος στη δραστηριότητα σημασίας λέξης", + "constructUseCorWLDesc": "Ορθό στη δραστηριότητα ακρόασης λέξης", + "constructUseIncWLDesc": "Λάθος στη δραστηριότητα ακρόασης λέξης", + "constructUseIngWLDesc": "Παραβλέπεται στη δραστηριότητα ακρόασης λέξης", + "constructUseCorHWLDesc": "Ορθό στη δραστηριότητα κρυφής λέξης", + "constructUseIncHWLDesc": "Λάθος στην κρυφή δραστηριότητα λέξης", + "constructUseIgnHWLDesc": "Αγνοήθηκε στην κρυφή δραστηριότητα λέξης", + "constructUseCorLDesc": "Σωστό στην δραστηριότητα λήμματος", + "constructUseIncLDesc": "Λάθος στην δραστηριότητα λήμματος", + "constructUseIgnLDesc": "Αγνοήθηκε στην δραστηριότητα λήμματος", + "constructUseCorMDesc": "Σωστό στην δραστηριότητα γραμματικής", + "constructUseIncMDesc": "Λάθος στην δραστηριότητα γραμματικής", + "constructUseIgnMDesc": "Αγνοήθηκε στην δραστηριότητα γραμματικής", + "constructUseEmojiDesc": "Σωστό στην δραστηριότητα emoji", + "constructUseCollected": "Συλλέχθηκε στη συνομιλία", + "constructUseNanDesc": "Μη εφαρμόσιμο", + "xpIntoLevel": "{currentXP} / {maxXP} Πόντοι XP", + "enableTTSToolName": "Ενεργοποιημένη φωνητική ανάγνωση κειμένου", + "enableTTSToolDescription": "Επιτρέψτε στην εφαρμογή να παράγει έξοδο φωνητικής ανάγνωσης για τμήματα κειμένου στη γλώσσα στόχο σας.", + "yourUsername": "Το όνομα χρήστη σας", + "yourEmail": "Το email σας", + "iWantToLearn": "Θέλω να μάθω", + "pleaseEnterEmail": "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση email.", + "myBaseLanguage": "Η βασική μου γλώσσα", + "meaningSectionHeader": "Νόημα:", + "formSectionHeader": "Μορφές που χρησιμοποιούνται στα chat:", + "writingExercisesTooltip": "Γράψιμο", + "listeningExercisesTooltip": "Ακρόαση", + "readingExercisesTooltip": "Ανάγνωση", + "meaningNotFound": "Δεν ήταν δυνατή η εύρεση του νοήματος.", + "chooseBaseForm": "Επιλέξτε τη βασική μορφή", + "notTheCodeError": "Λυπούμαστε, αυτό δεν είναι ο κώδικας!", + "totalXP": "Συνολικά XP", + "numLemmas": "Συνολικός αριθμός λημμάτων", + "numLemmasUsedCorrectly": "Αριθμός λημμάτων που χρησιμοποιήθηκαν σωστά τουλάχιστον μία φορά", + "numLemmasUsedIncorrectly": "Αριθμός λημμάτων που χρησιμοποιήθηκαν σωστά 0 φορές", + "numLemmasSmallXP": "Αριθμός λημμάτων με 0 - 30 XP", + "numLemmasMediumXP": "Αριθμός λημμάτων με 31 - 200 XP", + "numLemmasLargeXP": "Αριθμός λημμάτων με > 200 XP", + "numGrammarConcepts": "Αριθμός γραμματικών εννοιών", + "listGrammarConcepts": "Γραμματικές έννοιες", + "listGrammarConceptsUsedCorrectly": "Γραμματικές έννοιες που χρησιμοποιήθηκαν σωστά σε αρχικά μηνύματα τουλάχιστον το 80% του χρόνου", + "listGrammarConceptsUsedIncorrectly": "Γραμματικές έννοιες που χρησιμοποιήθηκαν σωστά σε αρχικά μηνύματα λιγότερο από το 80% του χρόνου", + "listGrammarConceptsUseCorrectlySystemGenerated": "Γραμματικές έννοιες που επιλέχθηκαν σωστά από προτάσεις συστήματος τουλάχιστον το 80% του χρόνου", + "listGrammarConceptsUseIncorrectlySystemGenerated": "Γραμματικές έννοιες που επιλέχθηκαν σωστά από προτάσεις συστήματος λιγότερο από το 80% του χρόνου", + "listGrammarConceptsSmallXP": "Γλωσσικά concepts με 0-50 XP", + "listGrammarConceptsMediumXP": "Γλωσσικά concepts με 51-200 XP", + "listGrammarConceptsLargeXP": "Γλωσσικά concepts 201-500 XP", + "listGrammarConceptsHugeXP": "Γλωσσικά concepts >500 XP", + "numMessagesSent": "Αριθμός αποστελλόμενων μηνυμάτων", + "numWordsTyped": "Αριθμός πληκτρολογημένων λέξεων στα αρχικά μηνύματα", + "numCorrectChoices": "Αριθμός σωστών λέξεων που επιλέχθηκαν από προτάσεις συστήματος", + "numIncorrectChoices": "Αριθμός λανθασμένων λέξεων που επιλέχθηκαν από προτάσεις συστήματος", + "commaSeparatedFile": "CSV", + "excelFile": "Excel", + "fileType": "Τύπος αρχείου", + "download": "Λήψη", + "analyticsNotAvailable": "Ανάλυση χρήστη δεν διατίθεται", + "downloading": "Λήψη σε εξέλιξη...", + "failedFetchUserAnalytics": "Αποτυχία λήψης ανάλυσης χρήστη", + "downloadComplete": "Η λήψη ολοκληρώθηκε!", + "whatIsTheMorphTag": "Τι είναι το {morphologicalFeature} του '{wordForm}'?", + "dataAvailable": "Διαθεσιμότητα δεδομένων", + "available": "Διαθέσιμο", + "pangeaBotIsFallible": "Ο Pangea Bot κάνει και λάθη!", + "whatIsMeaning": "Τι σημαίνει το '{lemma}'?", + "pickAnEmoji": "Ποιο είναι το αγαπημένο σου emoji για το '{lemma}'?", + "chooseLemmaMeaningInstructionsBody": "Ταιριάξτε τις σημασίες με τις λέξεις στο μήνυμα!", + "doubleClickToEdit": "Διπλό κλικ για επεξεργασία.", + "activityPlannerTitle": "Προγραμματιστής Δραστηριοτήτων", + "topicLabel": "Θέμα", + "topicPlaceholder": "Επιλέξτε ένα θέμα...", + "modeLabel": "Τύπος δραστηριότητας", + "modePlaceholder": "Επιλέξτε μια λειτουργία...", + "learningObjectiveLabel": "Στόχος μάθησης", + "learningObjectivePlaceholder": "Επιλέξτε στόχο μάθησης...", + "languageOfInstructionsLabel": "Γλώσσα οδηγιών δραστηριότητας", + "targetLanguageLabel": "Στόχος γλώσσα", + "cefrLevelLabel": "Επίπεδο CEFR", + "generateActivitiesButton": "Δημιουργία Δραστηριότητας", + "launchActivityButton": "Έναρξη Δραστηριότητας", + "image": "Εικόνα", + "video": "Βίντεο", + "nan": "Μη εφαρμόσιμο", + "activityPlannerOverviewInstructionsBody": "Επιλέξτε ένα θέμα, τρόπο, μαθησιακό στόχο και δημιουργήστε μια δραστηριότητα για τη συνομιλία!", + "activityTitle": "Τίτλος Δραστηριότητας", + "addVocabulary": "Προσθήκη λεξιλογίου", + "instructions": "Οδηγίες", + "numberOfLearners": "Αριθμός μαθητών", + "mustBeInteger": "Πρέπει να είναι ακέραιος π.χ. 1, 2, 3, ...", + "constructUsePvmDesc": "Παράγεται σε φωνητικό μήνυμα", + "leaveSpaceDescription": "Αφήνοντας το μάθημα, θα αφήσετε όλες τις συνομιλίες μέσα σε αυτό. Οι άλλοι χρήστες θα δουν ότι έχετε φύγει από το μάθημα.", + "constructUseCorMmDesc": "Ορθό μήνυμα σημασίας", + "constructUseIncMmDesc": "Λάθος μήνυμα σημασίας", + "constructUseIgnMmDesc": "Αγνοημένο μήνυμα σημασίας", + "clickForMeaningActivity": "Κάντε κλικ εδώ για μια Πρόκληση Νοήματος", + "meaning": "Νόημα", + "chatWith": "Ομάδα με {displayname}", + "clickOnEmailLink": "Παρακαλώ κάντε κλικ στον σύνδεσμο στο email και συνεχίστε.\n\nΕλέγξτε τον φάκελο spam αν το email δεν έχει φτάσει.", + "dontForgetPassword": "Μην ξεχάσετε τον κωδικό πρόσβασής σας!", + "enableAutocorrectToolName": "Ενεργοποίηση αυτόματης διόρθωσης συσκευής", + "enableAutocorrectDescription": "Αν η συσκευή σας υποστηρίζει τη γλώσσα που μαθαίνετε, μπορείτε να ενεργοποιήσετε την αυτόματη διόρθωση για να διορθώνει κοινά λάθη καθώς πληκτρολογείτε.", + "ttsDisbledTitle": "Η φωνητική ανάγνωση απενεργοποιήθηκε", + "ttsDisabledBody": "Μπορείτε να ενεργοποιήσετε τη φωνητική ανάγνωση στις ρυθμίσεις εκμάθησης", + "noSpaceDescriptionYet": "Δεν έχει δημιουργηθεί ακόμη περιγραφή μαθήματος.", + "tooLargeToSend": "Αυτό το μήνυμα είναι πολύ μεγάλο για αποστολή", + "exitWithoutSaving": "Είστε βέβαιοι ότι θέλετε να φύγετε χωρίς να αποθηκεύσετε;", + "enableAutocorrectPopupTitle": "Προσθέστε το πληκτρολόγιο της γλώσσας στόχου πηγαίνοντας στα:", + "enableAutocorrectPopupSteps": " • Ρυθμίσεις\n • Γενικά\n • Πληκτρολόγιο\n • Πληκτρολόγια\n • Προσθήκη νέου πληκτρολογίου", + "enableAutocorrectPopupDescription": "Μόλις επιλεγεί η γλώσσα, μπορείτε να κάνετε κλικ στο μικρό εικονίδιο του κόσμου στο κάτω αριστερό μέρος του πληκτρολογίου σας για να ενεργοποιήσετε το νέο εγκατεστημένο πληκτρολόγιο.", + "downloadGboardTitle": "Κατεβάστε το Gboard από το Google Play Store για να ενεργοποιήσετε την αυτόματη διόρθωση και άλλες λειτουργίες πληκτρολογίου:", + "downloadGboardSteps": " • Κατεβάστε το Gboard\n • Ανοίξτε την εφαρμογή\n • Γλώσσες\n • Προσθήκη πληκτρολογίου\n • Επιλογή γλώσσας\n • Επιλογή τύπου πληκτρολογίου\n • Τέλος", + "downloadGboardDescription": "Μόλις επιλεγεί η γλώσσα, μπορείτε να κάνετε κλικ στο μικρό εικονίδιο του κόσμου στο κάτω αριστερό μέρος του πληκτρολογίου σας για να ενεργοποιήσετε το νέο εγκατεστημένο πληκτρολόγιο.", + "enableAutocorrectWarning": "Προειδοποίηση! Απαιτείται η προσθήκη του πληκτρολογίου της γλώσσας στόχου", + "displayName": "Εμφανιζόμενο όνομα", + "leaveRoomDescription": "Πρόκειται να φύγετε από αυτήν τη συνομιλία. Οι άλλοι χρήστες θα δουν ότι έχετε φύγει.", + "confirmUserId": "Παρακαλούμε επιβεβαιώστε το όνομα χρήστη Pangea Chat για να διαγράψετε τον λογαριασμό σας.", + "startingToday": "Από σήμερα", + "oneWeekFreeTrial": "Μια εβδομάδα δωρεάν δοκιμής", + "paidSubscriptionStarts": "Ξεκινάει {startDate}", + "cancelInSubscriptionSettings": "• Ακύρωση οποιαδήποτε στιγμή στις ρυθμίσεις συνδρομής", + "cancelToAvoidCharges": "• Ακύρωση πριν από {trialEnds} για να αποφύγετε χρεώσεις", + "downloadGboard": "Κατεβάστε το Gboard", + "autocorrectNotAvailable": "Δυστυχώς, η πλατφόρμα σας δεν υποστηρίζεται αυτήν τη στιγμή για αυτήν τη λειτουργία. Μείνετε συντονισμένοι για περαιτέρω ανάπτυξη!", + "pleaseUpdateApp": "Παρακαλούμε ενημερώστε την εφαρμογή για να συνεχίσετε.", + "chooseEmojiInstructionsBody": "Ταιριάξτε emojis με τις λέξεις που καλύτερα αντιπροσωπεύουν. Μην ανησυχείτε! Δεν θα χάσετε πόντους αν διαφωνείτε. 😅", + "analyticsVocabListBody": "Αυτή είναι όλη η λεξιλογική σας λίστα! Καθώς κερδίζετε XP για κάθε λέξη, θα μετατρέπονται από σπορά σε πλήρη άνθιση. Κάντε κλικ σε οποιαδήποτε λέξη για περισσότερες λεπτομέρειες.", + "morphAnalyticsListBody": "Αυτές είναι όλες οι γραμματικές έννοιες στη γλώσσα που μαθαίνετε! Θα τις ξεκλειδώσετε καθώς τις συναντάτε κατά τη διάρκεια της συνομιλίας. Κάντε κλικ για λεπτομέρειες.", + "knockSpaceSuccess": "Έχετε ζητήσει να συμμετάσχετε σε αυτό το μάθημα! Ένας διαχειριστής θα απαντήσει στο αίτημά σας μόλις το λάβει 😀", + "chooseWordAudioInstructionsBody": "Ακούστε το πλήρες μήνυμα. Στη συνέχεια, ταιριάξτε τα ηχητικά με τις λέξεις.", + "chooseMorphsInstructionsBody": "Κάντε κλικ στα κομμάτια παζλ για γραμματικές ερωτήσεις!", + "pleaseEnterInt": "Παρακαλούμε εισάγετε έναν αριθμό", + "home": "Αρχική", + "join": "Συμμετοχή", + "readingAssistanceOverviewBody": "Κάντε κλικ στα κουμπιά παρακάτω για mini-games με αντιστοίχιση emoji, ήχων, σημασιών λέξεων και γραμματικών εννοιών. Ή κάντε κλικ σε οποιαδήποτε λέξη για λεπτομέρειες.", + "levelSummaryPopupTitle": "Περίληψη Επιπέδου {level}", + "resetInstructionTooltipsTitle": "Επαναφορά οδηγιών βοήθειας", + "resetInstructionTooltipsDesc": "Κάντε κλικ για να εμφανίσετε ξανά τις οδηγίες βοήθειας, όπως για έναν ολοκαίνουργιο χρήστη.", + "selectForGrammar": "Επιλέξτε ένα εικονίδιο γραμματικής για δραστηριότητες και λεπτομέρειες.", + "randomize": "Τυχαία επιλογή", + "clear": "Καθαρισμός", + "makeYourOwnActivity": "Δημιουργήστε τη δική σας δραστηριότητα", + "featuredActivities": "Προτεινόμενες", + "save": "Αποθήκευση", + "startChat": "Ξεκίνα μια συνομιλία", + "translationProblem": "Πρόβλημα μετάφρασης", + "askToJoin": "Ζήτησε να συμμετάσχεις", + "emptyChatWarningTitle": "Η συνομιλία είναι κενή", + "emptyChatWarningDesc": "Δεν έχεις προσκαλέσει κανέναν στη συνομιλία σου. Πήγαινε στις ρυθμίσεις συνομιλίας για να προσκαλέσεις τις επαφές σου ή το Bot. Μπορείς επίσης να το κάνεις αργότερα.", + "areYouLikeMe": "Είσαι σαν εμένα;", + "tryAgainLater": "Πολλές προσπάθειες. Παρακαλώ δοκίμασε ξανά σε 5 λεπτά.", + "enterSpaceCode": "Εισάγετε τον κωδικό μαθήματος", + "shareSpaceLink": "Μοιράσου τον σύνδεσμο", + "byUsingPangeaChat": "Χρησιμοποιώντας το Pangea Chat, συμφωνώ με το ", + "details": "Λεπτομέρειες", + "languageLevelPreA1Desc": "Ποτέ δεν έμαθα ή χρησιμοποίησα τη γλώσσα.", + "languageLevelA1Desc": "Μπορώ να καταλάβω και να χρησιμοποιήσω μερικές οικείες καθημερινές εκφράσεις και πολύ βασικές φράσεις.", + "languageLevelA2Desc": "Μπορώ να καταλάβω προτάσεις και συχνά χρησιμοποιούμενες εκφράσεις που σχετίζονται με περιοχές άμεσης σημασίας.", + "languageLevelB1Desc": "Μπορώ να αντιμετωπίσω τις περισσότερες οικείες καταστάσεις και μπορώ να παράγω απλό συνδεδεμένο κείμενο σε οικεία θέματα.", + "languageLevelB2Desc": "Μπορώ να καταλάβω τις κύριες ιδέες σύνθετων κειμένων και να αλληλεπιδράσω με βαθμό ευφράδειας και αυθορμητισμού.", + "languageLevelC1Desc": "Μπορώ να εκφράσω ιδέες με ευφράδεια και αυθορμητισμό χωρίς μεγάλη δυσκολία και να καταλάβω ένα ευρύ φάσμα απαιτητικών κειμένων.", + "languageLevelC2Desc": "Μπορώ να καταλάβω σχεδόν τα πάντα που ακούω ή διαβάζω και να εκφράζομαι με ευφράδεια και ακρίβεια.", + "newVocab": "Νέες λέξεις", + "newGrammar": "Νέες γραμματικές έννοιες", + "choosePracticeMode": "Κάνε κλικ σε μία από τις παραπάνω επιλογές για να ξεκινήσεις μια δραστηριότητα εξάσκησης", + "ban": "Απαγόρευση", + "unban": "Άρση απαγόρευσης", + "kick": "Απομάκρυνση", + "lemma": "Λήμμα", + "grammarFeature": "Χαρακτηριστικό γραμματικής", + "grammarTag": "Ετικέτα γραμματικής", + "forms": "Μορφές", + "exampleMessages": "Παραδείγματα μηνυμάτων", + "timesUsedIndependently": "Χρησιμοποιήθηκε αυτόνομα", + "timesUsedWithAssistance": "Χρησιμοποιήθηκε με βοήθεια", + "shareInviteCode": "Μοιραστείτε τον κωδικό πρόσκλησης: {code}", + "leaderboard": "Κατάταξη", + "skipForNow": "Παραλείψτε προς το παρόν", + "permissions": "Άδειες", + "spaceChildPermission": "Ποιος μπορεί να προσθέσει νέες συνομιλίες σε αυτό το μάθημα", + "addEnvironmentOverride": "Προσθήκη παραμέτρου περιβάλλοντος", + "defaultOption": "Προεπιλογή", + "deleteChatDesc": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτήν τη συνομιλία; Θα διαγραφεί για όλους τους συμμετέχοντες και όλα τα μηνύματα μέσα στη συνομιλία δεν θα είναι πλέον διαθέσιμα για πρακτική ή αναλυτικά δεδομένα μάθησης.", + "deleteSpaceDesc": "Το μάθημα και οποιεσδήποτε επιλεγμένες συνομιλίες θα διαγραφούν για όλους τους συμμετέχοντες και όλα τα μηνύματα μέσα στη συνομιλία δεν θα είναι πλέον διαθέσιμα για πρακτική ή αναλυτικά δεδομένα μάθησης. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.", + "launch": "Έναρξη", + "searchChats": "Αναζήτηση συνομιλιών", + "maxFifty": "Μέγιστο 50", + "configureSpace": "Διαμόρφωση μαθήματος", + "pinMessages": "Καρφιτσώστε μηνύματα", + "setJoinRules": "Ορίστε κανόνες συμμετοχής", + "changeGeneralSettings": "Αλλάξτε τις γενικές ρυθμίσεις", + "inviteOtherUsersToRoom": "Προσκαλέστε άλλους χρήστες", + "changeTheNameOfTheSpace": "Αλλάξτε το όνομα του μαθήματος", + "changeTheDescription": "Αλλάξτε την περιγραφή", + "changeThePermissions": "Αλλάξτε τα δικαιώματα", + "introductions": "Εισαγωγές", + "announcements": "Ανακοινώσεις", + "activities": "Δραστηριότητες", + "access": "Πρόσβαση", + "activitySuggestionTimeoutMessage": "Δουλεύουμε σκληρά για να δημιουργήσουμε περισσότερες δραστηριότητες για εσάς, παρακαλούμε ελέγξτε ξανά σε ένα λεπτό", + "howSpaceCanBeFound": "Πώς μπορεί να βρεθεί αυτό το μάθημα", + "private": "Ιδιωτικό", + "cannotBeFoundInSearch": "Δεν μπορεί να βρεθεί στην αναζήτηση", + "public": "Δημόσιο", + "visibleToCommunity": "Ορατό στην ευρύτερη κοινότητα Pangea Chat μέσω \"Βρες ένα μάθημα\"", + "howSpaceCanBeJoined": "Πώς μπορεί να ενταχθεί αυτό το μάθημα", + "canBeFoundVia": "Μπορεί να βρεθεί μέσω:", + "canBeFoundViaInvitation": "• πρόσκληση", + "canBeFoundViaCodeOrLink": "• κωδικός ή σύνδεσμος", + "canBeFoundViaKnock": "• αίτημα συμμετοχής και έγκριση διαχειριστή", + "youHaveLeveledUp": "Έχετε ανέβει επίπεδο!", + "sendActivities": "Αποστολή δραστηριοτήτων", + "groupChat": "Ομαδική Συνομιλία", + "directMessage": "Άμεσο μήνυμα", + "newDirectMessage": "Νέο άμεσο μήνυμα", + "speakingExercisesTooltip": "Ομιλία", + "noChatsFoundHereYet": "Δεν βρέθηκαν συνομιλίες εδώ ακόμα", + "duration": "Διάρκεια", + "transcriptionFailed": "Αποτυχία μεταγραφής ήχου", + "aUserIsKnocking": "Ένας χρήστης ζητά να συμμετάσχει στο μάθημά σας", + "usersAreKnocking": "{users} χρήστες ζητούν να συμμετάσχουν στο μάθημά σας", + "failedToFetchTranscription": "Αποτυχία λήψης μεταγραφής", + "deleteEmptySpaceDesc": "Το μάθημα θα διαγραφεί για όλους τους συμμετέχοντες. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.", + "regenerate": "Αναδημιουργία", + "mySavedActivities": "Αποθηκευμένες Δραστηριότητες μου", + "noSavedActivities": "Δεν υπάρχουν αποθηκευμένες δραστηριότητες", + "saveActivity": "Αποθήκευση αυτής της δραστηριότητας", + "failedToPlayVideo": "Αποτυχία αναπαραγωγής βίντεο", + "done": "Ολοκληρώθηκε", + "inThisSpace": "Σε αυτό το μάθημα", + "myContacts": "Οι επαφές μου", + "inviteAllInSpace": "Πρόσκληση όλων στο μάθημα", + "spaceParticipantsHaveBeenInvitedToTheChat": "Όλοι οι συμμετέχοντες στο μάθημα έχουν προσκληθεί στη συνομιλία", + "numKnocking": "{count} χτυπήματα", + "numInvited": "{count} προσκεκλημένοι", + "saved": "Αποθηκευμένο", + "reset": "Επαναφορά", + "errorGenerateActivityMessage": "Αποτυχία δημιουργίας δραστηριότητας", + "errorRegenerateActivityMessage": "Αποτυχία αναδημιουργίας δραστηριότητας", + "errorLaunchActivityMessage": "Αποτυχία εκκίνησης δραστηριότητας", + "errorFetchingActivitiesMessage": "Αποτυχία λήψης δραστηριοτήτων", + "errorFetchingDefinition": "Αποτυχία λήψης ορισμού", + "errorProcessAnalytics": "Αποτυχία επεξεργασίας αναλυτικών στοιχείων", + "errorDownloading": "Η λήψη απέτυχε", + "errorFetchingLevelSummary": "Αποτυχία λήψης περίληψης επιπέδου", + "errorLoadingSpaceChildren": "Αποτυχία φόρτωσης συνομιλιών εντός αυτού του μαθήματος", + "unexpectedError": "Απρόβλεπτο σφάλμα.", + "pleaseReload": "Παρακαλώ επαναφορτώστε και δοκιμάστε ξανά.", + "translationError": "Σφάλμα μετάφρασης", + "errorFetchingTranslation": "Αποτυχία λήψης μετάφρασης", + "errorFetchingActivity": "Αποτυχία λήψης δραστηριότητας", + "check": "Έλεγχος", + "unableToFindRoom": "Δεν βρέθηκε συνομιλία ή μάθημα με αυτόν τον κωδικό. Παρακαλώ δοκιμάστε ξανά.", + "numCompletedActivities": "Αριθμός ολοκληρωμένων δραστηριοτήτων", + "viewingAnalytics": "Προβολή {visible}/{users} Αναλύσεων", + "request": "Αίτημα", + "requestAll": "Ζήτηση Όλα", + "confirmMessageUnpin": "Είστε σίγουροι ότι θέλετε να αποσυνδέσετε αυτό το μήνυμα;", + "createActivityPlan": "Δημιουργία νέου σχεδίου δραστηριότητας", + "saveAndLaunch": "Αποθήκευση και Εκκίνηση", + "launchToSpace": "Εκκίνηση στην πορεία", + "numberOfActivities": "Αριθμός συνεδριών δραστηριότητας", + "maximumActivityParticipants": "Κάθε δραστηριότητα μπορεί να έχει το μέγιστο {count} συμμετέχοντα(ους).", + "pending": "Εκκρεμεί", + "inactive": "Ανενεργό", + "confirmRole": "Επιβεβαίωση ρόλου", + "openRoleLabel": "ΑΝΟΙΧΤΟ", + "joinedTheActivity": "👋 {username} συμμετείχε ως {role}", + "finishedTheActivity": "🎯 {username} ολοκλήρωσε αυτήν τη δραστηριότητα", + "archiveToAnalytics": "Προσθήκη στις Ολοκληρωμένες Δραστηριότητες μου", + "activitySummaryError": "Οι περιλήψεις δραστηριοτήτων δεν είναι διαθέσιμες", + "requestSummaries": "Αιτήματα περιλήψεων", + "generatingNewActivities": "Είστε ο πρώτος χρήστης αυτής της ζεύξης γλωσσών! Παρακαλούμε δώστε μας ένα λεπτό, ετοιμάζουμε δραστηριότητες αποκλειστικά για εσάς.", + "requestAccessTitle": "Ζητήστε πρόσβαση σε αναλύσεις;", + "requestAccessDesc": "Θα θέλατε να ζητήσετε πρόσβαση για να δείτε τα αναλυτικά στοιχεία των συμμετεχόντων;\n\nΑν οι συμμετέχοντες συμφωνήσουν, οι διαχειριστές αυτού του μαθήματος θα μπορούν να δουν:\n • συνολικό λεξιλόγιο\n • συνολικές γραμματικές έννοιες\n • συνολικές συνεδρίες δραστηριότητας που ολοκληρώθηκαν\n • τις συγκεκριμένες γραμματικές έννοιες που χρησιμοποιήθηκαν, σωστά και λανθασμένα\n\nΔεν θα μπορούν να δουν:\n • μηνύματα σε συνομιλίες εκτός του μαθήματος\n • λίστα λεξιλογίου", + "requestAccess": "Αίτηση πρόσβασης ({count})", + "analyticsInactiveTitle": "Οι αιτήσεις σε ανενεργούς χρήστες δεν μπορούν να σταλούν", + "analyticsInactiveDesc": "Οι ανενεργοί χρήστες που δεν έχουν συνδεθεί από τότε που εισήχθη αυτή η λειτουργία δεν θα δουν το αίτημά σας.\n\nΤο κουμπί Αίτημα θα εμφανιστεί μόλις επιστρέψουν. Μπορείτε να ξαναστείλετε το αίτημα αργότερα κάνοντας κλικ στο κουμπί Αίτημα κάτω από το όνομά τους όταν είναι διαθέσιμο.", + "accessRequestedTitle": "Αίτημα πρόσβασης στα αναλυτικά στοιχεία", + "accessRequestedDesc": "Ζητώντας admin(s): {admin} \n\nΟι διαχειριστές από το «{space}» ζητούν να δουν τις αναλύσεις μάθησής σας.\n\nΑν συμφωνείτε, θα μπορούν να δουν:\n • το συνολικό λεξιλόγιο\n • τις συνολικές έννοιες γραμματικής\n • τις συνολικές συνεδρίες δραστηριότητας που ολοκληρώθηκαν\n • τις συγκεκριμένες έννοιες γραμματικής που χρησιμοποιήθηκαν, σωστά και λανθασμένα\n\nΔεν θα μπορούν να δουν:\n • μηνύματα σε συνομιλίες εκτός του μαθήματος\n • τη λίστα λεξιλογίου", + "adminRequestedAccess": "Οι διαχειριστές ζήτησαν να δουν τα αναλυτικά σας στοιχεία.", + "lastUpdated": "Ενημερώθηκε\n{time}", + "activityFinishedMessage": "Όλα Ολοκληρώθηκαν!", + "endForAll": "Τέλος για όλους", + "newCourse": "Νέο μάθημα", + "numModules": "{num} ενότητες", + "coursePlan": "Πλάνο Μαθήματος", + "editCourseLater": "Μπορείτε να επεξεργαστείτε τον τίτλο, τις περιγραφές και την εικόνα του μαθήματος αργότερα.", + "createCourse": "Δημιουργία μαθήματος", + "stats": "Στατιστικά", + "createGroupChat": "Δημιουργία ομαδικής συνομιλίας", + "editCourse": "Επεξεργασία μαθήματος", + "inviteDesc": "Με όνομα χρήστη, με κωδικό ή σύνδεσμο", + "editCourseDesc": "Εδώ μπορείτε να επεξεργαστείτε τον τίτλο, την περιγραφή και άλλα στοιχεία του μαθήματος.", + "permissionsDesc": "Ορίστε δικαιώματα, όπως ποιος μπορεί να προσκαλεί χρήστες, να στέλνει μηνύματα, να δημιουργεί συνομιλίες κ.λπ.", + "accessDesc": "Μπορείτε να κάνετε το μάθημά σας ανοιχτό στον κόσμο! Ή, να το κρατήσετε ιδιωτικό και ασφαλές.", + "createGroupChatDesc": "Ενώ οι συνεδρίες δραστηριοτήτων ξεκινούν και τελειώνουν, οι ομαδικές συνομιλίες θα παραμένουν ανοιχτές για τακτική επικοινωνία.", + "deleteDesc": "Μόνο διαχειριστές μπορούν να διαγράψουν ένα μάθημα. Αυτή είναι μια καταστροφική ενέργεια που αφαιρεί όλους τους χρήστες και διαγράφει όλες τις επιλεγμένες συνομιλίες εντός του μαθήματος. Προχωρήστε με προσοχή.", + "noCourseFound": "Ωχ, αυτό το μάθημα χρειάζεται ένα πλάνο!\n\nΤα πλάνα μαθημάτων είναι μια σειρά θεμάτων και δραστηριοτήτων συζήτησης.", + "additionalParticipants": "+ {num} άλλοι", + "directMessages": "Άμεσες Μηνύσεις", + "whatNow": "Τι τώρα;", + "chooseNextActivity": "Επιλέξτε την επόμενη δραστηριότητά σας!", + "letsGo": "Πάμε", + "chooseRole": "Επιλέξτε ρόλο!", + "chooseRoleToParticipate": "Επιλέξτε ρόλο για συμμετοχή!", + "waitingToFillRole": "Αναμονή για συμπλήρωση {num} ρόλων...", + "pingParticipants": "Ειδοποιήστε τους συμμετέχοντες του μαθήματος", + "playWithBot": "Παίξτε με το Pangea Bot", + "inviteFriends": "Προσκαλέστε φίλους", + "waitNotDone": "Περίμενε, δεν έχω τελειώσει!", + "waitingForOthersToFinish": "Αναμονή για τους υπόλοιπους να τελειώσουν...", + "generatingSummary": "Ανάλυση συνομιλίας και δημιουργία αποτελεσμάτων", + "findCourse": "Βρείτε ένα μάθημα", + "pingParticipantsNotification": "{user} ψάχνει χρήστες να συμμετάσχουν στη συνεδρία δραστηριότητας στο {room}", + "course": "Μάθημα", + "courses": "Μαθήματα", + "courseName": "Όνομα μαθήματος", + "createNewCourse": "Νέο μάθημα", + "goToCourse": "Πήγαινε στο μάθημα: {course}", + "activityComplete": "Αυτή η δραστηριότητα έχει ολοκληρωθεί. Η περίληψη της δραστηριότητας θα πρέπει να είναι διαθέσιμη παρακάτω.", + "startNewSession": "Ξεκινήστε νέα συνεδρία", + "joinOpenSession": "Συμμετοχή σε ανοιχτή συνεδρία", + "less": "λιγότερο", + "activityNotFound": "Δεν βρέθηκε δραστηριότητα", + "levelUp": "Επίπεδο πάνω", + "myActivities": "Οι δραστηριότητές μου", + "openToJoin": "Ανοιχτό για συμμετοχή", + "results": "Αποτελέσματα", + "activityDone": "Ολοκληρώθηκε η δραστηριότητα!", + "promoCodeInfo": "Οι κωδικοί προώθησης μπορούν να εισαχθούν στη σελίδα που ακολουθεί", + "editsComingSoon": "Η δυνατότητα επεξεργασίας πόλεων και δραστηριοτήτων έρχεται σύντομα.", + "editing": "Επεξεργασία", + "activityNeedsOneMember": "Ωχ! Αυτή η δραστηριότητα χρειάζεται 1 ακόμη άτομο.", + "activityNeedsMembers": "Ωχ! Αυτή η δραστηριότητα χρειάζεται {num} ακόμη άτομα.", + "inviteFriendsToCourse": "Πρόσκληση φίλων στο μάθημά μου", + "subscribeToUnlockActivitySummaries": "Εγγραφή για ξεκλείδωμα περιλήψεων δραστηριοτήτων", + "subscribeToUnlockDefinitions": "Εγγραφή για ξεκλείδωμα ορισμών", + "subscribeToUnlockTranscriptions": "Εγγραφή για ξεκλείδωμα μεταγραφών", + "pingSent": "🔔 Η ειδοποίηση μαθήματος εστάλη! 🔔", + "courseTitle": "Τίτλος μαθήματος", + "courseDesc": "Περιγραφή μαθήματος", + "courseSavedSuccessfully": "Το μάθημα αποθηκεύτηκε με επιτυχία", + "addCoursePlan": "Προσθήκη σχεδίου μαθήματος", + "activityStatsButtonInstruction": "Κάντε κλικ εδώ για να δείτε τα στατιστικά της δραστηριότητάς σας και να κλείσετε τη δραστηριότητα όταν τελειώσετε", + "loginToAccount": "Συνδεθείτε στον λογαριασμό μου", + "appDescription": "Μάθε μια γλώσσα\nενώ στέλνεις μηνύματα στους φίλους σου.", + "languages": "Γλώσσες", + "chooseLanguage": "Επιλέξτε μια γλώσσα στόχου.", + "planTrip": "Προγραμματίστε το ταξίδι σας", + "howAreYouTraveling": "Πώς ταξιδεύετε;", + "unlockPrivateTrip": "Ξεκλειδώστε ένα ιδιωτικό ταξίδι", + "joinPublicTrip": "Συμμετάσχετε σε ένα δημόσιο ταξίδι", + "startOwnTrip": "Ξεκινήστε το δικό μου", + "tripPlanDesc": "Τα ταξίδια είναι μαθήματα. Κάθε ένα έχει 8-10 διαδοχικά θέματα με μια σειρά δραστηριοτήτων μάθησης γλώσσας με βάση τις εργασίες.", + "unlockPrivateTripTitle": "Ξεκλειδώστε ιδιωτικό ταξίδι", + "browsePublicTrips": "Περιηγηθείτε σε δημόσια ταξίδια", + "startOwnTripTitle": "Ξεκινήστε το δικό μου ταξίδι", + "courseCode": "Ποιος είναι ο μυστικός κωδικός;", + "courseCodeHint": "Κωδικός ή σύνδεσμος ταξιδιού", + "unlockMyTrip": "Ξεκλειδώστε το ταξίδι μου", + "signupOption": "Πώς θέλετε να εγγραφείτε;", + "withApple": "Με την Apple", + "withGoogle": "Με Google", + "withEmail": "Με Email", + "createAccount": "Δημιουργία λογαριασμού", + "loginWithEmail": "Σύνδεση με email", + "usernameOrEmail": "Όνομα χρήστη ή email", + "email": "Email", + "forgotPassword": "Ξεχάσατε τον κωδικό;", + "endActivity": "Τέλος δραστηριότητας", + "allLanguages": "Όλες οι γλώσσες", + "chatListTooltip": "Εδώ θα βρείτε τα άμεσα μηνύματά σας! Κάντε κλικ σε οποιονδήποτε avatar χρήστη και \"ξεκινήστε συνομιλία\" για να στείλετε ένα DM.", + "directMessageBotTitle": "Άμεσο μήνυμα Pangea Bot", + "feedbackTitle": "Ανατροφοδότηση δραστηριότητας", + "feedbackHint": "Η ανατροφοδότησή σας", + "feedbackButton": "Υποβολή ανατροφοδότησης", + "directMessageBotDesc": "Το να μιλάς με ανθρώπους είναι πιο διασκεδαστικό, αλλά... η ΤΝ είναι πάντα έτοιμη!", + "inviteYourFriends": "Προσκαλέστε τους φίλους σας", + "playWithAI": "Παίξτε με την Τεχνητή Νοημοσύνη προς το παρόν", + "courseStartDesc": "Ο Pangea Bot είναι έτοιμος να ξεκινήσει οποιαδήποτε στιγμή!\n\n...αλλά η μάθηση είναι καλύτερη με φίλους!", + "@@locale": "el", + "@@last_modified": "2026-02-05 10:10:14.390437", + "@checkList": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } } - } - }, - "@noTeachersFound": { - "type": "String", - "placeholders": {} - }, - "@trialExpiration": { - "type": "String", - "placeholders": { - "expiration": { - "type": "String" + }, + "@globalChatId": { + "type": "String", + "placeholders": {} + }, + "@accessAndVisibility": { + "type": "String", + "placeholders": {} + }, + "@accessAndVisibilityDescription": { + "type": "String", + "placeholders": {} + }, + "@calls": { + "type": "String", + "placeholders": {} + }, + "@customEmojisAndStickers": { + "type": "String", + "placeholders": {} + }, + "@customEmojisAndStickersBody": { + "type": "String", + "placeholders": {} + }, + "@hideRedactedMessages": { + "type": "String", + "placeholders": {} + }, + "@hideRedactedMessagesBody": { + "type": "String", + "placeholders": {} + }, + "@hideInvalidOrUnknownMessageFormats": { + "type": "String", + "placeholders": {} + }, + "@block": { + "type": "String", + "placeholders": {} + }, + "@blockedUsers": { + "type": "String", + "placeholders": {} + }, + "@blockListDescription": { + "type": "String", + "placeholders": {} + }, + "@blockUsername": { + "type": "String", + "placeholders": {} + }, + "@hideMemberChangesInPublicChats": { + "type": "String", + "placeholders": {} + }, + "@hideMemberChangesInPublicChatsBody": { + "type": "String", + "placeholders": {} + }, + "@overview": { + "type": "String", + "placeholders": {} + }, + "@notifyMeFor": { + "type": "String", + "placeholders": {} + }, + "@passwordRecoverySettings": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } } - } - }, - "@freeTrialDesc": { - "type": "String", - "placeholders": {} - }, - "@activateTrial": { - "type": "String", - "placeholders": {} - }, - "@successfullySubscribed": { - "type": "String", - "placeholders": {} - }, - "@clickToManageSubscription": { - "type": "String", - "placeholders": {} - }, - "@signUp": { - "type": "String", - "placeholders": {} - }, - "@pleaseChooseAtLeastChars": { - "type": "String", - "placeholders": { - "min": { - "type": "String" + }, + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } } - } - }, - "@noEmailWarning": { - "type": "String", - "placeholders": {} - }, - "@pleaseEnterValidEmail": { - "type": "String", - "placeholders": {} - }, - "@pleaseChooseAUsername": { - "type": "String", - "placeholders": {} - }, - "@define": { - "type": "String", - "placeholders": {} - }, - "@listen": { - "type": "String", - "placeholders": {} - }, - "@trialPeriodExpired": { - "type": "String", - "placeholders": {} - }, - "@translations": { - "type": "String", - "placeholders": {} - }, - "@messageAudio": { - "type": "String", - "placeholders": {} - }, - "@definitions": { - "type": "String", - "placeholders": {} - }, - "@subscribedToUnlockTools": { - "type": "String", - "placeholders": {} - }, - "@translationTooltip": { - "type": "String", - "placeholders": {} - }, - "@speechToTextTooltip": { - "type": "String", - "placeholders": {} - }, - "@kickBotWarning": { - "type": "String", - "placeholders": {} - }, - "@refresh": { - "type": "String", - "placeholders": {} - }, - "@messageAnalytics": { - "type": "String", - "placeholders": {} - }, - "@words": { - "type": "String", - "placeholders": {} - }, - "@score": { - "type": "String", - "placeholders": {} - }, - "@accuracy": { - "type": "String", - "placeholders": {} - }, - "@points": { - "type": "String", - "placeholders": {} - }, - "@noPaymentInfo": { - "type": "String", - "placeholders": {} - }, - "@updatePhoneOS": { - "type": "String", - "placeholders": {} - }, - "@wordsPerMinute": { - "type": "String", - "placeholders": {} - }, - "@tooltipInstructionsTitle": { - "type": "String", - "placeholders": {} - }, - "@tooltipInstructionsMobileBody": { - "type": "String", - "placeholders": {} - }, - "@tooltipInstructionsBrowserBody": { - "type": "String", - "placeholders": {} - }, - "@chatCapacity": { - "type": "String", - "placeholders": {} - }, - "@roomFull": { - "type": "String", - "placeholders": {} - }, - "@chatCapacityHasBeenChanged": { - "type": "String", - "placeholders": {} - }, - "@chatCapacitySetTooLow": { - "type": "int", - "placeholders": { - "count": { - "type": "int" + }, + "@youInvitedToBy": { + "type": "String", + "placeholders": { + "alias": { + "type": "String" + } } - } - }, - "@chatCapacityExplanation": { - "type": "String", - "placeholders": {} - }, - "@tooManyRequest": { - "type": "String", - "placeholders": {} - }, - "@enterNumber": { - "type": "String", - "placeholders": {} - }, - "@buildTranslation": { - "type": "String", - "placeholders": {} - }, - "@practice": { - "type": "String", - "placeholders": {} - }, - "@noLanguagesSet": { - "type": "String", - "placeholders": {} - }, - "@speechToTextBody": { - "type": "String", - "placeholders": {} - }, - "@versionNotFound": { - "type": "String", - "placeholders": {} - }, - "@fetchingVersion": { - "type": "String", - "placeholders": {} - }, - "@versionFetchError": { - "type": "String", - "placeholders": {} - }, - "@versionText": { - "type": "String", - "placeholders": { - "version": { - "type": "String" - }, - "buildNumber": { - "type": "String" + }, + "@invitedBy": { + "type": "String", + "placeholders": { + "user": { + "type": "String" + } } - } - }, - "@l1TranslationBody": { - "type": "String", - "placeholders": {} - }, - "@deleteSubscriptionWarningTitle": { - "type": "String", - "placeholders": {} - }, - "@deleteSubscriptionWarningBody": { - "type": "String", - "placeholders": {} - }, - "@manageSubscription": { - "type": "String", - "placeholders": {} - }, - "@error520Title": { - "type": "String", - "placeholders": {} - }, - "@error520Desc": { - "type": "String", - "placeholders": {} - }, - "@wordsUsed": { - "type": "String", - "placeholders": {} - }, - "@level": { - "type": "String", - "placeholders": {} - }, - "@morphsUsed": { - "type": "String", - "placeholders": {} - }, - "@translationChoicesBody": { - "type": "String", - "placeholders": {} - }, - "@grammar": { - "type": "String", - "placeholders": {} - }, - "@contactHasBeenInvitedToTheChat": { - "type": "String", - "placeholders": {} - }, - "@inviteChat": { - "type": "String", - "placeholders": {} - }, - "@chatName": { - "type": "String", - "placeholders": {} - }, - "@reportContentIssueTitle": { - "type": "String", - "placeholders": {} - }, - "@feedback": { - "type": "String", - "placeholders": {} - }, - "@reportContentIssueDescription": { - "type": "String", - "placeholders": {} - }, - "@clickTheWordAgainToDeselect": { - "type": "String", - "placeholders": {} - }, - "@l2SupportNa": { - "type": "String", - "placeholders": {} - }, - "@l2SupportAlpha": { - "type": "String", - "placeholders": {} - }, - "@l2SupportBeta": { - "type": "String", - "placeholders": {} - }, - "@l2SupportFull": { - "type": "String", - "placeholders": {} - }, - "@missingVoiceTitle": { - "type": "String", - "placeholders": {} - }, - "@voiceNotAvailable": { - "type": "String", - "placeholders": {} - }, - "@openVoiceSettings": { - "type": "String", - "placeholders": {} - }, - "@playAudio": { - "type": "String", - "placeholders": {} - }, - "@stop": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSsconj": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSnum": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSverb": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSaffix": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSpart": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSadj": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOScconj": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSpunct": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSadv": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSaux": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSspace": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSsym": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSdet": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSpron": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSadp": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSpropn": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSnoun": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSintj": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSx": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyGENDERfem": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPERSON2": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyMOODimp": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTTYPEqest": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyASPECTperf": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEaccnom": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEobl": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVOICEact": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTTYPEbrck": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNOUNTYPEart": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMBERsing": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyGENDERmasc": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBTYPEmod": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyADVTYPEadverbial": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyTENSEperi": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMFORMdigit": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNOUNTYPEnot_proper": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMTYPEcard": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNOUNTYPEprop": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTTYPEdash": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTTYPEyes": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTTYPEsemi": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTTYPEcomm": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyMOODcnd": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEacc": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPARTTYPEpart": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyTENSEpast": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyDEGREEsup": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTTYPEcolo": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPERSON3": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMBERplur": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPEnpr": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPEinterrogative": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOLITEinfm": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyADVTYPEtim": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOLARITYneg": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMTYPEtot": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyADVTYPEadnomial": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyASPECTprog": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyMOODsub": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBFORMcomplementive": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEnom": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyTENSEfut": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEdat": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyTENSEpres": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyGENDERneut": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPErel": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBFORMfinalEnding": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPEdem": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPREPCASEpre": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBFORMfin": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyDEGREEpos": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTTYPEquot": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBFORMger": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVOICEpass": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEgen": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyTENSEprs": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyDEFINITEdef": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMTYPEord": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEins": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBFORMinf": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBFORMaux": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMFORMlong": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEloc": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyMOODind": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyDEGREEcmp": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASErelativeCase": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTTYPEexcl": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPERSON1": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTSIDEini": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyGENDERperson": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyFOREIGNyes": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVOICEvoice": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBTYPEverbType": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSSpass": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPREPCASEprepCase": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMTYPEnumType": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNOUNTYPEnounType": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyREFLEXreflex": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPEpronType": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTSIDEpunctSide": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBFORMverbForm": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyGENDERgender": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyMOODmood": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyASPECTaspect": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTTYPEpunctType": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyTENSEtense": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyDEGREEdegree": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOLITEpolite": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyADVTYPEadvType": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMFORMnumber": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCONJTYPEconjType": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOLARITYpolarity": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEcase": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyDEFINITEdefinite": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMFORMnumForm": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPEadn": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVOCvoc": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCMPLcmpl": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyADVadv": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyMOODjus": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyGENDERcom": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyREFLEXrflx": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPARTTYPEpar": { - "type": "String", - "placeholders": {} - }, - "@grammarCopySPCspc": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyTENSEpqp": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyREFLEXref": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTTYPEnshrt": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMBERdual": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMFORMlng": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVOICEmid": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyINTRELintRel": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyINTint": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVOICEcaus": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyUnknown": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyEVIDENTevident": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMFORMnumberPsor": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyASPECThab": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEabl": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEall": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEess": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEtra": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEequ": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEdis": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEabs": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEerg": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEcau": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEben": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEtem": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCONJTYPEcoord": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyDEFINITEcons": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyDEGREEabs": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyEVIDENTfh": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyEVIDENTnfh": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyMOODopt": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyMOODadm": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyMOODdes": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyMOODnec": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyMOODpot": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyMOODprp": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyMOODqot": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMFORMword": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMFORMroman": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMFORMletter": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMTYPEmult": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMTYPEfrac": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMTYPEsets": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMTYPErange": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMTYPEdist": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMBERtri": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMBERpauc": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMBERgrpa": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMBERgrpl": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMBERinv": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPERSON0": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPERSON4": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOLITEform": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOLITEelev": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOLITEhumb": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPEemp": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPEexc": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPErcp": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPEintRelPronType": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyTENSEaor": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyTENSEeps": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyTENSEprosp": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBFORMpart": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBFORMconv": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBFORMvnoun": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVOICEantip": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVOICEcauVoice": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVOICedir": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVOICEinvVoice": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVOICErcpVoice": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOS": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyGENDER": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPERSON": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyMOOD": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTTYPE": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyASPECT": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASE": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVOICE": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNOUNTYPE": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBTYPE": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyADVTYPE": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMFORM": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMTYPE": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMBER": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyDEFINITE": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyDEGREE": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyEVIDENT": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyFOREIGN": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOLARITY": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOLITE": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPREPCASE": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPE": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTSIDE": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyREFLEX": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyTENSE": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBFORM": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCONJTYPE": { - "type": "String", - "placeholders": {} - }, - "@grammarCopySPC": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPARTTYPE": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyINTREL": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyUNKNOWN": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMBERPSOR": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSS": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyASPECTimp": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEvoc": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEcom": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEpar": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEadv": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEref": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASErel": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEsub": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEsup": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEaccdat": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCASEpre": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCONJTYPEsub": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyCONJTYPEcmp": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyDEFINITEind": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyMOODint": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNOUNTYPEcomm": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMBERPSORsing": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMBERPSORplur": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyNUMBERPSORdual": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOLARITYpos": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSSyes": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPREPCASEnpr": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPEprs": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPEint": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPEtot": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPEneg": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPEart": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPEind": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPRONTYPEintrel": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTSIDEfin": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPUNCTTYPEperi": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyREFLEXyes": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyTENSEimp": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBFORMsup": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBFORMadn": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBFORMlng": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBFORMshrt": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVERBTYPEcaus": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVOICEcau": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVOICEdir": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVOICEinv": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyVOICErcp": { - "type": "String", - "placeholders": {} - }, - "@other": { - "type": "String", - "placeholders": {} - }, - "@levelShort": { - "type": "String", - "placeholders": { - "level": { - "type": "int" + }, + "@usersMustKnock": { + "type": "String", + "placeholders": {} + }, + "@noOneCanJoin": { + "type": "String", + "placeholders": {} + }, + "@userWouldLikeToChangeTheChat": { + "type": "String", + "placeholders": { + "user": { + "type": "String" + } } - } - }, - "@clickBestOption": { - "type": "String", - "placeholders": {} - }, - "@completeActivitiesToUnlock": { - "type": "String", - "placeholders": {} - }, - "@noCapacityLimit": { - "type": "String", - "placeholders": {} - }, - "@downloadGroupText": { - "type": "String", - "placeholders": {} - }, - "@notificationsOn": { - "type": "String", - "placeholders": {} - }, - "@notificationsOff": { - "type": "String", - "placeholders": {} - }, - "@createChatAndInviteUsers": { - "type": "String", - "placeholders": {} - }, - "@updatedNewSpaceDescription": { - "type": "String", - "placeholders": {} - }, - "@joinWithCode": { - "type": "String", - "placeholders": {} - }, - "@enterCodeToJoin": { - "type": "String", - "placeholders": {} - }, - "@updateNow": { - "type": "String", - "placeholders": {} - }, - "@updateLater": { - "type": "String", - "placeholders": {} - }, - "@constructUseWaDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseGaDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseTaDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseUnkDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseCorITDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIgnITDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIncITDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIgnIGCDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseCorIGCDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIncIGCDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseCorPADesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIgnPADesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIncPADesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseCorWLDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIncWLDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIngWLDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseCorHWLDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIncHWLDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIgnHWLDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseCorLDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIncLDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIgnLDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseCorMDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIncMDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIgnMDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseEmojiDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseCollected": { - "type": "String", - "placeholders": {} - }, - "@constructUseNanDesc": { - "type": "String", - "placeholders": {} - }, - "@xpIntoLevel": { - "type": "String", - "placeholders": { - "currentXP": { - "type": "int" - }, - "maxXP": { - "type": "int" + }, + "@noPublicLinkHasBeenCreatedYet": { + "type": "String", + "placeholders": {} + }, + "@knock": { + "type": "String", + "placeholders": {} + }, + "@hidePresences": { + "type": "String", + "placeholders": {} + }, + "@yourGlobalUserIdIs": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } } - } - }, - "@enableTTSToolName": { - "type": "String", - "placeholders": {} - }, - "@enableTTSToolDescription": { - "type": "String", - "placeholders": {} - }, - "@yourUsername": { - "type": "String", - "placeholders": {} - }, - "@yourEmail": { - "type": "String", - "placeholders": {} - }, - "@iWantToLearn": { - "type": "String", - "placeholders": {} - }, - "@pleaseEnterEmail": { - "type": "String", - "placeholders": {} - }, - "@myBaseLanguage": { - "type": "String", - "placeholders": {} - }, - "@meaningSectionHeader": { - "type": "String", - "placeholders": {} - }, - "@formSectionHeader": { - "type": "String", - "placeholders": {} - }, - "@writingExercisesTooltip": { - "type": "String", - "placeholders": {} - }, - "@listeningExercisesTooltip": { - "type": "String", - "placeholders": {} - }, - "@readingExercisesTooltip": { - "type": "String", - "placeholders": {} - }, - "@meaningNotFound": { - "type": "String", - "placeholders": {} - }, - "@chooseBaseForm": { - "type": "String", - "placeholders": {} - }, - "@notTheCodeError": { - "type": "String", - "placeholders": {} - }, - "@totalXP": { - "type": "String", - "placeholders": {} - }, - "@numLemmas": { - "type": "String", - "placeholders": {} - }, - "@numLemmasUsedCorrectly": { - "type": "String", - "placeholders": {} - }, - "@numLemmasUsedIncorrectly": { - "type": "String", - "placeholders": {} - }, - "@numLemmasSmallXP": { - "type": "String", - "placeholders": {} - }, - "@numLemmasMediumXP": { - "type": "String", - "placeholders": {} - }, - "@numLemmasLargeXP": { - "type": "String", - "placeholders": {} - }, - "@numGrammarConcepts": { - "type": "String", - "placeholders": {} - }, - "@listGrammarConcepts": { - "type": "String", - "placeholders": {} - }, - "@listGrammarConceptsUsedCorrectly": { - "type": "String", - "placeholders": {} - }, - "@listGrammarConceptsUsedIncorrectly": { - "type": "String", - "placeholders": {} - }, - "@listGrammarConceptsUseCorrectlySystemGenerated": { - "type": "String", - "placeholders": {} - }, - "@listGrammarConceptsUseIncorrectlySystemGenerated": { - "type": "String", - "placeholders": {} - }, - "@listGrammarConceptsSmallXP": { - "type": "String", - "placeholders": {} - }, - "@listGrammarConceptsMediumXP": { - "type": "String", - "placeholders": {} - }, - "@listGrammarConceptsLargeXP": { - "type": "String", - "placeholders": {} - }, - "@listGrammarConceptsHugeXP": { - "type": "String", - "placeholders": {} - }, - "@numMessagesSent": { - "type": "String", - "placeholders": {} - }, - "@numWordsTyped": { - "type": "String", - "placeholders": {} - }, - "@numCorrectChoices": { - "type": "String", - "placeholders": {} - }, - "@numIncorrectChoices": { - "type": "String", - "placeholders": {} - }, - "@commaSeparatedFile": { - "type": "String", - "placeholders": {} - }, - "@excelFile": { - "type": "String", - "placeholders": {} - }, - "@fileType": { - "type": "String", - "placeholders": {} - }, - "@download": { - "type": "String", - "placeholders": {} - }, - "@analyticsNotAvailable": { - "type": "String", - "placeholders": {} - }, - "@downloading": { - "type": "String", - "placeholders": {} - }, - "@failedFetchUserAnalytics": { - "type": "String", - "placeholders": {} - }, - "@downloadComplete": { - "type": "String", - "placeholders": {} - }, - "@whatIsTheMorphTag": { - "type": "String", - "placeholders": { - "morphologicalFeature": { - "type": "String" - }, - "wordForm": { - "type": "String" + }, + "@knocking": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } } - } - }, - "@dataAvailable": { - "type": "String", - "placeholders": {} - }, - "@available": { - "type": "String", - "placeholders": {} - }, - "@pangeaBotIsFallible": { - "type": "String", - "placeholders": {} - }, - "@whatIsMeaning": { - "type": "String", - "placeholders": { - "lemma": { - "type": "String" + }, + "@searchChatsRooms": { + "type": "String", + "placeholders": {} + }, + "@nothingFound": { + "type": "String", + "placeholders": {} + }, + "@groupName": { + "type": "String", + "placeholders": {} + }, + "@createGroupAndInviteUsers": { + "type": "String", + "placeholders": {} + }, + "@groupCanBeFoundViaSearch": { + "type": "String", + "placeholders": {} + }, + "@wrongRecoveryKey": { + "type": "String", + "placeholders": {} + }, + "@startConversation": { + "type": "String", + "placeholders": {} + }, + "@commandHint_sendraw": { + "type": "String", + "placeholders": {} + }, + "@databaseMigrationTitle": { + "type": "String", + "placeholders": {} + }, + "@databaseMigrationBody": { + "type": "String", + "placeholders": {} + }, + "@leaveEmptyToClearStatus": { + "type": "String", + "placeholders": {} + }, + "@select": { + "type": "String", + "placeholders": {} + }, + "@searchForUsers": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourCurrentPassword": { + "type": "String", + "placeholders": {} + }, + "@newPassword": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@passwordsDoNotMatch": { + "type": "String", + "placeholders": {} + }, + "@passwordIsWrong": { + "type": "String", + "placeholders": {} + }, + "@publicLink": { + "type": "String", + "placeholders": {} + }, + "@publicChatAddresses": { + "type": "String", + "placeholders": {} + }, + "@createNewAddress": { + "type": "String", + "placeholders": {} + }, + "@joinSpace": { + "type": "String", + "placeholders": {} + }, + "@publicSpaces": { + "type": "String", + "placeholders": {} + }, + "@addChatOrSubSpace": { + "type": "String", + "placeholders": {} + }, + "@subspace": { + "type": "String", + "placeholders": {} + }, + "@decline": { + "type": "String", + "placeholders": {} + }, + "@thisDevice": { + "type": "String", + "placeholders": {} + }, + "@initAppError": { + "type": "String", + "placeholders": {} + }, + "@userRole": { + "type": "String", + "placeholders": {} + }, + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } } - } - }, - "@pickAnEmoji": { - "type": "String", - "placeholders": { - "lemma": { - "type": "String" + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } } - } - }, - "@chooseLemmaMeaningInstructionsBody": { - "type": "String", - "placeholders": {} - }, - "@doubleClickToEdit": { - "type": "String", - "placeholders": {} - }, - "@activityPlannerTitle": { - "type": "String", - "placeholders": {} - }, - "@topicLabel": { - "type": "String", - "placeholders": {} - }, - "@topicPlaceholder": { - "type": "String", - "placeholders": {} - }, - "@modeLabel": { - "type": "String", - "placeholders": {} - }, - "@modePlaceholder": { - "type": "String", - "placeholders": {} - }, - "@learningObjectiveLabel": { - "type": "String", - "placeholders": {} - }, - "@learningObjectivePlaceholder": { - "type": "String", - "placeholders": {} - }, - "@languageOfInstructionsLabel": { - "type": "String", - "placeholders": {} - }, - "@targetLanguageLabel": { - "type": "String", - "placeholders": {} - }, - "@cefrLevelLabel": { - "type": "String", - "placeholders": {} - }, - "@generateActivitiesButton": { - "type": "String", - "placeholders": {} - }, - "@launchActivityButton": { - "type": "String", - "placeholders": {} - }, - "@image": { - "type": "String", - "placeholders": {} - }, - "@video": { - "type": "String", - "placeholders": {} - }, - "@nan": { - "type": "String", - "placeholders": {} - }, - "@activityPlannerOverviewInstructionsBody": { - "type": "String", - "placeholders": {} - }, - "@activityTitle": { - "type": "String", - "placeholders": {} - }, - "@addVocabulary": { - "type": "String", - "placeholders": {} - }, - "@instructions": { - "type": "String", - "placeholders": {} - }, - "@numberOfLearners": { - "type": "String", - "placeholders": {} - }, - "@mustBeInteger": { - "type": "String", - "placeholders": {} - }, - "@constructUsePvmDesc": { - "type": "String", - "placeholders": {} - }, - "@leaveSpaceDescription": { - "type": "String", - "placeholders": {} - }, - "@constructUseCorMmDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIncMmDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIgnMmDesc": { - "type": "String", - "placeholders": {} - }, - "@clickForMeaningActivity": { - "type": "String", - "placeholders": {} - }, - "@meaning": { - "type": "String", - "placeholders": {} - }, - "@chatWith": { - "type": "String", - "placeholders": { - "displayname": { - "type": "String" + }, + "@searchMore": { + "type": "String", + "placeholders": {} + }, + "@gallery": { + "type": "String", + "placeholders": {} + }, + "@files": { + "type": "String", + "placeholders": {} + }, + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } } - } - }, - "@clickOnEmailLink": { - "type": "String", - "placeholders": {} - }, - "@dontForgetPassword": { - "type": "String", - "placeholders": {} - }, - "@enableAutocorrectToolName": { - "type": "String", - "placeholders": {} - }, - "@enableAutocorrectDescription": { - "type": "String", - "placeholders": {} - }, - "@ttsDisbledTitle": { - "type": "String", - "placeholders": {} - }, - "@ttsDisabledBody": { - "type": "String", - "placeholders": {} - }, - "@noSpaceDescriptionYet": { - "type": "String", - "placeholders": {} - }, - "@tooLargeToSend": { - "type": "String", - "placeholders": {} - }, - "@exitWithoutSaving": { - "type": "String", - "placeholders": {} - }, - "@enableAutocorrectPopupTitle": { - "type": "String", - "placeholders": {} - }, - "@enableAutocorrectPopupSteps": { - "type": "String", - "placeholders": {} - }, - "@enableAutocorrectPopupDescription": { - "type": "String", - "placeholders": {} - }, - "@downloadGboardTitle": { - "type": "String", - "placeholders": {} - }, - "@downloadGboardSteps": { - "type": "String", - "placeholders": {} - }, - "@downloadGboardDescription": { - "type": "String", - "placeholders": {} - }, - "@enableAutocorrectWarning": { - "type": "String", - "placeholders": {} - }, - "@displayName": { - "type": "String", - "placeholders": {} - }, - "@leaveRoomDescription": { - "type": "String", - "placeholders": {} - }, - "@confirmUserId": { - "type": "String", - "placeholders": {} - }, - "@startingToday": { - "type": "String", - "placeholders": {} - }, - "@oneWeekFreeTrial": { - "type": "String", - "placeholders": {} - }, - "@paidSubscriptionStarts": { - "type": "String", - "placeholders": { - "startDate": { - "type": "String" + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } } - } - }, - "@cancelInSubscriptionSettings": { - "type": "String", - "placeholders": {} - }, - "@cancelToAvoidCharges": { - "type": "String", - "placeholders": { - "trialEnds": { - "type": "String" + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } } - } - }, - "@downloadGboard": { - "type": "String", - "placeholders": {} - }, - "@autocorrectNotAvailable": { - "type": "String", - "placeholders": {} - }, - "@pleaseUpdateApp": { - "type": "String", - "placeholders": {} - }, - "@chooseEmojiInstructionsBody": { - "type": "String", - "placeholders": {} - }, - "@analyticsVocabListBody": { - "type": "String", - "placeholders": {} - }, - "@morphAnalyticsListBody": { - "type": "String", - "placeholders": {} - }, - "@knockSpaceSuccess": { - "type": "String", - "placeholders": {} - }, - "@chooseWordAudioInstructionsBody": { - "type": "String", - "placeholders": {} - }, - "@chooseMorphsInstructionsBody": { - "type": "String", - "placeholders": {} - }, - "@pleaseEnterInt": { - "type": "String", - "placeholders": {} - }, - "@home": { - "type": "String", - "placeholders": {} - }, - "@join": { - "type": "String", - "placeholders": {} - }, - "@readingAssistanceOverviewBody": { - "type": "String", - "placeholders": {} - }, - "@levelSummaryPopupTitle": { - "type": "String", - "placeholders": { - "level": { - "type": "int" + }, + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } } - } - }, - "@resetInstructionTooltipsTitle": { - "type": "String", - "placeholders": {} - }, - "@resetInstructionTooltipsDesc": { - "type": "String", - "placeholders": {} - }, - "@selectForGrammar": { - "type": "String", - "placeholders": {} - }, - "@randomize": { - "type": "String", - "placeholders": {} - }, - "@clear": { - "type": "String", - "placeholders": {} - }, - "@makeYourOwnActivity": { - "type": "String", - "placeholders": {} - }, - "@featuredActivities": { - "type": "String", - "placeholders": {} - }, - "@save": { - "type": "String", - "placeholders": {} - }, - "@startChat": { - "type": "String", - "placeholders": {} - }, - "@translationProblem": { - "type": "String", - "placeholders": {} - }, - "@askToJoin": { - "type": "String", - "placeholders": {} - }, - "@emptyChatWarningTitle": { - "type": "String", - "placeholders": {} - }, - "@emptyChatWarningDesc": { - "type": "String", - "placeholders": {} - }, - "@areYouLikeMe": { - "type": "String", - "placeholders": {} - }, - "@tryAgainLater": { - "type": "String", - "placeholders": {} - }, - "@enterSpaceCode": { - "type": "String", - "placeholders": {} - }, - "@shareSpaceLink": { - "type": "String", - "placeholders": {} - }, - "@byUsingPangeaChat": { - "type": "String", - "placeholders": {} - }, - "@details": { - "type": "String", - "placeholders": {} - }, - "@languageLevelPreA1Desc": { - "type": "String", - "placeholders": {} - }, - "@languageLevelA1Desc": { - "type": "String", - "placeholders": {} - }, - "@languageLevelA2Desc": { - "type": "String", - "placeholders": {} - }, - "@languageLevelB1Desc": { - "type": "String", - "placeholders": {} - }, - "@languageLevelB2Desc": { - "type": "String", - "placeholders": {} - }, - "@languageLevelC1Desc": { - "type": "String", - "placeholders": {} - }, - "@languageLevelC2Desc": { - "type": "String", - "placeholders": {} - }, - "@newVocab": { - "type": "String", - "placeholders": {} - }, - "@newGrammar": { - "type": "String", - "placeholders": {} - }, - "@choosePracticeMode": { - "type": "String", - "placeholders": {} - }, - "@ban": { - "type": "String", - "placeholders": {} - }, - "@unban": { - "type": "String", - "placeholders": {} - }, - "@kick": { - "type": "String", - "placeholders": {} - }, - "@lemma": { - "type": "String", - "placeholders": {} - }, - "@grammarFeature": { - "type": "String", - "placeholders": {} - }, - "@grammarTag": { - "type": "String", - "placeholders": {} - }, - "@forms": { - "type": "String", - "placeholders": {} - }, - "@exampleMessages": { - "type": "String", - "placeholders": {} - }, - "@timesUsedIndependently": { - "type": "String", - "placeholders": {} - }, - "@timesUsedWithAssistance": { - "type": "String", - "placeholders": {} - }, - "@shareInviteCode": { - "type": "String", - "placeholders": { - "code": { - "type": "String" + }, + "@sendReadReceipts": { + "type": "String", + "placeholders": {} + }, + "@sendTypingNotificationsDescription": { + "type": "String", + "placeholders": {} + }, + "@sendReadReceiptsDescription": { + "type": "String", + "placeholders": {} + }, + "@formattedMessages": { + "type": "String", + "placeholders": {} + }, + "@formattedMessagesDescription": { + "type": "String", + "placeholders": {} + }, + "@verifyOtherUser": { + "type": "String", + "placeholders": {} + }, + "@verifyOtherUserDescription": { + "type": "String", + "placeholders": {} + }, + "@verifyOtherDevice": { + "type": "String", + "placeholders": {} + }, + "@verifyOtherDeviceDescription": { + "type": "String", + "placeholders": {} + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } } - } - }, - "@leaderboard": { - "type": "String", - "placeholders": {} - }, - "@skipForNow": { - "type": "String", - "placeholders": {} - }, - "@permissions": { - "type": "String", - "placeholders": {} - }, - "@spaceChildPermission": { - "type": "String", - "placeholders": {} - }, - "@addEnvironmentOverride": { - "type": "String", - "placeholders": {} - }, - "@defaultOption": { - "type": "String", - "placeholders": {} - }, - "@deleteChatDesc": { - "type": "String", - "placeholders": {} - }, - "@deleteSpaceDesc": { - "type": "String", - "placeholders": {} - }, - "@launch": { - "type": "String", - "placeholders": {} - }, - "@searchChats": { - "type": "String", - "placeholders": {} - }, - "@maxFifty": { - "type": "String", - "placeholders": {} - }, - "@configureSpace": { - "type": "String", - "placeholders": {} - }, - "@pinMessages": { - "type": "String", - "placeholders": {} - }, - "@setJoinRules": { - "type": "String", - "placeholders": {} - }, - "@changeGeneralSettings": { - "type": "String", - "placeholders": {} - }, - "@inviteOtherUsersToRoom": { - "type": "String", - "placeholders": {} - }, - "@changeTheNameOfTheSpace": { - "type": "String", - "placeholders": {} - }, - "@changeTheDescription": { - "type": "String", - "placeholders": {} - }, - "@changeThePermissions": { - "type": "String", - "placeholders": {} - }, - "@introductions": { - "type": "String", - "placeholders": {} - }, - "@announcements": { - "type": "String", - "placeholders": {} - }, - "@activities": { - "type": "String", - "placeholders": {} - }, - "@access": { - "type": "String", - "placeholders": {} - }, - "@activitySuggestionTimeoutMessage": { - "type": "String", - "placeholders": {} - }, - "@howSpaceCanBeFound": { - "type": "String", - "placeholders": {} - }, - "@private": { - "type": "String", - "placeholders": {} - }, - "@cannotBeFoundInSearch": { - "type": "String", - "placeholders": {} - }, - "@public": { - "type": "String", - "placeholders": {} - }, - "@visibleToCommunity": { - "type": "String", - "placeholders": {} - }, - "@howSpaceCanBeJoined": { - "type": "String", - "placeholders": {} - }, - "@canBeFoundVia": { - "type": "String", - "placeholders": {} - }, - "@canBeFoundViaInvitation": { - "type": "String", - "placeholders": {} - }, - "@canBeFoundViaCodeOrLink": { - "type": "String", - "placeholders": {} - }, - "@canBeFoundViaKnock": { - "type": "String", - "placeholders": {} - }, - "@youHaveLeveledUp": { - "type": "String", - "placeholders": {} - }, - "@sendActivities": { - "type": "String", - "placeholders": {} - }, - "@groupChat": { - "type": "String", - "placeholders": {} - }, - "@directMessage": { - "type": "String", - "placeholders": {} - }, - "@newDirectMessage": { - "type": "String", - "placeholders": {} - }, - "@speakingExercisesTooltip": { - "type": "String", - "placeholders": {} - }, - "@noChatsFoundHereYet": { - "type": "String", - "placeholders": {} - }, - "@duration": { - "type": "String", - "placeholders": {} - }, - "@transcriptionFailed": { - "type": "String", - "placeholders": {} - }, - "@aUserIsKnocking": { - "type": "String", - "placeholders": {} - }, - "@usersAreKnocking": { - "type": "int", - "placeholders": { - "users": { - "type": "int" + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } } - } - }, - "@failedToFetchTranscription": { - "type": "String", - "placeholders": {} - }, - "@deleteEmptySpaceDesc": { - "type": "String", - "placeholders": {} - }, - "@regenerate": { - "type": "String", - "placeholders": {} - }, - "@mySavedActivities": { - "type": "String", - "placeholders": {} - }, - "@noSavedActivities": { - "type": "String", - "placeholders": {} - }, - "@saveActivity": { - "type": "String", - "placeholders": {} - }, - "@failedToPlayVideo": { - "type": "String", - "placeholders": {} - }, - "@done": { - "type": "String", - "placeholders": {} - }, - "@inThisSpace": { - "type": "String", - "placeholders": {} - }, - "@myContacts": { - "type": "String", - "placeholders": {} - }, - "@inviteAllInSpace": { - "type": "String", - "placeholders": {} - }, - "@spaceParticipantsHaveBeenInvitedToTheChat": { - "type": "String", - "placeholders": {} - }, - "@numKnocking": { - "type": "String", - "placeholders": { - "count": { - "type": "int" + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } } - } - }, - "@numInvited": { - "type": "String", - "placeholders": { - "count": { - "type": "int" + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } } - } - }, - "@saved": { - "type": "String", - "placeholders": {} - }, - "@reset": { - "type": "String", - "placeholders": {} - }, - "@errorGenerateActivityMessage": { - "type": "String", - "placeholders": {} - }, - "@errorRegenerateActivityMessage": { - "type": "String", - "placeholders": {} - }, - "@errorLaunchActivityMessage": { - "type": "String", - "placeholders": {} - }, - "@errorFetchingActivitiesMessage": { - "type": "String", - "placeholders": {} - }, - "@errorFetchingDefinition": { - "type": "String", - "placeholders": {} - }, - "@errorProcessAnalytics": { - "type": "String", - "placeholders": {} - }, - "@errorDownloading": { - "type": "String", - "placeholders": {} - }, - "@errorFetchingLevelSummary": { - "type": "String", - "placeholders": {} - }, - "@errorLoadingSpaceChildren": { - "type": "String", - "placeholders": {} - }, - "@unexpectedError": { - "type": "String", - "placeholders": {} - }, - "@pleaseReload": { - "type": "String", - "placeholders": {} - }, - "@translationError": { - "type": "String", - "placeholders": {} - }, - "@errorFetchingTranslation": { - "type": "String", - "placeholders": {} - }, - "@errorFetchingActivity": { - "type": "String", - "placeholders": {} - }, - "@check": { - "type": "String", - "placeholders": {} - }, - "@unableToFindRoom": { - "type": "String", - "placeholders": {} - }, - "@numCompletedActivities": { - "type": "String", - "placeholders": {} - }, - "@viewingAnalytics": { - "type": "String", - "placeholders": { - "visible": { - "type": "int" - }, - "users": { - "type": "int" + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } } - } - }, - "@request": { - "type": "String", - "placeholders": {} - }, - "@requestAll": { - "type": "String", - "placeholders": {} - }, - "@confirmMessageUnpin": { - "type": "String", - "placeholders": {} - }, - "@createActivityPlan": { - "type": "String", - "placeholders": {} - }, - "@saveAndLaunch": { - "type": "String", - "placeholders": {} - }, - "@launchToSpace": { - "type": "String", - "placeholders": {} - }, - "@numberOfActivities": { - "type": "String", - "placeholders": {} - }, - "@maximumActivityParticipants": { - "type": "String", - "placeholders": { - "count": { - "type": "int" + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } } - } - }, - "@pending": { - "type": "String", - "placeholders": {} - }, - "@inactive": { - "type": "String", - "placeholders": {} - }, - "@confirmRole": { - "type": "String", - "placeholders": {} - }, - "@openRoleLabel": { - "type": "String", - "placeholders": {} - }, - "@joinedTheActivity": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "role": { - "type": "String" + }, + "@transparent": { + "type": "String", + "placeholders": {} + }, + "@incomingMessages": { + "type": "String", + "placeholders": {} + }, + "@stickers": { + "type": "String", + "placeholders": {} + }, + "@discover": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ignore": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unignore": { + "type": "String", + "placeholders": {} + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } } - } - }, - "@finishedTheActivity": { - "type": "String", - "placeholders": { - "username": { - "type": "String" + }, + "@noDatabaseEncryption": { + "type": "String", + "placeholders": {} + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@restricted": { + "type": "String", + "placeholders": {} + }, + "@knockRestricted": { + "type": "String", + "placeholders": {} + }, + "@goToSpace": { + "type": "String", + "placeholders": { + "space": {} } - } - }, - "@archiveToAnalytics": { - "type": "String", - "placeholders": {} - }, - "@activitySummaryError": { - "type": "String", - "placeholders": {} - }, - "@requestSummaries": { - "type": "String", - "placeholders": {} - }, - "@generatingNewActivities": { - "type": "String", - "placeholders": {} - }, - "@requestAccessTitle": { - "type": "String", - "placeholders": {} - }, - "@requestAccessDesc": { - "type": "String", - "placeholders": {} - }, - "@requestAccess": { - "type": "String", - "placeholders": { - "count": { - "type": "int" + }, + "@markAsUnread": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } } - } - }, - "@analyticsInactiveTitle": { - "type": "String", - "placeholders": {} - }, - "@analyticsInactiveDesc": { - "type": "String", - "placeholders": {} - }, - "@accessRequestedTitle": { - "type": "String", - "placeholders": {} - }, - "@accessRequestedDesc": { - "type": "String", - "placeholders": { - "admin": { - "type": "String" - }, - "space": { - "type": "String" + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } } - } - }, - "@adminRequestedAccess": { - "type": "String", - "placeholders": {} - }, - "@lastUpdated": { - "type": "String", - "placeholders": { - "time": { - "type": "String" + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } } - } - }, - "@activityFinishedMessage": { - "type": "String", - "placeholders": {} - }, - "@endForAll": { - "type": "String", - "placeholders": {} - }, - "@newCourse": { - "type": "String", - "placeholders": {} - }, - "@numModules": { - "type": "int", - "placeholders": { - "num": { - "type": "int" + }, + "@changeGeneralChatSettings": { + "type": "String", + "placeholders": {} + }, + "@inviteOtherUsers": { + "type": "String", + "placeholders": {} + }, + "@changeTheChatPermissions": { + "type": "String", + "placeholders": {} + }, + "@changeTheVisibilityOfChatHistory": { + "type": "String", + "placeholders": {} + }, + "@changeTheCanonicalRoomAlias": { + "type": "String", + "placeholders": {} + }, + "@sendRoomNotifications": { + "type": "String", + "placeholders": {} + }, + "@changeTheDescriptionOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@chatPermissionsDescription": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } } - } - }, - "@coursePlan": { - "type": "String", - "placeholders": {} - }, - "@editCourseLater": { - "type": "String", - "placeholders": {} - }, - "@createCourse": { - "type": "String", - "placeholders": {} - }, - "@stats": { - "type": "String", - "placeholders": {} - }, - "@createGroupChat": { - "type": "String", - "placeholders": {} - }, - "@editCourse": { - "type": "String", - "placeholders": {} - }, - "@inviteDesc": { - "type": "String", - "placeholders": {} - }, - "@editCourseDesc": { - "type": "String", - "placeholders": {} - }, - "@permissionsDesc": { - "type": "String", - "placeholders": {} - }, - "@accessDesc": { - "type": "String", - "placeholders": {} - }, - "@createGroupChatDesc": { - "type": "String", - "placeholders": {} - }, - "@deleteDesc": { - "type": "String", - "placeholders": {} - }, - "@noCourseFound": { - "type": "String", - "placeholders": {} - }, - "@additionalParticipants": { - "type": "int", - "placeholders": { - "num": { - "type": "int" + }, + "@changelog": { + "type": "String", + "placeholders": {} + }, + "@sendCanceled": { + "type": "String", + "placeholders": {} + }, + "@loginWithMatrixId": { + "type": "String", + "placeholders": {} + }, + "@discoverHomeservers": { + "type": "String", + "placeholders": {} + }, + "@whatIsAHomeserver": { + "type": "String", + "placeholders": {} + }, + "@homeserverDescription": { + "type": "String", + "placeholders": {} + }, + "@doesNotSeemToBeAValidHomeserver": { + "type": "String", + "placeholders": {} + }, + "@calculatingFileSize": { + "type": "String", + "placeholders": {} + }, + "@prepareSendingAttachment": { + "type": "String", + "placeholders": {} + }, + "@sendingAttachment": { + "type": "String", + "placeholders": {} + }, + "@generatingVideoThumbnail": { + "type": "String", + "placeholders": {} + }, + "@compressVideo": { + "type": "String", + "placeholders": {} + }, + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } } - } - }, - "@directMessages": { - "type": "String", - "placeholders": {} - }, - "@whatNow": { - "type": "String", - "placeholders": {} - }, - "@chooseNextActivity": { - "type": "String", - "placeholders": {} - }, - "@letsGo": { - "type": "String", - "placeholders": {} - }, - "@chooseRole": { - "type": "String", - "placeholders": {} - }, - "@chooseRoleToParticipate": { - "type": "String", - "placeholders": {} - }, - "@waitingToFillRole": { - "type": "int", - "placeholders": { - "num": { - "type": "int" + }, + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } } - } - }, - "@pingParticipants": { - "type": "String", - "placeholders": {} - }, - "@playWithBot": { - "type": "String", - "placeholders": {} - }, - "@inviteFriends": { - "type": "String", - "placeholders": {} - }, - "@waitNotDone": { - "type": "String", - "placeholders": {} - }, - "@waitingForOthersToFinish": { - "type": "String", - "placeholders": {} - }, - "@generatingSummary": { - "type": "String", - "placeholders": {} - }, - "@findCourse": { - "type": "String", - "placeholders": {} - }, - "@pingParticipantsNotification": { - "type": "String", - "placeholders": { - "user": { - "type": "String" - }, - "room": { - "type": "String" + }, + "@oneOfYourDevicesIsNotVerified": { + "type": "String", + "placeholders": {} + }, + "@noticeChatBackupDeviceVerification": { + "type": "String", + "placeholders": {} + }, + "@continueText": { + "type": "String", + "placeholders": {} + }, + "@welcomeText": { + "type": "String", + "placeholders": {} + }, + "@blur": { + "type": "String", + "placeholders": {} + }, + "@opacity": { + "type": "String", + "placeholders": {} + }, + "@setWallpaper": { + "type": "String", + "placeholders": {} + }, + "@manageAccount": { + "type": "String", + "placeholders": {} + }, + "@noContactInformationProvided": { + "type": "String", + "placeholders": {} + }, + "@contactServerAdmin": { + "type": "String", + "placeholders": {} + }, + "@contactServerSecurity": { + "type": "String", + "placeholders": {} + }, + "@supportPage": { + "type": "String", + "placeholders": {} + }, + "@serverInformation": { + "type": "String", + "placeholders": {} + }, + "@name": { + "type": "String", + "placeholders": {} + }, + "@version": { + "type": "String", + "placeholders": {} + }, + "@website": { + "type": "String", + "placeholders": {} + }, + "@compress": { + "type": "String", + "placeholders": {} + }, + "@boldText": { + "type": "String", + "placeholders": {} + }, + "@italicText": { + "type": "String", + "placeholders": {} + }, + "@strikeThrough": { + "type": "String", + "placeholders": {} + }, + "@pleaseFillOut": { + "type": "String", + "placeholders": {} + }, + "@invalidUrl": { + "type": "String", + "placeholders": {} + }, + "@addLink": { + "type": "String", + "placeholders": {} + }, + "@unableToJoinChat": { + "type": "String", + "placeholders": {} + }, + "@previous": { + "type": "String", + "placeholders": {} + }, + "@otherPartyNotLoggedIn": { + "type": "String", + "placeholders": {} + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } } - } - }, - "@course": { - "type": "String", - "placeholders": {} - }, - "@courses": { - "type": "String", - "placeholders": {} - }, - "@courseName": { - "type": "String", - "placeholders": {} - }, - "@createNewCourse": { - "type": "String", - "placeholders": {} - }, - "@goToCourse": { - "type": "String", - "placeholders": { - "course": {} - } - }, - "@activityComplete": { - "type": "String", - "placeholders": {} - }, - "@startNewSession": { - "type": "String", - "placeholders": {} - }, - "@joinOpenSession": { - "type": "String", - "placeholders": {} - }, - "@less": { - "type": "String", - "placeholders": {} - }, - "@activityNotFound": { - "type": "String", - "placeholders": {} - }, - "@levelUp": { - "type": "String", - "placeholders": {} - }, - "@myActivities": { - "type": "String", - "placeholders": {} - }, - "@openToJoin": { - "type": "String", - "placeholders": {} - }, - "@results": { - "type": "String", - "placeholders": {} - }, - "@activityDone": { - "type": "String", - "placeholders": {} - }, - "@promoCodeInfo": { - "type": "String", - "placeholders": {} - }, - "@editsComingSoon": { - "type": "String", - "placeholders": {} - }, - "@editing": { - "type": "String", - "placeholders": {} - }, - "@activityNeedsOneMember": { - "type": "String", - "placeholders": {} - }, - "@activityNeedsMembers": { - "type": "String", - "placeholders": { - "num": { - "type": "int" + }, + "@appWantsToUseForLoginDescription": { + "type": "String", + "placeholders": {} + }, + "@open": { + "type": "String", + "placeholders": {} + }, + "@waitingForServer": { + "type": "String", + "placeholders": {} + }, + "@appIntroduction": { + "type": "String", + "placeholders": {} + }, + "@newChatRequest": { + "type": "String", + "placeholders": {} + }, + "@contentNotificationSettings": { + "type": "String", + "placeholders": {} + }, + "@generalNotificationSettings": { + "type": "String", + "placeholders": {} + }, + "@roomNotificationSettings": { + "type": "String", + "placeholders": {} + }, + "@userSpecificNotificationSettings": { + "type": "String", + "placeholders": {} + }, + "@otherNotificationSettings": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleContainsUserName": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleContainsUserNameDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleMaster": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleMasterDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleSuppressNotices": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleSuppressNoticesDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleInviteForMe": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleInviteForMeDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleMemberEvent": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleMemberEventDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleIsUserMention": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleIsUserMentionDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleContainsDisplayName": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleContainsDisplayNameDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleIsRoomMention": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleIsRoomMentionDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleRoomnotif": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleRoomnotifDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleTombstone": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleTombstoneDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleReaction": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleReactionDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleRoomServerAcl": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleRoomServerAclDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleSuppressEdits": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleSuppressEditsDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleCall": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleCallDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleEncryptedRoomOneToOne": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleEncryptedRoomOneToOneDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleRoomOneToOne": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleRoomOneToOneDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleMessage": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleMessageDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleEncrypted": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleEncryptedDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleJitsi": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleJitsiDescription": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleServerAcl": { + "type": "String", + "placeholders": {} + }, + "@notificationRuleServerAclDescription": { + "type": "String", + "placeholders": {} + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } } - } - }, - "@inviteFriendsToCourse": { - "type": "String", - "placeholders": {} - }, - "@subscribeToUnlockActivitySummaries": { - "type": "String", - "placeholders": {} - }, - "@subscribeToUnlockDefinitions": { - "type": "String", - "placeholders": {} - }, - "@subscribeToUnlockTranscriptions": { - "type": "String", - "placeholders": {} - }, - "@pingSent": { - "type": "String", - "placeholders": {} - }, - "@courseTitle": { - "type": "String", - "placeholders": {} - }, - "@courseDesc": { - "type": "String", - "placeholders": {} - }, - "@courseSavedSuccessfully": { - "type": "String", - "placeholders": {} - }, - "@addCoursePlan": { - "type": "String", - "placeholders": {} - }, - "@activityStatsButtonInstruction": { - "type": "String", - "placeholders": {} - }, - "@loginToAccount": { - "type": "String", - "placeholders": {} - }, - "@appDescription": { - "type": "String", - "placeholders": {} - }, - "@languages": { - "type": "String", - "placeholders": {} - }, - "@chooseLanguage": { - "type": "String", - "placeholders": {} - }, - "@planTrip": { - "type": "String", - "placeholders": {} - }, - "@howAreYouTraveling": { - "type": "String", - "placeholders": {} - }, - "@unlockPrivateTrip": { - "type": "String", - "placeholders": {} - }, - "@joinPublicTrip": { - "type": "String", - "placeholders": {} - }, - "@startOwnTrip": { - "type": "String", - "placeholders": {} - }, - "@tripPlanDesc": { - "type": "String", - "placeholders": {} - }, - "@unlockPrivateTripTitle": { - "type": "String", - "placeholders": {} - }, - "@browsePublicTrips": { - "type": "String", - "placeholders": {} - }, - "@startOwnTripTitle": { - "type": "String", - "placeholders": {} - }, - "@courseCode": { - "type": "String", - "placeholders": {} - }, - "@courseCodeHint": { - "type": "String", - "placeholders": {} - }, - "@unlockMyTrip": { - "type": "String", - "placeholders": {} - }, - "@signupOption": { - "type": "String", - "placeholders": {} - }, - "@withApple": { - "type": "String", - "placeholders": {} - }, - "@withGoogle": { - "type": "String", - "placeholders": {} - }, - "@withEmail": { - "type": "String", - "placeholders": {} - }, - "@createAccount": { - "type": "String", - "placeholders": {} - }, - "@loginWithEmail": { - "type": "String", - "placeholders": {} - }, - "@usernameOrEmail": { - "type": "String", - "placeholders": {} - }, - "@email": { - "type": "String", - "placeholders": {} - }, - "@forgotPassword": { - "type": "String", - "placeholders": {} - }, - "@endActivity": { - "type": "String", - "placeholders": {} - }, - "@allLanguages": { - "type": "String", - "placeholders": {} - }, - "@chatListTooltip": { - "type": "String", - "placeholders": {} - }, - "@directMessageBotTitle": { - "type": "String", - "placeholders": {} - }, - "@feedbackTitle": { - "type": "String", - "placeholders": {} - }, - "@feedbackHint": { - "type": "String", - "placeholders": {} - }, - "@feedbackButton": { - "type": "String", - "placeholders": {} - }, - "@directMessageBotDesc": { - "type": "String", - "placeholders": {} - }, - "@inviteYourFriends": { - "type": "String", - "placeholders": {} - }, - "@playWithAI": { - "type": "String", - "placeholders": {} - }, - "@courseStartDesc": { - "type": "String", - "placeholders": {} - }, - "feedbackRespDesc": "Ελέγξτε ξανά αύριο για ενημερώσεις δραστηριότητας.", - "activityDropdownDesc": "Όταν τελειώσετε με αυτή τη δραστηριότητα, κάντε κλικ παρακάτω", - "languageMismatchTitle": "Αντιφάσεις γλώσσας", - "languageMismatchDesc": "Η γλώσσα στόχος σας δεν ταιριάζει με τη γλώσσα αυτής της δραστηριότητας. Θέλετε να ενημερώσετε τη γλώσσα στόχο;", - "reportWordIssueTooltip": "Αναφορά προβλήματος με τις πληροφορίες της λέξης", - "tokenInfoFeedbackDialogTitle": "Ανατροφοδότηση Πληροφοριών Λέξης", - "noPublicCoursesFound": "Δεν βρέθηκαν δημόσια μαθήματα. Θα θέλατε να δημιουργήσετε ένα;", - "noCourseTemplatesFound": "Δεν βρήκαμε μαθήματα για τη γλώσσα στόχο σας. Μπορείτε να συνομιλήσετε με το Pangea Bot εν τω μεταξύ, και να επιστρέψετε αργότερα για περισσότερα μαθήματα.", - "botActivityJoinFailMessage": "Ο Pangea Bot καθυστερεί να απαντήσει. Παρακαλώ δοκιμάστε ξανά αργότερα, ή προσκαλέστε έναν φίλο.", - "unsubscribedResponseError": "Αυτή η λειτουργία απαιτεί συνδρομή", - "leaveDesc": "Αφήστε αυτόν τον χώρο και όλες τις συνομιλίες μέσα σε αυτόν", - "selectAll": "Επιλογή όλων", - "deselectAll": "Αποεπιλογή όλων", - "@feedbackRespDesc": { - "type": "String", - "placeholders": {} - }, - "@activityDropdownDesc": { - "type": "String", - "placeholders": {} - }, - "@languageMismatchTitle": { - "type": "String", - "placeholders": {} - }, - "@languageMismatchDesc": { - "type": "String", - "placeholders": {} - }, - "@reportWordIssueTooltip": { - "type": "String", - "placeholders": {} - }, - "@tokenInfoFeedbackDialogTitle": { - "type": "String", - "placeholders": {} - }, - "@noPublicCoursesFound": { - "type": "String", - "placeholders": {} - }, - "@noCourseTemplatesFound": { - "type": "String", - "placeholders": {} - }, - "@botActivityJoinFailMessage": { - "type": "String", - "placeholders": {} - }, - "@unsubscribedResponseError": { - "type": "String", - "placeholders": {} - }, - "@leaveDesc": { - "type": "String", - "placeholders": {} - }, - "@selectAll": { - "type": "String", - "placeholders": {} - }, - "@deselectAll": { - "type": "String", - "placeholders": {} - }, - "startOwn": "Ξεκίνα το δικό σου", - "joinCourseDesc": "Κάθε μάθημα έχει 8-10 διαδοχικά θέματα με μια σειρά δραστηριοτήτων μάθησης γλώσσας βασισμένων σε εργασίες.", - "newMessageInPangeaChat": "🔊 Νέο μήνυμα στο Pangea Chat", - "shareCourse": "Μοιράσου το μάθημα", - "addCourse": "Πρόσθεσε ένα μάθημα", - "joinPublicCourse": "Συνδεθείτε σε δημόσιο μάθημα", - "vocabLevelsDesc": "Εδώ θα προστεθούν οι λέξεις λεξιλογίου μόλις τις αναβαθμίσετε!", - "highlightVocabTooltip": "Επισημάνετε τις λέξεις-στόχους παρακάτω στέλνοντάς τες ή εξασκώντας τες στη συνομιλία", - "@startOwn": { - "type": "String", - "placeholders": {} - }, - "@joinCourseDesc": { - "type": "String", - "placeholders": {} - }, - "@newMessageInPangeaChat": { - "type": "String", - "placeholders": {} - }, - "@shareCourse": { - "type": "String", - "placeholders": {} - }, - "@addCourse": { - "type": "String", - "placeholders": {} - }, - "@joinPublicCourse": { - "type": "String", - "placeholders": {} - }, - "@vocabLevelsDesc": { - "type": "String", - "placeholders": {} - }, - "emptyChatSearch": "Δεν βρέθηκαν άμεσες μηνύματα ή συνομιλίες. Βεβαιωθείτε ότι η αναζήτησή σας είναι σωστά γραμμένη.", - "activityAnalyticsTooltipBody": "Αυτές είναι οι αποθηκευμένες δραστηριότητές σας για ανασκόπηση και πρακτική.", - "numSavedActivities": "Αριθμός αποθηκευμένων δραστηριοτήτων", - "saveActivityTitle": "Αποθήκευση δραστηριότητας", - "saveActivityDesc": "Καλή δουλειά! Αποθηκεύστε αυτή τη δραστηριότητα για μελλοντική ανασκόπηση και πρακτική", - "levelInfoTooltip": "Εδώ μπορείτε να δείτε όλους τους πόντους που έχετε κερδίσει και πώς!", - "alreadyInCourseWithID": "Είστε ήδη σε ένα μάθημα με αυτό το σχέδιο. Θέλετε να δημιουργήσετε ένα μάθημα με το ίδιο σχέδιο ή να πάτε στο υπάρχον μάθημα;", - "goToExistingCourse": "Πηγαίνετε στο υπάρχον μάθημα", - "emojiView": "Προβολή emoji", - "feedbackDialogDesc": "Κάνω λάθη κι εγώ! Οτιδήποτε μπορεί να με βοηθήσει να βελτιωθώ;", - "contactHasBeenInvitedToTheCourse": "Η επαφή έχει προσκληθεί στο μάθημα", - "activityStatsButtonTooltip": "Πληροφορίες δραστηριότητας", - "allow": "Επιτρέπω", - "deny": "Αρνούμαι", - "enabledRenewal": "Ενεργοποίηση Ανανέωσης Συνδρομής", - "subscriptionEndsOn": "Η Συνδρομή Λήγει Στις", - "subscriptionRenewsOn": "Η Συνδρομή Ανανεώνεται Στις", - "waitForSubscriptionChanges": "Οι αλλαγές στη συνδρομή σας μπορεί να χρειαστούν λίγο χρόνο για να εμφανιστούν στην εφαρμογή.", - "subscribeReadingAssistance": "Εγγραφείτε για να ξεκλειδώσετε τα εργαλεία μηνυμάτων", - "aceDisplayName": "Αχινέζικα", - "achDisplayName": "Ακόλι", - "afDisplayName": "Αφρικάανς", - "akDisplayName": "Ακάν", - "alzDisplayName": "Αλούρ", - "amDisplayName": "Αμχαρικά", - "arDisplayName": "Αραβικά", - "asDisplayName": "Ασαμέζ", - "awaDisplayName": "Αουάντι", - "ayDisplayName": "Αϊμάρα", - "azDisplayName": "Αζερικά", - "baDisplayName": "Μπασκίρ", - "banDisplayName": "Μπαλινέζικα", - "bbcDisplayName": "Μπατάκ Τόμπα", - "beDisplayName": "Λευκορωσικά", - "bemDisplayName": "Μπέμπα", - "bewDisplayName": "Μπεταβί", - "bgDisplayName": "Βουλγαρικά", - "bhoDisplayName": "Μποχτζπούρι", - "bikDisplayName": "Μπικολ", - "bmDisplayName": "Μπαμπάρα", - "bnDisplayName": "Μπενγκάλι", - "bnBDDisplayName": "Μπενγκάλι (Μπαγκλαντές)", - "bnINDisplayName": "Μπενγκάλι (Ινδία)", - "brDisplayName": "Βρετονικά", - "bsDisplayName": "Βοσνιακά", - "btsDisplayName": "Μπατάκ Σιμαλούνγκουν", - "btxDisplayName": "Μπατάκ Καρό", - "buaDisplayName": "Μπουριάτ", - "caDisplayName": "Καταλανικά", - "cebDisplayName": "Σεμπουάνο", - "cggDisplayName": "Χίγκα", - "chmDisplayName": "Μάρι", - "ckbDisplayName": "Κεντρικά Κουρδικά", - "cnhDisplayName": "Χάκα Τσιν", - "coDisplayName": "Κορσικανικά", - "crhDisplayName": "Κριμαϊκά Τουρκικά", - "crsDisplayName": "Σεσέλβα Κρεολικά Γαλλικά", - "csDisplayName": "Τσέχικα", - "cvDisplayName": "Τσουβάς", - "cyDisplayName": "Ουαλικά", - "daDisplayName": "Δανέζικα", - "deDisplayName": "Γερμανικά", - "dinDisplayName": "Ντίγκα", - "doiDisplayName": "Ντόγκρι", - "dovDisplayName": "Ντόμπε", - "dzDisplayName": "Ντζονγκκά", - "eeDisplayName": "Εβέ", - "enDisplayName": "Αγγλικά", - "enAUDisplayName": "Αγγλικά (Αυστραλία)", - "enGBDisplayName": "Αγγλικά (Ηνωμένο Βασίλειο)", - "enINDisplayName": "Αγγλικά (Ινδία)", - "enUSDisplayName": "Αγγλικά (ΗΠΑ)", - "eoDisplayName": "Εσπεράντο", - "esDisplayName": "Ισπανικά", - "esESDisplayName": "Ισπανικά (Ισπανία)", - "esMXDisplayName": "Ισπανικά (Μεξικό)", - "euDisplayName": "Βάσκικα", - "faDisplayName": "Περσικά", - "ffDisplayName": "Φουλάχ", - "fiDisplayName": "Φινλανδικά", - "filDisplayName": "Φιλιππινέζικα", - "fjDisplayName": "Φιτζιανικά", - "foDisplayName": "Φαροέζικα", - "frDisplayName": "Γαλλικά", - "frCADisplayName": "Γαλλικά (Καναδάς)", - "frFRDisplayName": "Γαλλικά (Γαλλία)", - "fyDisplayName": "Δυτικά Φριζιανά", - "gaDisplayName": "Ιρλανδικά", - "gaaDisplayName": "Γκα", - "gdDisplayName": "Σκωτικά Γαελικά", - "glDisplayName": "Γαλικιανά", - "gnDisplayName": "Γκουαρανί", - "gomDisplayName": "Γκόαν Κονκάνι", - "guDisplayName": "Γκουτζαράτι", - "haDisplayName": "Χάουσα", - "hawDisplayName": "Χαβανέζικα", - "heDisplayName": "Εβραϊκά", - "hiDisplayName": "Χίντι", - "hilDisplayName": "Χιλιγκάινον", - "hmnDisplayName": "Χμονγκ", - "hneDisplayName": "Χαττισγκάρχι", - "hrDisplayName": "Κροατικά", - "hrxDisplayName": "Χουνσρικ", - "htDisplayName": "Αϊτινός Κρεόλ", - "huDisplayName": "Ουγγρικά", - "hyDisplayName": "Αρμενικά", - "idDisplayName": "Ινδονησιακά", - "igDisplayName": "Ίγκο", - "iloDisplayName": "Ιλόκο", - "isDisplayName": "Ισλανδικά", - "itDisplayName": "Ιταλικά", - "jaDisplayName": "Ιαπωνικά", - "jvDisplayName": "Ιαβανικά", - "kaDisplayName": "Γεωργιανά", - "kkDisplayName": "Καζακικά", - "kmDisplayName": "Χμερ", - "knDisplayName": "Καννάδα", - "koDisplayName": "Κορεατικά", - "kokDisplayName": "Κονκάνι", - "kriDisplayName": "Κρίο", - "ksDisplayName": "Κασμίρι", - "ktuDisplayName": "Κιτούμπα (Δημοκρατική Δημοκρατία του Κονγκό)", - "kuDisplayName": "Κουρδικά", - "kyDisplayName": "Κιργιζικά", - "laDisplayName": "Λατινικά", - "lbDisplayName": "Λουξεμβουργιανά", - "lgDisplayName": "Γκάντα", - "liDisplayName": "Λιμβουργιανά", - "lijDisplayName": "Λιγουριανά", - "lmoDisplayName": "Λομβαρδικά", - "lnDisplayName": "Λινγκάλα", - "loDisplayName": "Λάο", - "ltDisplayName": "Λιθουανικά", - "ltgDisplayName": "Λατγαλικά", - "luoDisplayName": "Λούο (Κένυα και Τανζανία)", - "lusDisplayName": "Μίζο", - "lvDisplayName": "Λετονικά", - "maiDisplayName": "Μαϊθίλι", - "makDisplayName": "Μακασάρ", - "mgDisplayName": "Μαλαγασί", - "miDisplayName": "Μάορι", - "minDisplayName": "Μιναγκαμπάου", - "mkDisplayName": "Μακεδονικά", - "mlDisplayName": "Μαλαγιαλάμ", - "mnDisplayName": "Μογγολικά", - "mniDisplayName": "Μανιπούρι", - "mrDisplayName": "Μαραθί", - "msDisplayName": "Μαλάι", - "msArabDisplayName": "Μαλάι (Αραβικά)", - "msMYDisplayName": "Μαλάι (Μαλαισία)", - "mtDisplayName": "Μαλτέζικα", - "mwrDisplayName": "Μαραθί", - "myDisplayName": "Βιρμανικά", - "nanDisplayName": "Μιν Ναν", - "nbDisplayName": "Νορβηγικά (Μποκμάλ)", - "neDisplayName": "Νεπαλέζικα", - "newDisplayName": "Νεουαρί", - "nlDisplayName": "Ολλανδικά", - "nlBEDisplayName": "Φλαμανδικά", - "noDisplayName": "Νορβηγικά", - "nrDisplayName": "Νότιο Ντεμπέλε", - "nsoDisplayName": "Βόρειος Σόθο", - "nusDisplayName": "Νούερ", - "nyDisplayName": "Νιάντζα", - "ocDisplayName": "Οξιτανικά", - "omDisplayName": "Ορόμο", - "orDisplayName": "Οντία", - "paDisplayName": "Παντζάμπι", - "paArabDisplayName": "Παντζάμπι (Σαχμουκί)", - "paINDisplayName": "Παντζάμπι (Γκουρμούκι)", - "pagDisplayName": "Πανγκασινάν", - "pamDisplayName": "Πάμπανγκα", - "papDisplayName": "Πάπιεντο", - "plDisplayName": "Πολωνικά", - "psDisplayName": "Παστού", - "ptDisplayName": "Πορτογαλικά", - "ptBRDisplayName": "Πορτογαλικά (Βραζιλία)", - "ptPTDisplayName": "Πορτογαλικά (Πορτογαλία)", - "quDisplayName": "Κετσούα", - "rajDisplayName": "Ρατζαστάνι", - "rnDisplayName": "Ρούντι", - "roDisplayName": "Ρουμανικά", - "roMDDisplayName": "Μολδαβικά", - "romDisplayName": "Ρομά", - "ruDisplayName": "Ρωσικά", - "rwDisplayName": "Κινυαρουάντα", - "saDisplayName": "Σανσκριτικά", - "satDisplayName": "Σαντάλι", - "scnDisplayName": "Σικελικά", - "sdDisplayName": "Σιντί", - "sgDisplayName": "Σάνγκο", - "shnDisplayName": "Σαν", - "siDisplayName": "Σινχάλα", - "skDisplayName": "Σλοβακικά", - "slDisplayName": "Σλοβενικά", - "smDisplayName": "Σαμοά", - "snDisplayName": "Σόνα", - "soDisplayName": "Σομαλικά", - "sqDisplayName": "Αλβανικά", - "srDisplayName": "Σερβικά", - "srMEDisplayName": "Μαυροβούνιο", - "ssDisplayName": "Σουαχίλι", - "stDisplayName": "Νότιος Σόθο", - "suDisplayName": "Σουντανησιακά", - "svDisplayName": "Σουηδικά", - "swDisplayName": "Σουαχίλι", - "szlDisplayName": "Σιλεσιανά", - "taDisplayName": "Ταμίλ", - "teDisplayName": "Τελούγκου", - "tetDisplayName": "Τετούμ", - "tgDisplayName": "Τατζικικά", - "thDisplayName": "Ταϊλανδέζικα", - "tiDisplayName": "Τιγκρινιά", - "tkDisplayName": "Τουρκμενικά", - "tlDisplayName": "Ταγκάλογ", - "tnDisplayName": "Τσουάνα", - "trDisplayName": "Τουρκικά", - "tsDisplayName": "Τσόνγκα", - "ttDisplayName": "Τατάρ", - "ugDisplayName": "Ουιγούρο", - "ukDisplayName": "Ουκρανικά", - "urDisplayName": "Ουρντού", - "urINDisplayName": "Ουρντού (Ινδία)", - "urPKDisplayName": "Ουρντού (Πακιστάν)", - "uzDisplayName": "Ουζμπεκικά", - "viDisplayName": "Βιετναμέζικα", - "wuuDisplayName": "Γου", - "xhDisplayName": "Χόσα", - "yiDisplayName": "Γίντις", - "yoDisplayName": "Γιορούμπα", - "yuaDisplayName": "Γιουκατέκο", - "yueDisplayName": "Καντονέζικα", - "yueCNDisplayName": "Καντονέζικα (Κίνα)", - "yueHKDisplayName": "Καντονέζικα (Χονγκ Κονγκ)", - "zhDisplayName": "Κινέζικα", - "zhCNDisplayName": "Κινέζικα (Απλοποιημένα)", - "zhTWDisplayName": "Κινέζικα (Παραδοσιακά)", - "zuDisplayName": "Ζουλού", - "@emptyChatSearch": { - "type": "String", - "placeholders": {} - }, - "@activityAnalyticsTooltipBody": { - "type": "String", - "placeholders": {} - }, - "@numSavedActivities": { - "type": "String", - "placeholders": {} - }, - "@saveActivityTitle": { - "type": "String", - "placeholders": {} - }, - "@saveActivityDesc": { - "type": "String", - "placeholders": {} - }, - "@levelInfoTooltip": { - "type": "String", - "placeholders": {} - }, - "@alreadyInCourseWithID": { - "type": "String", - "placeholders": {} - }, - "@goToExistingCourse": { - "type": "String", - "placeholders": {} - }, - "@emojiView": { - "type": "String", - "placeholders": {} - }, - "@feedbackDialogDesc": { - "type": "String", - "placeholders": {} - }, - "@contactHasBeenInvitedToTheCourse": { - "type": "String", - "placeholders": {} - }, - "@activityStatsButtonTooltip": { - "type": "String", - "placeholders": {} - }, - "@allow": { - "type": "String", - "placeholders": {} - }, - "@deny": { - "type": "String", - "placeholders": {} - }, - "@enabledRenewal": { - "type": "String", - "placeholders": {} - }, - "@subscriptionEndsOn": { - "type": "String", - "placeholders": {} - }, - "@subscriptionRenewsOn": { - "type": "String", - "placeholders": {} - }, - "@waitForSubscriptionChanges": { - "type": "String", - "placeholders": {} - }, - "@subscribeReadingAssistance": { - "type": "String", - "placeholders": {} - }, - "@aceDisplayName": { - "type": "String", - "placeholders": {} - }, - "@achDisplayName": { - "type": "String", - "placeholders": {} - }, - "@afDisplayName": { - "type": "String", - "placeholders": {} - }, - "@akDisplayName": { - "type": "String", - "placeholders": {} - }, - "@alzDisplayName": { - "type": "String", - "placeholders": {} - }, - "@amDisplayName": { - "type": "String", - "placeholders": {} - }, - "@arDisplayName": { - "type": "String", - "placeholders": {} - }, - "@asDisplayName": { - "type": "String", - "placeholders": {} - }, - "@awaDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ayDisplayName": { - "type": "String", - "placeholders": {} - }, - "@azDisplayName": { - "type": "String", - "placeholders": {} - }, - "@baDisplayName": { - "type": "String", - "placeholders": {} - }, - "@banDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bbcDisplayName": { - "type": "String", - "placeholders": {} - }, - "@beDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bemDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bewDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bgDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bhoDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bikDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bmDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bnDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bnBDDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bnINDisplayName": { - "type": "String", - "placeholders": {} - }, - "@brDisplayName": { - "type": "String", - "placeholders": {} - }, - "@bsDisplayName": { - "type": "String", - "placeholders": {} - }, - "@btsDisplayName": { - "type": "String", - "placeholders": {} - }, - "@btxDisplayName": { - "type": "String", - "placeholders": {} - }, - "@buaDisplayName": { - "type": "String", - "placeholders": {} - }, - "@caDisplayName": { - "type": "String", - "placeholders": {} - }, - "@cebDisplayName": { - "type": "String", - "placeholders": {} - }, - "@cggDisplayName": { - "type": "String", - "placeholders": {} - }, - "@chmDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ckbDisplayName": { - "type": "String", - "placeholders": {} - }, - "@cnhDisplayName": { - "type": "String", - "placeholders": {} - }, - "@coDisplayName": { - "type": "String", - "placeholders": {} - }, - "@crhDisplayName": { - "type": "String", - "placeholders": {} - }, - "@crsDisplayName": { - "type": "String", - "placeholders": {} - }, - "@csDisplayName": { - "type": "String", - "placeholders": {} - }, - "@cvDisplayName": { - "type": "String", - "placeholders": {} - }, - "@cyDisplayName": { - "type": "String", - "placeholders": {} - }, - "@daDisplayName": { - "type": "String", - "placeholders": {} - }, - "@deDisplayName": { - "type": "String", - "placeholders": {} - }, - "@dinDisplayName": { - "type": "String", - "placeholders": {} - }, - "@doiDisplayName": { - "type": "String", - "placeholders": {} - }, - "@dovDisplayName": { - "type": "String", - "placeholders": {} - }, - "@dzDisplayName": { - "type": "String", - "placeholders": {} - }, - "@eeDisplayName": { - "type": "String", - "placeholders": {} - }, - "@enDisplayName": { - "type": "String", - "placeholders": {} - }, - "@enAUDisplayName": { - "type": "String", - "placeholders": {} - }, - "@enGBDisplayName": { - "type": "String", - "placeholders": {} - }, - "@enINDisplayName": { - "type": "String", - "placeholders": {} - }, - "@enUSDisplayName": { - "type": "String", - "placeholders": {} - }, - "@eoDisplayName": { - "type": "String", - "placeholders": {} - }, - "@esDisplayName": { - "type": "String", - "placeholders": {} - }, - "@esESDisplayName": { - "type": "String", - "placeholders": {} - }, - "@esMXDisplayName": { - "type": "String", - "placeholders": {} - }, - "@euDisplayName": { - "type": "String", - "placeholders": {} - }, - "@faDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ffDisplayName": { - "type": "String", - "placeholders": {} - }, - "@fiDisplayName": { - "type": "String", - "placeholders": {} - }, - "@filDisplayName": { - "type": "String", - "placeholders": {} - }, - "@fjDisplayName": { - "type": "String", - "placeholders": {} - }, - "@foDisplayName": { - "type": "String", - "placeholders": {} - }, - "@frDisplayName": { - "type": "String", - "placeholders": {} - }, - "@frCADisplayName": { - "type": "String", - "placeholders": {} - }, - "@frFRDisplayName": { - "type": "String", - "placeholders": {} - }, - "@fyDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gaDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gaaDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gdDisplayName": { - "type": "String", - "placeholders": {} - }, - "@glDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gnDisplayName": { - "type": "String", - "placeholders": {} - }, - "@gomDisplayName": { - "type": "String", - "placeholders": {} - }, - "@guDisplayName": { - "type": "String", - "placeholders": {} - }, - "@haDisplayName": { - "type": "String", - "placeholders": {} - }, - "@hawDisplayName": { - "type": "String", - "placeholders": {} - }, - "@heDisplayName": { - "type": "String", - "placeholders": {} - }, - "@hiDisplayName": { - "type": "String", - "placeholders": {} - }, - "@hilDisplayName": { - "type": "String", - "placeholders": {} - }, - "@hmnDisplayName": { - "type": "String", - "placeholders": {} - }, - "@hneDisplayName": { - "type": "String", - "placeholders": {} - }, - "@hrDisplayName": { - "type": "String", - "placeholders": {} - }, - "@hrxDisplayName": { - "type": "String", - "placeholders": {} - }, - "@htDisplayName": { - "type": "String", - "placeholders": {} - }, - "@huDisplayName": { - "type": "String", - "placeholders": {} - }, - "@hyDisplayName": { - "type": "String", - "placeholders": {} - }, - "@idDisplayName": { - "type": "String", - "placeholders": {} - }, - "@igDisplayName": { - "type": "String", - "placeholders": {} - }, - "@iloDisplayName": { - "type": "String", - "placeholders": {} - }, - "@isDisplayName": { - "type": "String", - "placeholders": {} - }, - "@itDisplayName": { - "type": "String", - "placeholders": {} - }, - "@jaDisplayName": { - "type": "String", - "placeholders": {} - }, - "@jvDisplayName": { - "type": "String", - "placeholders": {} - }, - "@kaDisplayName": { - "type": "String", - "placeholders": {} - }, - "@kkDisplayName": { - "type": "String", - "placeholders": {} - }, - "@kmDisplayName": { - "type": "String", - "placeholders": {} - }, - "@knDisplayName": { - "type": "String", - "placeholders": {} - }, - "@koDisplayName": { - "type": "String", - "placeholders": {} - }, - "@kokDisplayName": { - "type": "String", - "placeholders": {} - }, - "@kriDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ksDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ktuDisplayName": { - "type": "String", - "placeholders": {} - }, - "@kuDisplayName": { - "type": "String", - "placeholders": {} - }, - "@kyDisplayName": { - "type": "String", - "placeholders": {} - }, - "@laDisplayName": { - "type": "String", - "placeholders": {} - }, - "@lbDisplayName": { - "type": "String", - "placeholders": {} - }, - "@lgDisplayName": { - "type": "String", - "placeholders": {} - }, - "@liDisplayName": { - "type": "String", - "placeholders": {} - }, - "@lijDisplayName": { - "type": "String", - "placeholders": {} - }, - "@lmoDisplayName": { - "type": "String", - "placeholders": {} - }, - "@lnDisplayName": { - "type": "String", - "placeholders": {} - }, - "@loDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ltDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ltgDisplayName": { - "type": "String", - "placeholders": {} - }, - "@luoDisplayName": { - "type": "String", - "placeholders": {} - }, - "@lusDisplayName": { - "type": "String", - "placeholders": {} - }, - "@lvDisplayName": { - "type": "String", - "placeholders": {} - }, - "@maiDisplayName": { - "type": "String", - "placeholders": {} - }, - "@makDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mgDisplayName": { - "type": "String", - "placeholders": {} - }, - "@miDisplayName": { - "type": "String", - "placeholders": {} - }, - "@minDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mkDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mlDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mnDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mniDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mrDisplayName": { - "type": "String", - "placeholders": {} - }, - "@msDisplayName": { - "type": "String", - "placeholders": {} - }, - "@msArabDisplayName": { - "type": "String", - "placeholders": {} - }, - "@msMYDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mtDisplayName": { - "type": "String", - "placeholders": {} - }, - "@mwrDisplayName": { - "type": "String", - "placeholders": {} - }, - "@myDisplayName": { - "type": "String", - "placeholders": {} - }, - "@nanDisplayName": { - "type": "String", - "placeholders": {} - }, - "@nbDisplayName": { - "type": "String", - "placeholders": {} - }, - "@neDisplayName": { - "type": "String", - "placeholders": {} - }, - "@newDisplayName": { - "type": "String", - "placeholders": {} - }, - "@nlDisplayName": { - "type": "String", - "placeholders": {} - }, - "@nlBEDisplayName": { - "type": "String", - "placeholders": {} - }, - "@noDisplayName": { - "type": "String", - "placeholders": {} - }, - "@nrDisplayName": { - "type": "String", - "placeholders": {} - }, - "@nsoDisplayName": { - "type": "String", - "placeholders": {} - }, - "@nusDisplayName": { - "type": "String", - "placeholders": {} - }, - "@nyDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ocDisplayName": { - "type": "String", - "placeholders": {} - }, - "@omDisplayName": { - "type": "String", - "placeholders": {} - }, - "@orDisplayName": { - "type": "String", - "placeholders": {} - }, - "@paDisplayName": { - "type": "String", - "placeholders": {} - }, - "@paArabDisplayName": { - "type": "String", - "placeholders": {} - }, - "@paINDisplayName": { - "type": "String", - "placeholders": {} - }, - "@pagDisplayName": { - "type": "String", - "placeholders": {} - }, - "@pamDisplayName": { - "type": "String", - "placeholders": {} - }, - "@papDisplayName": { - "type": "String", - "placeholders": {} - }, - "@plDisplayName": { - "type": "String", - "placeholders": {} - }, - "@psDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ptDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ptBRDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ptPTDisplayName": { - "type": "String", - "placeholders": {} - }, - "@quDisplayName": { - "type": "String", - "placeholders": {} - }, - "@rajDisplayName": { - "type": "String", - "placeholders": {} - }, - "@rnDisplayName": { - "type": "String", - "placeholders": {} - }, - "@roDisplayName": { - "type": "String", - "placeholders": {} - }, - "@roMDDisplayName": { - "type": "String", - "placeholders": {} - }, - "@romDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ruDisplayName": { - "type": "String", - "placeholders": {} - }, - "@rwDisplayName": { - "type": "String", - "placeholders": {} - }, - "@saDisplayName": { - "type": "String", - "placeholders": {} - }, - "@satDisplayName": { - "type": "String", - "placeholders": {} - }, - "@scnDisplayName": { - "type": "String", - "placeholders": {} - }, - "@sdDisplayName": { - "type": "String", - "placeholders": {} - }, - "@sgDisplayName": { - "type": "String", - "placeholders": {} - }, - "@shnDisplayName": { - "type": "String", - "placeholders": {} - }, - "@siDisplayName": { - "type": "String", - "placeholders": {} - }, - "@skDisplayName": { - "type": "String", - "placeholders": {} - }, - "@slDisplayName": { - "type": "String", - "placeholders": {} - }, - "@smDisplayName": { - "type": "String", - "placeholders": {} - }, - "@snDisplayName": { - "type": "String", - "placeholders": {} - }, - "@soDisplayName": { - "type": "String", - "placeholders": {} - }, - "@sqDisplayName": { - "type": "String", - "placeholders": {} - }, - "@srDisplayName": { - "type": "String", - "placeholders": {} - }, - "@srMEDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ssDisplayName": { - "type": "String", - "placeholders": {} - }, - "@stDisplayName": { - "type": "String", - "placeholders": {} - }, - "@suDisplayName": { - "type": "String", - "placeholders": {} - }, - "@svDisplayName": { - "type": "String", - "placeholders": {} - }, - "@swDisplayName": { - "type": "String", - "placeholders": {} - }, - "@szlDisplayName": { - "type": "String", - "placeholders": {} - }, - "@taDisplayName": { - "type": "String", - "placeholders": {} - }, - "@teDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tetDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tgDisplayName": { - "type": "String", - "placeholders": {} - }, - "@thDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tiDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tkDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tlDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tnDisplayName": { - "type": "String", - "placeholders": {} - }, - "@trDisplayName": { - "type": "String", - "placeholders": {} - }, - "@tsDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ttDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ugDisplayName": { - "type": "String", - "placeholders": {} - }, - "@ukDisplayName": { - "type": "String", - "placeholders": {} - }, - "@urDisplayName": { - "type": "String", - "placeholders": {} - }, - "@urINDisplayName": { - "type": "String", - "placeholders": {} - }, - "@urPKDisplayName": { - "type": "String", - "placeholders": {} - }, - "@uzDisplayName": { - "type": "String", - "placeholders": {} - }, - "@viDisplayName": { - "type": "String", - "placeholders": {} - }, - "@wuuDisplayName": { - "type": "String", - "placeholders": {} - }, - "@xhDisplayName": { - "type": "String", - "placeholders": {} - }, - "@yiDisplayName": { - "type": "String", - "placeholders": {} - }, - "@yoDisplayName": { - "type": "String", - "placeholders": {} - }, - "@yuaDisplayName": { - "type": "String", - "placeholders": {} - }, - "@yueDisplayName": { - "type": "String", - "placeholders": {} - }, - "@yueCNDisplayName": { - "type": "String", - "placeholders": {} - }, - "@yueHKDisplayName": { - "type": "String", - "placeholders": {} - }, - "@zhDisplayName": { - "type": "String", - "placeholders": {} - }, - "@zhCNDisplayName": { - "type": "String", - "placeholders": {} - }, - "@zhTWDisplayName": { - "type": "String", - "placeholders": {} - }, - "@zuDisplayName": { - "type": "String", - "placeholders": {} - }, - "teacherModeTitle": "Λειτουργία Δασκάλου", - "teacherModeDesc": "Εναλλαγή για να ξεκλειδώσετε όλα τα θέματα και τις δραστηριότητες. Μόνο για διαχειριστές μαθημάτων.", - "@teacherModeTitle": { - "type": "String", - "placeholders": {} - }, - "@teacherModeDesc": { - "type": "String", - "placeholders": {} - }, - "failedToLoadFeedback": "Αποτυχία φόρτωσης ανατροφοδότησης.", - "unreadPlus": "99+", - "noSavedActivitiesYet": "Οι δραστηριότητες θα εμφανιστούν εδώ μόλις ολοκληρωθούν και αποθηκευτούν.", - "@failedToLoadFeedback": { - "type": "String", - "placeholders": {} - }, - "@unreadPlus": { - "type": "String", - "placeholders": {} - }, - "@noSavedActivitiesYet": { - "type": "String", - "placeholders": {} - }, - "changeCourse": "Αλλαγή μαθήματος", - "changeCourseDesc": "Εδώ μπορείτε να αλλάξετε το σχέδιο μαθήματος αυτού του μαθήματος.", - "@changeCourse": { - "type": "String", - "placeholders": {} - }, - "@changeCourseDesc": { - "type": "String", - "placeholders": {} - }, - "practiceActivityCompleted": "Η δραστηριότητα πρακτικής ολοκληρώθηκε", - "@practiceActivityCompleted": { - "type": "String", - "placeholders": {} - }, - "introChatTitle": "Δημιουργία Συνομιλίας Εισαγωγών", - "introChatDesc": "Οποιοσδήποτε στον χώρο μπορεί να δημοσιεύσει.", - "announcementsChatTitle": "Συνομιλία Ανακοινώσεων", - "announcementsChatDesc": "Μόνο ο διαχειριστής του χώρου μπορεί να δημοσιεύσει.", - "@introChatTitle": { - "type": "String", - "placeholders": {} - }, - "@introChatDesc": { - "type": "String", - "placeholders": {} - }, - "@announcementsChatTitle": { - "type": "String", - "placeholders": {} - }, - "@announcementsChatDesc": { - "type": "String", - "placeholders": {} - }, - "notStartedActivitiesTitle": "Ανοιχτές συνεδρίες ({num})", - "inProgressActivitiesTitle": "Γίνεται τώρα ({num})", - "completedActivitiesTitle": "Ολοκληρώθηκε ({num})", - "pickDifferentActivity": "Επιλέξτε μια διαφορετική δραστηριότητα", - "inOngoingActivity": "Έχετε μια τρέχουσα δραστηριότητα!", - "@notStartedActivitiesTitle": { - "type": "String", - "placeholders": { - "num": { - "type": "int" + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "duration": { + "type": "String" + }, + "sender": { + "type": "String" + } } - } - }, - "@inProgressActivitiesTitle": { - "type": "String", - "placeholders": { - "num": { - "type": "int" + }, + "@deletePushRuleCanNotBeUndone": { + "type": "String", + "placeholders": {} + }, + "@more": { + "type": "String", + "placeholders": {} + }, + "@shareKeysWith": { + "type": "String", + "placeholders": {} + }, + "@shareKeysWithDescription": { + "type": "String", + "placeholders": {} + }, + "@allDevices": { + "type": "String", + "placeholders": {} + }, + "@crossVerifiedDevicesIfEnabled": { + "type": "String", + "placeholders": {} + }, + "@crossVerifiedDevices": { + "type": "String", + "placeholders": {} + }, + "@verifiedDevicesOnly": { + "type": "String", + "placeholders": {} + }, + "@takeAPhoto": { + "type": "String", + "placeholders": {} + }, + "@recordAVideo": { + "type": "String", + "placeholders": {} + }, + "@optionalMessage": { + "type": "String", + "placeholders": {} + }, + "@notSupportedOnThisDevice": { + "type": "String", + "placeholders": {} + }, + "@enterNewChat": { + "type": "String", + "placeholders": {} + }, + "@approve": { + "type": "String", + "placeholders": {} + }, + "@youHaveKnocked": { + "type": "String", + "placeholders": {} + }, + "@pleaseWaitUntilInvited": { + "type": "String", + "placeholders": {} + }, + "@commandHint_logout": { + "type": "String", + "placeholders": {} + }, + "@commandHint_logoutall": { + "type": "String", + "placeholders": {} + }, + "@displayNavigationRail": { + "type": "String", + "placeholders": {} + }, + "@customReaction": { + "type": "String", + "placeholders": {} + }, + "@writeAMessageLangCodes": { + "type": "String", + "placeholders": { + "l1": { + "type": "String" + }, + "l2": { + "type": "String" + } } - } - }, - "@completedActivitiesTitle": { - "type": "String", - "placeholders": { - "num": { - "type": "int" + }, + "@requests": { + "type": "String", + "placeholders": {} + }, + "@holdForInfo": { + "type": "String", + "placeholders": {} + }, + "@greenFeedback": { + "type": "String", + "placeholders": {} + }, + "@yellowFeedback": { + "type": "String", + "placeholders": {} + }, + "@redFeedback": { + "type": "String", + "placeholders": {} + }, + "@itInstructionsTitle": { + "type": "String", + "placeholders": {} + }, + "@itInstructionsBody": { + "type": "String", + "placeholders": {} + }, + "@gaTooltip": { + "type": "String", + "placeholders": {} + }, + "@taTooltip": { + "type": "String", + "placeholders": {} + }, + "@unTooltip": { + "type": "String", + "placeholders": {} + }, + "@interactiveTranslatorSliderHeader": { + "type": "String", + "placeholders": {} + }, + "@interactiveGrammarSliderHeader": { + "type": "String", + "placeholders": {} + }, + "@interactiveTranslatorNotAllowed": { + "type": "String", + "placeholders": {} + }, + "@interactiveTranslatorAllowed": { + "type": "String", + "placeholders": {} + }, + "@interactiveTranslatorRequired": { + "type": "String", + "placeholders": {} + }, + "@notYetSet": { + "type": "String", + "placeholders": {} + }, + "@waTooltip": { + "type": "String", + "placeholders": {} + }, + "@languageSettings": { + "type": "String", + "placeholders": {} + }, + "@interactiveTranslator": { + "type": "String", + "placeholders": {} + }, + "@noIdenticalLanguages": { + "type": "String", + "placeholders": {} + }, + "@searchBy": { + "type": "String", + "placeholders": {} + }, + "@joinWithClassCode": { + "type": "String", + "placeholders": {} + }, + "@languageLevelPreA1": { + "type": "String", + "placeholders": {} + }, + "@languageLevelA1": { + "type": "String", + "placeholders": {} + }, + "@languageLevelA2": { + "type": "String", + "placeholders": {} + }, + "@languageLevelB1": { + "type": "String", + "placeholders": {} + }, + "@languageLevelB2": { + "type": "String", + "placeholders": {} + }, + "@languageLevelC1": { + "type": "String", + "placeholders": {} + }, + "@languageLevelC2": { + "type": "String", + "placeholders": {} + }, + "@changeTheNameOfTheClass": { + "type": "String", + "placeholders": {} + }, + "@changeTheNameOfTheChat": { + "type": "String", + "placeholders": {} + }, + "@sorryNoResults": { + "type": "String", + "placeholders": {} + }, + "@ignoreInThisText": { + "type": "String", + "placeholders": {} + }, + "@needsItMessage": { + "type": "String", + "placeholders": { + "targetLanguage": { + "type": "String" + } } - } - }, - "@pickDifferentActivity": { - "type": "String", - "placeholders": {} - }, - "messageLanguageMismatchMessage": "Η γλώσσα στόχου σας δεν ταιριάζει με αυτό το μήνυμα. Θέλετε να ενημερώσετε τη γλώσσα στόχου σας;", - "@messageLanguageMismatchMessage": { - "type": "String", - "placeholders": {} - }, - "courseParticipantTooltip": "Αυτοί είναι όλοι σε αυτό το μάθημα. Κάντε κλικ στο avatar οποιουδήποτε χρήστη και \"ξεκινήστε συνομιλία\" για να στείλετε ένα DM.", - "@courseParticipantTooltip": { - "type": "String", - "placeholders": {} - }, - "blockLemmaConfirmation": "Αυτή η λέξη λεξιλογίου θα αφαιρεθεί μόνιμα από την ανάλυσή σας", - "woman": "Γυναίκα", - "man": "Άνδρας", - "otherGender": "Άλλο", - "unselectedGender": "Επιλέξτε μια επιλογή φύλου", - "gender": "Φύλο", - "chatParticipantTooltip": "Αυτοί είναι όλοι σε αυτή τη συνομιλία. Κάντε κλικ στο avatar οποιουδήποτε χρήστη και \"ξεκινήστε συνομιλία\" για να στείλετε ένα DM.", - "@blockLemmaConfirmation": { - "type": "String", - "placeholders": {} - }, - "@woman": { - "type": "String", - "placeholders": {} - }, - "@man": { - "type": "String", - "placeholders": {} - }, - "@otherGender": { - "type": "String", - "placeholders": {} - }, - "@unselectedGender": { - "type": "String", - "placeholders": {} - }, - "@gender": { - "type": "String", - "placeholders": {} - }, - "@chatParticipantTooltip": { - "type": "String", - "placeholders": {} - }, - "@inOngoingActivity": { - "type": "String", - "placeholders": {} - }, - "modeDisabled": "Τα εργαλεία μάθησης είναι απενεργοποιημένα για μηνύματα που δεν είναι στη γλώσσα στόχου σας.", - "vocabEmoji": "Εικόνισμα λεξιλογίου", - "@modeDisabled": { - "type": "String", - "placeholders": {} - }, - "@vocabEmoji": { - "type": "String", - "placeholders": {} - }, - "requestRegeneration": "Αίτημα αναγέννησης", - "optionalRegenerateReason": "(Προαιρετικό) Λόγος", - "@requestRegeneration": { - "type": "String", - "placeholders": {} - }, - "@optionalRegenerateReason": { - "type": "String", - "placeholders": {} - }, - "emojiSelectedSnackbar": "Έχετε ορίσει το emoji για {lemma}! Θα χρησιμοποιήσουμε αυτό το emoji για να εκπροσωπήσουμε τη λέξη σε πρακτικές δραστηριότητες στο εξής.", - "@emojiSelectedSnackbar": { - "type": "String", - "placeholders": { - "lemma": { - "type": "String" + }, + "@countryInformation": { + "type": "String", + "placeholders": {} + }, + "@targetLanguage": { + "type": "String", + "placeholders": {} + }, + "@sourceLanguage": { + "type": "String", + "placeholders": {} + }, + "@updateLanguage": { + "type": "String", + "placeholders": {} + }, + "@whatLanguageYouWantToLearn": { + "type": "String", + "placeholders": {} + }, + "@whatIsYourBaseLanguage": { + "type": "String", + "placeholders": {} + }, + "@saveChanges": { + "type": "String", + "placeholders": {} + }, + "@publicProfileTitle": { + "type": "String", + "placeholders": {} + }, + "@publicProfileDesc": { + "type": "String", + "placeholders": {} + }, + "@errorDisableIT": { + "type": "String", + "placeholders": {} + }, + "@errorDisableIGC": { + "type": "String", + "placeholders": {} + }, + "@errorDisableLanguageAssistance": { + "type": "String", + "placeholders": {} + }, + "@errorDisableITUserDesc": { + "type": "String", + "placeholders": {} + }, + "@errorDisableIGCUserDesc": { + "type": "String", + "placeholders": {} + }, + "@errorDisableLanguageAssistanceUserDesc": { + "type": "String", + "placeholders": {} + }, + "@errorDisableITClassDesc": { + "type": "String", + "placeholders": {} + }, + "@errorDisableIGCClassDesc": { + "type": "String", + "placeholders": {} + }, + "@error405Title": { + "type": "String", + "placeholders": {} + }, + "@error405Desc": { + "type": "String", + "placeholders": {} + }, + "@termsAndConditions": { + "type": "String", + "placeholders": {} + }, + "@andCertifyIAmAtLeast13YearsOfAge": { + "type": "String", + "placeholders": {} + }, + "@error502504Title": { + "type": "String", + "placeholders": {} + }, + "@error502504Desc": { + "type": "String", + "placeholders": {} + }, + "@error404Title": { + "type": "String", + "placeholders": {} + }, + "@error404Desc": { + "type": "String", + "placeholders": {} + }, + "@errorPleaseRefresh": { + "type": "String", + "placeholders": {} + }, + "@connectedToStaging": { + "type": "String", + "placeholders": {} + }, + "@learningSettings": { + "type": "String", + "placeholders": {} + }, + "@participants": { + "type": "String", + "placeholders": {} + }, + "@clickMessageTitle": { + "type": "String", + "placeholders": {} + }, + "@clickMessageBody": { + "type": "String", + "placeholders": {} + }, + "@allDone": { + "type": "String", + "placeholders": {} + }, + "@vocab": { + "type": "String", + "placeholders": {} + }, + "@low": { + "type": "String", + "placeholders": {} + }, + "@medium": { + "type": "String", + "placeholders": {} + }, + "@high": { + "type": "String", + "placeholders": {} + }, + "@subscribe": { + "type": "String", + "placeholders": {} + }, + "@getAccess": { + "type": "String", + "placeholders": {} + }, + "@subscriptionDesc": { + "type": "String", + "placeholders": {} + }, + "@subscriptionManagement": { + "type": "String", + "placeholders": {} + }, + "@currentSubscription": { + "type": "String", + "placeholders": {} + }, + "@cancelSubscription": { + "type": "String", + "placeholders": {} + }, + "@selectYourPlan": { + "type": "String", + "placeholders": {} + }, + "@subsciptionPlatformTooltip": { + "type": "String", + "placeholders": {} + }, + "@subscriptionManagementUnavailable": { + "type": "String", + "placeholders": {} + }, + "@paymentMethod": { + "type": "String", + "placeholders": {} + }, + "@paymentHistory": { + "type": "String", + "placeholders": {} + }, + "@emptyChatDownloadWarning": { + "type": "String", + "placeholders": {} + }, + "@update": { + "type": "String", + "placeholders": {} + }, + "@toggleImmersionMode": { + "type": "String", + "placeholders": {} + }, + "@toggleImmersionModeDesc": { + "type": "String", + "placeholders": {} + }, + "@itToggleDescription": { + "type": "String", + "placeholders": {} + }, + "@igcToggleDescription": { + "type": "String", + "placeholders": {} + }, + "@originalMessage": { + "type": "String", + "placeholders": {} + }, + "@sentMessage": { + "type": "String", + "placeholders": {} + }, + "@useType": { + "type": "String", + "placeholders": {} + }, + "@notAvailable": { + "type": "String", + "placeholders": {} + }, + "@taAndGaTooltip": { + "type": "String", + "placeholders": {} + }, + "@definitionsToolName": { + "type": "String", + "placeholders": {} + }, + "@messageTranslationsToolName": { + "type": "String", + "placeholders": {} + }, + "@definitionsToolDescription": { + "type": "String", + "placeholders": {} + }, + "@translationsToolDescrption": { + "type": "String", + "placeholders": {} + }, + "@welcomeBack": { + "type": "String", + "placeholders": {} + }, + "@downloadTxtFile": { + "type": "String", + "placeholders": {} + }, + "@downloadCSVFile": { + "type": "String", + "placeholders": {} + }, + "@promotionalSubscriptionDesc": { + "type": "String", + "placeholders": {} + }, + "@originalSubscriptionPlatform": { + "type": "String", + "placeholders": { + "purchasePlatform": { + "type": "String" + } } - } - }, - "ssoDialogTitle": "Περιμένοντας την ολοκλήρωση της σύνδεσης", - "ssoDialogDesc": "Ανοίξαμε μια νέα καρτέλα ώστε να μπορέσετε να συνδεθείτε με ασφάλεια.", - "ssoDialogHelpText": "🤔 Αν δεν είδατε τη νέα καρτέλα, παρακαλώ ελέγξτε τον αποκλειστή αναδυόμενων παραθύρων σας.", - "@ssoDialogTitle": { - "type": "String", - "placeholders": {} - }, - "@ssoDialogDesc": { - "type": "String", - "placeholders": {} - }, - "@ssoDialogHelpText": { - "type": "String", - "placeholders": {} - }, - "disableLanguageToolsTitle": "Απενεργοποίηση εργαλείων γλώσσας", - "disableLanguageToolsDesc": "Θα θέλατε να απενεργοποιήσετε την αυτόματη βοήθεια γλώσσας;", - "@disableLanguageToolsTitle": { - "type": "String", - "placeholders": {} - }, - "@disableLanguageToolsDesc": { - "type": "String", - "placeholders": {} - }, - "recordingPermissionDenied": "Η άδεια απορρίφθηκε. Ενεργοποιήστε τις άδειες εγγραφής για να καταγράψετε ηχητικά μηνύματα.", - "genericWebRecordingError": "Κάτι πήγε στραβά. Συνιστούμε να χρησιμοποιείτε τον περιηγητή Chrome κατά την εγγραφή μηνυμάτων.", - "@recordingPermissionDenied": { - "type": "String", - "placeholders": {} - }, - "@genericWebRecordingError": { - "type": "String", - "placeholders": {} - }, - "screenSizeWarning": "Για την καλύτερη εμπειρία χρήσης αυτής της εφαρμογής, παρακαλώ επεκτείνετε το μέγεθος της οθόνης σας.", - "@screenSizeWarning": { - "type": "String", - "placeholders": {} - }, - "activitiesToUnlockTopicTitle": "Δραστηριότητες για Ξεκλείδωμα Επόμενου Θέματος", - "activitiesToUnlockTopicDesc": "Ορίστε τον αριθμό των δραστηριοτήτων για να ξεκλειδώσετε το επόμενο θέμα του μαθήματος", - "@activitiesToUnlockTopicTitle": { - "type": "String", - "placeholders": {} - }, - "@activitiesToUnlockTopicDesc": { - "type": "String", - "placeholders": {} - }, - "constructUseCorLMDesc": "Διόρθωση πρακτικής ορισμού λεξιλογίου", - "constructUseIncLMDesc": "Λάθος πρακτική ορισμού λεξιλογίου", - "constructUseCorLADesc": "Διόρθωση πρακτικής ήχου λεξιλογίου", - "constructUseIncLADesc": "Λάθος πρακτική ήχου λεξιλογίου", - "constructUseBonus": "Μπόνους κατά τη διάρκεια της πρακτικής λεξιλογίου", - "practiceVocab": "Πρακτική λεξιλογίου", - "selectMeaning": "Επιλέξτε την έννοια", - "selectAudio": "Επιλέξτε τον αντίστοιχο ήχο", - "congratulations": "Συγχαρητήρια!", - "anotherRound": "Μια ακόμη γύρος", - "noActivityRequest": "Δεν υπάρχει τρέχουσα αίτηση δραστηριότητας.", - "quit": "Έξοδος", - "congratulationsYouveCompletedPractice": "Συγχαρητήρια! Έχετε ολοκληρώσει την πρακτική συνεδρία.", - "mustHave10Words": "Πρέπει να έχετε τουλάχιστον 10 λέξεις λεξιλογίου για να τις εξασκήσετε. Δοκιμάστε να μιλήσετε με έναν φίλο ή με τον Pangea Bot για να ανακαλύψετε περισσότερα!", - "botSettings": "Ρυθμίσεις Bot", - "activitySettingsOverrideWarning": "Η γλώσσα και το επίπεδο γλώσσας καθορίζονται από το σχέδιο δραστηριότητας", - "voice": "Φωνή", - "@constructUseCorLMDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIncLMDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseCorLADesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIncLADesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseBonus": { - "type": "String", - "placeholders": {} - }, - "@practiceVocab": { - "type": "String", - "placeholders": {} - }, - "@selectMeaning": { - "type": "String", - "placeholders": {} - }, - "@selectAudio": { - "type": "String", - "placeholders": {} - }, - "@congratulations": { - "type": "String", - "placeholders": {} - }, - "@anotherRound": { - "type": "String", - "placeholders": {} - }, - "@noActivityRequest": { - "type": "String", - "placeholders": {} - }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, - "@mustHave10Words": { - "type": "String", - "placeholders": {} - }, - "@botSettings": { - "type": "String", - "placeholders": {} - }, - "@activitySettingsOverrideWarning": { - "type": "String", - "placeholders": {} - }, - "@voice": { - "type": "String", - "placeholders": {} - }, - "youLeftTheChat": "🚪 Αφήσατε τη συνομιλία", - "@youLeftTheChat": { - "type": "String", - "placeholders": {} - }, - "downloadInitiated": "Η λήψη ξεκίνησε", - "webDownloadPermissionMessage": "Εάν ο περιηγητής σας μπλοκάρει τις λήψεις, παρακαλώ ενεργοποιήστε τις λήψεις για αυτόν τον ιστότοπο.", - "@downloadInitiated": { - "type": "String", - "placeholders": {} - }, - "@webDownloadPermissionMessage": { - "type": "String", - "placeholders": {} - }, - "exitPractice": "Η πρόοδος της συνεδρίας πρακτικής σας δεν θα αποθηκευτεί.", - "practiceGrammar": "Πρακτική γραμματικής", - "notEnoughToPractice": "Στείλτε περισσότερα μηνύματα για να ξεκλειδώσετε την πρακτική", - "constructUseCorGCDesc": "Πρακτική κατηγορίας σωστής γραμματικής", - "constructUseIncGCDesc": "Πρακτική κατηγορίας λανθαστής γραμματικής", - "@exitPractice": { - "type": "String", - "placeholders": {} - }, - "@practiceGrammar": { - "type": "String", - "placeholders": {} - }, - "@notEnoughToPractice": { - "type": "String", - "placeholders": {} - }, - "@constructUseCorGCDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIncGCDesc": { - "type": "String", - "placeholders": {} - }, - "constructUseCorGEDesc": "Πρακτική διόρθωσης γραμματικών λαθών", - "constructUseIncGEDesc": "Πρακτική λανθασμένων γραμματικών λαθών", - "fillInBlank": "Συμπληρώστε το κενό με τη σωστή επιλογή", - "learn": "Μάθετε", - "languageUpdated": "Η γλώσσα στόχος ενημερώθηκε!", - "@constructUseCorGEDesc": { - "type": "String", - "placeholders": {} - }, - "@constructUseIncGEDesc": { - "type": "String", - "placeholders": {} - }, - "@fillInBlank": { - "type": "String", - "placeholders": {} - }, - "@learn": { - "type": "String", - "placeholders": {} - }, - "@languageUpdated": { - "type": "String", - "placeholders": {} - }, - "voiceDropdownTitle": "Φωνή Pangea Bot", - "@voiceDropdownTitle": { - "type": "String", - "placeholders": {} - }, - "knockDesc": "Το αίτημά σας έχει σταλεί στον διαχειριστή του μαθήματος! Θα σας επιτρέψουν να μπείτε αν το εγκρίνουν.", - "@knockDesc": { - "type": "String", - "placeholders": {} - }, - "joinSpaceOnboardingDesc": "Έχετε έναν κωδικό πρόσκλησης ή σύνδεσμο για ένα δημόσιο μάθημα;", - "welcomeUser": "Καλώς ήρθατε {user}", - "@joinSpaceOnboardingDesc": { - "type": "String", - "placeholders": {} - }, - "@welcomeUser": { - "type": "String", - "placeholders": { - "user": { - "type": "String" + }, + "@oneWeekTrial": { + "type": "String", + "placeholders": {} + }, + "@downloadXLSXFile": { + "type": "String", + "placeholders": {} + }, + "@unkDisplayName": { + "type": "String", + "placeholders": {} + }, + "@wwCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@afCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@axCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@alCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@dzCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@asCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@adCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@aoCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@aiCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@agCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@arCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@amCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@awCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@acCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@auCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@atCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@azCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bsCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bhCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bdCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bbCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@byCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@beCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bzCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bjCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bmCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@btCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@boCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@baCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bwCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@brCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ioCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@vgCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bnCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bgCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bfCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@biCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@khCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@cmCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@caCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@cvCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bqCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@kyCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@cfCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tdCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@clCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@cnCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@cxCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ccCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@coCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@kmCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@cdCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@cgCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ckCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@crCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ciCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@hrCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@cuCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@cwCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@cyCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@czCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@dkCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@djCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@dmCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@doCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tlCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ecCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@egCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@svCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gqCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@erCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@eeCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@szCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@etCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@fkCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@foCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@fjCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@fiCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@frCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gfCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@pfCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gaCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gmCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@geCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@deCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ghCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@giCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@grCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@glCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gdCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gpCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@guCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gtCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ggCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gnCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gwCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gyCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@htCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@hmCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@hnCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@hkCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@huCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@isCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@inCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@idCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@irCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@iqCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ieCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@imCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ilCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@itCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@jmCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@jpCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@jeCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@joCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@kzCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@keCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@kiCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@xkCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@kwCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@kgCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@laCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@lvCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@lbCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@lsCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@lrCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@lyCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@liCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ltCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@luCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@moCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mkCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mgCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mwCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@myCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mvCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mlCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mtCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mhCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mqCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mrCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@muCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ytCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mxCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@fmCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mdCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mcCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mnCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@meCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@msCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@maCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mzCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mmCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@naCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@nrCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@npCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@nlCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ncCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@nzCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@niCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@neCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ngCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@nuCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@nfCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@kpCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mpCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@noCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@omCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@pkCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@pwCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@psCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@paCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@pgCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@pyCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@peCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@phCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@plCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ptCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@prCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@qaCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@reCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@roCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ruCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@rwCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@blCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@shCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@knCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@lcCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mfCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@pmCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@vcCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@wsCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@smCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@stCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@saCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@snCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@rsCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@scCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@slCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@sgCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@sxCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@skCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@siCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@sbCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@soCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@zaCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gsCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@krCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ssCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@esCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@lkCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@sdCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@srCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@sjCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@seCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@chCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@syCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@twCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tjCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tzCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@thCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tgCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tkCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@toCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ttCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tnCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@trCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tmCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tcCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tvCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@viCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ugCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@uaCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@aeCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gbCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@usCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@uyCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@uzCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@vuCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@vaCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@veCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@vnCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@wfCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ehCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@yeCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@zmCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@zwCountryDisplayName": { + "type": "String", + "placeholders": {} + }, + "@pay": { + "type": "String", + "placeholders": {} + }, + "@invitedToSpace": { + "type": "String", + "placeholders": { + "user": { + "type": "String" + }, + "space": { + "type": "String" + } } + }, + "@youreInvited": { + "type": "String", + "placeholders": {} + }, + "@invitedToChat": { + "type": "String", + "placeholders": { + "user": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "@monthlySubscription": { + "type": "String", + "placeholders": {} + }, + "@yearlySubscription": { + "type": "String", + "placeholders": {} + }, + "@defaultSubscription": { + "type": "String", + "placeholders": {} + }, + "@freeTrial": { + "type": "String", + "placeholders": {} + }, + "@total": { + "type": "String", + "placeholders": {} + }, + "@noDataFound": { + "type": "String", + "placeholders": {} + }, + "@blurMeansTranslateTitle": { + "type": "String", + "placeholders": {} + }, + "@blurMeansTranslateBody": { + "type": "String", + "placeholders": {} + }, + "@bestCorrectionFeedback": { + "type": "String", + "placeholders": {} + }, + "@distractorFeedback": { + "type": "String", + "placeholders": {} + }, + "@bestAnswerFeedback": { + "type": "String", + "placeholders": {} + }, + "@definitionDefaultPrompt": { + "type": "String", + "placeholders": {} + }, + "@practiceDefaultPrompt": { + "type": "String", + "placeholders": {} + }, + "@correctionDefaultPrompt": { + "type": "String", + "placeholders": {} + }, + "@acceptSelection": { + "type": "String", + "placeholders": {} + }, + "@why": { + "type": "String", + "placeholders": {} + }, + "@definition": { + "type": "String", + "placeholders": {} + }, + "@exampleSentence": { + "type": "String", + "placeholders": {} + }, + "@reportToTeacher": { + "type": "String", + "placeholders": {} + }, + "@reportMessageTitle": { + "type": "String", + "placeholders": { + "reportingUserId": { + "type": "String" + }, + "reportedUserId": { + "type": "String" + }, + "roomName": { + "type": "String" + } + } + }, + "@reportMessageBody": { + "type": "String", + "placeholders": { + "reportedMessage": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@noTeachersFound": { + "type": "String", + "placeholders": {} + }, + "@trialExpiration": { + "type": "String", + "placeholders": { + "expiration": { + "type": "String" + } + } + }, + "@freeTrialDesc": { + "type": "String", + "placeholders": {} + }, + "@activateTrial": { + "type": "String", + "placeholders": {} + }, + "@successfullySubscribed": { + "type": "String", + "placeholders": {} + }, + "@clickToManageSubscription": { + "type": "String", + "placeholders": {} + }, + "@signUp": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAtLeastChars": { + "type": "String", + "placeholders": { + "min": { + "type": "String" + } + } + }, + "@noEmailWarning": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterValidEmail": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAUsername": { + "type": "String", + "placeholders": {} + }, + "@define": { + "type": "String", + "placeholders": {} + }, + "@listen": { + "type": "String", + "placeholders": {} + }, + "@trialPeriodExpired": { + "type": "String", + "placeholders": {} + }, + "@translations": { + "type": "String", + "placeholders": {} + }, + "@messageAudio": { + "type": "String", + "placeholders": {} + }, + "@definitions": { + "type": "String", + "placeholders": {} + }, + "@subscribedToUnlockTools": { + "type": "String", + "placeholders": {} + }, + "@translationTooltip": { + "type": "String", + "placeholders": {} + }, + "@speechToTextTooltip": { + "type": "String", + "placeholders": {} + }, + "@kickBotWarning": { + "type": "String", + "placeholders": {} + }, + "@refresh": { + "type": "String", + "placeholders": {} + }, + "@messageAnalytics": { + "type": "String", + "placeholders": {} + }, + "@words": { + "type": "String", + "placeholders": {} + }, + "@score": { + "type": "String", + "placeholders": {} + }, + "@accuracy": { + "type": "String", + "placeholders": {} + }, + "@points": { + "type": "String", + "placeholders": {} + }, + "@noPaymentInfo": { + "type": "String", + "placeholders": {} + }, + "@updatePhoneOS": { + "type": "String", + "placeholders": {} + }, + "@wordsPerMinute": { + "type": "String", + "placeholders": {} + }, + "@tooltipInstructionsTitle": { + "type": "String", + "placeholders": {} + }, + "@tooltipInstructionsMobileBody": { + "type": "String", + "placeholders": {} + }, + "@tooltipInstructionsBrowserBody": { + "type": "String", + "placeholders": {} + }, + "@chatCapacity": { + "type": "String", + "placeholders": {} + }, + "@roomFull": { + "type": "String", + "placeholders": {} + }, + "@chatCapacityHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@chatCapacitySetTooLow": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@chatCapacityExplanation": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequest": { + "type": "String", + "placeholders": {} + }, + "@enterNumber": { + "type": "String", + "placeholders": {} + }, + "@buildTranslation": { + "type": "String", + "placeholders": {} + }, + "@practice": { + "type": "String", + "placeholders": {} + }, + "@noLanguagesSet": { + "type": "String", + "placeholders": {} + }, + "@speechToTextBody": { + "type": "String", + "placeholders": {} + }, + "@versionNotFound": { + "type": "String", + "placeholders": {} + }, + "@fetchingVersion": { + "type": "String", + "placeholders": {} + }, + "@versionFetchError": { + "type": "String", + "placeholders": {} + }, + "@versionText": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + }, + "buildNumber": { + "type": "String" + } + } + }, + "@l1TranslationBody": { + "type": "String", + "placeholders": {} + }, + "@deleteSubscriptionWarningTitle": { + "type": "String", + "placeholders": {} + }, + "@deleteSubscriptionWarningBody": { + "type": "String", + "placeholders": {} + }, + "@manageSubscription": { + "type": "String", + "placeholders": {} + }, + "@error520Title": { + "type": "String", + "placeholders": {} + }, + "@error520Desc": { + "type": "String", + "placeholders": {} + }, + "@wordsUsed": { + "type": "String", + "placeholders": {} + }, + "@level": { + "type": "String", + "placeholders": {} + }, + "@morphsUsed": { + "type": "String", + "placeholders": {} + }, + "@translationChoicesBody": { + "type": "String", + "placeholders": {} + }, + "@grammar": { + "type": "String", + "placeholders": {} + }, + "@contactHasBeenInvitedToTheChat": { + "type": "String", + "placeholders": {} + }, + "@inviteChat": { + "type": "String", + "placeholders": {} + }, + "@chatName": { + "type": "String", + "placeholders": {} + }, + "@reportContentIssueTitle": { + "type": "String", + "placeholders": {} + }, + "@feedback": { + "type": "String", + "placeholders": {} + }, + "@reportContentIssueDescription": { + "type": "String", + "placeholders": {} + }, + "@clickTheWordAgainToDeselect": { + "type": "String", + "placeholders": {} + }, + "@l2SupportNa": { + "type": "String", + "placeholders": {} + }, + "@l2SupportAlpha": { + "type": "String", + "placeholders": {} + }, + "@l2SupportBeta": { + "type": "String", + "placeholders": {} + }, + "@l2SupportFull": { + "type": "String", + "placeholders": {} + }, + "@missingVoiceTitle": { + "type": "String", + "placeholders": {} + }, + "@voiceNotAvailable": { + "type": "String", + "placeholders": {} + }, + "@openVoiceSettings": { + "type": "String", + "placeholders": {} + }, + "@playAudio": { + "type": "String", + "placeholders": {} + }, + "@stop": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSsconj": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSnum": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSverb": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSaffix": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSpart": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSadj": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOScconj": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSpunct": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSadv": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSaux": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSspace": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSsym": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSdet": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSpron": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSadp": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSpropn": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSnoun": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSintj": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSx": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyGENDERfem": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPERSON2": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyMOODimp": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTTYPEqest": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyASPECTperf": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEaccnom": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEobl": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVOICEact": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTTYPEbrck": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNOUNTYPEart": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMBERsing": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyGENDERmasc": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBTYPEmod": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyADVTYPEadverbial": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyTENSEperi": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMFORMdigit": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNOUNTYPEnot_proper": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMTYPEcard": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNOUNTYPEprop": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTTYPEdash": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTTYPEyes": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTTYPEsemi": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTTYPEcomm": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyMOODcnd": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEacc": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPARTTYPEpart": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyTENSEpast": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyDEGREEsup": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTTYPEcolo": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPERSON3": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMBERplur": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPEnpr": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPEinterrogative": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOLITEinfm": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyADVTYPEtim": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOLARITYneg": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMTYPEtot": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyADVTYPEadnomial": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyASPECTprog": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyMOODsub": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBFORMcomplementive": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEnom": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyTENSEfut": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEdat": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyTENSEpres": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyGENDERneut": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPErel": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBFORMfinalEnding": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPEdem": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPREPCASEpre": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBFORMfin": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyDEGREEpos": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTTYPEquot": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBFORMger": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVOICEpass": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEgen": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyTENSEprs": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyDEFINITEdef": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMTYPEord": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEins": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBFORMinf": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBFORMaux": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMFORMlong": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEloc": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyMOODind": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyDEGREEcmp": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASErelativeCase": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTTYPEexcl": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPERSON1": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTSIDEini": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyGENDERperson": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyFOREIGNyes": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVOICEvoice": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBTYPEverbType": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSSpass": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPREPCASEprepCase": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMTYPEnumType": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNOUNTYPEnounType": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyREFLEXreflex": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPEpronType": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTSIDEpunctSide": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBFORMverbForm": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyGENDERgender": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyMOODmood": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyASPECTaspect": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTTYPEpunctType": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyTENSEtense": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyDEGREEdegree": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOLITEpolite": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyADVTYPEadvType": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMFORMnumber": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCONJTYPEconjType": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOLARITYpolarity": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEcase": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyDEFINITEdefinite": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMFORMnumForm": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPEadn": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVOCvoc": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCMPLcmpl": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyADVadv": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyMOODjus": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyGENDERcom": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyREFLEXrflx": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPARTTYPEpar": { + "type": "String", + "placeholders": {} + }, + "@grammarCopySPCspc": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyTENSEpqp": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyREFLEXref": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTTYPEnshrt": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMBERdual": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMFORMlng": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVOICEmid": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyINTRELintRel": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyINTint": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVOICEcaus": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyUnknown": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyEVIDENTevident": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMFORMnumberPsor": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyASPECThab": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEabl": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEall": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEess": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEtra": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEequ": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEdis": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEabs": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEerg": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEcau": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEben": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEtem": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCONJTYPEcoord": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyDEFINITEcons": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyDEGREEabs": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyEVIDENTfh": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyEVIDENTnfh": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyMOODopt": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyMOODadm": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyMOODdes": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyMOODnec": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyMOODpot": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyMOODprp": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyMOODqot": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMFORMword": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMFORMroman": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMFORMletter": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMTYPEmult": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMTYPEfrac": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMTYPEsets": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMTYPErange": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMTYPEdist": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMBERtri": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMBERpauc": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMBERgrpa": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMBERgrpl": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMBERinv": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPERSON0": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPERSON4": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOLITEform": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOLITEelev": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOLITEhumb": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPEemp": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPEexc": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPErcp": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPEintRelPronType": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyTENSEaor": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyTENSEeps": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyTENSEprosp": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBFORMpart": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBFORMconv": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBFORMvnoun": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVOICEantip": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVOICEcauVoice": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVOICedir": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVOICEinvVoice": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVOICErcpVoice": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOS": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyGENDER": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPERSON": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyMOOD": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTTYPE": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyASPECT": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASE": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVOICE": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNOUNTYPE": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBTYPE": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyADVTYPE": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMFORM": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMTYPE": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMBER": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyDEFINITE": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyDEGREE": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyEVIDENT": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyFOREIGN": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOLARITY": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOLITE": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPREPCASE": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPE": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTSIDE": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyREFLEX": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyTENSE": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBFORM": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCONJTYPE": { + "type": "String", + "placeholders": {} + }, + "@grammarCopySPC": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPARTTYPE": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyINTREL": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyUNKNOWN": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMBERPSOR": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSS": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyASPECTimp": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEvoc": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEcom": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEpar": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEadv": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEref": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASErel": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEsub": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEsup": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEaccdat": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCASEpre": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCONJTYPEsub": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyCONJTYPEcmp": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyDEFINITEind": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyMOODint": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNOUNTYPEcomm": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMBERPSORsing": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMBERPSORplur": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyNUMBERPSORdual": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOLARITYpos": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSSyes": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPREPCASEnpr": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPEprs": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPEint": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPEtot": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPEneg": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPEart": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPEind": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPRONTYPEintrel": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTSIDEfin": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPUNCTTYPEperi": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyREFLEXyes": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyTENSEimp": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBFORMsup": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBFORMadn": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBFORMlng": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBFORMshrt": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVERBTYPEcaus": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVOICEcau": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVOICEdir": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVOICEinv": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyVOICErcp": { + "type": "String", + "placeholders": {} + }, + "@other": { + "type": "String", + "placeholders": {} + }, + "@levelShort": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@clickBestOption": { + "type": "String", + "placeholders": {} + }, + "@completeActivitiesToUnlock": { + "type": "String", + "placeholders": {} + }, + "@noCapacityLimit": { + "type": "String", + "placeholders": {} + }, + "@downloadGroupText": { + "type": "String", + "placeholders": {} + }, + "@notificationsOn": { + "type": "String", + "placeholders": {} + }, + "@notificationsOff": { + "type": "String", + "placeholders": {} + }, + "@createChatAndInviteUsers": { + "type": "String", + "placeholders": {} + }, + "@updatedNewSpaceDescription": { + "type": "String", + "placeholders": {} + }, + "@joinWithCode": { + "type": "String", + "placeholders": {} + }, + "@enterCodeToJoin": { + "type": "String", + "placeholders": {} + }, + "@updateNow": { + "type": "String", + "placeholders": {} + }, + "@updateLater": { + "type": "String", + "placeholders": {} + }, + "@constructUseWaDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseGaDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseTaDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseUnkDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseCorITDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIgnITDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIncITDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIgnIGCDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseCorIGCDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIncIGCDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseCorPADesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIgnPADesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIncPADesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseCorWLDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIncWLDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIngWLDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseCorHWLDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIncHWLDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIgnHWLDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseCorLDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIncLDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIgnLDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseCorMDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIncMDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIgnMDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseEmojiDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseCollected": { + "type": "String", + "placeholders": {} + }, + "@constructUseNanDesc": { + "type": "String", + "placeholders": {} + }, + "@xpIntoLevel": { + "type": "String", + "placeholders": { + "currentXP": { + "type": "int" + }, + "maxXP": { + "type": "int" + } + } + }, + "@enableTTSToolName": { + "type": "String", + "placeholders": {} + }, + "@enableTTSToolDescription": { + "type": "String", + "placeholders": {} + }, + "@yourUsername": { + "type": "String", + "placeholders": {} + }, + "@yourEmail": { + "type": "String", + "placeholders": {} + }, + "@iWantToLearn": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterEmail": { + "type": "String", + "placeholders": {} + }, + "@myBaseLanguage": { + "type": "String", + "placeholders": {} + }, + "@meaningSectionHeader": { + "type": "String", + "placeholders": {} + }, + "@formSectionHeader": { + "type": "String", + "placeholders": {} + }, + "@writingExercisesTooltip": { + "type": "String", + "placeholders": {} + }, + "@listeningExercisesTooltip": { + "type": "String", + "placeholders": {} + }, + "@readingExercisesTooltip": { + "type": "String", + "placeholders": {} + }, + "@meaningNotFound": { + "type": "String", + "placeholders": {} + }, + "@chooseBaseForm": { + "type": "String", + "placeholders": {} + }, + "@notTheCodeError": { + "type": "String", + "placeholders": {} + }, + "@totalXP": { + "type": "String", + "placeholders": {} + }, + "@numLemmas": { + "type": "String", + "placeholders": {} + }, + "@numLemmasUsedCorrectly": { + "type": "String", + "placeholders": {} + }, + "@numLemmasUsedIncorrectly": { + "type": "String", + "placeholders": {} + }, + "@numLemmasSmallXP": { + "type": "String", + "placeholders": {} + }, + "@numLemmasMediumXP": { + "type": "String", + "placeholders": {} + }, + "@numLemmasLargeXP": { + "type": "String", + "placeholders": {} + }, + "@numGrammarConcepts": { + "type": "String", + "placeholders": {} + }, + "@listGrammarConcepts": { + "type": "String", + "placeholders": {} + }, + "@listGrammarConceptsUsedCorrectly": { + "type": "String", + "placeholders": {} + }, + "@listGrammarConceptsUsedIncorrectly": { + "type": "String", + "placeholders": {} + }, + "@listGrammarConceptsUseCorrectlySystemGenerated": { + "type": "String", + "placeholders": {} + }, + "@listGrammarConceptsUseIncorrectlySystemGenerated": { + "type": "String", + "placeholders": {} + }, + "@listGrammarConceptsSmallXP": { + "type": "String", + "placeholders": {} + }, + "@listGrammarConceptsMediumXP": { + "type": "String", + "placeholders": {} + }, + "@listGrammarConceptsLargeXP": { + "type": "String", + "placeholders": {} + }, + "@listGrammarConceptsHugeXP": { + "type": "String", + "placeholders": {} + }, + "@numMessagesSent": { + "type": "String", + "placeholders": {} + }, + "@numWordsTyped": { + "type": "String", + "placeholders": {} + }, + "@numCorrectChoices": { + "type": "String", + "placeholders": {} + }, + "@numIncorrectChoices": { + "type": "String", + "placeholders": {} + }, + "@commaSeparatedFile": { + "type": "String", + "placeholders": {} + }, + "@excelFile": { + "type": "String", + "placeholders": {} + }, + "@fileType": { + "type": "String", + "placeholders": {} + }, + "@download": { + "type": "String", + "placeholders": {} + }, + "@analyticsNotAvailable": { + "type": "String", + "placeholders": {} + }, + "@downloading": { + "type": "String", + "placeholders": {} + }, + "@failedFetchUserAnalytics": { + "type": "String", + "placeholders": {} + }, + "@downloadComplete": { + "type": "String", + "placeholders": {} + }, + "@whatIsTheMorphTag": { + "type": "String", + "placeholders": { + "morphologicalFeature": { + "type": "String" + }, + "wordForm": { + "type": "String" + } + } + }, + "@dataAvailable": { + "type": "String", + "placeholders": {} + }, + "@available": { + "type": "String", + "placeholders": {} + }, + "@pangeaBotIsFallible": { + "type": "String", + "placeholders": {} + }, + "@whatIsMeaning": { + "type": "String", + "placeholders": { + "lemma": { + "type": "String" + } + } + }, + "@pickAnEmoji": { + "type": "String", + "placeholders": { + "lemma": { + "type": "String" + } + } + }, + "@chooseLemmaMeaningInstructionsBody": { + "type": "String", + "placeholders": {} + }, + "@doubleClickToEdit": { + "type": "String", + "placeholders": {} + }, + "@activityPlannerTitle": { + "type": "String", + "placeholders": {} + }, + "@topicLabel": { + "type": "String", + "placeholders": {} + }, + "@topicPlaceholder": { + "type": "String", + "placeholders": {} + }, + "@modeLabel": { + "type": "String", + "placeholders": {} + }, + "@modePlaceholder": { + "type": "String", + "placeholders": {} + }, + "@learningObjectiveLabel": { + "type": "String", + "placeholders": {} + }, + "@learningObjectivePlaceholder": { + "type": "String", + "placeholders": {} + }, + "@languageOfInstructionsLabel": { + "type": "String", + "placeholders": {} + }, + "@targetLanguageLabel": { + "type": "String", + "placeholders": {} + }, + "@cefrLevelLabel": { + "type": "String", + "placeholders": {} + }, + "@generateActivitiesButton": { + "type": "String", + "placeholders": {} + }, + "@launchActivityButton": { + "type": "String", + "placeholders": {} + }, + "@image": { + "type": "String", + "placeholders": {} + }, + "@video": { + "type": "String", + "placeholders": {} + }, + "@nan": { + "type": "String", + "placeholders": {} + }, + "@activityPlannerOverviewInstructionsBody": { + "type": "String", + "placeholders": {} + }, + "@activityTitle": { + "type": "String", + "placeholders": {} + }, + "@addVocabulary": { + "type": "String", + "placeholders": {} + }, + "@instructions": { + "type": "String", + "placeholders": {} + }, + "@numberOfLearners": { + "type": "String", + "placeholders": {} + }, + "@mustBeInteger": { + "type": "String", + "placeholders": {} + }, + "@constructUsePvmDesc": { + "type": "String", + "placeholders": {} + }, + "@leaveSpaceDescription": { + "type": "String", + "placeholders": {} + }, + "@constructUseCorMmDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIncMmDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIgnMmDesc": { + "type": "String", + "placeholders": {} + }, + "@clickForMeaningActivity": { + "type": "String", + "placeholders": {} + }, + "@meaning": { + "type": "String", + "placeholders": {} + }, + "@chatWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@clickOnEmailLink": { + "type": "String", + "placeholders": {} + }, + "@dontForgetPassword": { + "type": "String", + "placeholders": {} + }, + "@enableAutocorrectToolName": { + "type": "String", + "placeholders": {} + }, + "@enableAutocorrectDescription": { + "type": "String", + "placeholders": {} + }, + "@ttsDisbledTitle": { + "type": "String", + "placeholders": {} + }, + "@ttsDisabledBody": { + "type": "String", + "placeholders": {} + }, + "@noSpaceDescriptionYet": { + "type": "String", + "placeholders": {} + }, + "@tooLargeToSend": { + "type": "String", + "placeholders": {} + }, + "@exitWithoutSaving": { + "type": "String", + "placeholders": {} + }, + "@enableAutocorrectPopupTitle": { + "type": "String", + "placeholders": {} + }, + "@enableAutocorrectPopupSteps": { + "type": "String", + "placeholders": {} + }, + "@enableAutocorrectPopupDescription": { + "type": "String", + "placeholders": {} + }, + "@downloadGboardTitle": { + "type": "String", + "placeholders": {} + }, + "@downloadGboardSteps": { + "type": "String", + "placeholders": {} + }, + "@downloadGboardDescription": { + "type": "String", + "placeholders": {} + }, + "@enableAutocorrectWarning": { + "type": "String", + "placeholders": {} + }, + "@displayName": { + "type": "String", + "placeholders": {} + }, + "@leaveRoomDescription": { + "type": "String", + "placeholders": {} + }, + "@confirmUserId": { + "type": "String", + "placeholders": {} + }, + "@startingToday": { + "type": "String", + "placeholders": {} + }, + "@oneWeekFreeTrial": { + "type": "String", + "placeholders": {} + }, + "@paidSubscriptionStarts": { + "type": "String", + "placeholders": { + "startDate": { + "type": "String" + } + } + }, + "@cancelInSubscriptionSettings": { + "type": "String", + "placeholders": {} + }, + "@cancelToAvoidCharges": { + "type": "String", + "placeholders": { + "trialEnds": { + "type": "String" + } + } + }, + "@downloadGboard": { + "type": "String", + "placeholders": {} + }, + "@autocorrectNotAvailable": { + "type": "String", + "placeholders": {} + }, + "@pleaseUpdateApp": { + "type": "String", + "placeholders": {} + }, + "@chooseEmojiInstructionsBody": { + "type": "String", + "placeholders": {} + }, + "@analyticsVocabListBody": { + "type": "String", + "placeholders": {} + }, + "@morphAnalyticsListBody": { + "type": "String", + "placeholders": {} + }, + "@knockSpaceSuccess": { + "type": "String", + "placeholders": {} + }, + "@chooseWordAudioInstructionsBody": { + "type": "String", + "placeholders": {} + }, + "@chooseMorphsInstructionsBody": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterInt": { + "type": "String", + "placeholders": {} + }, + "@home": { + "type": "String", + "placeholders": {} + }, + "@join": { + "type": "String", + "placeholders": {} + }, + "@readingAssistanceOverviewBody": { + "type": "String", + "placeholders": {} + }, + "@levelSummaryPopupTitle": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@resetInstructionTooltipsTitle": { + "type": "String", + "placeholders": {} + }, + "@resetInstructionTooltipsDesc": { + "type": "String", + "placeholders": {} + }, + "@selectForGrammar": { + "type": "String", + "placeholders": {} + }, + "@randomize": { + "type": "String", + "placeholders": {} + }, + "@clear": { + "type": "String", + "placeholders": {} + }, + "@makeYourOwnActivity": { + "type": "String", + "placeholders": {} + }, + "@featuredActivities": { + "type": "String", + "placeholders": {} + }, + "@save": { + "type": "String", + "placeholders": {} + }, + "@startChat": { + "type": "String", + "placeholders": {} + }, + "@translationProblem": { + "type": "String", + "placeholders": {} + }, + "@askToJoin": { + "type": "String", + "placeholders": {} + }, + "@emptyChatWarningTitle": { + "type": "String", + "placeholders": {} + }, + "@emptyChatWarningDesc": { + "type": "String", + "placeholders": {} + }, + "@areYouLikeMe": { + "type": "String", + "placeholders": {} + }, + "@tryAgainLater": { + "type": "String", + "placeholders": {} + }, + "@enterSpaceCode": { + "type": "String", + "placeholders": {} + }, + "@shareSpaceLink": { + "type": "String", + "placeholders": {} + }, + "@byUsingPangeaChat": { + "type": "String", + "placeholders": {} + }, + "@details": { + "type": "String", + "placeholders": {} + }, + "@languageLevelPreA1Desc": { + "type": "String", + "placeholders": {} + }, + "@languageLevelA1Desc": { + "type": "String", + "placeholders": {} + }, + "@languageLevelA2Desc": { + "type": "String", + "placeholders": {} + }, + "@languageLevelB1Desc": { + "type": "String", + "placeholders": {} + }, + "@languageLevelB2Desc": { + "type": "String", + "placeholders": {} + }, + "@languageLevelC1Desc": { + "type": "String", + "placeholders": {} + }, + "@languageLevelC2Desc": { + "type": "String", + "placeholders": {} + }, + "@newVocab": { + "type": "String", + "placeholders": {} + }, + "@newGrammar": { + "type": "String", + "placeholders": {} + }, + "@choosePracticeMode": { + "type": "String", + "placeholders": {} + }, + "@ban": { + "type": "String", + "placeholders": {} + }, + "@unban": { + "type": "String", + "placeholders": {} + }, + "@kick": { + "type": "String", + "placeholders": {} + }, + "@lemma": { + "type": "String", + "placeholders": {} + }, + "@grammarFeature": { + "type": "String", + "placeholders": {} + }, + "@grammarTag": { + "type": "String", + "placeholders": {} + }, + "@forms": { + "type": "String", + "placeholders": {} + }, + "@exampleMessages": { + "type": "String", + "placeholders": {} + }, + "@timesUsedIndependently": { + "type": "String", + "placeholders": {} + }, + "@timesUsedWithAssistance": { + "type": "String", + "placeholders": {} + }, + "@shareInviteCode": { + "type": "String", + "placeholders": { + "code": { + "type": "String" + } + } + }, + "@leaderboard": { + "type": "String", + "placeholders": {} + }, + "@skipForNow": { + "type": "String", + "placeholders": {} + }, + "@permissions": { + "type": "String", + "placeholders": {} + }, + "@spaceChildPermission": { + "type": "String", + "placeholders": {} + }, + "@addEnvironmentOverride": { + "type": "String", + "placeholders": {} + }, + "@defaultOption": { + "type": "String", + "placeholders": {} + }, + "@deleteChatDesc": { + "type": "String", + "placeholders": {} + }, + "@deleteSpaceDesc": { + "type": "String", + "placeholders": {} + }, + "@launch": { + "type": "String", + "placeholders": {} + }, + "@searchChats": { + "type": "String", + "placeholders": {} + }, + "@maxFifty": { + "type": "String", + "placeholders": {} + }, + "@configureSpace": { + "type": "String", + "placeholders": {} + }, + "@pinMessages": { + "type": "String", + "placeholders": {} + }, + "@setJoinRules": { + "type": "String", + "placeholders": {} + }, + "@changeGeneralSettings": { + "type": "String", + "placeholders": {} + }, + "@inviteOtherUsersToRoom": { + "type": "String", + "placeholders": {} + }, + "@changeTheNameOfTheSpace": { + "type": "String", + "placeholders": {} + }, + "@changeTheDescription": { + "type": "String", + "placeholders": {} + }, + "@changeThePermissions": { + "type": "String", + "placeholders": {} + }, + "@introductions": { + "type": "String", + "placeholders": {} + }, + "@announcements": { + "type": "String", + "placeholders": {} + }, + "@activities": { + "type": "String", + "placeholders": {} + }, + "@access": { + "type": "String", + "placeholders": {} + }, + "@activitySuggestionTimeoutMessage": { + "type": "String", + "placeholders": {} + }, + "@howSpaceCanBeFound": { + "type": "String", + "placeholders": {} + }, + "@private": { + "type": "String", + "placeholders": {} + }, + "@cannotBeFoundInSearch": { + "type": "String", + "placeholders": {} + }, + "@public": { + "type": "String", + "placeholders": {} + }, + "@visibleToCommunity": { + "type": "String", + "placeholders": {} + }, + "@howSpaceCanBeJoined": { + "type": "String", + "placeholders": {} + }, + "@canBeFoundVia": { + "type": "String", + "placeholders": {} + }, + "@canBeFoundViaInvitation": { + "type": "String", + "placeholders": {} + }, + "@canBeFoundViaCodeOrLink": { + "type": "String", + "placeholders": {} + }, + "@canBeFoundViaKnock": { + "type": "String", + "placeholders": {} + }, + "@youHaveLeveledUp": { + "type": "String", + "placeholders": {} + }, + "@sendActivities": { + "type": "String", + "placeholders": {} + }, + "@groupChat": { + "type": "String", + "placeholders": {} + }, + "@directMessage": { + "type": "String", + "placeholders": {} + }, + "@newDirectMessage": { + "type": "String", + "placeholders": {} + }, + "@speakingExercisesTooltip": { + "type": "String", + "placeholders": {} + }, + "@noChatsFoundHereYet": { + "type": "String", + "placeholders": {} + }, + "@duration": { + "type": "String", + "placeholders": {} + }, + "@transcriptionFailed": { + "type": "String", + "placeholders": {} + }, + "@aUserIsKnocking": { + "type": "String", + "placeholders": {} + }, + "@usersAreKnocking": { + "type": "int", + "placeholders": { + "users": { + "type": "int" + } + } + }, + "@failedToFetchTranscription": { + "type": "String", + "placeholders": {} + }, + "@deleteEmptySpaceDesc": { + "type": "String", + "placeholders": {} + }, + "@regenerate": { + "type": "String", + "placeholders": {} + }, + "@mySavedActivities": { + "type": "String", + "placeholders": {} + }, + "@noSavedActivities": { + "type": "String", + "placeholders": {} + }, + "@saveActivity": { + "type": "String", + "placeholders": {} + }, + "@failedToPlayVideo": { + "type": "String", + "placeholders": {} + }, + "@done": { + "type": "String", + "placeholders": {} + }, + "@inThisSpace": { + "type": "String", + "placeholders": {} + }, + "@myContacts": { + "type": "String", + "placeholders": {} + }, + "@inviteAllInSpace": { + "type": "String", + "placeholders": {} + }, + "@spaceParticipantsHaveBeenInvitedToTheChat": { + "type": "String", + "placeholders": {} + }, + "@numKnocking": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@numInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@saved": { + "type": "String", + "placeholders": {} + }, + "@reset": { + "type": "String", + "placeholders": {} + }, + "@errorGenerateActivityMessage": { + "type": "String", + "placeholders": {} + }, + "@errorRegenerateActivityMessage": { + "type": "String", + "placeholders": {} + }, + "@errorLaunchActivityMessage": { + "type": "String", + "placeholders": {} + }, + "@errorFetchingActivitiesMessage": { + "type": "String", + "placeholders": {} + }, + "@errorFetchingDefinition": { + "type": "String", + "placeholders": {} + }, + "@errorProcessAnalytics": { + "type": "String", + "placeholders": {} + }, + "@errorDownloading": { + "type": "String", + "placeholders": {} + }, + "@errorFetchingLevelSummary": { + "type": "String", + "placeholders": {} + }, + "@errorLoadingSpaceChildren": { + "type": "String", + "placeholders": {} + }, + "@unexpectedError": { + "type": "String", + "placeholders": {} + }, + "@pleaseReload": { + "type": "String", + "placeholders": {} + }, + "@translationError": { + "type": "String", + "placeholders": {} + }, + "@errorFetchingTranslation": { + "type": "String", + "placeholders": {} + }, + "@errorFetchingActivity": { + "type": "String", + "placeholders": {} + }, + "@check": { + "type": "String", + "placeholders": {} + }, + "@unableToFindRoom": { + "type": "String", + "placeholders": {} + }, + "@numCompletedActivities": { + "type": "String", + "placeholders": {} + }, + "@viewingAnalytics": { + "type": "String", + "placeholders": { + "visible": { + "type": "int" + }, + "users": { + "type": "int" + } + } + }, + "@request": { + "type": "String", + "placeholders": {} + }, + "@requestAll": { + "type": "String", + "placeholders": {} + }, + "@confirmMessageUnpin": { + "type": "String", + "placeholders": {} + }, + "@createActivityPlan": { + "type": "String", + "placeholders": {} + }, + "@saveAndLaunch": { + "type": "String", + "placeholders": {} + }, + "@launchToSpace": { + "type": "String", + "placeholders": {} + }, + "@numberOfActivities": { + "type": "String", + "placeholders": {} + }, + "@maximumActivityParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pending": { + "type": "String", + "placeholders": {} + }, + "@inactive": { + "type": "String", + "placeholders": {} + }, + "@confirmRole": { + "type": "String", + "placeholders": {} + }, + "@openRoleLabel": { + "type": "String", + "placeholders": {} + }, + "@joinedTheActivity": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "role": { + "type": "String" + } + } + }, + "@finishedTheActivity": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@archiveToAnalytics": { + "type": "String", + "placeholders": {} + }, + "@activitySummaryError": { + "type": "String", + "placeholders": {} + }, + "@requestSummaries": { + "type": "String", + "placeholders": {} + }, + "@generatingNewActivities": { + "type": "String", + "placeholders": {} + }, + "@requestAccessTitle": { + "type": "String", + "placeholders": {} + }, + "@requestAccessDesc": { + "type": "String", + "placeholders": {} + }, + "@requestAccess": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@analyticsInactiveTitle": { + "type": "String", + "placeholders": {} + }, + "@analyticsInactiveDesc": { + "type": "String", + "placeholders": {} + }, + "@accessRequestedTitle": { + "type": "String", + "placeholders": {} + }, + "@accessRequestedDesc": { + "type": "String", + "placeholders": { + "admin": { + "type": "String" + }, + "space": { + "type": "String" + } + } + }, + "@adminRequestedAccess": { + "type": "String", + "placeholders": {} + }, + "@lastUpdated": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@activityFinishedMessage": { + "type": "String", + "placeholders": {} + }, + "@endForAll": { + "type": "String", + "placeholders": {} + }, + "@newCourse": { + "type": "String", + "placeholders": {} + }, + "@numModules": { + "type": "int", + "placeholders": { + "num": { + "type": "int" + } + } + }, + "@coursePlan": { + "type": "String", + "placeholders": {} + }, + "@editCourseLater": { + "type": "String", + "placeholders": {} + }, + "@createCourse": { + "type": "String", + "placeholders": {} + }, + "@stats": { + "type": "String", + "placeholders": {} + }, + "@createGroupChat": { + "type": "String", + "placeholders": {} + }, + "@editCourse": { + "type": "String", + "placeholders": {} + }, + "@inviteDesc": { + "type": "String", + "placeholders": {} + }, + "@editCourseDesc": { + "type": "String", + "placeholders": {} + }, + "@permissionsDesc": { + "type": "String", + "placeholders": {} + }, + "@accessDesc": { + "type": "String", + "placeholders": {} + }, + "@createGroupChatDesc": { + "type": "String", + "placeholders": {} + }, + "@deleteDesc": { + "type": "String", + "placeholders": {} + }, + "@noCourseFound": { + "type": "String", + "placeholders": {} + }, + "@additionalParticipants": { + "type": "int", + "placeholders": { + "num": { + "type": "int" + } + } + }, + "@directMessages": { + "type": "String", + "placeholders": {} + }, + "@whatNow": { + "type": "String", + "placeholders": {} + }, + "@chooseNextActivity": { + "type": "String", + "placeholders": {} + }, + "@letsGo": { + "type": "String", + "placeholders": {} + }, + "@chooseRole": { + "type": "String", + "placeholders": {} + }, + "@chooseRoleToParticipate": { + "type": "String", + "placeholders": {} + }, + "@waitingToFillRole": { + "type": "int", + "placeholders": { + "num": { + "type": "int" + } + } + }, + "@pingParticipants": { + "type": "String", + "placeholders": {} + }, + "@playWithBot": { + "type": "String", + "placeholders": {} + }, + "@inviteFriends": { + "type": "String", + "placeholders": {} + }, + "@waitNotDone": { + "type": "String", + "placeholders": {} + }, + "@waitingForOthersToFinish": { + "type": "String", + "placeholders": {} + }, + "@generatingSummary": { + "type": "String", + "placeholders": {} + }, + "@findCourse": { + "type": "String", + "placeholders": {} + }, + "@pingParticipantsNotification": { + "type": "String", + "placeholders": { + "user": { + "type": "String" + }, + "room": { + "type": "String" + } + } + }, + "@course": { + "type": "String", + "placeholders": {} + }, + "@courses": { + "type": "String", + "placeholders": {} + }, + "@courseName": { + "type": "String", + "placeholders": {} + }, + "@createNewCourse": { + "type": "String", + "placeholders": {} + }, + "@goToCourse": { + "type": "String", + "placeholders": { + "course": {} + } + }, + "@activityComplete": { + "type": "String", + "placeholders": {} + }, + "@startNewSession": { + "type": "String", + "placeholders": {} + }, + "@joinOpenSession": { + "type": "String", + "placeholders": {} + }, + "@less": { + "type": "String", + "placeholders": {} + }, + "@activityNotFound": { + "type": "String", + "placeholders": {} + }, + "@levelUp": { + "type": "String", + "placeholders": {} + }, + "@myActivities": { + "type": "String", + "placeholders": {} + }, + "@openToJoin": { + "type": "String", + "placeholders": {} + }, + "@results": { + "type": "String", + "placeholders": {} + }, + "@activityDone": { + "type": "String", + "placeholders": {} + }, + "@promoCodeInfo": { + "type": "String", + "placeholders": {} + }, + "@editsComingSoon": { + "type": "String", + "placeholders": {} + }, + "@editing": { + "type": "String", + "placeholders": {} + }, + "@activityNeedsOneMember": { + "type": "String", + "placeholders": {} + }, + "@activityNeedsMembers": { + "type": "String", + "placeholders": { + "num": { + "type": "int" + } + } + }, + "@inviteFriendsToCourse": { + "type": "String", + "placeholders": {} + }, + "@subscribeToUnlockActivitySummaries": { + "type": "String", + "placeholders": {} + }, + "@subscribeToUnlockDefinitions": { + "type": "String", + "placeholders": {} + }, + "@subscribeToUnlockTranscriptions": { + "type": "String", + "placeholders": {} + }, + "@pingSent": { + "type": "String", + "placeholders": {} + }, + "@courseTitle": { + "type": "String", + "placeholders": {} + }, + "@courseDesc": { + "type": "String", + "placeholders": {} + }, + "@courseSavedSuccessfully": { + "type": "String", + "placeholders": {} + }, + "@addCoursePlan": { + "type": "String", + "placeholders": {} + }, + "@activityStatsButtonInstruction": { + "type": "String", + "placeholders": {} + }, + "@loginToAccount": { + "type": "String", + "placeholders": {} + }, + "@appDescription": { + "type": "String", + "placeholders": {} + }, + "@languages": { + "type": "String", + "placeholders": {} + }, + "@chooseLanguage": { + "type": "String", + "placeholders": {} + }, + "@planTrip": { + "type": "String", + "placeholders": {} + }, + "@howAreYouTraveling": { + "type": "String", + "placeholders": {} + }, + "@unlockPrivateTrip": { + "type": "String", + "placeholders": {} + }, + "@joinPublicTrip": { + "type": "String", + "placeholders": {} + }, + "@startOwnTrip": { + "type": "String", + "placeholders": {} + }, + "@tripPlanDesc": { + "type": "String", + "placeholders": {} + }, + "@unlockPrivateTripTitle": { + "type": "String", + "placeholders": {} + }, + "@browsePublicTrips": { + "type": "String", + "placeholders": {} + }, + "@startOwnTripTitle": { + "type": "String", + "placeholders": {} + }, + "@courseCode": { + "type": "String", + "placeholders": {} + }, + "@courseCodeHint": { + "type": "String", + "placeholders": {} + }, + "@unlockMyTrip": { + "type": "String", + "placeholders": {} + }, + "@signupOption": { + "type": "String", + "placeholders": {} + }, + "@withApple": { + "type": "String", + "placeholders": {} + }, + "@withGoogle": { + "type": "String", + "placeholders": {} + }, + "@withEmail": { + "type": "String", + "placeholders": {} + }, + "@createAccount": { + "type": "String", + "placeholders": {} + }, + "@loginWithEmail": { + "type": "String", + "placeholders": {} + }, + "@usernameOrEmail": { + "type": "String", + "placeholders": {} + }, + "@email": { + "type": "String", + "placeholders": {} + }, + "@forgotPassword": { + "type": "String", + "placeholders": {} + }, + "@endActivity": { + "type": "String", + "placeholders": {} + }, + "@allLanguages": { + "type": "String", + "placeholders": {} + }, + "@chatListTooltip": { + "type": "String", + "placeholders": {} + }, + "@directMessageBotTitle": { + "type": "String", + "placeholders": {} + }, + "@feedbackTitle": { + "type": "String", + "placeholders": {} + }, + "@feedbackHint": { + "type": "String", + "placeholders": {} + }, + "@feedbackButton": { + "type": "String", + "placeholders": {} + }, + "@directMessageBotDesc": { + "type": "String", + "placeholders": {} + }, + "@inviteYourFriends": { + "type": "String", + "placeholders": {} + }, + "@playWithAI": { + "type": "String", + "placeholders": {} + }, + "@courseStartDesc": { + "type": "String", + "placeholders": {} + }, + "feedbackRespDesc": "Ελέγξτε ξανά αύριο για ενημερώσεις δραστηριότητας.", + "activityDropdownDesc": "Όταν τελειώσετε με αυτή τη δραστηριότητα, κάντε κλικ παρακάτω", + "languageMismatchTitle": "Αντιφάσεις γλώσσας", + "languageMismatchDesc": "Η γλώσσα στόχος σας δεν ταιριάζει με τη γλώσσα αυτής της δραστηριότητας. Θέλετε να ενημερώσετε τη γλώσσα στόχο;", + "reportWordIssueTooltip": "Αναφορά προβλήματος με τις πληροφορίες της λέξης", + "tokenInfoFeedbackDialogTitle": "Ανατροφοδότηση Πληροφοριών Λέξης", + "noPublicCoursesFound": "Δεν βρέθηκαν δημόσια μαθήματα. Θα θέλατε να δημιουργήσετε ένα;", + "noCourseTemplatesFound": "Δεν βρήκαμε μαθήματα για τη γλώσσα στόχο σας. Μπορείτε να συνομιλήσετε με το Pangea Bot εν τω μεταξύ, και να επιστρέψετε αργότερα για περισσότερα μαθήματα.", + "botActivityJoinFailMessage": "Ο Pangea Bot καθυστερεί να απαντήσει. Παρακαλώ δοκιμάστε ξανά αργότερα, ή προσκαλέστε έναν φίλο.", + "unsubscribedResponseError": "Αυτή η λειτουργία απαιτεί συνδρομή", + "leaveDesc": "Αφήστε αυτόν τον χώρο και όλες τις συνομιλίες μέσα σε αυτόν", + "selectAll": "Επιλογή όλων", + "deselectAll": "Αποεπιλογή όλων", + "@feedbackRespDesc": { + "type": "String", + "placeholders": {} + }, + "@activityDropdownDesc": { + "type": "String", + "placeholders": {} + }, + "@languageMismatchTitle": { + "type": "String", + "placeholders": {} + }, + "@languageMismatchDesc": { + "type": "String", + "placeholders": {} + }, + "@reportWordIssueTooltip": { + "type": "String", + "placeholders": {} + }, + "@tokenInfoFeedbackDialogTitle": { + "type": "String", + "placeholders": {} + }, + "@noPublicCoursesFound": { + "type": "String", + "placeholders": {} + }, + "@noCourseTemplatesFound": { + "type": "String", + "placeholders": {} + }, + "@botActivityJoinFailMessage": { + "type": "String", + "placeholders": {} + }, + "@unsubscribedResponseError": { + "type": "String", + "placeholders": {} + }, + "@leaveDesc": { + "type": "String", + "placeholders": {} + }, + "@selectAll": { + "type": "String", + "placeholders": {} + }, + "@deselectAll": { + "type": "String", + "placeholders": {} + }, + "startOwn": "Ξεκίνα το δικό σου", + "joinCourseDesc": "Κάθε μάθημα έχει 8-10 διαδοχικά θέματα με μια σειρά δραστηριοτήτων μάθησης γλώσσας βασισμένων σε εργασίες.", + "newMessageInPangeaChat": "🔊 Νέο μήνυμα στο Pangea Chat", + "shareCourse": "Μοιράσου το μάθημα", + "addCourse": "Πρόσθεσε ένα μάθημα", + "joinPublicCourse": "Συνδεθείτε σε δημόσιο μάθημα", + "vocabLevelsDesc": "Εδώ θα προστεθούν οι λέξεις λεξιλογίου μόλις τις αναβαθμίσετε!", + "highlightVocabTooltip": "Επισημάνετε τις λέξεις-στόχους παρακάτω στέλνοντάς τες ή εξασκώντας τες στη συνομιλία", + "@startOwn": { + "type": "String", + "placeholders": {} + }, + "@joinCourseDesc": { + "type": "String", + "placeholders": {} + }, + "@newMessageInPangeaChat": { + "type": "String", + "placeholders": {} + }, + "@shareCourse": { + "type": "String", + "placeholders": {} + }, + "@addCourse": { + "type": "String", + "placeholders": {} + }, + "@joinPublicCourse": { + "type": "String", + "placeholders": {} + }, + "@vocabLevelsDesc": { + "type": "String", + "placeholders": {} + }, + "emptyChatSearch": "Δεν βρέθηκαν άμεσες μηνύματα ή συνομιλίες. Βεβαιωθείτε ότι η αναζήτησή σας είναι σωστά γραμμένη.", + "activityAnalyticsTooltipBody": "Αυτές είναι οι αποθηκευμένες δραστηριότητές σας για ανασκόπηση και πρακτική.", + "numSavedActivities": "Αριθμός αποθηκευμένων δραστηριοτήτων", + "saveActivityTitle": "Αποθήκευση δραστηριότητας", + "saveActivityDesc": "Καλή δουλειά! Αποθηκεύστε αυτή τη δραστηριότητα για μελλοντική ανασκόπηση και πρακτική", + "levelInfoTooltip": "Εδώ μπορείτε να δείτε όλους τους πόντους που έχετε κερδίσει και πώς!", + "alreadyInCourseWithID": "Είστε ήδη σε ένα μάθημα με αυτό το σχέδιο. Θέλετε να δημιουργήσετε ένα μάθημα με το ίδιο σχέδιο ή να πάτε στο υπάρχον μάθημα;", + "goToExistingCourse": "Πηγαίνετε στο υπάρχον μάθημα", + "emojiView": "Προβολή emoji", + "feedbackDialogDesc": "Κάνω λάθη κι εγώ! Οτιδήποτε μπορεί να με βοηθήσει να βελτιωθώ;", + "contactHasBeenInvitedToTheCourse": "Η επαφή έχει προσκληθεί στο μάθημα", + "activityStatsButtonTooltip": "Πληροφορίες δραστηριότητας", + "allow": "Επιτρέπω", + "deny": "Αρνούμαι", + "enabledRenewal": "Ενεργοποίηση Ανανέωσης Συνδρομής", + "subscriptionEndsOn": "Η Συνδρομή Λήγει Στις", + "subscriptionRenewsOn": "Η Συνδρομή Ανανεώνεται Στις", + "waitForSubscriptionChanges": "Οι αλλαγές στη συνδρομή σας μπορεί να χρειαστούν λίγο χρόνο για να εμφανιστούν στην εφαρμογή.", + "subscribeReadingAssistance": "Εγγραφείτε για να ξεκλειδώσετε τα εργαλεία μηνυμάτων", + "aceDisplayName": "Αχινέζικα", + "achDisplayName": "Ακόλι", + "afDisplayName": "Αφρικάανς", + "akDisplayName": "Ακάν", + "alzDisplayName": "Αλούρ", + "amDisplayName": "Αμχαρικά", + "arDisplayName": "Αραβικά", + "asDisplayName": "Ασαμέζ", + "awaDisplayName": "Αουάντι", + "ayDisplayName": "Αϊμάρα", + "azDisplayName": "Αζερικά", + "baDisplayName": "Μπασκίρ", + "banDisplayName": "Μπαλινέζικα", + "bbcDisplayName": "Μπατάκ Τόμπα", + "beDisplayName": "Λευκορωσικά", + "bemDisplayName": "Μπέμπα", + "bewDisplayName": "Μπεταβί", + "bgDisplayName": "Βουλγαρικά", + "bhoDisplayName": "Μποχτζπούρι", + "bikDisplayName": "Μπικολ", + "bmDisplayName": "Μπαμπάρα", + "bnDisplayName": "Μπενγκάλι", + "bnBDDisplayName": "Μπενγκάλι (Μπαγκλαντές)", + "bnINDisplayName": "Μπενγκάλι (Ινδία)", + "brDisplayName": "Βρετονικά", + "bsDisplayName": "Βοσνιακά", + "btsDisplayName": "Μπατάκ Σιμαλούνγκουν", + "btxDisplayName": "Μπατάκ Καρό", + "buaDisplayName": "Μπουριάτ", + "caDisplayName": "Καταλανικά", + "cebDisplayName": "Σεμπουάνο", + "cggDisplayName": "Χίγκα", + "chmDisplayName": "Μάρι", + "ckbDisplayName": "Κεντρικά Κουρδικά", + "cnhDisplayName": "Χάκα Τσιν", + "coDisplayName": "Κορσικανικά", + "crhDisplayName": "Κριμαϊκά Τουρκικά", + "crsDisplayName": "Σεσέλβα Κρεολικά Γαλλικά", + "csDisplayName": "Τσέχικα", + "cvDisplayName": "Τσουβάς", + "cyDisplayName": "Ουαλικά", + "daDisplayName": "Δανέζικα", + "deDisplayName": "Γερμανικά", + "dinDisplayName": "Ντίγκα", + "doiDisplayName": "Ντόγκρι", + "dovDisplayName": "Ντόμπε", + "dzDisplayName": "Ντζονγκκά", + "eeDisplayName": "Εβέ", + "enDisplayName": "Αγγλικά", + "enAUDisplayName": "Αγγλικά (Αυστραλία)", + "enGBDisplayName": "Αγγλικά (Ηνωμένο Βασίλειο)", + "enINDisplayName": "Αγγλικά (Ινδία)", + "enUSDisplayName": "Αγγλικά (ΗΠΑ)", + "eoDisplayName": "Εσπεράντο", + "esDisplayName": "Ισπανικά", + "esESDisplayName": "Ισπανικά (Ισπανία)", + "esMXDisplayName": "Ισπανικά (Μεξικό)", + "euDisplayName": "Βάσκικα", + "faDisplayName": "Περσικά", + "ffDisplayName": "Φουλάχ", + "fiDisplayName": "Φινλανδικά", + "filDisplayName": "Φιλιππινέζικα", + "fjDisplayName": "Φιτζιανικά", + "foDisplayName": "Φαροέζικα", + "frDisplayName": "Γαλλικά", + "frCADisplayName": "Γαλλικά (Καναδάς)", + "frFRDisplayName": "Γαλλικά (Γαλλία)", + "fyDisplayName": "Δυτικά Φριζιανά", + "gaDisplayName": "Ιρλανδικά", + "gaaDisplayName": "Γκα", + "gdDisplayName": "Σκωτικά Γαελικά", + "glDisplayName": "Γαλικιανά", + "gnDisplayName": "Γκουαρανί", + "gomDisplayName": "Γκόαν Κονκάνι", + "guDisplayName": "Γκουτζαράτι", + "haDisplayName": "Χάουσα", + "hawDisplayName": "Χαβανέζικα", + "heDisplayName": "Εβραϊκά", + "hiDisplayName": "Χίντι", + "hilDisplayName": "Χιλιγκάινον", + "hmnDisplayName": "Χμονγκ", + "hneDisplayName": "Χαττισγκάρχι", + "hrDisplayName": "Κροατικά", + "hrxDisplayName": "Χουνσρικ", + "htDisplayName": "Αϊτινός Κρεόλ", + "huDisplayName": "Ουγγρικά", + "hyDisplayName": "Αρμενικά", + "idDisplayName": "Ινδονησιακά", + "igDisplayName": "Ίγκο", + "iloDisplayName": "Ιλόκο", + "isDisplayName": "Ισλανδικά", + "itDisplayName": "Ιταλικά", + "jaDisplayName": "Ιαπωνικά", + "jvDisplayName": "Ιαβανικά", + "kaDisplayName": "Γεωργιανά", + "kkDisplayName": "Καζακικά", + "kmDisplayName": "Χμερ", + "knDisplayName": "Καννάδα", + "koDisplayName": "Κορεατικά", + "kokDisplayName": "Κονκάνι", + "kriDisplayName": "Κρίο", + "ksDisplayName": "Κασμίρι", + "ktuDisplayName": "Κιτούμπα (Δημοκρατική Δημοκρατία του Κονγκό)", + "kuDisplayName": "Κουρδικά", + "kyDisplayName": "Κιργιζικά", + "laDisplayName": "Λατινικά", + "lbDisplayName": "Λουξεμβουργιανά", + "lgDisplayName": "Γκάντα", + "liDisplayName": "Λιμβουργιανά", + "lijDisplayName": "Λιγουριανά", + "lmoDisplayName": "Λομβαρδικά", + "lnDisplayName": "Λινγκάλα", + "loDisplayName": "Λάο", + "ltDisplayName": "Λιθουανικά", + "ltgDisplayName": "Λατγαλικά", + "luoDisplayName": "Λούο (Κένυα και Τανζανία)", + "lusDisplayName": "Μίζο", + "lvDisplayName": "Λετονικά", + "maiDisplayName": "Μαϊθίλι", + "makDisplayName": "Μακασάρ", + "mgDisplayName": "Μαλαγασί", + "miDisplayName": "Μάορι", + "minDisplayName": "Μιναγκαμπάου", + "mkDisplayName": "Μακεδονικά", + "mlDisplayName": "Μαλαγιαλάμ", + "mnDisplayName": "Μογγολικά", + "mniDisplayName": "Μανιπούρι", + "mrDisplayName": "Μαραθί", + "msDisplayName": "Μαλάι", + "msArabDisplayName": "Μαλάι (Αραβικά)", + "msMYDisplayName": "Μαλάι (Μαλαισία)", + "mtDisplayName": "Μαλτέζικα", + "mwrDisplayName": "Μαραθί", + "myDisplayName": "Βιρμανικά", + "nanDisplayName": "Μιν Ναν", + "nbDisplayName": "Νορβηγικά (Μποκμάλ)", + "neDisplayName": "Νεπαλέζικα", + "newDisplayName": "Νεουαρί", + "nlDisplayName": "Ολλανδικά", + "nlBEDisplayName": "Φλαμανδικά", + "noDisplayName": "Νορβηγικά", + "nrDisplayName": "Νότιο Ντεμπέλε", + "nsoDisplayName": "Βόρειος Σόθο", + "nusDisplayName": "Νούερ", + "nyDisplayName": "Νιάντζα", + "ocDisplayName": "Οξιτανικά", + "omDisplayName": "Ορόμο", + "orDisplayName": "Οντία", + "paDisplayName": "Παντζάμπι", + "paArabDisplayName": "Παντζάμπι (Σαχμουκί)", + "paINDisplayName": "Παντζάμπι (Γκουρμούκι)", + "pagDisplayName": "Πανγκασινάν", + "pamDisplayName": "Πάμπανγκα", + "papDisplayName": "Πάπιεντο", + "plDisplayName": "Πολωνικά", + "psDisplayName": "Παστού", + "ptDisplayName": "Πορτογαλικά", + "ptBRDisplayName": "Πορτογαλικά (Βραζιλία)", + "ptPTDisplayName": "Πορτογαλικά (Πορτογαλία)", + "quDisplayName": "Κετσούα", + "rajDisplayName": "Ρατζαστάνι", + "rnDisplayName": "Ρούντι", + "roDisplayName": "Ρουμανικά", + "roMDDisplayName": "Μολδαβικά", + "romDisplayName": "Ρομά", + "ruDisplayName": "Ρωσικά", + "rwDisplayName": "Κινυαρουάντα", + "saDisplayName": "Σανσκριτικά", + "satDisplayName": "Σαντάλι", + "scnDisplayName": "Σικελικά", + "sdDisplayName": "Σιντί", + "sgDisplayName": "Σάνγκο", + "shnDisplayName": "Σαν", + "siDisplayName": "Σινχάλα", + "skDisplayName": "Σλοβακικά", + "slDisplayName": "Σλοβενικά", + "smDisplayName": "Σαμοά", + "snDisplayName": "Σόνα", + "soDisplayName": "Σομαλικά", + "sqDisplayName": "Αλβανικά", + "srDisplayName": "Σερβικά", + "srMEDisplayName": "Μαυροβούνιο", + "ssDisplayName": "Σουαχίλι", + "stDisplayName": "Νότιος Σόθο", + "suDisplayName": "Σουντανησιακά", + "svDisplayName": "Σουηδικά", + "swDisplayName": "Σουαχίλι", + "szlDisplayName": "Σιλεσιανά", + "taDisplayName": "Ταμίλ", + "teDisplayName": "Τελούγκου", + "tetDisplayName": "Τετούμ", + "tgDisplayName": "Τατζικικά", + "thDisplayName": "Ταϊλανδέζικα", + "tiDisplayName": "Τιγκρινιά", + "tkDisplayName": "Τουρκμενικά", + "tlDisplayName": "Ταγκάλογ", + "tnDisplayName": "Τσουάνα", + "trDisplayName": "Τουρκικά", + "tsDisplayName": "Τσόνγκα", + "ttDisplayName": "Τατάρ", + "ugDisplayName": "Ουιγούρο", + "ukDisplayName": "Ουκρανικά", + "urDisplayName": "Ουρντού", + "urINDisplayName": "Ουρντού (Ινδία)", + "urPKDisplayName": "Ουρντού (Πακιστάν)", + "uzDisplayName": "Ουζμπεκικά", + "viDisplayName": "Βιετναμέζικα", + "wuuDisplayName": "Γου", + "xhDisplayName": "Χόσα", + "yiDisplayName": "Γίντις", + "yoDisplayName": "Γιορούμπα", + "yuaDisplayName": "Γιουκατέκο", + "yueDisplayName": "Καντονέζικα", + "yueCNDisplayName": "Καντονέζικα (Κίνα)", + "yueHKDisplayName": "Καντονέζικα (Χονγκ Κονγκ)", + "zhDisplayName": "Κινέζικα", + "zhCNDisplayName": "Κινέζικα (Απλοποιημένα)", + "zhTWDisplayName": "Κινέζικα (Παραδοσιακά)", + "zuDisplayName": "Ζουλού", + "@emptyChatSearch": { + "type": "String", + "placeholders": {} + }, + "@activityAnalyticsTooltipBody": { + "type": "String", + "placeholders": {} + }, + "@numSavedActivities": { + "type": "String", + "placeholders": {} + }, + "@saveActivityTitle": { + "type": "String", + "placeholders": {} + }, + "@saveActivityDesc": { + "type": "String", + "placeholders": {} + }, + "@levelInfoTooltip": { + "type": "String", + "placeholders": {} + }, + "@alreadyInCourseWithID": { + "type": "String", + "placeholders": {} + }, + "@goToExistingCourse": { + "type": "String", + "placeholders": {} + }, + "@emojiView": { + "type": "String", + "placeholders": {} + }, + "@feedbackDialogDesc": { + "type": "String", + "placeholders": {} + }, + "@contactHasBeenInvitedToTheCourse": { + "type": "String", + "placeholders": {} + }, + "@activityStatsButtonTooltip": { + "type": "String", + "placeholders": {} + }, + "@allow": { + "type": "String", + "placeholders": {} + }, + "@deny": { + "type": "String", + "placeholders": {} + }, + "@enabledRenewal": { + "type": "String", + "placeholders": {} + }, + "@subscriptionEndsOn": { + "type": "String", + "placeholders": {} + }, + "@subscriptionRenewsOn": { + "type": "String", + "placeholders": {} + }, + "@waitForSubscriptionChanges": { + "type": "String", + "placeholders": {} + }, + "@subscribeReadingAssistance": { + "type": "String", + "placeholders": {} + }, + "@aceDisplayName": { + "type": "String", + "placeholders": {} + }, + "@achDisplayName": { + "type": "String", + "placeholders": {} + }, + "@afDisplayName": { + "type": "String", + "placeholders": {} + }, + "@akDisplayName": { + "type": "String", + "placeholders": {} + }, + "@alzDisplayName": { + "type": "String", + "placeholders": {} + }, + "@amDisplayName": { + "type": "String", + "placeholders": {} + }, + "@arDisplayName": { + "type": "String", + "placeholders": {} + }, + "@asDisplayName": { + "type": "String", + "placeholders": {} + }, + "@awaDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ayDisplayName": { + "type": "String", + "placeholders": {} + }, + "@azDisplayName": { + "type": "String", + "placeholders": {} + }, + "@baDisplayName": { + "type": "String", + "placeholders": {} + }, + "@banDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bbcDisplayName": { + "type": "String", + "placeholders": {} + }, + "@beDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bemDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bewDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bgDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bhoDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bikDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bmDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bnDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bnBDDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bnINDisplayName": { + "type": "String", + "placeholders": {} + }, + "@brDisplayName": { + "type": "String", + "placeholders": {} + }, + "@bsDisplayName": { + "type": "String", + "placeholders": {} + }, + "@btsDisplayName": { + "type": "String", + "placeholders": {} + }, + "@btxDisplayName": { + "type": "String", + "placeholders": {} + }, + "@buaDisplayName": { + "type": "String", + "placeholders": {} + }, + "@caDisplayName": { + "type": "String", + "placeholders": {} + }, + "@cebDisplayName": { + "type": "String", + "placeholders": {} + }, + "@cggDisplayName": { + "type": "String", + "placeholders": {} + }, + "@chmDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ckbDisplayName": { + "type": "String", + "placeholders": {} + }, + "@cnhDisplayName": { + "type": "String", + "placeholders": {} + }, + "@coDisplayName": { + "type": "String", + "placeholders": {} + }, + "@crhDisplayName": { + "type": "String", + "placeholders": {} + }, + "@crsDisplayName": { + "type": "String", + "placeholders": {} + }, + "@csDisplayName": { + "type": "String", + "placeholders": {} + }, + "@cvDisplayName": { + "type": "String", + "placeholders": {} + }, + "@cyDisplayName": { + "type": "String", + "placeholders": {} + }, + "@daDisplayName": { + "type": "String", + "placeholders": {} + }, + "@deDisplayName": { + "type": "String", + "placeholders": {} + }, + "@dinDisplayName": { + "type": "String", + "placeholders": {} + }, + "@doiDisplayName": { + "type": "String", + "placeholders": {} + }, + "@dovDisplayName": { + "type": "String", + "placeholders": {} + }, + "@dzDisplayName": { + "type": "String", + "placeholders": {} + }, + "@eeDisplayName": { + "type": "String", + "placeholders": {} + }, + "@enDisplayName": { + "type": "String", + "placeholders": {} + }, + "@enAUDisplayName": { + "type": "String", + "placeholders": {} + }, + "@enGBDisplayName": { + "type": "String", + "placeholders": {} + }, + "@enINDisplayName": { + "type": "String", + "placeholders": {} + }, + "@enUSDisplayName": { + "type": "String", + "placeholders": {} + }, + "@eoDisplayName": { + "type": "String", + "placeholders": {} + }, + "@esDisplayName": { + "type": "String", + "placeholders": {} + }, + "@esESDisplayName": { + "type": "String", + "placeholders": {} + }, + "@esMXDisplayName": { + "type": "String", + "placeholders": {} + }, + "@euDisplayName": { + "type": "String", + "placeholders": {} + }, + "@faDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ffDisplayName": { + "type": "String", + "placeholders": {} + }, + "@fiDisplayName": { + "type": "String", + "placeholders": {} + }, + "@filDisplayName": { + "type": "String", + "placeholders": {} + }, + "@fjDisplayName": { + "type": "String", + "placeholders": {} + }, + "@foDisplayName": { + "type": "String", + "placeholders": {} + }, + "@frDisplayName": { + "type": "String", + "placeholders": {} + }, + "@frCADisplayName": { + "type": "String", + "placeholders": {} + }, + "@frFRDisplayName": { + "type": "String", + "placeholders": {} + }, + "@fyDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gaDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gaaDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gdDisplayName": { + "type": "String", + "placeholders": {} + }, + "@glDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gnDisplayName": { + "type": "String", + "placeholders": {} + }, + "@gomDisplayName": { + "type": "String", + "placeholders": {} + }, + "@guDisplayName": { + "type": "String", + "placeholders": {} + }, + "@haDisplayName": { + "type": "String", + "placeholders": {} + }, + "@hawDisplayName": { + "type": "String", + "placeholders": {} + }, + "@heDisplayName": { + "type": "String", + "placeholders": {} + }, + "@hiDisplayName": { + "type": "String", + "placeholders": {} + }, + "@hilDisplayName": { + "type": "String", + "placeholders": {} + }, + "@hmnDisplayName": { + "type": "String", + "placeholders": {} + }, + "@hneDisplayName": { + "type": "String", + "placeholders": {} + }, + "@hrDisplayName": { + "type": "String", + "placeholders": {} + }, + "@hrxDisplayName": { + "type": "String", + "placeholders": {} + }, + "@htDisplayName": { + "type": "String", + "placeholders": {} + }, + "@huDisplayName": { + "type": "String", + "placeholders": {} + }, + "@hyDisplayName": { + "type": "String", + "placeholders": {} + }, + "@idDisplayName": { + "type": "String", + "placeholders": {} + }, + "@igDisplayName": { + "type": "String", + "placeholders": {} + }, + "@iloDisplayName": { + "type": "String", + "placeholders": {} + }, + "@isDisplayName": { + "type": "String", + "placeholders": {} + }, + "@itDisplayName": { + "type": "String", + "placeholders": {} + }, + "@jaDisplayName": { + "type": "String", + "placeholders": {} + }, + "@jvDisplayName": { + "type": "String", + "placeholders": {} + }, + "@kaDisplayName": { + "type": "String", + "placeholders": {} + }, + "@kkDisplayName": { + "type": "String", + "placeholders": {} + }, + "@kmDisplayName": { + "type": "String", + "placeholders": {} + }, + "@knDisplayName": { + "type": "String", + "placeholders": {} + }, + "@koDisplayName": { + "type": "String", + "placeholders": {} + }, + "@kokDisplayName": { + "type": "String", + "placeholders": {} + }, + "@kriDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ksDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ktuDisplayName": { + "type": "String", + "placeholders": {} + }, + "@kuDisplayName": { + "type": "String", + "placeholders": {} + }, + "@kyDisplayName": { + "type": "String", + "placeholders": {} + }, + "@laDisplayName": { + "type": "String", + "placeholders": {} + }, + "@lbDisplayName": { + "type": "String", + "placeholders": {} + }, + "@lgDisplayName": { + "type": "String", + "placeholders": {} + }, + "@liDisplayName": { + "type": "String", + "placeholders": {} + }, + "@lijDisplayName": { + "type": "String", + "placeholders": {} + }, + "@lmoDisplayName": { + "type": "String", + "placeholders": {} + }, + "@lnDisplayName": { + "type": "String", + "placeholders": {} + }, + "@loDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ltDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ltgDisplayName": { + "type": "String", + "placeholders": {} + }, + "@luoDisplayName": { + "type": "String", + "placeholders": {} + }, + "@lusDisplayName": { + "type": "String", + "placeholders": {} + }, + "@lvDisplayName": { + "type": "String", + "placeholders": {} + }, + "@maiDisplayName": { + "type": "String", + "placeholders": {} + }, + "@makDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mgDisplayName": { + "type": "String", + "placeholders": {} + }, + "@miDisplayName": { + "type": "String", + "placeholders": {} + }, + "@minDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mkDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mlDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mnDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mniDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mrDisplayName": { + "type": "String", + "placeholders": {} + }, + "@msDisplayName": { + "type": "String", + "placeholders": {} + }, + "@msArabDisplayName": { + "type": "String", + "placeholders": {} + }, + "@msMYDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mtDisplayName": { + "type": "String", + "placeholders": {} + }, + "@mwrDisplayName": { + "type": "String", + "placeholders": {} + }, + "@myDisplayName": { + "type": "String", + "placeholders": {} + }, + "@nanDisplayName": { + "type": "String", + "placeholders": {} + }, + "@nbDisplayName": { + "type": "String", + "placeholders": {} + }, + "@neDisplayName": { + "type": "String", + "placeholders": {} + }, + "@newDisplayName": { + "type": "String", + "placeholders": {} + }, + "@nlDisplayName": { + "type": "String", + "placeholders": {} + }, + "@nlBEDisplayName": { + "type": "String", + "placeholders": {} + }, + "@noDisplayName": { + "type": "String", + "placeholders": {} + }, + "@nrDisplayName": { + "type": "String", + "placeholders": {} + }, + "@nsoDisplayName": { + "type": "String", + "placeholders": {} + }, + "@nusDisplayName": { + "type": "String", + "placeholders": {} + }, + "@nyDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ocDisplayName": { + "type": "String", + "placeholders": {} + }, + "@omDisplayName": { + "type": "String", + "placeholders": {} + }, + "@orDisplayName": { + "type": "String", + "placeholders": {} + }, + "@paDisplayName": { + "type": "String", + "placeholders": {} + }, + "@paArabDisplayName": { + "type": "String", + "placeholders": {} + }, + "@paINDisplayName": { + "type": "String", + "placeholders": {} + }, + "@pagDisplayName": { + "type": "String", + "placeholders": {} + }, + "@pamDisplayName": { + "type": "String", + "placeholders": {} + }, + "@papDisplayName": { + "type": "String", + "placeholders": {} + }, + "@plDisplayName": { + "type": "String", + "placeholders": {} + }, + "@psDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ptDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ptBRDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ptPTDisplayName": { + "type": "String", + "placeholders": {} + }, + "@quDisplayName": { + "type": "String", + "placeholders": {} + }, + "@rajDisplayName": { + "type": "String", + "placeholders": {} + }, + "@rnDisplayName": { + "type": "String", + "placeholders": {} + }, + "@roDisplayName": { + "type": "String", + "placeholders": {} + }, + "@roMDDisplayName": { + "type": "String", + "placeholders": {} + }, + "@romDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ruDisplayName": { + "type": "String", + "placeholders": {} + }, + "@rwDisplayName": { + "type": "String", + "placeholders": {} + }, + "@saDisplayName": { + "type": "String", + "placeholders": {} + }, + "@satDisplayName": { + "type": "String", + "placeholders": {} + }, + "@scnDisplayName": { + "type": "String", + "placeholders": {} + }, + "@sdDisplayName": { + "type": "String", + "placeholders": {} + }, + "@sgDisplayName": { + "type": "String", + "placeholders": {} + }, + "@shnDisplayName": { + "type": "String", + "placeholders": {} + }, + "@siDisplayName": { + "type": "String", + "placeholders": {} + }, + "@skDisplayName": { + "type": "String", + "placeholders": {} + }, + "@slDisplayName": { + "type": "String", + "placeholders": {} + }, + "@smDisplayName": { + "type": "String", + "placeholders": {} + }, + "@snDisplayName": { + "type": "String", + "placeholders": {} + }, + "@soDisplayName": { + "type": "String", + "placeholders": {} + }, + "@sqDisplayName": { + "type": "String", + "placeholders": {} + }, + "@srDisplayName": { + "type": "String", + "placeholders": {} + }, + "@srMEDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ssDisplayName": { + "type": "String", + "placeholders": {} + }, + "@stDisplayName": { + "type": "String", + "placeholders": {} + }, + "@suDisplayName": { + "type": "String", + "placeholders": {} + }, + "@svDisplayName": { + "type": "String", + "placeholders": {} + }, + "@swDisplayName": { + "type": "String", + "placeholders": {} + }, + "@szlDisplayName": { + "type": "String", + "placeholders": {} + }, + "@taDisplayName": { + "type": "String", + "placeholders": {} + }, + "@teDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tetDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tgDisplayName": { + "type": "String", + "placeholders": {} + }, + "@thDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tiDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tkDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tlDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tnDisplayName": { + "type": "String", + "placeholders": {} + }, + "@trDisplayName": { + "type": "String", + "placeholders": {} + }, + "@tsDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ttDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ugDisplayName": { + "type": "String", + "placeholders": {} + }, + "@ukDisplayName": { + "type": "String", + "placeholders": {} + }, + "@urDisplayName": { + "type": "String", + "placeholders": {} + }, + "@urINDisplayName": { + "type": "String", + "placeholders": {} + }, + "@urPKDisplayName": { + "type": "String", + "placeholders": {} + }, + "@uzDisplayName": { + "type": "String", + "placeholders": {} + }, + "@viDisplayName": { + "type": "String", + "placeholders": {} + }, + "@wuuDisplayName": { + "type": "String", + "placeholders": {} + }, + "@xhDisplayName": { + "type": "String", + "placeholders": {} + }, + "@yiDisplayName": { + "type": "String", + "placeholders": {} + }, + "@yoDisplayName": { + "type": "String", + "placeholders": {} + }, + "@yuaDisplayName": { + "type": "String", + "placeholders": {} + }, + "@yueDisplayName": { + "type": "String", + "placeholders": {} + }, + "@yueCNDisplayName": { + "type": "String", + "placeholders": {} + }, + "@yueHKDisplayName": { + "type": "String", + "placeholders": {} + }, + "@zhDisplayName": { + "type": "String", + "placeholders": {} + }, + "@zhCNDisplayName": { + "type": "String", + "placeholders": {} + }, + "@zhTWDisplayName": { + "type": "String", + "placeholders": {} + }, + "@zuDisplayName": { + "type": "String", + "placeholders": {} + }, + "teacherModeTitle": "Λειτουργία Δασκάλου", + "teacherModeDesc": "Εναλλαγή για να ξεκλειδώσετε όλα τα θέματα και τις δραστηριότητες. Μόνο για διαχειριστές μαθημάτων.", + "@teacherModeTitle": { + "type": "String", + "placeholders": {} + }, + "@teacherModeDesc": { + "type": "String", + "placeholders": {} + }, + "failedToLoadFeedback": "Αποτυχία φόρτωσης ανατροφοδότησης.", + "unreadPlus": "99+", + "noSavedActivitiesYet": "Οι δραστηριότητες θα εμφανιστούν εδώ μόλις ολοκληρωθούν και αποθηκευτούν.", + "@failedToLoadFeedback": { + "type": "String", + "placeholders": {} + }, + "@unreadPlus": { + "type": "String", + "placeholders": {} + }, + "@noSavedActivitiesYet": { + "type": "String", + "placeholders": {} + }, + "changeCourse": "Αλλαγή μαθήματος", + "changeCourseDesc": "Εδώ μπορείτε να αλλάξετε το σχέδιο μαθήματος αυτού του μαθήματος.", + "@changeCourse": { + "type": "String", + "placeholders": {} + }, + "@changeCourseDesc": { + "type": "String", + "placeholders": {} + }, + "practiceActivityCompleted": "Η δραστηριότητα πρακτικής ολοκληρώθηκε", + "@practiceActivityCompleted": { + "type": "String", + "placeholders": {} + }, + "introChatTitle": "Δημιουργία Συνομιλίας Εισαγωγών", + "introChatDesc": "Οποιοσδήποτε στον χώρο μπορεί να δημοσιεύσει.", + "announcementsChatTitle": "Συνομιλία Ανακοινώσεων", + "announcementsChatDesc": "Μόνο ο διαχειριστής του χώρου μπορεί να δημοσιεύσει.", + "@introChatTitle": { + "type": "String", + "placeholders": {} + }, + "@introChatDesc": { + "type": "String", + "placeholders": {} + }, + "@announcementsChatTitle": { + "type": "String", + "placeholders": {} + }, + "@announcementsChatDesc": { + "type": "String", + "placeholders": {} + }, + "notStartedActivitiesTitle": "Ανοιχτές συνεδρίες ({num})", + "inProgressActivitiesTitle": "Γίνεται τώρα ({num})", + "completedActivitiesTitle": "Ολοκληρώθηκε ({num})", + "pickDifferentActivity": "Επιλέξτε μια διαφορετική δραστηριότητα", + "inOngoingActivity": "Έχετε μια τρέχουσα δραστηριότητα!", + "@notStartedActivitiesTitle": { + "type": "String", + "placeholders": { + "num": { + "type": "int" + } + } + }, + "@inProgressActivitiesTitle": { + "type": "String", + "placeholders": { + "num": { + "type": "int" + } + } + }, + "@completedActivitiesTitle": { + "type": "String", + "placeholders": { + "num": { + "type": "int" + } + } + }, + "@pickDifferentActivity": { + "type": "String", + "placeholders": {} + }, + "messageLanguageMismatchMessage": "Η γλώσσα στόχου σας δεν ταιριάζει με αυτό το μήνυμα. Θέλετε να ενημερώσετε τη γλώσσα στόχου σας;", + "@messageLanguageMismatchMessage": { + "type": "String", + "placeholders": {} + }, + "courseParticipantTooltip": "Αυτοί είναι όλοι σε αυτό το μάθημα. Κάντε κλικ στο avatar οποιουδήποτε χρήστη και \"ξεκινήστε συνομιλία\" για να στείλετε ένα DM.", + "@courseParticipantTooltip": { + "type": "String", + "placeholders": {} + }, + "blockLemmaConfirmation": "Αυτή η λέξη λεξιλογίου θα αφαιρεθεί μόνιμα από την ανάλυσή σας", + "woman": "Γυναίκα", + "man": "Άνδρας", + "otherGender": "Άλλο", + "unselectedGender": "Επιλέξτε μια επιλογή φύλου", + "gender": "Φύλο", + "chatParticipantTooltip": "Αυτοί είναι όλοι σε αυτή τη συνομιλία. Κάντε κλικ στο avatar οποιουδήποτε χρήστη και \"ξεκινήστε συνομιλία\" για να στείλετε ένα DM.", + "@blockLemmaConfirmation": { + "type": "String", + "placeholders": {} + }, + "@woman": { + "type": "String", + "placeholders": {} + }, + "@man": { + "type": "String", + "placeholders": {} + }, + "@otherGender": { + "type": "String", + "placeholders": {} + }, + "@unselectedGender": { + "type": "String", + "placeholders": {} + }, + "@gender": { + "type": "String", + "placeholders": {} + }, + "@chatParticipantTooltip": { + "type": "String", + "placeholders": {} + }, + "@inOngoingActivity": { + "type": "String", + "placeholders": {} + }, + "modeDisabled": "Τα εργαλεία μάθησης είναι απενεργοποιημένα για μηνύματα που δεν είναι στη γλώσσα στόχου σας.", + "vocabEmoji": "Εικόνισμα λεξιλογίου", + "@modeDisabled": { + "type": "String", + "placeholders": {} + }, + "@vocabEmoji": { + "type": "String", + "placeholders": {} + }, + "requestRegeneration": "Αίτημα αναγέννησης", + "optionalRegenerateReason": "(Προαιρετικό) Λόγος", + "@requestRegeneration": { + "type": "String", + "placeholders": {} + }, + "@optionalRegenerateReason": { + "type": "String", + "placeholders": {} + }, + "emojiSelectedSnackbar": "Έχετε ορίσει το emoji για {lemma}! Θα χρησιμοποιήσουμε αυτό το emoji για να εκπροσωπήσουμε τη λέξη σε πρακτικές δραστηριότητες στο εξής.", + "@emojiSelectedSnackbar": { + "type": "String", + "placeholders": { + "lemma": { + "type": "String" + } + } + }, + "ssoDialogTitle": "Περιμένοντας την ολοκλήρωση της σύνδεσης", + "ssoDialogDesc": "Ανοίξαμε μια νέα καρτέλα ώστε να μπορέσετε να συνδεθείτε με ασφάλεια.", + "ssoDialogHelpText": "🤔 Αν δεν είδατε τη νέα καρτέλα, παρακαλώ ελέγξτε τον αποκλειστή αναδυόμενων παραθύρων σας.", + "@ssoDialogTitle": { + "type": "String", + "placeholders": {} + }, + "@ssoDialogDesc": { + "type": "String", + "placeholders": {} + }, + "@ssoDialogHelpText": { + "type": "String", + "placeholders": {} + }, + "disableLanguageToolsTitle": "Απενεργοποίηση εργαλείων γλώσσας", + "disableLanguageToolsDesc": "Θα θέλατε να απενεργοποιήσετε την αυτόματη βοήθεια γλώσσας;", + "@disableLanguageToolsTitle": { + "type": "String", + "placeholders": {} + }, + "@disableLanguageToolsDesc": { + "type": "String", + "placeholders": {} + }, + "recordingPermissionDenied": "Η άδεια απορρίφθηκε. Ενεργοποιήστε τις άδειες εγγραφής για να καταγράψετε ηχητικά μηνύματα.", + "genericWebRecordingError": "Κάτι πήγε στραβά. Συνιστούμε να χρησιμοποιείτε τον περιηγητή Chrome κατά την εγγραφή μηνυμάτων.", + "@recordingPermissionDenied": { + "type": "String", + "placeholders": {} + }, + "@genericWebRecordingError": { + "type": "String", + "placeholders": {} + }, + "screenSizeWarning": "Για την καλύτερη εμπειρία χρήσης αυτής της εφαρμογής, παρακαλώ επεκτείνετε το μέγεθος της οθόνης σας.", + "@screenSizeWarning": { + "type": "String", + "placeholders": {} + }, + "activitiesToUnlockTopicTitle": "Δραστηριότητες για Ξεκλείδωμα Επόμενου Θέματος", + "activitiesToUnlockTopicDesc": "Ορίστε τον αριθμό των δραστηριοτήτων για να ξεκλειδώσετε το επόμενο θέμα του μαθήματος", + "@activitiesToUnlockTopicTitle": { + "type": "String", + "placeholders": {} + }, + "@activitiesToUnlockTopicDesc": { + "type": "String", + "placeholders": {} + }, + "constructUseCorLMDesc": "Διόρθωση πρακτικής ορισμού λεξιλογίου", + "constructUseIncLMDesc": "Λάθος πρακτική ορισμού λεξιλογίου", + "constructUseCorLADesc": "Διόρθωση πρακτικής ήχου λεξιλογίου", + "constructUseIncLADesc": "Λάθος πρακτική ήχου λεξιλογίου", + "constructUseBonus": "Μπόνους κατά τη διάρκεια της πρακτικής λεξιλογίου", + "practiceVocab": "Πρακτική λεξιλογίου", + "selectMeaning": "Επιλέξτε την έννοια", + "selectAudio": "Επιλέξτε τον αντίστοιχο ήχο", + "congratulations": "Συγχαρητήρια!", + "anotherRound": "Μια ακόμη γύρος", + "noActivityRequest": "Δεν υπάρχει τρέχουσα αίτηση δραστηριότητας.", + "quit": "Έξοδος", + "congratulationsYouveCompletedPractice": "Συγχαρητήρια! Έχετε ολοκληρώσει την πρακτική συνεδρία.", + "mustHave10Words": "Πρέπει να έχετε τουλάχιστον 10 λέξεις λεξιλογίου για να τις εξασκήσετε. Δοκιμάστε να μιλήσετε με έναν φίλο ή με τον Pangea Bot για να ανακαλύψετε περισσότερα!", + "botSettings": "Ρυθμίσεις Bot", + "activitySettingsOverrideWarning": "Η γλώσσα και το επίπεδο γλώσσας καθορίζονται από το σχέδιο δραστηριότητας", + "voice": "Φωνή", + "@constructUseCorLMDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIncLMDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseCorLADesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIncLADesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseBonus": { + "type": "String", + "placeholders": {} + }, + "@practiceVocab": { + "type": "String", + "placeholders": {} + }, + "@selectMeaning": { + "type": "String", + "placeholders": {} + }, + "@selectAudio": { + "type": "String", + "placeholders": {} + }, + "@congratulations": { + "type": "String", + "placeholders": {} + }, + "@anotherRound": { + "type": "String", + "placeholders": {} + }, + "@noActivityRequest": { + "type": "String", + "placeholders": {} + }, + "@quit": { + "type": "String", + "placeholders": {} + }, + "@congratulationsYouveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "@mustHave10Words": { + "type": "String", + "placeholders": {} + }, + "@botSettings": { + "type": "String", + "placeholders": {} + }, + "@activitySettingsOverrideWarning": { + "type": "String", + "placeholders": {} + }, + "@voice": { + "type": "String", + "placeholders": {} + }, + "youLeftTheChat": "🚪 Αφήσατε τη συνομιλία", + "@youLeftTheChat": { + "type": "String", + "placeholders": {} + }, + "downloadInitiated": "Η λήψη ξεκίνησε", + "webDownloadPermissionMessage": "Εάν ο περιηγητής σας μπλοκάρει τις λήψεις, παρακαλώ ενεργοποιήστε τις λήψεις για αυτόν τον ιστότοπο.", + "@downloadInitiated": { + "type": "String", + "placeholders": {} + }, + "@webDownloadPermissionMessage": { + "type": "String", + "placeholders": {} + }, + "exitPractice": "Η πρόοδος της συνεδρίας πρακτικής σας δεν θα αποθηκευτεί.", + "practiceGrammar": "Πρακτική γραμματικής", + "notEnoughToPractice": "Στείλτε περισσότερα μηνύματα για να ξεκλειδώσετε την πρακτική", + "constructUseCorGCDesc": "Πρακτική κατηγορίας σωστής γραμματικής", + "constructUseIncGCDesc": "Πρακτική κατηγορίας λανθαστής γραμματικής", + "@exitPractice": { + "type": "String", + "placeholders": {} + }, + "@practiceGrammar": { + "type": "String", + "placeholders": {} + }, + "@notEnoughToPractice": { + "type": "String", + "placeholders": {} + }, + "@constructUseCorGCDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIncGCDesc": { + "type": "String", + "placeholders": {} + }, + "constructUseCorGEDesc": "Πρακτική διόρθωσης γραμματικών λαθών", + "constructUseIncGEDesc": "Πρακτική λανθασμένων γραμματικών λαθών", + "fillInBlank": "Συμπληρώστε το κενό με τη σωστή επιλογή", + "learn": "Μάθετε", + "languageUpdated": "Η γλώσσα στόχος ενημερώθηκε!", + "@constructUseCorGEDesc": { + "type": "String", + "placeholders": {} + }, + "@constructUseIncGEDesc": { + "type": "String", + "placeholders": {} + }, + "@fillInBlank": { + "type": "String", + "placeholders": {} + }, + "@learn": { + "type": "String", + "placeholders": {} + }, + "@languageUpdated": { + "type": "String", + "placeholders": {} + }, + "voiceDropdownTitle": "Φωνή Pangea Bot", + "@voiceDropdownTitle": { + "type": "String", + "placeholders": {} + }, + "knockDesc": "Το αίτημά σας έχει σταλεί στον διαχειριστή του μαθήματος! Θα σας επιτρέψουν να μπείτε αν το εγκρίνουν.", + "@knockDesc": { + "type": "String", + "placeholders": {} + }, + "joinSpaceOnboardingDesc": "Έχετε έναν κωδικό πρόσκλησης ή σύνδεσμο για ένα δημόσιο μάθημα;", + "welcomeUser": "Καλώς ήρθατε {user}", + "@joinSpaceOnboardingDesc": { + "type": "String", + "placeholders": {} + }, + "@welcomeUser": { + "type": "String", + "placeholders": { + "user": { + "type": "String" + } + } + }, + "publicInviteDescChat": "Αναζητήστε χρήστες για να τους προσκαλέσετε σε αυτήν την συνομιλία.", + "publicInviteDescSpace": "Αναζητήστε χρήστες για να τους προσκαλέσετε σε αυτόν τον χώρο.", + "@publicInviteDescChat": { + "type": "String", + "placeholders": {} + }, + "@publicInviteDescSpace": { + "type": "String", + "placeholders": {} + }, + "enableNotificationsTitle": "Η Pangea Chat είναι μια εφαρμογή μηνυμάτων, οπότε οι ειδοποιήσεις είναι σημαντικές!", + "enableNotificationsDesc": "Επιτρέψτε τις ειδοποιήσεις", + "@enableNotificationsTitle": { + "type": "String", + "placeholders": {} + }, + "@enableNotificationsDesc": { + "type": "String", + "placeholders": {} + }, + "useActivityImageAsChatBackground": "Χρησιμοποιήστε την εικόνα δραστηριότητας ως φόντο συνομιλίας", + "@useActivityImageAsChatBackground": { + "type": "String", + "placeholders": {} + }, + "chatWithSupport": "Συνομιλία με Υποστήριξη", + "@chatWithSupport": { + "type": "String", + "placeholders": {} + }, + "newCourseAccess": "Από προεπιλογή, τα μαθήματα είναι δημόσια αναζητήσιμα και απαιτούν έγκριση διαχειριστή για να συμμετάσχετε. Μπορείτε να επεξεργαστείτε αυτές τις ρυθμίσεις οποιαδήποτε στιγμή.", + "@newCourseAccess": { + "type": "String", + "placeholders": {} + }, + "onboardingLanguagesTitle": "Ποια γλώσσα μαθαίνετε;", + "searchLanguagesHint": "Αναζητήστε γλώσσες στόχου", + "@onboardingLanguagesTitle": { + "type": "String", + "placeholders": {} + }, + "@searchLanguagesHint": { + "type": "String", + "placeholders": {} + }, + "supportSubtitle": "Ερωτήσεις; Είμαστε εδώ για να βοηθήσουμε!", + "@supportSubtitle": { + "type": "String", + "placeholders": {} + }, + "courseLoadingError": "Κάτι πήγε στραβά και εργαζόμαστε σκληρά για να το διορθώσουμε. Έλεγξε ξανά αργότερα.", + "@courseLoadingError": { + "type": "String", + "placeholders": {} + }, + "autoIGCToolName": "Ενεργοποίηση βοήθειας γραφής", + "autoIGCToolDescription": "Αυτόματα εκτελέστε τα εργαλεία Pangea Chat για να διορθώσετε τα αποσταλμένα μηνύματα στη γλώσσα στόχο.", + "@autoIGCToolName": { + "type": "String", + "placeholders": {} + }, + "@autoIGCToolDescription": { + "type": "String", + "placeholders": {} + }, + "emptyAudioError": "Η ηχογράφηση απέτυχε. Παρακαλώ ελέγξτε τις άδειες ήχου σας και δοκιμάστε ξανά.", + "@emptyAudioError": { + "type": "String", + "placeholders": {} + }, + "grammarCopyPOSidiom": "Ιδιωματισμός", + "grammarCopyPOSphrasalv": "Φραστικό Ρήμα", + "grammarCopyPOScompn": "Σύνθετο", + "@grammarCopyPOSidiom": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOSphrasalv": { + "type": "String", + "placeholders": {} + }, + "@grammarCopyPOScompn": { + "type": "String", + "placeholders": {} } - }, - "publicInviteDescChat": "Αναζητήστε χρήστες για να τους προσκαλέσετε σε αυτήν την συνομιλία.", - "publicInviteDescSpace": "Αναζητήστε χρήστες για να τους προσκαλέσετε σε αυτόν τον χώρο.", - "@publicInviteDescChat": { - "type": "String", - "placeholders": {} - }, - "@publicInviteDescSpace": { - "type": "String", - "placeholders": {} - }, - "enableNotificationsTitle": "Η Pangea Chat είναι μια εφαρμογή μηνυμάτων, οπότε οι ειδοποιήσεις είναι σημαντικές!", - "enableNotificationsDesc": "Επιτρέψτε τις ειδοποιήσεις", - "@enableNotificationsTitle": { - "type": "String", - "placeholders": {} - }, - "@enableNotificationsDesc": { - "type": "String", - "placeholders": {} - }, - "useActivityImageAsChatBackground": "Χρησιμοποιήστε την εικόνα δραστηριότητας ως φόντο συνομιλίας", - "@useActivityImageAsChatBackground": { - "type": "String", - "placeholders": {} - }, - "chatWithSupport": "Συνομιλία με Υποστήριξη", - "@chatWithSupport": { - "type": "String", - "placeholders": {} - }, - "newCourseAccess": "Από προεπιλογή, τα μαθήματα είναι δημόσια αναζητήσιμα και απαιτούν έγκριση διαχειριστή για να συμμετάσχετε. Μπορείτε να επεξεργαστείτε αυτές τις ρυθμίσεις οποιαδήποτε στιγμή.", - "@newCourseAccess": { - "type": "String", - "placeholders": {} - }, - "onboardingLanguagesTitle": "Ποια γλώσσα μαθαίνετε;", - "searchLanguagesHint": "Αναζητήστε γλώσσες στόχου", - "@onboardingLanguagesTitle": { - "type": "String", - "placeholders": {} - }, - "@searchLanguagesHint": { - "type": "String", - "placeholders": {} - }, - "supportSubtitle": "Ερωτήσεις; Είμαστε εδώ για να βοηθήσουμε!", - "@supportSubtitle": { - "type": "String", - "placeholders": {} - }, - "courseLoadingError": "Κάτι πήγε στραβά και εργαζόμαστε σκληρά για να το διορθώσουμε. Έλεγξε ξανά αργότερα.", - "@courseLoadingError": { - "type": "String", - "placeholders": {} - }, - "autoIGCToolName": "Ενεργοποίηση βοήθειας γραφής", - "autoIGCToolDescription": "Αυτόματα εκτελέστε τα εργαλεία Pangea Chat για να διορθώσετε τα αποσταλμένα μηνύματα στη γλώσσα στόχο.", - "@autoIGCToolName": { - "type": "String", - "placeholders": {} - }, - "@autoIGCToolDescription": { - "type": "String", - "placeholders": {} - }, - "emptyAudioError": "Η ηχογράφηση απέτυχε. Παρακαλώ ελέγξτε τις άδειες ήχου σας και δοκιμάστε ξανά.", - "@emptyAudioError": { - "type": "String", - "placeholders": {} - }, - "grammarCopyPOSidiom": "Ιδιωματισμός", - "grammarCopyPOSphrasalv": "Φραστικό Ρήμα", - "grammarCopyPOScompn": "Σύνθετο", - "@grammarCopyPOSidiom": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOSphrasalv": { - "type": "String", - "placeholders": {} - }, - "@grammarCopyPOScompn": { - "type": "String", - "placeholders": {} - } } diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 7d072ea2b..24c2f695a 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -5277,8 +5277,6 @@ "genericWebRecordingError": "Something went wrong. We recommend using the Chrome browser when recording messages.", "screenSizeWarning": "For the best experience using this application, please expand your screen size.", "noActivityRequest": "No current activity request.", - "quit": "Quit", - "congratulationsYouveCompletedPractice": "Congratulations! You've completed the practice session.", "activitiesToUnlockTopicTitle": "Activities to Unlock Next Topic", "activitiesToUnlockTopicDesc": "Set the number of activities to unlock the next course topic", "mustHave10Words": "You must have at least 10 vocab words to practice them. Try talking to a friend or Pangea Bot to discover more!", @@ -5323,5 +5321,25 @@ "supportSubtitle": "Questions? We're here to help!", "autoIGCToolName": "Enable writing assistance", "autoIGCToolDescription": "Automatically run Pangea Chat tools to correct sent messages to target language.", + "emptyAudioError": "Recording failed. Please check your audio permissions and try again.", + "spanTypeGrammar": "Grammar", + "spanTypeWordChoice": "Word Choice", + "spanTypeSpelling": "Spelling", + "spanTypePunctuation": "Punctuation", + "spanTypeStyle": "Style", + "spanTypeFluency": "Fluency", + "spanTypeAccents": "Accents", + "spanTypeCapitalization": "Capitalization", + "spanTypeCorrection": "Correction", + "spanFeedbackTitle": "Report correction issue", + "selectAllWords": "Select all the words you hear in the audio", + "aboutMeHint": "About me", + "changeEmail": "Change email", + "withTheseAddressesDescription": "With these email addresses you can log in, recover your password, and manage subscriptions.", + "noAddressDescription": "You have not added any email addresses yet.", + "perfectPractice": "Perfect practice!", + "greatPractice": "Great practice!", + "usedNoHints": "Nice job not using any hints!", + "youveCompletedPractice": "You've completed practice, keep it up to get better!", "emptyAudioError": "Recording failed. Please check your audio permissions and try again." } diff --git a/lib/l10n/intl_eo.arb b/lib/l10n/intl_eo.arb index 34458ad3b..15fa29b49 100644 --- a/lib/l10n/intl_eo.arb +++ b/lib/l10n/intl_eo.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-08-14 12:41:10.107750", + "@@last_modified": "2026-02-09 15:32:34.842172", "about": "Prio", "@about": { "type": "String", @@ -11815,8 +11815,6 @@ "congratulations": "Gratulon!", "anotherRound": "Alia rundo", "noActivityRequest": "Neniu aktuala aktivitecpeticio.", - "quit": "Eliri", - "congratulationsYouveCompletedPractice": "Gratulojn! Vi kompletigis la praktikadon.", "mustHave10Words": "Vi devas havi almenaŭ 10 vortojn por praktiki ilin. Provu paroli kun amiko aŭ Pangea Bot por malkovri pli!", "botSettings": "Botaj Agordoj", "activitySettingsOverrideWarning": "Lingvo kaj lingvonivelo determinita de la aktiviteca plano", @@ -11865,14 +11863,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -12048,6 +12038,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Pri mi", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Phrasal Verb", "grammarCopyPOScompn": "Kunmetita", @@ -12062,5 +12057,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Perfekta praktiko!", + "greatPractice": "Granda praktiko!", + "usedNoHints": "Bonega laboro ne uzi iujn sugestojn!", + "youveCompletedPractice": "Vi finis la praktikon, daŭrigu por pliboniĝi!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Ŝanĝi retpoŝton", + "withTheseAddressesDescription": "Kun ĉi tiuj retpoŝtaj adresoj vi povas ensaluti, rekuperi vian pasvorton, kaj administri abonojn.", + "noAddressDescription": "Vi ankoraŭ ne aldonis iujn retpoŝtajn adresojn.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramatiko", + "spanTypeWordChoice": "Vortelekto", + "spanTypeSpelling": "Ortografio", + "spanTypePunctuation": "Punkto", + "spanTypeStyle": "Stilo", + "spanTypeFluency": "Flueco", + "spanTypeAccents": "Akcentoj", + "spanTypeCapitalization": "Kapitaligo", + "spanTypeCorrection": "Korektado", + "spanFeedbackTitle": "Raporti korektadon", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_es.arb b/lib/l10n/intl_es.arb index bf2e1f9e0..c7c555256 100644 --- a/lib/l10n/intl_es.arb +++ b/lib/l10n/intl_es.arb @@ -1,6 +1,6 @@ { "@@locale": "es", - "@@last_modified": "2021-08-14 12:41:10.097243", + "@@last_modified": "2026-02-09 15:30:33.438936", "about": "Acerca de", "@about": { "type": "String", @@ -8010,8 +8010,6 @@ "congratulations": "¡Felicidades!", "anotherRound": "Otra ronda", "noActivityRequest": "No hay solicitudes de actividad actuales.", - "quit": "Salir", - "congratulationsYouveCompletedPractice": "¡Felicidades! Has completado la sesión de práctica.", "mustHave10Words": "Debes tener al menos 10 palabras de vocabulario para practicarlas. ¡Intenta hablar con un amigo o con Pangea Bot para descubrir más!", "botSettings": "Configuración del Bot", "activitySettingsOverrideWarning": "Idioma y nivel de idioma determinados por el plan de actividad", @@ -8060,14 +8058,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -8243,6 +8233,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Acerca de mí", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Modismo", "grammarCopyPOSphrasalv": "Verbo Frasal", "grammarCopyPOScompn": "Compuesto", @@ -8257,5 +8252,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "¡Práctica perfecta!", + "greatPractice": "¡Gran práctica!", + "usedNoHints": "¡Buen trabajo no usando ninguna pista!", + "youveCompletedPractice": "¡Has completado la práctica, sigue así para mejorar!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Cambiar correo electrónico", + "withTheseAddressesDescription": "Con estas direcciones de correo electrónico puedes iniciar sesión, recuperar tu contraseña y gestionar suscripciones.", + "noAddressDescription": "Aún no has añadido ninguna dirección de correo electrónico.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramática", + "spanTypeWordChoice": "Elección de palabras", + "spanTypeSpelling": "Ortografía", + "spanTypePunctuation": "Puntuación", + "spanTypeStyle": "Estilo", + "spanTypeFluency": "Fluidez", + "spanTypeAccents": "Acentos", + "spanTypeCapitalization": "Capitalización", + "spanTypeCorrection": "Corrección", + "spanFeedbackTitle": "Informar problema de corrección", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_et.arb b/lib/l10n/intl_et.arb index d0e981d64..2b99b3818 100644 --- a/lib/l10n/intl_et.arb +++ b/lib/l10n/intl_et.arb @@ -1,6 +1,6 @@ { "@@locale": "et", - "@@last_modified": "2021-08-14 12:41:10.079944", + "@@last_modified": "2026-02-09 15:31:13.687328", "about": "Rakenduse teave", "@about": { "type": "String", @@ -11133,8 +11133,6 @@ "congratulations": "Palju õnne!", "anotherRound": "Veel üks voor", "noActivityRequest": "Praegu ei ole aktiivsuse taotlust.", - "quit": "Välju", - "congratulationsYouveCompletedPractice": "Palju õnne! Olete lõpetanud harjut seansi.", "mustHave10Words": "Te peate omama vähemalt 10 sõnavara sõna, et neid harjutada. Proovige rääkida sõbraga või Pangea Botiga, et rohkem avastada!", "botSettings": "Boti seaded", "activitySettingsOverrideWarning": "Keele ja keele taseme määrab tegevusplaan", @@ -11183,14 +11181,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11366,6 +11356,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Minust", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idioom", "grammarCopyPOSphrasalv": "Fraasi Verb", "grammarCopyPOScompn": "Kompleks", @@ -11380,5 +11375,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Täiuslik harjutamine!", + "greatPractice": "Suurepärane harjutamine!", + "usedNoHints": "Hea töö, et ei kasutanud mingeid vihjeid!", + "youveCompletedPractice": "Oled harjutamise lõpetanud, jätka samas vaimus, et paremaks saada!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Muuda e-posti", + "withTheseAddressesDescription": "Nende e-posti aadressidega saad sisse logida, oma parooli taastada ja tellimusi hallata.", + "noAddressDescription": "Sa ei ole veel ühtegi e-posti aadressi lisanud.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Grammatika", + "spanTypeWordChoice": "Sõnavalik", + "spanTypeSpelling": "Õigekiri", + "spanTypePunctuation": "Interpunktsioon", + "spanTypeStyle": "Stiil", + "spanTypeFluency": "Sujuvus", + "spanTypeAccents": "Aksendid", + "spanTypeCapitalization": "Suurtähed", + "spanTypeCorrection": "Parandus", + "spanFeedbackTitle": "Teata paranduse probleemist", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_eu.arb b/lib/l10n/intl_eu.arb index 189c010c6..d2e9994a2 100644 --- a/lib/l10n/intl_eu.arb +++ b/lib/l10n/intl_eu.arb @@ -1,6 +1,6 @@ { "@@locale": "eu", - "@@last_modified": "2021-08-14 12:41:10.062383", + "@@last_modified": "2026-02-09 15:31:08.773071", "about": "Honi buruz", "@about": { "type": "String", @@ -10845,8 +10845,6 @@ "congratulations": "Zorionak!", "anotherRound": "Beste txanda bat", "noActivityRequest": "Ez dago egungo jarduera eskaerarik.", - "quit": "Irten", - "congratulationsYouveCompletedPractice": "Zorionak! Praktika saioa amaitu duzu.", "mustHave10Words": "Gutxienez 10 hiztegi hitz izan behar dituzu praktikan jartzeko. Saiatu lagun batekin edo Pangea Bot-ekin hitz egiten gehiago ezagutzeko!", "botSettings": "Botaren Ezarpenak", "activitySettingsOverrideWarning": "Jarduera planak zehaztutako hizkuntza eta hizkuntza maila", @@ -10895,14 +10893,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11078,6 +11068,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Niri buruz", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Phrasal Verb", "grammarCopyPOScompn": "Konposatu", @@ -11092,5 +11087,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Praktika perfektua!", + "greatPractice": "Praktika handia!", + "usedNoHints": "Lan ona, ez duzu inolako iradokizunik erabili!", + "youveCompletedPractice": "Praktika amaitu duzu, jarraitu horrela hobetzeko!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Aldatu posta elektronikoa", + "withTheseAddressesDescription": "Posta elektroniko helbide hauekin saioa hasi dezakezu, zure pasahitza berreskuratu eta harpidetzak kudeatu.", + "noAddressDescription": "Oraindik ez duzu posta elektroniko helbiderik gehitu.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramatika", + "spanTypeWordChoice": "Hitz Aukera", + "spanTypeSpelling": "Ortografia", + "spanTypePunctuation": "Puntuazioa", + "spanTypeStyle": "Estiloa", + "spanTypeFluency": "Fluentzia", + "spanTypeAccents": "Azentuak", + "spanTypeCapitalization": "Kapitalizazioa", + "spanTypeCorrection": "Zuzenketa", + "spanFeedbackTitle": "Zuzenketa arazoa txostenatu", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_fa.arb b/lib/l10n/intl_fa.arb index 405cf8b4a..331585120 100644 --- a/lib/l10n/intl_fa.arb +++ b/lib/l10n/intl_fa.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-08-14 12:41:10.061080", + "@@last_modified": "2026-02-09 15:32:19.749220", "repeatPassword": "تکرار گذرواژه", "@repeatPassword": {}, "about": "درباره", @@ -10718,8 +10718,6 @@ "congratulations": "تبریک می‌گویم!", "anotherRound": "یک دور دیگر", "noActivityRequest": "درخواست فعالیت فعلی وجود ندارد.", - "quit": "خروج", - "congratulationsYouveCompletedPractice": "تبریک! شما جلسه تمرین را کامل کرده‌اید.", "mustHave10Words": "شما باید حداقل 10 کلمه واژگان برای تمرین داشته باشید. سعی کنید با یک دوست یا ربات پانژیا صحبت کنید تا بیشتر کشف کنید!", "botSettings": "تنظیمات ربات", "activitySettingsOverrideWarning": "زبان و سطح زبان تعیین شده توسط برنامه فعالیت", @@ -10768,14 +10766,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -10951,6 +10941,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "درباره من", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "اصطلاح", "grammarCopyPOSphrasalv": "فعل عبارتی", "grammarCopyPOScompn": "ترکیب", @@ -10965,5 +10960,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "تمرین عالی!", + "greatPractice": "تمرین فوق‌العاده!", + "usedNoHints": "کار خوبی کردید که از هیچ راهنمایی استفاده نکردید!", + "youveCompletedPractice": "شما تمرین را کامل کردید، ادامه دهید تا بهتر شوید!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "تغییر ایمیل", + "withTheseAddressesDescription": "با این آدرس‌های ایمیل می‌توانید وارد شوید، رمز عبور خود را بازیابی کنید و اشتراک‌ها را مدیریت کنید.", + "noAddressDescription": "شما هنوز هیچ آدرس ایمیلی اضافه نکرده‌اید.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "قواعد", + "spanTypeWordChoice": "انتخاب واژه", + "spanTypeSpelling": "هجی", + "spanTypePunctuation": "نقطه‌گذاری", + "spanTypeStyle": "سبک", + "spanTypeFluency": "روانی", + "spanTypeAccents": "لهجه‌ها", + "spanTypeCapitalization": "حروف بزرگ", + "spanTypeCorrection": "تصحیح", + "spanFeedbackTitle": "گزارش مشکل تصحیح", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_fil.arb b/lib/l10n/intl_fil.arb index 936f6845a..dc6dc3774 100644 --- a/lib/l10n/intl_fil.arb +++ b/lib/l10n/intl_fil.arb @@ -2783,7 +2783,7 @@ "selectAll": "Piliin lahat", "deselectAll": "Huwag piliin lahat", "@@locale": "fil", - "@@last_modified": "2026-02-05 10:09:53.428313", + "@@last_modified": "2026-02-09 15:31:47.672143", "@setCustomPermissionLevel": { "type": "String", "placeholders": {} @@ -11702,8 +11702,6 @@ "congratulations": "Binabati kita!", "anotherRound": "Isa pang round", "noActivityRequest": "Walang kasalukuyang kahilingan sa aktibidad.", - "quit": "Lumabas", - "congratulationsYouveCompletedPractice": "Binabati kita! Natapos mo na ang sesyon ng pagsasanay.", "mustHave10Words": "Dapat mayroon kang hindi bababa sa 10 salita ng bokabularyo upang sanayin ang mga ito. Subukan mong makipag-usap sa isang kaibigan o sa Pangea Bot upang matuklasan pa!", "botSettings": "Mga Setting ng Bot", "activitySettingsOverrideWarning": "Wika at antas ng wika na tinutukoy ng plano ng aktibidad", @@ -11752,14 +11750,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11935,6 +11925,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Tungkol sa akin", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idyoma", "grammarCopyPOSphrasalv": "Phrasal Verb", "grammarCopyPOScompn": "Pinagsama", @@ -11949,5 +11944,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Perpektong pagsasanay!", + "greatPractice": "Mahusay na pagsasanay!", + "usedNoHints": "Magandang trabaho sa hindi paggamit ng anumang mga pahiwatig!", + "youveCompletedPractice": "Natapos mo na ang pagsasanay, ipagpatuloy mo lang ito upang maging mas mahusay!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Palitan ang email", + "withTheseAddressesDescription": "Sa mga email address na ito, maaari kang mag-log in, i-recover ang iyong password, at pamahalaan ang mga subscription.", + "noAddressDescription": "Wala ka pang naidagdag na anumang email address.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Balarila", + "spanTypeWordChoice": "Pagpili ng Salita", + "spanTypeSpelling": "Pagbaybay", + "spanTypePunctuation": "Bantas", + "spanTypeStyle": "Estilo", + "spanTypeFluency": "Kadaluyan", + "spanTypeAccents": "Mga Tono", + "spanTypeCapitalization": "Pagkakapital", + "spanTypeCorrection": "Pagwawasto", + "spanFeedbackTitle": "Iulat ang isyu sa pagwawasto", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index dd54a616f..adce6e7c9 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -1,6 +1,6 @@ { "@@locale": "fr", - "@@last_modified": "2021-08-14 12:41:10.051787", + "@@last_modified": "2026-02-09 15:32:46.273653", "about": "À propos", "@about": { "type": "String", @@ -11013,8 +11013,6 @@ "congratulations": "Félicitations !", "anotherRound": "Un autre tour", "noActivityRequest": "Aucune demande d'activité en cours.", - "quit": "Quitter", - "congratulationsYouveCompletedPractice": "Félicitations ! Vous avez terminé la session de pratique.", "mustHave10Words": "Vous devez avoir au moins 10 mots de vocabulaire à pratiquer. Essayez de parler à un ami ou au Pangea Bot pour en découvrir plus !", "botSettings": "Paramètres du bot", "activitySettingsOverrideWarning": "Langue et niveau de langue déterminés par le plan d'activité", @@ -11063,14 +11061,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11246,6 +11236,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "À propos de moi", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Verbe à particule", "grammarCopyPOScompn": "Composé", @@ -11260,5 +11255,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Pratique parfaite !", + "greatPractice": "Super pratique !", + "usedNoHints": "Bien joué de ne pas avoir utilisé d'indices !", + "youveCompletedPractice": "Vous avez terminé la pratique, continuez comme ça pour vous améliorer !", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Changer l'email", + "withTheseAddressesDescription": "Avec ces adresses email, vous pouvez vous connecter, récupérer votre mot de passe et gérer vos abonnements.", + "noAddressDescription": "Vous n'avez pas encore ajouté d'adresses email.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Grammaire", + "spanTypeWordChoice": "Choix des mots", + "spanTypeSpelling": "Orthographe", + "spanTypePunctuation": "Ponctuation", + "spanTypeStyle": "Style", + "spanTypeFluency": "Fluidité", + "spanTypeAccents": "Accents", + "spanTypeCapitalization": "Capitalisation", + "spanTypeCorrection": "Correction", + "spanFeedbackTitle": "Signaler un problème de correction", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_ga.arb b/lib/l10n/intl_ga.arb index 2774e2fbb..7de1b2a89 100644 --- a/lib/l10n/intl_ga.arb +++ b/lib/l10n/intl_ga.arb @@ -4639,7 +4639,7 @@ "playWithAI": "Imir le AI faoi láthair", "courseStartDesc": "Tá Bot Pangea réidh chun dul am ar bith!\n\n...ach is fearr foghlaim le cairde!", "@@locale": "ga", - "@@last_modified": "2026-02-05 10:10:23.901035", + "@@last_modified": "2026-02-09 15:32:44.231605", "@writeAMessageLangCodes": { "type": "String", "placeholders": { @@ -10852,8 +10852,6 @@ "congratulations": "Comhghairdeas!", "anotherRound": "Ciorcal eile", "noActivityRequest": "Níl aon iarratas gníomhaíochta reatha.", - "quit": "Dícheangail", - "congratulationsYouveCompletedPractice": "Comhghairdeas! Tá an seisiún cleachtaidh críochnaithe agat.", "mustHave10Words": "Caithfidh go mbeidh 10 focal le haghaidh cleachtaidh agat ar a laghad. Bain triail as labhairt le cara nó le Pangea Bot chun tuilleadh a fháil amach!", "botSettings": "Socruithe an Bhot", "activitySettingsOverrideWarning": "Teanga agus leibhéal teanga a chinneadh de réir plean gníomhaíochta", @@ -10902,14 +10900,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11085,6 +11075,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Fúm", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Frása", "grammarCopyPOSphrasalv": "Gníomhhacht Phrásúil", "grammarCopyPOScompn": "Comhoibriú", @@ -11099,5 +11094,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Cleachtadh foirfe!", + "greatPractice": "Cleachtadh iontach!", + "usedNoHints": "Obair mhaith gan aon leideanna a úsáid!", + "youveCompletedPractice": "Tá do chleachtadh críochnaithe, coinnigh ort chun feabhsú!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Athraigh an ríomhphost", + "withTheseAddressesDescription": "Leis na seoltaí ríomhphoist seo, is féidir leat logáil isteach, do phasfhocal a chur ar ais, agus síntiúis a bhainistiú.", + "noAddressDescription": "Níl aon seoltaí ríomhphoist curtha leis fós.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramadach", + "spanTypeWordChoice": "Rogha Focal", + "spanTypeSpelling": "Litriú", + "spanTypePunctuation": "Póntú", + "spanTypeStyle": "Stíl", + "spanTypeFluency": "Sreabhadh", + "spanTypeAccents": "Guthanna", + "spanTypeCapitalization": "Caipitleadh", + "spanTypeCorrection": "Córas", + "spanFeedbackTitle": "Tuairisc a dhéanamh ar fhadhb le ceartú", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_gl.arb b/lib/l10n/intl_gl.arb index da6d806b2..ae12b0870 100644 --- a/lib/l10n/intl_gl.arb +++ b/lib/l10n/intl_gl.arb @@ -1,6 +1,6 @@ { "@@locale": "gl", - "@@last_modified": "2021-08-14 12:41:10.040321", + "@@last_modified": "2026-02-09 15:30:36.091824", "about": "Acerca de", "@about": { "type": "String", @@ -10845,8 +10845,6 @@ "congratulations": "Parabéns!", "anotherRound": "Outra ronda", "noActivityRequest": "Non hai solicitudes de actividade actuais.", - "quit": "Saír", - "congratulationsYouveCompletedPractice": "Parabéns! Completaches a sesión de práctica.", "mustHave10Words": "Debes ter polo menos 10 palabras de vocabulario para practicálas. Intenta falar cun amigo ou co Pangea Bot para descubrir máis!", "botSettings": "Configuración do Bot", "activitySettingsOverrideWarning": "Idioma e nivel de idioma determinados polo plan de actividade", @@ -10895,14 +10893,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11078,6 +11068,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Sobre min", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Verbo Frasal", "grammarCopyPOScompn": "Composto", @@ -11092,5 +11087,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Práctica perfecta!", + "greatPractice": "Gran práctica!", + "usedNoHints": "Bo traballo sen usar pistas!", + "youveCompletedPractice": "Completaches a práctica, segue así para mellorar!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Cambiar correo electrónico", + "withTheseAddressesDescription": "Con estes enderezos de correo electrónico podes iniciar sesión, recuperar a túa contrasinal e xestionar subscricións.", + "noAddressDescription": "Non engadiches ningún enderezo de correo electrónico aínda.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramática", + "spanTypeWordChoice": "Escolma de Palabras", + "spanTypeSpelling": "Ortografía", + "spanTypePunctuation": "Pontuación", + "spanTypeStyle": "Estilo", + "spanTypeFluency": "Fluidez", + "spanTypeAccents": "Acentos", + "spanTypeCapitalization": "Capitalización", + "spanTypeCorrection": "Corrección", + "spanFeedbackTitle": "Informar de problemas de corrección", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_he.arb b/lib/l10n/intl_he.arb index c2b597739..5264fb2cb 100644 --- a/lib/l10n/intl_he.arb +++ b/lib/l10n/intl_he.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-08-14 12:41:10.036931", + "@@last_modified": "2026-02-09 15:31:01.183623", "about": "אודות", "@about": { "type": "String", @@ -11775,8 +11775,6 @@ "congratulations": "מזל טוב!", "anotherRound": "סיבוב נוסף", "noActivityRequest": "אין בקשת פעילות נוכחית.", - "quit": "צא", - "congratulationsYouveCompletedPractice": "מזל טוב! סיימת את מושב האימון.", "mustHave10Words": "עליך שיהיו לפחות 10 מילים לאוצר מילים כדי לתרגל אותן. נסה לדבר עם חבר או עם פנגיאה בוט כדי לגלות עוד!", "botSettings": "הגדרות בוט", "activitySettingsOverrideWarning": "שפה ורמת שפה נקבעות על ידי תוכנית הפעילות", @@ -11825,14 +11823,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -12008,6 +11998,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "עליי", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "ביטוי", "grammarCopyPOSphrasalv": "פועל פיזי", "grammarCopyPOScompn": "מורכב", @@ -12022,5 +12017,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "תרגול מושלם!", + "greatPractice": "תרגול נהדר!", + "usedNoHints": "עבודה טובה שלא השתמשת ברמזים!", + "youveCompletedPractice": "סיימת את התרגול, המשך כך כדי להשתפר!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "שנה דוא\"ל", + "withTheseAddressesDescription": "עם כתובות הדוא\"ל הללו אתה יכול להתחבר, לשחזר את הסיסמה שלך ולנהל מנויים.", + "noAddressDescription": "עדיין לא הוספת כתובות דוא\"ל.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "דקדוק", + "spanTypeWordChoice": "בחירת מילים", + "spanTypeSpelling": "איות", + "spanTypePunctuation": "פיסוק", + "spanTypeStyle": "סגנון", + "spanTypeFluency": "שפה רהוטה", + "spanTypeAccents": "הטעמה", + "spanTypeCapitalization": "הגדלת אותיות", + "spanTypeCorrection": "תיקון", + "spanFeedbackTitle": "דווח על בעיית תיקון", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_hi.arb b/lib/l10n/intl_hi.arb index 29d11dccd..32e26d17c 100644 --- a/lib/l10n/intl_hi.arb +++ b/lib/l10n/intl_hi.arb @@ -3999,7 +3999,7 @@ "playWithAI": "अभी के लिए एआई के साथ खेलें", "courseStartDesc": "पैंजिया बॉट कभी भी जाने के लिए तैयार है!\n\n...लेकिन दोस्तों के साथ सीखना बेहतर है!", "@@locale": "hi", - "@@last_modified": "2026-02-05 10:10:16.696075", + "@@last_modified": "2026-02-09 15:32:32.199640", "@alwaysUse24HourFormat": { "type": "String", "placeholders": {} @@ -11339,8 +11339,6 @@ "congratulations": "बधाई हो!", "anotherRound": "एक और राउंड", "noActivityRequest": "कोई वर्तमान गतिविधि अनुरोध नहीं है।", - "quit": "बंद करें", - "congratulationsYouveCompletedPractice": "बधाई हो! आपने अभ्यास सत्र पूरा कर लिया है।", "mustHave10Words": "आपके पास उन्हें अभ्यास करने के लिए कम से कम 10 शब्द होने चाहिए। अधिक जानने के लिए किसी मित्र या Pangea Bot से बात करने की कोशिश करें!", "botSettings": "बॉट सेटिंग्स", "activitySettingsOverrideWarning": "भाषा और भाषा स्तर गतिविधि योजना द्वारा निर्धारित किया गया है", @@ -11389,14 +11387,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11572,6 +11562,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "मेरे बारे में", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "मुहावरा", "grammarCopyPOSphrasalv": "फ्रेज़ल वर्ब", "grammarCopyPOScompn": "संयुक्त", @@ -11586,5 +11581,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "संपूर्ण अभ्यास!", + "greatPractice": "महान अभ्यास!", + "usedNoHints": "कोई संकेत न उपयोग करने के लिए अच्छा काम!", + "youveCompletedPractice": "आपने अभ्यास पूरा कर लिया है, बेहतर होने के लिए इसे जारी रखें!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "ईमेल बदलें", + "withTheseAddressesDescription": "इन ईमेल पतों के साथ आप लॉग इन कर सकते हैं, अपना पासवर्ड पुनर्प्राप्त कर सकते हैं, और सब्सक्रिप्शन प्रबंधित कर सकते हैं।", + "noAddressDescription": "आपने अभी तक कोई ईमेल पता नहीं जोड़ा है।", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "व्याकरण", + "spanTypeWordChoice": "शब्द चयन", + "spanTypeSpelling": "वर्तनी", + "spanTypePunctuation": "विराम चिह्न", + "spanTypeStyle": "शैली", + "spanTypeFluency": "धाराप्रवाहता", + "spanTypeAccents": "उच्चारण", + "spanTypeCapitalization": "बड़े अक्षर", + "spanTypeCorrection": "सुधार", + "spanFeedbackTitle": "सुधार समस्या की रिपोर्ट करें", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_hr.arb b/lib/l10n/intl_hr.arb index 981ee13a5..f8ad07e6e 100644 --- a/lib/l10n/intl_hr.arb +++ b/lib/l10n/intl_hr.arb @@ -1,6 +1,6 @@ { "@@locale": "hr", - "@@last_modified": "2021-08-14 12:41:10.025984", + "@@last_modified": "2026-02-09 15:30:58.744003", "about": "Informacije", "@about": { "type": "String", @@ -11085,8 +11085,6 @@ "congratulations": "Čestitamo!", "anotherRound": "Još jedan krug", "noActivityRequest": "Nema trenutnog zahtjeva za aktivnost.", - "quit": "Izlaz", - "congratulationsYouveCompletedPractice": "Čestitamo! Završili ste sesiju vježbanja.", "mustHave10Words": "Morate imati najmanje 10 riječi za vokabular kako biste ih vježbali. Pokušajte razgovarati s prijateljem ili Pangea Botom kako biste otkrili više!", "botSettings": "Postavke Bota", "activitySettingsOverrideWarning": "Jezik i razina jezika određeni planom aktivnosti", @@ -11135,14 +11133,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11318,6 +11308,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "O meni", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Phrasalni Glagol", "grammarCopyPOScompn": "Složenica", @@ -11332,5 +11327,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Savršena praksa!", + "greatPractice": "Sjajna praksa!", + "usedNoHints": "Odlično, niste koristili nikakve savjete!", + "youveCompletedPractice": "Završili ste praksu, nastavite tako da postanete bolji!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Promijeni email", + "withTheseAddressesDescription": "S ovim email adresama možete se prijaviti, oporaviti svoju lozinku i upravljati pretplatama.", + "noAddressDescription": "Još niste dodali nijednu email adresu.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramatika", + "spanTypeWordChoice": "Odabir riječi", + "spanTypeSpelling": "Pravopis", + "spanTypePunctuation": "Interpunkcija", + "spanTypeStyle": "Stil", + "spanTypeFluency": "Tečnost", + "spanTypeAccents": "Naglasci", + "spanTypeCapitalization": "Velika slova", + "spanTypeCorrection": "Ispravak", + "spanFeedbackTitle": "Prijavi problem s ispravkom", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_hu.arb b/lib/l10n/intl_hu.arb index 759df6a6c..1af2c3966 100644 --- a/lib/l10n/intl_hu.arb +++ b/lib/l10n/intl_hu.arb @@ -1,6 +1,6 @@ { "@@locale": "hu", - "@@last_modified": "2021-08-14 12:41:10.016566", + "@@last_modified": "2026-02-09 15:30:44.809310", "about": "Névjegy", "@about": { "type": "String", @@ -10729,8 +10729,6 @@ "congratulations": "Gratulálunk!", "anotherRound": "Még egy kör", "noActivityRequest": "Jelenleg nincs aktivitás kérés.", - "quit": "Kilépés", - "congratulationsYouveCompletedPractice": "Gratulálunk! Befejezted a gyakorló ülést.", "mustHave10Words": "Legalább 10 szókincsszót kellene gyakorolnod. Próbálj meg beszélni egy baráttal vagy a Pangea Bot-tal, hogy többet felfedezhess!", "botSettings": "Bot beállítások", "activitySettingsOverrideWarning": "A nyelvet és a nyelvi szintet az aktivitási terv határozza meg", @@ -10779,14 +10777,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -10962,6 +10952,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Rólam", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idióma", "grammarCopyPOSphrasalv": "Frazális ige", "grammarCopyPOScompn": "Összetett", @@ -10976,5 +10971,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Tökéletes gyakorlás!", + "greatPractice": "Nagyszerű gyakorlás!", + "usedNoHints": "Jó munka, hogy nem használtál semmilyen tippet!", + "youveCompletedPractice": "Befejezted a gyakorlást, folytasd így, hogy jobb legyél!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Email cím módosítása", + "withTheseAddressesDescription": "Ezekkel az email címekkel be tudsz jelentkezni, vissza tudod állítani a jelszavadat, és kezelni tudod az előfizetéseket.", + "noAddressDescription": "Még nem adtál hozzá email címeket.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Nyelvtan", + "spanTypeWordChoice": "Szóválasztás", + "spanTypeSpelling": "Helyesírás", + "spanTypePunctuation": "Írásjelek", + "spanTypeStyle": "Stílus", + "spanTypeFluency": "Folyékonyság", + "spanTypeAccents": "Akcentusok", + "spanTypeCapitalization": "Nagybetűs írás", + "spanTypeCorrection": "Javítás", + "spanFeedbackTitle": "Javítási probléma jelentése", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_ia.arb b/lib/l10n/intl_ia.arb index 263e1aad3..cc34e5549 100644 --- a/lib/l10n/intl_ia.arb +++ b/lib/l10n/intl_ia.arb @@ -1954,7 +1954,7 @@ "playWithAI": "Joca con le IA pro ora", "courseStartDesc": "Pangea Bot es preste a comenzar a qualunque momento!\n\n...ma apprender es melior con amicos!", "@@locale": "ia", - "@@last_modified": "2026-02-05 10:09:29.962506", + "@@last_modified": "2026-02-09 15:31:03.556297", "@alwaysUse24HourFormat": { "type": "String", "placeholders": {} @@ -11804,8 +11804,6 @@ "congratulations": "Gratulon!", "anotherRound": "Alia rundo", "noActivityRequest": "Ninguna solicitud de actividad actual.", - "quit": "Salir", - "congratulationsYouveCompletedPractice": "¡Felicidades! Has completado la sesión de práctica.", "mustHave10Words": "Debes tener al menos 10 palabras de vocabulario para practicarlas. ¡Intenta hablar con un amigo o con Pangea Bot para descubrir más!", "botSettings": "Configuraciones del Bot", "activitySettingsOverrideWarning": "Idioma y nivel de idioma determinados por el plan de actividad", @@ -11854,14 +11852,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -12037,6 +12027,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Despre mine", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Verbo Phrasal", "grammarCopyPOScompn": "Compuesto", @@ -12051,5 +12046,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Praktiko perfekta!", + "greatPractice": "Praktiko granda!", + "usedNoHints": "Bonega laboro ne uzante iujn indikojn!", + "youveCompletedPractice": "Vi finis la praktikon, daŭrigu por pliboniĝi!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Cambia email", + "withTheseAddressesDescription": "Con estas direcciones de correo electrónico puedes iniciar sesión, recuperar tu contraseña y gestionar suscripciones.", + "noAddressDescription": "Aún no has añadido ninguna dirección de correo electrónico.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramatika", + "spanTypeWordChoice": "Escolha de Palavras", + "spanTypeSpelling": "Ortografia", + "spanTypePunctuation": "Pontuação", + "spanTypeStyle": "Estilo", + "spanTypeFluency": "Fluência", + "spanTypeAccents": "Acentos", + "spanTypeCapitalization": "Capitalização", + "spanTypeCorrection": "Correção", + "spanFeedbackTitle": "Relatar problema de correção", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_id.arb b/lib/l10n/intl_id.arb index 1d89a51d2..8da69060b 100644 --- a/lib/l10n/intl_id.arb +++ b/lib/l10n/intl_id.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-08-14 12:41:10.002360", + "@@last_modified": "2026-02-09 15:30:47.056945", "setAsCanonicalAlias": "Atur sebagai alias utama", "@setAsCanonicalAlias": { "type": "String", @@ -10728,8 +10728,6 @@ "congratulations": "Selamat!", "anotherRound": "Putaran lain", "noActivityRequest": "Tidak ada permintaan aktivitas saat ini.", - "quit": "Keluar", - "congratulationsYouveCompletedPractice": "Selamat! Anda telah menyelesaikan sesi latihan.", "mustHave10Words": "Anda harus memiliki setidaknya 10 kata kosakata untuk berlatih. Cobalah berbicara dengan teman atau Pangea Bot untuk menemukan lebih banyak!", "botSettings": "Pengaturan Bot", "activitySettingsOverrideWarning": "Bahasa dan tingkat bahasa ditentukan oleh rencana aktivitas", @@ -10778,14 +10776,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -10961,6 +10951,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Tentang saya", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Kata Kerja Phrasal", "grammarCopyPOScompn": "Kombinasi", @@ -10975,5 +10970,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Latihan yang sempurna!", + "greatPractice": "Latihan yang hebat!", + "usedNoHints": "Kerja bagus tidak menggunakan petunjuk!", + "youveCompletedPractice": "Anda telah menyelesaikan latihan, teruskan untuk menjadi lebih baik!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Ubah email", + "withTheseAddressesDescription": "Dengan alamat email ini, Anda dapat masuk, memulihkan kata sandi Anda, dan mengelola langganan.", + "noAddressDescription": "Anda belum menambahkan alamat email apapun.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Tata Bahasa", + "spanTypeWordChoice": "Pilihan Kata", + "spanTypeSpelling": "Ejaan", + "spanTypePunctuation": "Tanda Baca", + "spanTypeStyle": "Gaya", + "spanTypeFluency": "Kefasihan", + "spanTypeAccents": "Aksen", + "spanTypeCapitalization": "Kapitalisasi", + "spanTypeCorrection": "Koreksi", + "spanFeedbackTitle": "Laporkan masalah koreksi", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_ie.arb b/lib/l10n/intl_ie.arb index 4a77ef272..b36e2ba3c 100644 --- a/lib/l10n/intl_ie.arb +++ b/lib/l10n/intl_ie.arb @@ -4000,7 +4000,7 @@ "playWithAI": "Joca con AI pro ora", "courseStartDesc": "Pangea Bot es preste a partir a qualunque momento!\n\n...ma apprender es melior con amicos!", "@@locale": "ie", - "@@last_modified": "2026-02-05 10:09:26.195275", + "@@last_modified": "2026-02-09 15:30:55.872849", "@alwaysUse24HourFormat": { "type": "String", "placeholders": {} @@ -11340,8 +11340,6 @@ "congratulations": "Gratulon!", "anotherRound": "Alia rundo", "noActivityRequest": "Ninguna solicitud de actividad actual.", - "quit": "Salir", - "congratulationsYouveCompletedPractice": "¡Felicidades! Has completado la sesión de práctica.", "mustHave10Words": "Debes tener al menos 10 palabras de vocabulario para practicarlas. ¡Intenta hablar con un amigo o con Pangea Bot para descubrir más!", "botSettings": "Configuración del Bot", "activitySettingsOverrideWarning": "Idioma y nivel de idioma determinados por el plan de actividad", @@ -11390,14 +11388,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11573,6 +11563,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Faoi m'ainm", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Phrasal Verb", "grammarCopyPOScompn": "Composé", @@ -11587,5 +11582,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Praktika perfekt!", + "greatPractice": "Praktika granda!", + "usedNoHints": "Bonega laboro ne uzante iujn indicojn!", + "youveCompletedPractice": "Vi kompletigis la praktikon, daŭrigu por pliboniĝi!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Mudara e-posta", + "withTheseAddressesDescription": "Izi e-posta adresleri ile giriş yapabilir, şifrenizi kurtarabilir ve aboneliklerinizi yönetebilirsiniz.", + "noAddressDescription": "Henüz herhangi bir e-posta adresi eklemediniz.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramatica", + "spanTypeWordChoice": "Elección de palabras", + "spanTypeSpelling": "Ortografía", + "spanTypePunctuation": "Puntuación", + "spanTypeStyle": "Estilo", + "spanTypeFluency": "Fluidez", + "spanTypeAccents": "Acentos", + "spanTypeCapitalization": "Capitalización", + "spanTypeCorrection": "Corrección", + "spanFeedbackTitle": "Informar problema de corrección", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_it.arb b/lib/l10n/intl_it.arb index 247c7ee06..387c4a353 100644 --- a/lib/l10n/intl_it.arb +++ b/lib/l10n/intl_it.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-08-14 12:41:09.992206", + "@@last_modified": "2026-02-09 15:31:23.943569", "about": "Informazioni", "@about": { "type": "String", @@ -10736,8 +10736,6 @@ "congratulations": "Congratulazioni!", "anotherRound": "Un altro turno", "noActivityRequest": "Nessuna richiesta di attività attuale.", - "quit": "Esci", - "congratulationsYouveCompletedPractice": "Congratulazioni! Hai completato la sessione di pratica.", "mustHave10Words": "Devi avere almeno 10 parole di vocabolario per praticarle. Prova a parlare con un amico o con Pangea Bot per scoprire di più!", "botSettings": "Impostazioni del Bot", "activitySettingsOverrideWarning": "Lingua e livello di lingua determinati dal piano di attività", @@ -10786,14 +10784,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -10969,6 +10959,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Informazioni su di me", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Verbo Frazionale", "grammarCopyPOScompn": "Composto", @@ -10983,5 +10978,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Pratica perfetta!", + "greatPractice": "Ottima pratica!", + "usedNoHints": "Ottimo lavoro non usando suggerimenti!", + "youveCompletedPractice": "Hai completato la pratica, continua così per migliorare!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Cambia email", + "withTheseAddressesDescription": "Con queste email puoi accedere, recuperare la tua password e gestire gli abbonamenti.", + "noAddressDescription": "Non hai ancora aggiunto alcun indirizzo email.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Grammatica", + "spanTypeWordChoice": "Scelta delle parole", + "spanTypeSpelling": "Ortografia", + "spanTypePunctuation": "Punteggiatura", + "spanTypeStyle": "Stile", + "spanTypeFluency": "Fluidità", + "spanTypeAccents": "Accenti", + "spanTypeCapitalization": "Capitalizzazione", + "spanTypeCorrection": "Correzione", + "spanFeedbackTitle": "Segnala problema di correzione", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_ja.arb b/lib/l10n/intl_ja.arb index fd1dfc360..6c60ae247 100644 --- a/lib/l10n/intl_ja.arb +++ b/lib/l10n/intl_ja.arb @@ -1,6 +1,6 @@ { "@@locale": "ja", - "@@last_modified": "2021-08-14 12:41:09.978060", + "@@last_modified": "2026-02-09 15:32:29.891676", "about": "このアプリについて", "@about": { "type": "String", @@ -11516,8 +11516,6 @@ "congratulations": "おめでとうございます!", "anotherRound": "もう一回", "noActivityRequest": "現在のアクティビティリクエストはありません。", - "quit": "終了", - "congratulationsYouveCompletedPractice": "おめでとうございます!練習セッションを完了しました。", "mustHave10Words": "練習するには、少なくとも10語の語彙が必要です。友達やPangea Botに話しかけて、もっと発見してみてください!", "botSettings": "ボット設定", "activitySettingsOverrideWarning": "アクティビティプランによって決定された言語と言語レベル", @@ -11566,14 +11564,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11749,6 +11739,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "私について", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "イディオム", "grammarCopyPOSphrasalv": "句動詞", "grammarCopyPOScompn": "複合語", @@ -11763,5 +11758,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "完璧な練習!", + "greatPractice": "素晴らしい練習!", + "usedNoHints": "ヒントを使わずによくやった!", + "youveCompletedPractice": "練習を完了しました。これを続けて上達してください!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "メールアドレスを変更", + "withTheseAddressesDescription": "これらのメールアドレスを使用して、ログイン、パスワードの回復、サブスクリプションの管理ができます。", + "noAddressDescription": "まだメールアドレスを追加していません。", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "文法", + "spanTypeWordChoice": "単語の選択", + "spanTypeSpelling": "スペル", + "spanTypePunctuation": "句読点", + "spanTypeStyle": "スタイル", + "spanTypeFluency": "流暢さ", + "spanTypeAccents": "アクセント", + "spanTypeCapitalization": "大文字化", + "spanTypeCorrection": "修正", + "spanFeedbackTitle": "修正の問題を報告する", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_ka.arb b/lib/l10n/intl_ka.arb index 20e8835b4..5b6e36f17 100644 --- a/lib/l10n/intl_ka.arb +++ b/lib/l10n/intl_ka.arb @@ -2590,7 +2590,7 @@ "playWithAI": "ამ დროისთვის ითამაშეთ AI-თან", "courseStartDesc": "Pangea Bot მზადაა ნებისმიერ დროს გასასვლელად!\n\n...მაგრამ სწავლა უკეთესია მეგობრებთან ერთად!", "@@locale": "ka", - "@@last_modified": "2026-02-05 10:10:20.523925", + "@@last_modified": "2026-02-09 15:32:39.485983", "@alwaysUse24HourFormat": { "type": "String", "placeholders": {} @@ -11756,8 +11756,6 @@ "congratulations": "გილოცავთ!", "anotherRound": "მეორე რაუნდი", "noActivityRequest": "ამჟამად აქტივობის მოთხოვნა არ არის.", - "quit": "გამოსვლა", - "congratulationsYouveCompletedPractice": "გილოცავთ! თქვენ დაასრულეთ პრაქტიკის სესია.", "mustHave10Words": "თქვენ უნდა გქონდეთ მინიმუმ 10 სიტყვა, რომ მათ პრაქტიკაში გამოიყენოთ. სცადეთ მეგობართან ან Pangea Bot-თან საუბარი, რომ მეტი აღმოაჩინოთ!", "botSettings": "ბოტის პარამეტრები", "activitySettingsOverrideWarning": "ენასა და ენების დონეს განსაზღვრავს აქტივობის გეგმა", @@ -11806,14 +11804,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11989,6 +11979,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "ჩემზე", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "იდიომი", "grammarCopyPOSphrasalv": "ფრაზული ზმნა", "grammarCopyPOScompn": "კომპლექსური", @@ -12003,5 +11998,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "შესანიშნავი პრაქტიკა!", + "greatPractice": "დიდებული პრაქტიკა!", + "usedNoHints": "კარგი საქმე, რომ არ გამოიყენე არცერთი მინიშნება!", + "youveCompletedPractice": "თქვენ დაასრულეთ პრაქტიკა, გააგრძელეთ ასე, რომ უკეთესი გახდეთ!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "ელ. ფოსტის შეცვლა", + "withTheseAddressesDescription": "ამ ელ. ფოსტის მისამართების საშუალებით შეგიძლიათ შეხვიდეთ, აღადგინოთ თქვენი პაროლი და მართოთ გამოწერები.", + "noAddressDescription": "თქვენ ჯერ არ გაქვთ დამატებული ელ. ფოსტის მისამართები.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "გრამატიკა", + "spanTypeWordChoice": "სიტყვების არჩევანი", + "spanTypeSpelling": "წერა", + "spanTypePunctuation": "ნიშნის გამოყენება", + "spanTypeStyle": "სტილი", + "spanTypeFluency": "მიმდინარე", + "spanTypeAccents": "აქცენტები", + "spanTypeCapitalization": "დიდი ასოები", + "spanTypeCorrection": "კორექტირება", + "spanFeedbackTitle": "შეტყობინება კორექტირების პრობლემაზე", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_ko.arb b/lib/l10n/intl_ko.arb index 2e18b1ef8..3859105e8 100644 --- a/lib/l10n/intl_ko.arb +++ b/lib/l10n/intl_ko.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-08-14 12:41:09.975135", + "@@last_modified": "2026-02-09 15:30:29.458374", "about": "소개", "@about": { "type": "String", @@ -10818,8 +10818,6 @@ "congratulations": "축하합니다!", "anotherRound": "또 다른 라운드", "noActivityRequest": "현재 활동 요청이 없습니다.", - "quit": "종료", - "congratulationsYouveCompletedPractice": "축하합니다! 연습 세션을 완료했습니다.", "mustHave10Words": "연습할 단어가 최소 10개 이상 있어야 합니다. 친구나 Pangea Bot과 대화하여 더 많은 것을 발견해 보세요!", "botSettings": "봇 설정", "activitySettingsOverrideWarning": "활동 계획에 의해 결정된 언어 및 언어 수준", @@ -10868,14 +10866,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11051,6 +11041,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "내 소개", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "관용구", "grammarCopyPOSphrasalv": "구동사", "grammarCopyPOScompn": "복합어", @@ -11065,5 +11060,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "완벽한 연습!", + "greatPractice": "훌륭한 연습!", + "usedNoHints": "힌트를 사용하지 않아서 잘했어요!", + "youveCompletedPractice": "연습을 완료했습니다. 계속해서 더 나아지세요!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "이메일 변경", + "withTheseAddressesDescription": "이 이메일 주소로 로그인하고, 비밀번호를 복구하며, 구독을 관리할 수 있습니다.", + "noAddressDescription": "아직 이메일 주소를 추가하지 않았습니다.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "문법", + "spanTypeWordChoice": "단어 선택", + "spanTypeSpelling": "철자", + "spanTypePunctuation": "구두점", + "spanTypeStyle": "스타일", + "spanTypeFluency": "유창성", + "spanTypeAccents": "억양", + "spanTypeCapitalization": "대문자 사용", + "spanTypeCorrection": "수정", + "spanFeedbackTitle": "수정 문제 보고", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_lt.arb b/lib/l10n/intl_lt.arb index a1937736d..8adb45ef5 100644 --- a/lib/l10n/intl_lt.arb +++ b/lib/l10n/intl_lt.arb @@ -3857,7 +3857,7 @@ "playWithAI": "Žaiskite su dirbtiniu intelektu dabar", "courseStartDesc": "Pangea botas pasiruošęs bet kada pradėti!\n\n...bet mokymasis yra geresnis su draugais!", "@@locale": "lt", - "@@last_modified": "2026-02-05 10:10:01.069181", + "@@last_modified": "2026-02-09 15:32:01.402371", "@alwaysUse24HourFormat": { "type": "String", "placeholders": {} @@ -11531,8 +11531,6 @@ "congratulations": "Sveikiname!", "anotherRound": "Dar viena raundas", "noActivityRequest": "Nėra dabartinio veiklos prašymo.", - "quit": "Išeiti", - "congratulationsYouveCompletedPractice": "Sveikiname! Jūs baigėte praktikos sesiją.", "mustHave10Words": "Turite turėti bent 10 žodžių, kad galėtumėte juos praktikuoti. Pabandykite pasikalbėti su draugu arba Pangea Bot, kad sužinotumėte daugiau!", "botSettings": "Roboto nustatymai", "activitySettingsOverrideWarning": "Kalba ir kalbos lygis nustatomi pagal veiklos planą", @@ -11581,14 +11579,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11764,6 +11754,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Apie mane", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Phrasal Verb", "grammarCopyPOScompn": "Sudėtinis", @@ -11778,5 +11773,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Tobulas praktika!", + "greatPractice": "Puiki praktika!", + "usedNoHints": "Puikus darbas, kad nenaudojote jokių užuominų!", + "youveCompletedPractice": "Jūs baigėte praktiką, tęskite, kad taptumėte geresni!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Keisti el. paštą", + "withTheseAddressesDescription": "Su šiais el. pašto adresais galite prisijungti, atkurti slaptažodį ir valdyti prenumeratas.", + "noAddressDescription": "Jūs dar nepridėjote jokių el. pašto adresų.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramatika", + "spanTypeWordChoice": "Žodžių pasirinkimas", + "spanTypeSpelling": "Rašyba", + "spanTypePunctuation": "Skyryba", + "spanTypeStyle": "Stilius", + "spanTypeFluency": "Sklandumas", + "spanTypeAccents": "Akcentai", + "spanTypeCapitalization": "Didžiųjų raidžių naudojimas", + "spanTypeCorrection": "Korekcija", + "spanFeedbackTitle": "Pranešti apie korekcijos problemą", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_lv.arb b/lib/l10n/intl_lv.arb index c107fe7dc..a5262fcf5 100644 --- a/lib/l10n/intl_lv.arb +++ b/lib/l10n/intl_lv.arb @@ -4605,7 +4605,7 @@ "playWithAI": "Tagad spēlējiet ar AI", "courseStartDesc": "Pangea bots ir gatavs jebkurā laikā!\n\n...bet mācīties ir labāk ar draugiem!", "@@locale": "lv", - "@@last_modified": "2026-02-05 10:09:54.766036", + "@@last_modified": "2026-02-09 15:31:50.771177", "analyticsInactiveTitle": "Pieprasījumi neaktīviem lietotājiem nevar tikt nosūtīti", "analyticsInactiveDesc": "Neaktīvi lietotāji, kuri nav pieteikušies kopš šīs funkcijas ieviešanas, neredzēs jūsu pieprasījumu.\n\nPieprasījuma poga parādīsies, kad viņi atgriezīsies. Jūs varat atkārtoti nosūtīt pieprasījumu vēlāk, noklikšķinot uz pieprasījuma pogas viņu vārdā, kad tā būs pieejama.", "accessRequestedTitle": "Pieprasījums piekļūt analītikai", @@ -10840,8 +10840,6 @@ "congratulations": "Apsveicam!", "anotherRound": "Vēl viena kārta", "noActivityRequest": "Nav pašreizējo aktivitāšu pieprasījumu.", - "quit": "Iziet", - "congratulationsYouveCompletedPractice": "Apsveicam! Jūs esat pabeidzis prakses sesiju.", "mustHave10Words": "Jums jābūt vismaz 10 vārdiem, lai tos praktizētu. Mēģiniet parunāt ar draugu vai Pangea Bot, lai uzzinātu vairāk!", "botSettings": "Bota iestatījumi", "activitySettingsOverrideWarning": "Valoda un valodas līmenis, ko nosaka aktivitāšu plāns", @@ -10890,14 +10888,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11073,6 +11063,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Par mani", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Frazēts darbības vārds", "grammarCopyPOScompn": "Savienojums", @@ -11087,5 +11082,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Lieliska prakse!", + "greatPractice": "Lieliska prakse!", + "usedNoHints": "Lieliski, ka neizmantoji nevienu padomu!", + "youveCompletedPractice": "Tu esi pabeidzis praksi, turpini tādā garā, lai uzlabotos!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Mainīt e-pastu", + "withTheseAddressesDescription": "Ar šiem e-pasta adresēm jūs varat pieteikties, atjaunot savu paroli un pārvaldīt abonementus.", + "noAddressDescription": "Jūs vēl neesat pievienojis nevienu e-pasta adresi.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramatika", + "spanTypeWordChoice": "Vārdu izvēle", + "spanTypeSpelling": "Ortogrāfija", + "spanTypePunctuation": "Interpunkcija", + "spanTypeStyle": "Stils", + "spanTypeFluency": "Plūdums", + "spanTypeAccents": "Akcenti", + "spanTypeCapitalization": "Lielie burti", + "spanTypeCorrection": "Korekcija", + "spanFeedbackTitle": "Ziņot par korekcijas problēmu", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_nb.arb b/lib/l10n/intl_nb.arb index a4e2aba07..2f7929093 100644 --- a/lib/l10n/intl_nb.arb +++ b/lib/l10n/intl_nb.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-08-14 12:41:09.967351", + "@@last_modified": "2026-02-09 15:31:32.332245", "about": "Om", "@about": { "type": "String", @@ -10909,8 +10909,6 @@ "congratulations": "Gratulerer!", "anotherRound": "En runde til", "noActivityRequest": "Ingen nåværende aktivitetsforespørsel.", - "quit": "Avslutt", - "congratulationsYouveCompletedPractice": "Gratulerer! Du har fullført økt med øvelser.", "mustHave10Words": "Du må ha minst 10 ordforråd for å øve på dem. Prøv å snakke med en venn eller Pangea Bot for å oppdage mer!", "botSettings": "Bot-innstillinger", "activitySettingsOverrideWarning": "Språk og språknivå bestemt av aktivitetsplan", @@ -10959,14 +10957,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11142,6 +11132,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Om meg", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Phrasal Verb", "grammarCopyPOScompn": "Sammensatt", @@ -11156,5 +11151,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Perfekt øvelse!", + "greatPractice": "Flott øvelse!", + "usedNoHints": "Bra jobba med å ikke bruke noen hint!", + "youveCompletedPractice": "Du har fullført øvelsen, fortsett slik for å bli bedre!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Endre e-post", + "withTheseAddressesDescription": "Med disse e-postadressene kan du logge inn, gjenopprette passordet ditt og administrere abonnementer.", + "noAddressDescription": "Du har ikke lagt til noen e-postadresser ennå.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Grammatikk", + "spanTypeWordChoice": "Ordvalg", + "spanTypeSpelling": "Staving", + "spanTypePunctuation": "Tegnsetting", + "spanTypeStyle": "Stil", + "spanTypeFluency": "Flyt", + "spanTypeAccents": "Aksenter", + "spanTypeCapitalization": "Store bokstaver", + "spanTypeCorrection": "Korrigering", + "spanFeedbackTitle": "Rapporter korrigeringsproblem", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb index d30b40503..fc2c5f651 100644 --- a/lib/l10n/intl_nl.arb +++ b/lib/l10n/intl_nl.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-08-14 12:41:09.955292", + "@@last_modified": "2026-02-09 15:32:09.504392", "about": "Over ons", "@about": { "type": "String", @@ -10845,8 +10845,6 @@ "congratulations": "Gefeliciteerd!", "anotherRound": "Nog een ronde", "noActivityRequest": "Geen huidige activiteit aanvraag.", - "quit": "Afsluiten", - "congratulationsYouveCompletedPractice": "Gefeliciteerd! Je hebt de oefensessie voltooid.", "mustHave10Words": "Je moet minstens 10 vocabulairewoorden hebben om ze te oefenen. Probeer met een vriend of Pangea Bot te praten om meer te ontdekken!", "botSettings": "Botinstellingen", "activitySettingsOverrideWarning": "Taal en taalniveau bepaald door het activiteitenplan", @@ -10895,14 +10893,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11078,6 +11068,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Over mij", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idioom", "grammarCopyPOSphrasalv": "Frazal Werkwoord", "grammarCopyPOScompn": "Samenstelling", @@ -11092,5 +11087,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Perfecte oefening!", + "greatPractice": "Geweldige oefening!", + "usedNoHints": "Goed gedaan, geen hints gebruikt!", + "youveCompletedPractice": "Je hebt de oefening voltooid, ga zo door om beter te worden!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Wijzig e-mailadres", + "withTheseAddressesDescription": "Met deze e-mailadressen kun je inloggen, je wachtwoord herstellen en abonnementen beheren.", + "noAddressDescription": "Je hebt nog geen e-mailadressen toegevoegd.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Grammatica", + "spanTypeWordChoice": "Woordkeuze", + "spanTypeSpelling": "Spelling", + "spanTypePunctuation": "Interpunctie", + "spanTypeStyle": "Stijl", + "spanTypeFluency": "Vloeiendheid", + "spanTypeAccents": "Accenten", + "spanTypeCapitalization": "Hoofdletters", + "spanTypeCorrection": "Correctie", + "spanFeedbackTitle": "Rapporteer correctiefout", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_pl.arb b/lib/l10n/intl_pl.arb index 74366b912..6c1c95fd6 100644 --- a/lib/l10n/intl_pl.arb +++ b/lib/l10n/intl_pl.arb @@ -1,6 +1,6 @@ { "@@locale": "pl", - "@@last_modified": "2021-08-14 12:41:09.943634", + "@@last_modified": "2026-02-09 15:32:22.411163", "about": "O aplikacji", "@about": { "type": "String", @@ -10718,8 +10718,6 @@ "congratulations": "Gratulacje!", "anotherRound": "Kolejna runda", "noActivityRequest": "Brak bieżącego żądania aktywności.", - "quit": "Zakończ", - "congratulationsYouveCompletedPractice": "Gratulacje! Ukończyłeś sesję ćwiczeń.", "mustHave10Words": "Musisz mieć co najmniej 10 słówek do ćwiczenia. Spróbuj porozmawiać z przyjacielem lub Pangea Bot, aby odkryć więcej!", "botSettings": "Ustawienia bota", "activitySettingsOverrideWarning": "Język i poziom językowy określone przez plan aktywności", @@ -10768,14 +10766,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -10951,6 +10941,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "O mnie", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Czasownik frazowy", "grammarCopyPOScompn": "Złożony", @@ -10965,5 +10960,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Idealna praktyka!", + "greatPractice": "Świetna praktyka!", + "usedNoHints": "Dobra robota, że nie korzystałeś z żadnych wskazówek!", + "youveCompletedPractice": "Ukończyłeś praktykę, kontynuuj, aby się poprawić!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Zmień adres e-mail", + "withTheseAddressesDescription": "Dzięki tym adresom e-mail możesz się zalogować, odzyskać hasło i zarządzać subskrypcjami.", + "noAddressDescription": "Nie dodałeś jeszcze żadnych adresów e-mail.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramatyka", + "spanTypeWordChoice": "Wybór słów", + "spanTypeSpelling": "Ortografia", + "spanTypePunctuation": "Interpunkcja", + "spanTypeStyle": "Styl", + "spanTypeFluency": "Płynność", + "spanTypeAccents": "Akcenty", + "spanTypeCapitalization": "Kapitalizacja", + "spanTypeCorrection": "Korekta", + "spanFeedbackTitle": "Zgłoś problem z korektą", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_pt.arb b/lib/l10n/intl_pt.arb index ebef35dc5..e2236b526 100644 --- a/lib/l10n/intl_pt.arb +++ b/lib/l10n/intl_pt.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-08-14 12:41:09.940318", + "@@last_modified": "2026-02-09 15:31:11.061688", "copiedToClipboard": "Copiada para a área de transferência", "@copiedToClipboard": { "type": "String", @@ -11813,8 +11813,6 @@ "congratulations": "Parabéns!", "anotherRound": "Outra rodada", "noActivityRequest": "Nenhum pedido de atividade atual.", - "quit": "Sair", - "congratulationsYouveCompletedPractice": "Parabéns! Você completou a sessão de prática.", "mustHave10Words": "Você deve ter pelo menos 10 palavras de vocabulário para praticá-las. Tente conversar com um amigo ou com o Pangea Bot para descobrir mais!", "botSettings": "Configurações do Bot", "activitySettingsOverrideWarning": "Idioma e nível de idioma determinados pelo plano de atividade", @@ -11863,14 +11861,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -12046,6 +12036,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Sobre mim", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Verbo Frasal", "grammarCopyPOScompn": "Composto", @@ -12060,5 +12055,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Prática perfeita!", + "greatPractice": "Ótima prática!", + "usedNoHints": "Bom trabalho em não usar dicas!", + "youveCompletedPractice": "Você completou a prática, continue assim para melhorar!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Alterar e-mail", + "withTheseAddressesDescription": "Com esses endereços de e-mail, você pode fazer login, recuperar sua senha e gerenciar assinaturas.", + "noAddressDescription": "Você ainda não adicionou nenhum endereço de e-mail.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramática", + "spanTypeWordChoice": "Escolha de Palavras", + "spanTypeSpelling": "Ortografia", + "spanTypePunctuation": "Pontuação", + "spanTypeStyle": "Estilo", + "spanTypeFluency": "Fluência", + "spanTypeAccents": "Acentos", + "spanTypeCapitalization": "Capitalização", + "spanTypeCorrection": "Correção", + "spanFeedbackTitle": "Relatar problema de correção", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_pt_BR.arb b/lib/l10n/intl_pt_BR.arb index 772b38ff9..b64fd28e9 100644 --- a/lib/l10n/intl_pt_BR.arb +++ b/lib/l10n/intl_pt_BR.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-08-14 12:41:09.925971", + "@@last_modified": "2026-02-09 15:31:06.403516", "about": "Sobre", "@about": { "type": "String", @@ -10840,8 +10840,6 @@ "congratulations": "Parabéns!", "anotherRound": "Outra rodada", "noActivityRequest": "Nenhum pedido de atividade atual.", - "quit": "Sair", - "congratulationsYouveCompletedPractice": "Parabéns! Você completou a sessão de prática.", "mustHave10Words": "Você deve ter pelo menos 10 palavras de vocabulário para praticá-las. Tente conversar com um amigo ou com o Pangea Bot para descobrir mais!", "botSettings": "Configurações do Bot", "activitySettingsOverrideWarning": "Idioma e nível de idioma determinados pelo plano de atividade", @@ -10890,14 +10888,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11073,6 +11063,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Sobre mim", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Verbo Frasal", "grammarCopyPOScompn": "Composto", @@ -11087,5 +11082,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Prática perfeita!", + "greatPractice": "Ótima prática!", + "usedNoHints": "Bom trabalho não usando dicas!", + "youveCompletedPractice": "Você completou a prática, continue assim para melhorar!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Alterar e-mail", + "withTheseAddressesDescription": "Com esses endereços de e-mail, você pode fazer login, recuperar sua senha e gerenciar assinaturas.", + "noAddressDescription": "Você ainda não adicionou nenhum endereço de e-mail.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramática", + "spanTypeWordChoice": "Escolha de Palavras", + "spanTypeSpelling": "Ortografia", + "spanTypePunctuation": "Pontuação", + "spanTypeStyle": "Estilo", + "spanTypeFluency": "Fluência", + "spanTypeAccents": "Acentos", + "spanTypeCapitalization": "Capitalização", + "spanTypeCorrection": "Correção", + "spanFeedbackTitle": "Relatar problema de correção", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_pt_PT.arb b/lib/l10n/intl_pt_PT.arb index 0255d3ed5..561d6e68e 100644 --- a/lib/l10n/intl_pt_PT.arb +++ b/lib/l10n/intl_pt_PT.arb @@ -3327,7 +3327,7 @@ "selectAll": "Selecionar tudo", "deselectAll": "Desmarcar tudo", "@@locale": "pt_PT", - "@@last_modified": "2026-02-05 10:09:50.725651", + "@@last_modified": "2026-02-09 15:31:42.773873", "@alwaysUse24HourFormat": { "type": "String", "placeholders": {} @@ -11755,8 +11755,6 @@ "congratulations": "Parabéns!", "anotherRound": "Outra rodada", "noActivityRequest": "Nenhum pedido de atividade atual.", - "quit": "Sair", - "congratulationsYouveCompletedPractice": "Parabéns! Você completou a sessão de prática.", "mustHave10Words": "Você deve ter pelo menos 10 palavras de vocabulário para praticar. Tente conversar com um amigo ou com o Pangea Bot para descobrir mais!", "botSettings": "Configurações do Bot", "activitySettingsOverrideWarning": "Idioma e nível de idioma determinados pelo plano de atividade", @@ -11805,14 +11803,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11988,6 +11978,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Sobre mim", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Verbo Frasal", "grammarCopyPOScompn": "Composto", @@ -12002,5 +11997,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Prática perfeita!", + "greatPractice": "Ótima prática!", + "usedNoHints": "Bom trabalho em não usar dicas!", + "youveCompletedPractice": "Você completou a prática, continue assim para melhorar!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Alterar e-mail", + "withTheseAddressesDescription": "Com esses endereços de e-mail, você pode fazer login, recuperar sua senha e gerenciar assinaturas.", + "noAddressDescription": "Você ainda não adicionou nenhum endereço de e-mail.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramática", + "spanTypeWordChoice": "Escolha de Palavras", + "spanTypeSpelling": "Ortografia", + "spanTypePunctuation": "Pontuação", + "spanTypeStyle": "Estilo", + "spanTypeFluency": "Fluência", + "spanTypeAccents": "Acentos", + "spanTypeCapitalization": "Capitalização", + "spanTypeCorrection": "Correção", + "spanFeedbackTitle": "Relatar problema de correção", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_ro.arb b/lib/l10n/intl_ro.arb index 5e6b4cb28..bb30b4d98 100644 --- a/lib/l10n/intl_ro.arb +++ b/lib/l10n/intl_ro.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-08-14 12:41:09.918296", + "@@last_modified": "2026-02-09 15:30:49.927369", "about": "Despre", "@about": { "type": "String", @@ -11461,8 +11461,6 @@ "congratulations": "Felicitări!", "anotherRound": "Încă o rundă", "noActivityRequest": "Nu există cereri de activitate curente.", - "quit": "Ieși", - "congratulationsYouveCompletedPractice": "Felicitări! Ai completat sesiunea de practică.", "mustHave10Words": "Trebuie să ai cel puțin 10 cuvinte de vocabular pentru a le exersa. Încearcă să vorbești cu un prieten sau cu Pangea Bot pentru a descoperi mai multe!", "botSettings": "Setări Bot", "activitySettingsOverrideWarning": "Limba și nivelul de limbă sunt determinate de planul de activitate", @@ -11511,14 +11509,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11694,6 +11684,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Despre mine", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Verb Phrastic", "grammarCopyPOScompn": "Compus", @@ -11708,5 +11703,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Practica perfectă!", + "greatPractice": "Practica grozavă!", + "usedNoHints": "Bravo că nu ai folosit niciun indiciu!", + "youveCompletedPractice": "Ai finalizat practica, continuă așa pentru a te îmbunătăți!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Schimbă emailul", + "withTheseAddressesDescription": "Cu aceste adrese de email poți să te conectezi, să îți recuperezi parola și să gestionezi abonamentele.", + "noAddressDescription": "Nu ai adăugat încă nicio adresă de email.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramatica", + "spanTypeWordChoice": "Alegerea cuvintelor", + "spanTypeSpelling": "Ortografie", + "spanTypePunctuation": "Punctuație", + "spanTypeStyle": "Stil", + "spanTypeFluency": "Fluență", + "spanTypeAccents": "Accente", + "spanTypeCapitalization": "Capitalizare", + "spanTypeCorrection": "Corectare", + "spanFeedbackTitle": "Raportează problema de corectare", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index 22cbac7d5..99f992a87 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -1,6 +1,6 @@ { "@@locale": "ru", - "@@last_modified": "2021-08-14 12:41:09.903021", + "@@last_modified": "2026-02-09 15:32:37.241817", "about": "О проекте", "@about": { "type": "String", @@ -10831,8 +10831,6 @@ "congratulations": "Поздравляем!", "anotherRound": "Еще один раунд", "noActivityRequest": "Нет текущего запроса на активность.", - "quit": "Выйти", - "congratulationsYouveCompletedPractice": "Поздравляем! Вы завершили практическую сессию.", "mustHave10Words": "Вы должны иметь как минимум 10 слов для практики. Попробуйте поговорить с другом или Pangea Bot, чтобы узнать больше!", "botSettings": "Настройки бота", "activitySettingsOverrideWarning": "Язык и уровень языка определяются планом активности", @@ -10881,14 +10879,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11078,6 +11068,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Обо мне", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Идиома", "grammarCopyPOSphrasalv": "Фразовый глагол", "grammarCopyPOScompn": "Составное", @@ -11092,5 +11087,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Идеальная практика!", + "greatPractice": "Отличная практика!", + "usedNoHints": "Хорошая работа, что не использовали подсказки!", + "youveCompletedPractice": "Вы завершили практику, продолжайте в том же духе, чтобы стать лучше!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Сменить электронную почту", + "withTheseAddressesDescription": "С помощью этих адресов электронной почты вы можете войти в систему, восстановить пароль и управлять подписками.", + "noAddressDescription": "Вы еще не добавили ни одного адреса электронной почты.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Грамматика", + "spanTypeWordChoice": "Выбор слов", + "spanTypeSpelling": "Орфография", + "spanTypePunctuation": "Пунктуация", + "spanTypeStyle": "Стиль", + "spanTypeFluency": "Связность", + "spanTypeAccents": "Акценты", + "spanTypeCapitalization": "Капитализация", + "spanTypeCorrection": "Коррекция", + "spanFeedbackTitle": "Сообщить о проблеме с коррекцией", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_sk.arb b/lib/l10n/intl_sk.arb index 62bf0e9e9..15b18d377 100644 --- a/lib/l10n/intl_sk.arb +++ b/lib/l10n/intl_sk.arb @@ -1,6 +1,6 @@ { "@@locale": "sk", - "@@last_modified": "2021-08-14 12:41:09.879987", + "@@last_modified": "2026-02-09 15:30:52.656999", "about": "O aplikácii", "@about": { "type": "String", @@ -11810,8 +11810,6 @@ "congratulations": "Gratulujeme!", "anotherRound": "Ďalšie kolo", "noActivityRequest": "Žiadna aktuálna požiadavka na aktivitu.", - "quit": "Ukončiť", - "congratulationsYouveCompletedPractice": "Gratulujeme! Dokončili ste cvičebnú reláciu.", "mustHave10Words": "Musíte mať aspoň 10 slovíčok na precvičovanie. Skúste sa porozprávať s priateľom alebo Pangea Botom, aby ste objavili viac!", "botSettings": "Nastavenia bota", "activitySettingsOverrideWarning": "Jazyk a jazyková úroveň určené plánom aktivity", @@ -11860,14 +11858,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -12043,6 +12033,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "O mne", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idióm", "grammarCopyPOSphrasalv": "Frázové sloveso", "grammarCopyPOScompn": "Zložené", @@ -12057,5 +12052,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Dokonalá prax!", + "greatPractice": "Skvelá prax!", + "usedNoHints": "Dobrý výkon, že si nepoužil žiadne nápovedy!", + "youveCompletedPractice": "Dokončil si prax, pokračuj v tom, aby si sa zlepšil!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Zmeniť e-mail", + "withTheseAddressesDescription": "S týmito e-mailovými adresami sa môžete prihlásiť, obnoviť svoje heslo a spravovať predplatné.", + "noAddressDescription": "Ešte ste nepridali žiadne e-mailové adresy.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramatika", + "spanTypeWordChoice": "Výber slov", + "spanTypeSpelling": "Pravopis", + "spanTypePunctuation": "Interpunkcia", + "spanTypeStyle": "Štýl", + "spanTypeFluency": "Plynulosť", + "spanTypeAccents": "Prízvuky", + "spanTypeCapitalization": "Veľké písmená", + "spanTypeCorrection": "Oprava", + "spanFeedbackTitle": "Nahlásiť problém s opravou", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_sl.arb b/lib/l10n/intl_sl.arb index 583682823..8c9f59a8a 100644 --- a/lib/l10n/intl_sl.arb +++ b/lib/l10n/intl_sl.arb @@ -2460,7 +2460,7 @@ "playWithAI": "Za zdaj igrajte z AI-jem", "courseStartDesc": "Pangea Bot je pripravljen kadarkoli!\n\n...ampak je bolje učiti se s prijatelji!", "@@locale": "sl", - "@@last_modified": "2026-02-05 10:09:38.721866", + "@@last_modified": "2026-02-09 15:31:19.119268", "@alwaysUse24HourFormat": { "type": "String", "placeholders": {} @@ -11807,8 +11807,6 @@ "congratulations": "Čestitamo!", "anotherRound": "Še en krog", "noActivityRequest": "Trenutno ni zahtevka za aktivnost.", - "quit": "Izhod", - "congratulationsYouveCompletedPractice": "Čestitamo! Zaključili ste vadbeno sejo.", "mustHave10Words": "Imeti morate vsaj 10 besed za besedišče, da jih lahko vadite. Poskusite se pogovoriti s prijateljem ali Pangea Botom, da odkrijete več!", "botSettings": "Nastavitve bota", "activitySettingsOverrideWarning": "Jezik in jezikovna raven sta določena z načrtom aktivnosti", @@ -11857,14 +11855,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -12040,6 +12030,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "O meni", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Phrasalni glagol", "grammarCopyPOScompn": "Sestavljenka", @@ -12054,5 +12049,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Popolna praksa!", + "greatPractice": "Super praksa!", + "usedNoHints": "Odlično, da niste uporabili nobenih namigov!", + "youveCompletedPractice": "Zaključili ste prakso, nadaljujte tako, da boste boljši!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Spremeni e-pošto", + "withTheseAddressesDescription": "S temi e-poštnimi naslovi se lahko prijavite, obnovite geslo in upravljate z naročninami.", + "noAddressDescription": "Še niste dodali nobenih e-poštnih naslovov.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramatika", + "spanTypeWordChoice": "Izbira besed", + "spanTypeSpelling": "Pravopis", + "spanTypePunctuation": "Interpunkcija", + "spanTypeStyle": "Slog", + "spanTypeFluency": "Sposobnost", + "spanTypeAccents": "Naglaski", + "spanTypeCapitalization": "Velike začetnice", + "spanTypeCorrection": "Popravek", + "spanFeedbackTitle": "Poročilo o težavi s popravkom", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_sr.arb b/lib/l10n/intl_sr.arb index 33734061a..2ee0646e4 100644 --- a/lib/l10n/intl_sr.arb +++ b/lib/l10n/intl_sr.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-08-14 12:41:09.857024", + "@@last_modified": "2026-02-09 15:32:41.761528", "about": "О програму", "@about": { "type": "String", @@ -11822,8 +11822,6 @@ "congratulations": "Čestitamo!", "anotherRound": "Još jedan krug", "noActivityRequest": "Nema trenutnog zahteva za aktivnost.", - "quit": "Izlaz", - "congratulationsYouveCompletedPractice": "Čestitamo! Završili ste sesiju vežbanja.", "mustHave10Words": "Morate imati najmanje 10 reči za rečnik da biste ih vežbali. Pokušajte da razgovarate sa prijateljem ili Pangea Bot-om da biste otkrili više!", "botSettings": "Podešavanja Bota", "activitySettingsOverrideWarning": "Jezik i nivo jezika određeni planom aktivnosti", @@ -11872,14 +11870,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -12055,6 +12045,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "О мени", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Phrasal Verb", "grammarCopyPOScompn": "Kombinacija", @@ -12069,5 +12064,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Savršena praksa!", + "greatPractice": "Sjajna praksa!", + "usedNoHints": "Odlično, niste koristili nikakve savete!", + "youveCompletedPractice": "Završili ste praksu, nastavite tako da postanete bolji!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Promeni email", + "withTheseAddressesDescription": "Sa ovim email adresama možete se prijaviti, povratiti svoju lozinku i upravljati pretplatama.", + "noAddressDescription": "Još niste dodali nijednu email adresu.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Gramatika", + "spanTypeWordChoice": "Izbor reči", + "spanTypeSpelling": "Pravopis", + "spanTypePunctuation": "Interpunkcija", + "spanTypeStyle": "Stil", + "spanTypeFluency": "Tečnost", + "spanTypeAccents": "Akcenti", + "spanTypeCapitalization": "Velika slova", + "spanTypeCorrection": "Ispravka", + "spanFeedbackTitle": "Prijavi problem sa ispravkom", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_sv.arb b/lib/l10n/intl_sv.arb index f42df01d5..2f71f1bb4 100644 --- a/lib/l10n/intl_sv.arb +++ b/lib/l10n/intl_sv.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2026-02-05 10:10:13.035755", + "@@last_modified": "2026-02-09 15:32:24.746342", "about": "Om", "@about": { "type": "String", @@ -11204,8 +11204,6 @@ "congratulations": "Grattis!", "anotherRound": "En runda till", "noActivityRequest": "Ingen aktuell aktivitetsförfrågan.", - "quit": "Avsluta", - "congratulationsYouveCompletedPractice": "Grattis! Du har slutfört övningssessionen.", "mustHave10Words": "Du måste ha minst 10 ord för att öva dem. Försök att prata med en vän eller Pangea Bot för att upptäcka mer!", "botSettings": "Botinställningar", "activitySettingsOverrideWarning": "Språk och språknivå bestäms av aktivitetsplanen", @@ -11254,14 +11252,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11437,6 +11427,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Om mig", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Idiom", "grammarCopyPOSphrasalv": "Phrasverb", "grammarCopyPOScompn": "Sammansatt", @@ -11451,5 +11446,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Perfekt träning!", + "greatPractice": "Bra träning!", + "usedNoHints": "Bra jobbat utan att använda några ledtrådar!", + "youveCompletedPractice": "Du har slutfört träningen, fortsätt så för att bli bättre!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Ändra e-postadress", + "withTheseAddressesDescription": "Med dessa e-postadresser kan du logga in, återställa ditt lösenord och hantera prenumerationer.", + "noAddressDescription": "Du har ännu inte lagt till några e-postadresser.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Grammatik", + "spanTypeWordChoice": "Orval", + "spanTypeSpelling": "Stavning", + "spanTypePunctuation": "Interpunktion", + "spanTypeStyle": "Stil", + "spanTypeFluency": "Flyt", + "spanTypeAccents": "Accenter", + "spanTypeCapitalization": "Versalisering", + "spanTypeCorrection": "Korrigering", + "spanFeedbackTitle": "Rapportera korrigeringsproblem", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_ta.arb b/lib/l10n/intl_ta.arb index 4d7dbbcfa..72680277c 100644 --- a/lib/l10n/intl_ta.arb +++ b/lib/l10n/intl_ta.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-08-14 12:41:09.826673", + "@@last_modified": "2026-02-09 15:32:06.841503", "acceptedTheInvitation": "👍 {username} அழைப்பை ஏற்றுக்கொண்டது", "@acceptedTheInvitation": { "type": "String", @@ -10722,8 +10722,6 @@ "congratulations": "வாழ்த்துகள்!", "anotherRound": "மற்றொரு சுற்று", "noActivityRequest": "தற்போதைய செயல்பாட்டுக்கான கோரிக்கை இல்லை.", - "quit": "விலகுங்கள்", - "congratulationsYouveCompletedPractice": "வாழ்த்துகள்! நீங்கள் பயிற்சி அமர்வை முடித்துவிட்டீர்கள்.", "mustHave10Words": "நீங்கள் பயிற்சிக்காக குறைந்தது 10 சொற்களை வைத்திருக்க வேண்டும். மேலும் கண்டுபிடிக்க நண்பருடன் அல்லது பாஙோ பாட்டுடன் பேச முயற்சிக்கவும்!", "botSettings": "பாடல் அமைப்புகள்", "activitySettingsOverrideWarning": "செயல்பாட்டு திட்டத்தால் நிர்ணயிக்கப்பட்ட மொழி மற்றும் மொழி நிலை", @@ -10772,14 +10770,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -10955,6 +10945,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "என்னைப் பற்றி", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "விளக்கம்", "grammarCopyPOSphrasalv": "பொருள் வினை", "grammarCopyPOScompn": "சேர்க்கை", @@ -10969,5 +10964,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "சரியான பயிற்சி!", + "greatPractice": "மிகவும் நல்ல பயிற்சி!", + "usedNoHints": "எந்த உதவியையும் பயன்படுத்தாததற்கு நல்ல வேலை!", + "youveCompletedPractice": "நீங்கள் பயிற்சியை முடித்துவிட்டீர்கள், மேலும் மேம்பட தொடர்ந்து முயற்சிக்கவும்!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "மின்னஞ்சலை மாற்றவும்", + "withTheseAddressesDescription": "இந்த மின்னஞ்சல் முகவரிகளுடன் நீங்கள் உள்நுழைந்து, உங்கள் கடவுச்சொல்லை மீட்டெடுக்கவும், சந்தாக்களை நிர்வகிக்கவும் முடியும்.", + "noAddressDescription": "நீங்கள் இன்னும் எந்த மின்னஞ்சல் முகவரிகளையும் சேர்க்கவில்லை.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "இயல்பியல்", + "spanTypeWordChoice": "சொல் தேர்வு", + "spanTypeSpelling": "எழுத்துப்பிழை", + "spanTypePunctuation": "இணைச்சொல்", + "spanTypeStyle": "அழகு", + "spanTypeFluency": "தரிசனம்", + "spanTypeAccents": "உயர்த்தல்கள்", + "spanTypeCapitalization": "முதலெழுத்து", + "spanTypeCorrection": "திருத்தம்", + "spanFeedbackTitle": "திருத்தப் பிரச்சினையைப் புகாரளிக்கவும்", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_te.arb b/lib/l10n/intl_te.arb index d1cdab1b9..68c2a4747 100644 --- a/lib/l10n/intl_te.arb +++ b/lib/l10n/intl_te.arb @@ -1916,7 +1916,7 @@ "playWithAI": "ఇప్పుడే AI తో ఆడండి", "courseStartDesc": "పాంజియా బాట్ ఎప్పుడైనా సిద్ధంగా ఉంటుంది!\n\n...కానీ స్నేహితులతో నేర్చుకోవడం మెరుగైనది!", "@@locale": "te", - "@@last_modified": "2026-02-05 10:09:59.064928", + "@@last_modified": "2026-02-09 15:31:58.761810", "@setCustomPermissionLevel": { "type": "String", "placeholders": {} @@ -11815,8 +11815,6 @@ "congratulations": "అభినందనలు!", "anotherRound": "మరొక రౌండ్", "noActivityRequest": "ప్రస్తుతం ఎలాంటి కార్యకలాపం అభ్యర్థన లేదు.", - "quit": "విడుదల", - "congratulationsYouveCompletedPractice": "అభినందనలు! మీరు అభ్యాస సెషన్‌ను పూర్తి చేశారు.", "mustHave10Words": "మీరు వాటిని అభ్యాసం చేయడానికి కనీసం 10 పదాలను కలిగి ఉండాలి. మరింత తెలుసుకోవడానికి మీ స్నేహితుడితో లేదా పాంజియా బాట్‌తో మాట్లాడండి!", "botSettings": "బాట్ సెట్టింగులు", "activitySettingsOverrideWarning": "కార్యకలాపం ప్రణాళిక ద్వారా నిర్ణయించబడిన భాష మరియు భాష స్థాయి", @@ -11865,14 +11863,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -12048,6 +12038,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "నా గురించి", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "సామెత", "grammarCopyPOSphrasalv": "పదబంధ క్రియ", "grammarCopyPOScompn": "సంకలనం", @@ -12062,5 +12057,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "సంపూర్ణ అభ్యాసం!", + "greatPractice": "మంచి అభ్యాసం!", + "usedNoHints": "ఏ సూచనలు ఉపయోగించకపోవడం మంచి పని!", + "youveCompletedPractice": "మీరు అభ్యాసం పూర్తి చేసారు, మెరుగుపడటానికి ఇలాగే కొనసాగించండి!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "ఇమెయిల్ మార్చండి", + "withTheseAddressesDescription": "ఈ ఇమెయిల్ చిరునామాలతో మీరు లాగిన్ అవ్వవచ్చు, మీ పాస్వర్డ్‌ను పునరుద్ధరించవచ్చు మరియు సబ్‌స్క్రిప్షన్లను నిర్వహించవచ్చు.", + "noAddressDescription": "మీరు ఇంకా ఎలాంటి ఇమెయిల్ చిరునామాలను జోడించలేదు.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "వ్యాకరణం", + "spanTypeWordChoice": "పద ఎంపిక", + "spanTypeSpelling": "అక్షరరూపం", + "spanTypePunctuation": "పంక్తి చిహ్నాలు", + "spanTypeStyle": "శైలి", + "spanTypeFluency": "ప్రవాహం", + "spanTypeAccents": "ఉచ్చారణలు", + "spanTypeCapitalization": "పెద్ద అక్షరాలు", + "spanTypeCorrection": "సరిదిద్దు", + "spanFeedbackTitle": "సరిదిద్దు సమస్యను నివేదించండి", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_th.arb b/lib/l10n/intl_th.arb index f2e0ca3a7..8f202a7bd 100644 --- a/lib/l10n/intl_th.arb +++ b/lib/l10n/intl_th.arb @@ -3999,7 +3999,7 @@ "playWithAI": "เล่นกับ AI ชั่วคราว", "courseStartDesc": "Pangea Bot พร้อมที่จะเริ่มต้นได้ทุกเมื่อ!\n\n...แต่การเรียนรู้ดีกว่ากับเพื่อน!", "@@locale": "th", - "@@last_modified": "2026-02-05 10:09:49.236652", + "@@last_modified": "2026-02-09 15:31:39.902769", "@alwaysUse24HourFormat": { "type": "String", "placeholders": {} @@ -11339,8 +11339,6 @@ "congratulations": "ขอแสดงความยินดี!", "anotherRound": "อีกหนึ่งรอบ", "noActivityRequest": "ไม่มีคำขอทำกิจกรรมในขณะนี้", - "quit": "ออก", - "congratulationsYouveCompletedPractice": "ขอแสดงความยินดี! คุณได้เสร็จสิ้นการฝึกฝนแล้ว", "mustHave10Words": "คุณต้องมีคำศัพท์อย่างน้อย 10 คำเพื่อฝึกฝน ลองพูดคุยกับเพื่อนหรือ Pangea Bot เพื่อค้นพบเพิ่มเติม!", "botSettings": "การตั้งค่า Bot", "activitySettingsOverrideWarning": "ภาษาและระดับภาษาที่กำหนดโดยแผนกิจกรรม", @@ -11389,14 +11387,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11572,6 +11562,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "เกี่ยวกับฉัน", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "สำนวน", "grammarCopyPOSphrasalv": "กริยาวลี", "grammarCopyPOScompn": "คำผสม", @@ -11586,5 +11581,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "การฝึกฝนที่สมบูรณ์แบบ!", + "greatPractice": "การฝึกฝนที่ยอดเยี่ยม!", + "usedNoHints": "ทำได้ดีที่ไม่ใช้คำใบ้ใด ๆ!", + "youveCompletedPractice": "คุณได้ทำการฝึกฝนเสร็จสิ้นแล้ว ทำต่อไปเพื่อให้ดีขึ้น!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "เปลี่ยนอีเมล", + "withTheseAddressesDescription": "ด้วยที่อยู่อีเมลเหล่านี้ คุณสามารถเข้าสู่ระบบ กู้คืนรหัสผ่าน และจัดการการสมัครสมาชิกได้", + "noAddressDescription": "คุณยังไม่ได้เพิ่มที่อยู่อีเมลใด ๆ", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "ไวยากรณ์", + "spanTypeWordChoice": "การเลือกคำ", + "spanTypeSpelling": "การสะกด", + "spanTypePunctuation": "เครื่องหมายวรรคตอน", + "spanTypeStyle": "สไตล์", + "spanTypeFluency": "ความคล่องแคล่ว", + "spanTypeAccents": "สำเนียง", + "spanTypeCapitalization": "การใช้ตัวพิมพ์ใหญ่", + "spanTypeCorrection": "การแก้ไข", + "spanFeedbackTitle": "รายงานปัญหาการแก้ไข", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_tr.arb b/lib/l10n/intl_tr.arb index f570345fc..9afa85af9 100644 --- a/lib/l10n/intl_tr.arb +++ b/lib/l10n/intl_tr.arb @@ -1,6 +1,6 @@ { "@@locale": "tr", - "@@last_modified": "2021-08-14 12:41:09.803728", + "@@last_modified": "2026-02-09 15:31:56.191986", "about": "Hakkında", "@about": { "type": "String", @@ -10932,8 +10932,6 @@ "congratulations": "Tebrikler!", "anotherRound": "Bir tur daha", "noActivityRequest": "Şu anda etkinlik talebi yok.", - "quit": "Çık", - "congratulationsYouveCompletedPractice": "Tebrikler! Pratik oturumunu tamamladınız.", "mustHave10Words": "Pratik yapmak için en az 10 kelimeye sahip olmalısınız. Daha fazla keşfetmek için bir arkadaşınızla veya Pangea Bot ile konuşmayı deneyin!", "botSettings": "Bot Ayarları", "activitySettingsOverrideWarning": "Etkinlik planı tarafından belirlenen dil ve dil seviyesi", @@ -10982,14 +10980,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11165,6 +11155,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Hakkımda", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Deyim", "grammarCopyPOSphrasalv": "Deyim Fiili", "grammarCopyPOScompn": "Bileşik", @@ -11179,5 +11174,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Mükemmel pratik!", + "greatPractice": "Harika pratik!", + "usedNoHints": "Hiç ipucu kullanmadığın için iyi iş çıkardın!", + "youveCompletedPractice": "Pratiği tamamladın, daha iyi olmak için devam et!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "E-posta değiştir", + "withTheseAddressesDescription": "Bu e-posta adresleriyle oturum açabilir, şifrenizi kurtarabilir ve aboneliklerinizi yönetebilirsiniz.", + "noAddressDescription": "Henüz herhangi bir e-posta adresi eklemediniz.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Dilbilgisi", + "spanTypeWordChoice": "Kelime Seçimi", + "spanTypeSpelling": "Yazım", + "spanTypePunctuation": "Noktalama", + "spanTypeStyle": "Üslup", + "spanTypeFluency": "Akıcılık", + "spanTypeAccents": "Aksanlar", + "spanTypeCapitalization": "Büyük Harf Kullanımı", + "spanTypeCorrection": "Düzeltme", + "spanFeedbackTitle": "Düzeltme sorununu bildir", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_uk.arb b/lib/l10n/intl_uk.arb index c1d7f2377..478a0645a 100644 --- a/lib/l10n/intl_uk.arb +++ b/lib/l10n/intl_uk.arb @@ -1,6 +1,6 @@ { "@@locale": "uk", - "@@last_modified": "2021-08-14 12:41:09.790615", + "@@last_modified": "2026-02-09 15:31:25.978266", "about": "Про застосунок", "@about": { "type": "String", @@ -10845,8 +10845,6 @@ "congratulations": "Вітаємо!", "anotherRound": "Ще один раунд", "noActivityRequest": "Немає поточного запиту на активність.", - "quit": "Вийти", - "congratulationsYouveCompletedPractice": "Вітаємо! Ви завершили практичну сесію.", "mustHave10Words": "Вам потрібно мати принаймні 10 слів для практики. Спробуйте поговорити з другом або Pangea Bot, щоб дізнатися більше!", "botSettings": "Налаштування бота", "activitySettingsOverrideWarning": "Мова та рівень мови визначаються планом активності", @@ -10895,14 +10893,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11078,6 +11068,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Про мене", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Ідіома", "grammarCopyPOSphrasalv": "Фразове дієслово", "grammarCopyPOScompn": "Складене", @@ -11092,5 +11087,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Ідеальна практика!", + "greatPractice": "Чудова практика!", + "usedNoHints": "Чудова робота, що не використовували підказки!", + "youveCompletedPractice": "Ви завершили практику, продовжуйте в тому ж дусі, щоб покращитися!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Змінити електронну пошту", + "withTheseAddressesDescription": "З цими електронними адресами ви можете увійти, відновити свій пароль і керувати підписками.", + "noAddressDescription": "Ви ще не додали жодних електронних адрес.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Граматика", + "spanTypeWordChoice": "Вибір слів", + "spanTypeSpelling": "Орфографія", + "spanTypePunctuation": "Пунктуація", + "spanTypeStyle": "Стиль", + "spanTypeFluency": "Вільність", + "spanTypeAccents": "Акценти", + "spanTypeCapitalization": "Великі літери", + "spanTypeCorrection": "Виправлення", + "spanFeedbackTitle": "Повідомити про проблему з виправленням", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_vi.arb b/lib/l10n/intl_vi.arb index 367bf685a..1f101bb6b 100644 --- a/lib/l10n/intl_vi.arb +++ b/lib/l10n/intl_vi.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-08-14 12:41:09.781172", + "@@last_modified": "2026-02-09 15:32:04.137171", "about": "Giới thiệu", "@about": { "type": "String", @@ -6309,8 +6309,6 @@ "congratulations": "Chúc mừng!", "anotherRound": "Một vòng nữa", "noActivityRequest": "Không có yêu cầu hoạt động nào hiện tại.", - "quit": "Thoát", - "congratulationsYouveCompletedPractice": "Chúc mừng! Bạn đã hoàn thành buổi thực hành.", "mustHave10Words": "Bạn phải có ít nhất 10 từ vựng để thực hành. Hãy thử nói chuyện với một người bạn hoặc Pangea Bot để khám phá thêm!", "botSettings": "Cài đặt Bot", "activitySettingsOverrideWarning": "Ngôn ngữ và cấp độ ngôn ngữ được xác định bởi kế hoạch hoạt động", @@ -6359,14 +6357,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -6542,6 +6532,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "Về tôi", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "Thành ngữ", "grammarCopyPOSphrasalv": "Động từ cụm", "grammarCopyPOScompn": "Hợp chất", @@ -6556,5 +6551,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "Thực hành hoàn hảo!", + "greatPractice": "Thực hành tuyệt vời!", + "usedNoHints": "Làm tốt lắm khi không sử dụng bất kỳ gợi ý nào!", + "youveCompletedPractice": "Bạn đã hoàn thành thực hành, hãy tiếp tục để cải thiện!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "Thay đổi email", + "withTheseAddressesDescription": "Với những địa chỉ email này, bạn có thể đăng nhập, khôi phục mật khẩu và quản lý đăng ký.", + "noAddressDescription": "Bạn chưa thêm địa chỉ email nào.", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "Ngữ pháp", + "spanTypeWordChoice": "Lựa chọn từ", + "spanTypeSpelling": "Chính tả", + "spanTypePunctuation": "Dấu câu", + "spanTypeStyle": "Phong cách", + "spanTypeFluency": "Lưu loát", + "spanTypeAccents": "Giọng điệu", + "spanTypeCapitalization": "Chữ hoa", + "spanTypeCorrection": "Sửa lỗi", + "spanFeedbackTitle": "Báo cáo vấn đề sửa lỗi", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_yue.arb b/lib/l10n/intl_yue.arb index 8965157b8..bb5132e76 100644 --- a/lib/l10n/intl_yue.arb +++ b/lib/l10n/intl_yue.arb @@ -1852,7 +1852,7 @@ "selectAll": "全選", "deselectAll": "取消全選", "@@locale": "yue", - "@@last_modified": "2026-02-05 10:09:39.916672", + "@@last_modified": "2026-02-09 15:31:21.578854", "@ignoreUser": { "type": "String", "placeholders": {} @@ -11817,8 +11817,6 @@ "congratulations": "恭喜!", "anotherRound": "再來一輪", "noActivityRequest": "目前沒有活動請求。", - "quit": "退出", - "congratulationsYouveCompletedPractice": "恭喜!你已完成練習課程。", "mustHave10Words": "你必須至少有 10 個詞彙來練習它們。試著和朋友或 Pangea Bot 談談以發現更多!", "botSettings": "機械人設置", "activitySettingsOverrideWarning": "活動計劃決定的語言和語言水平", @@ -11867,14 +11865,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -12050,6 +12040,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "關於我", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "成語", "grammarCopyPOSphrasalv": "短語動詞", "grammarCopyPOScompn": "複合詞", @@ -12064,5 +12059,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "完美的練習!", + "greatPractice": "很棒的練習!", + "usedNoHints": "不使用任何提示,做得好!", + "youveCompletedPractice": "你已經完成了練習,繼續努力以變得更好!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "更改電郵", + "withTheseAddressesDescription": "使用這些電郵地址您可以登錄、恢復密碼和管理訂閱。", + "noAddressDescription": "您尚未添加任何電郵地址。", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "文法", + "spanTypeWordChoice": "用詞選擇", + "spanTypeSpelling": "拼寫", + "spanTypePunctuation": "標點符號", + "spanTypeStyle": "風格", + "spanTypeFluency": "流暢度", + "spanTypeAccents": "口音", + "spanTypeCapitalization": "大寫", + "spanTypeCorrection": "更正", + "spanFeedbackTitle": "報告更正問題", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 9e0e738b0..4ed07cf1f 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -1,6 +1,6 @@ { "@@locale": "zh", - "@@last_modified": "2021-08-14 12:41:09.767805", + "@@last_modified": "2026-02-09 15:32:14.219030", "about": "关于", "@about": { "type": "String", @@ -10845,8 +10845,6 @@ "congratulations": "恭喜!", "anotherRound": "再来一轮", "noActivityRequest": "当前没有活动请求。", - "quit": "退出", - "congratulationsYouveCompletedPractice": "恭喜!您已完成练习课程。", "mustHave10Words": "您必须至少有 10 个词汇来进行练习。尝试与朋友或 Pangea Bot 交谈以发现更多!", "botSettings": "机器人设置", "activitySettingsOverrideWarning": "活动计划确定的语言和语言级别", @@ -10895,14 +10893,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -11078,6 +11068,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "关于我", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "成语", "grammarCopyPOSphrasalv": "短语动词", "grammarCopyPOScompn": "复合词", @@ -11092,5 +11087,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "完美的练习!", + "greatPractice": "很棒的练习!", + "usedNoHints": "很好,没使用任何提示!", + "youveCompletedPractice": "你已经完成了练习,继续努力以变得更好!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "更改电子邮件", + "withTheseAddressesDescription": "使用这些电子邮件地址,您可以登录、恢复密码和管理订阅。", + "noAddressDescription": "您尚未添加任何电子邮件地址。", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "语法", + "spanTypeWordChoice": "用词选择", + "spanTypeSpelling": "拼写", + "spanTypePunctuation": "标点", + "spanTypeStyle": "风格", + "spanTypeFluency": "流利度", + "spanTypeAccents": "口音", + "spanTypeCapitalization": "大写", + "spanTypeCorrection": "更正", + "spanFeedbackTitle": "报告更正问题", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/l10n/intl_zh_Hant.arb b/lib/l10n/intl_zh_Hant.arb index 047b9eb55..f80efa3cd 100644 --- a/lib/l10n/intl_zh_Hant.arb +++ b/lib/l10n/intl_zh_Hant.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2021-08-14 12:41:09.708353", + "@@last_modified": "2026-02-09 15:31:45.022584", "about": "關於", "@about": { "type": "String", @@ -10726,8 +10726,6 @@ "congratulations": "恭喜!", "anotherRound": "再來一輪", "noActivityRequest": "目前沒有活動請求。", - "quit": "退出", - "congratulationsYouveCompletedPractice": "恭喜!您已完成練習課程。", "mustHave10Words": "您必須至少有 10 個詞彙來進行練習。嘗試與朋友或 Pangea Bot 交談以發現更多!", "botSettings": "機器人設定", "activitySettingsOverrideWarning": "語言和語言級別由活動計劃決定", @@ -10776,14 +10774,6 @@ "type": "String", "placeholders": {} }, - "@quit": { - "type": "String", - "placeholders": {} - }, - "@congratulationsYouveCompletedPractice": { - "type": "String", - "placeholders": {} - }, "@mustHave10Words": { "type": "String", "placeholders": {} @@ -10959,6 +10949,11 @@ "type": "String", "placeholders": {} }, + "aboutMeHint": "關於我", + "@aboutMeHint": { + "type": "String", + "placeholders": {} + }, "grammarCopyPOSidiom": "成語", "grammarCopyPOSphrasalv": "片語動詞", "grammarCopyPOScompn": "合成詞", @@ -10973,5 +10968,90 @@ "@grammarCopyPOScompn": { "type": "String", "placeholders": {} + }, + "perfectPractice": "完美的練習!", + "greatPractice": "很棒的練習!", + "usedNoHints": "不使用任何提示,做得好!", + "youveCompletedPractice": "你已完成練習,繼續努力以變得更好!", + "@perfectPractice": { + "type": "String", + "placeholders": {} + }, + "@greatPractice": { + "type": "String", + "placeholders": {} + }, + "@usedNoHints": { + "type": "String", + "placeholders": {} + }, + "@youveCompletedPractice": { + "type": "String", + "placeholders": {} + }, + "changeEmail": "更改電子郵件", + "withTheseAddressesDescription": "使用這些電子郵件地址,您可以登錄、恢復密碼和管理訂閱。", + "noAddressDescription": "您尚未添加任何電子郵件地址。", + "@changeEmail": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesDescription": { + "type": "String", + "placeholders": {} + }, + "@noAddressDescription": { + "type": "String", + "placeholders": {} + }, + "spanTypeGrammar": "文法", + "spanTypeWordChoice": "用詞選擇", + "spanTypeSpelling": "拼寫", + "spanTypePunctuation": "標點符號", + "spanTypeStyle": "風格", + "spanTypeFluency": "流暢度", + "spanTypeAccents": "重音", + "spanTypeCapitalization": "大寫", + "spanTypeCorrection": "修正", + "spanFeedbackTitle": "報告修正問題", + "@spanTypeGrammar": { + "type": "String", + "placeholders": {} + }, + "@spanTypeWordChoice": { + "type": "String", + "placeholders": {} + }, + "@spanTypeSpelling": { + "type": "String", + "placeholders": {} + }, + "@spanTypePunctuation": { + "type": "String", + "placeholders": {} + }, + "@spanTypeStyle": { + "type": "String", + "placeholders": {} + }, + "@spanTypeFluency": { + "type": "String", + "placeholders": {} + }, + "@spanTypeAccents": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCapitalization": { + "type": "String", + "placeholders": {} + }, + "@spanTypeCorrection": { + "type": "String", + "placeholders": {} + }, + "@spanFeedbackTitle": { + "type": "String", + "placeholders": {} } } diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index d42f0ea2e..9708d8066 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -2253,18 +2253,23 @@ class ChatController extends State choreographer, context, showNextMatch, + (feedback) => onRequestWritingAssistance(feedback: feedback), ); } Future onRequestWritingAssistance({ bool manual = false, bool autosend = false, + String? feedback, }) async { if (shouldShowLanguageMismatchPopupByActivity) { return showLanguageMismatchPopup(manual: manual); } - await choreographer.requestWritingAssistance(manual: manual); + feedback == null + ? await choreographer.requestWritingAssistance(manual: manual) + : await choreographer.rerunWithFeedback(feedback); + if (choreographer.assistanceState == AssistanceStateEnum.fetched) { showNextMatch(); } else if (autosend) { diff --git a/lib/pages/chat/input_bar.dart b/lib/pages/chat/input_bar.dart index 149dd5f1f..1294fbc96 100644 --- a/lib/pages/chat/input_bar.dart +++ b/lib/pages/chat/input_bar.dart @@ -37,6 +37,7 @@ class InputBar extends StatelessWidget { final PangeaTextController? controller; final Choreographer choreographer; final VoidCallback showNextMatch; + final Future Function(String) onFeedbackSubmitted; // Pangea# final InputDecoration decoration; final ValueChanged? onChanged; @@ -62,6 +63,7 @@ class InputBar extends StatelessWidget { // #Pangea required this.choreographer, required this.showNextMatch, + required this.onFeedbackSubmitted, // Pangea# super.key, }); @@ -431,7 +433,13 @@ class InputBar extends StatelessWidget { if (match.updatedMatch.isITStart) { choreographer.itController.openIT(controller!.text); } else { - OverlayUtil.showIGCMatch(match, choreographer, context, showNextMatch); + OverlayUtil.showIGCMatch( + match, + choreographer, + context, + showNextMatch, + onFeedbackSubmitted, + ); // rebuild the text field to highlight the newly selected match choreographer.textController.setSystemText( @@ -475,9 +483,9 @@ class InputBar extends StatelessWidget { optionsBuilder: getSuggestions, // #Pangea // fieldViewBuilder: (context, controller, focusNode, _) => TextField( - fieldViewBuilder: (context, _, focusNode, _) => ValueListenableBuilder( - valueListenable: choreographer.itController.open, - builder: (context, _, _) { + fieldViewBuilder: (context, _, focusNode, _) => ListenableBuilder( + listenable: choreographer, + builder: (context, _) { return TextField( // Pangea# controller: controller, diff --git a/lib/pages/settings_3pid/settings_3pid_view.dart b/lib/pages/settings_3pid/settings_3pid_view.dart index d01fdc6bf..716f0df1b 100644 --- a/lib/pages/settings_3pid/settings_3pid_view.dart +++ b/lib/pages/settings_3pid/settings_3pid_view.dart @@ -20,7 +20,10 @@ class Settings3PidView extends StatelessWidget { return Scaffold( appBar: AppBar( leading: const Center(child: BackButton()), - title: Text(L10n.of(context).passwordRecovery), + // #Pangea + // title: Text(L10n.of(context).passwordRecovery), + title: Text(L10n.of(context).changeEmail), + // Pangea# actions: [ IconButton( icon: const Icon(Icons.add_outlined), @@ -68,10 +71,14 @@ class Settings3PidView extends StatelessWidget { ), title: Text( identifier.isEmpty - ? L10n.of(context).noPasswordRecoveryDescription - : L10n.of( - context, - ).withTheseAddressesRecoveryDescription, + // #Pangea + // ? L10n.of(context).noPasswordRecoveryDescription + // : L10n.of( + // context, + // ).withTheseAddressesRecoveryDescription, + ? L10n.of(context).noAddressDescription + : L10n.of(context).withTheseAddressesDescription, + // Pangea# ), ), const Divider(), diff --git a/lib/pages/settings_notifications/settings_notifications_view.dart b/lib/pages/settings_notifications/settings_notifications_view.dart index f2c211877..9f3e1780b 100644 --- a/lib/pages/settings_notifications/settings_notifications_view.dart +++ b/lib/pages/settings_notifications/settings_notifications_view.dart @@ -57,9 +57,7 @@ class SettingsNotificationsView extends StatelessWidget { child: snapshot.data != false ? const SizedBox() : Padding( - padding: const EdgeInsets.symmetric( - vertical: 8.0, - ), + padding: const EdgeInsets.fromLTRB(16, 8, 28, 8), child: ListTile( tileColor: theme.colorScheme.primaryContainer, leading: Icon( diff --git a/lib/pages/settings_password/settings_password_view.dart b/lib/pages/settings_password/settings_password_view.dart index fc0904a98..6525ecef8 100644 --- a/lib/pages/settings_password/settings_password_view.dart +++ b/lib/pages/settings_password/settings_password_view.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/settings_password/settings_password.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; @@ -75,11 +73,13 @@ class SettingsPasswordView extends StatelessWidget { : Text(L10n.of(context).changePassword), ), ), - const SizedBox(height: 16), - TextButton( - child: Text(L10n.of(context).passwordRecoverySettings), - onPressed: () => context.go('/rooms/settings/security/3pid'), - ), + // #Pangea + // const SizedBox(height: 16), + // TextButton( + // child: Text(L10n.of(context).passwordRecoverySettings), + // onPressed: () => context.go('/rooms/settings/security/3pid'), + // ), + // Pangea# ], ), ), diff --git a/lib/pages/settings_security/settings_security_view.dart b/lib/pages/settings_security/settings_security_view.dart index 2d38a5c4e..2da16e534 100644 --- a/lib/pages/settings_security/settings_security_view.dart +++ b/lib/pages/settings_security/settings_security_view.dart @@ -145,6 +145,16 @@ class SettingsSecurityView extends StatelessWidget { style: const TextStyle(fontFamily: 'RobotoMono'), ), ), + // #Pangea + if (capabilities?.m3pidChanges?.enabled != false || + error != null) + ListTile( + leading: const Icon(Icons.mail_outline_rounded), + trailing: const Icon(Icons.chevron_right_outlined), + title: Text(L10n.of(context).changeEmail), + onTap: () => context.go('/rooms/settings/security/3pid'), + ), + // Pangea# if (capabilities?.mChangePassword?.enabled != false || error != null) ListTile( diff --git a/lib/pangea/analytics_data/analytics_data_service.dart b/lib/pangea/analytics_data/analytics_data_service.dart index 8b260386c..b4362c156 100644 --- a/lib/pangea/analytics_data/analytics_data_service.dart +++ b/lib/pangea/analytics_data/analytics_data_service.dart @@ -241,7 +241,7 @@ class AnalyticsDataService { int? count, String? roomId, DateTime? since, - ConstructUseTypeEnum? type, + List? types, bool filterCapped = true, }) async { await _ensureInitialized(); @@ -249,7 +249,7 @@ class AnalyticsDataService { count: count, roomId: roomId, since: since, - type: type, + types: types, ); final blocked = blockedConstructs; @@ -442,7 +442,12 @@ class AnalyticsDataService { final offset = lowerLevelXP - newData.totalXP; await MatrixState.pangeaController.userController.addXPOffset(offset); await updateXPOffset( - MatrixState.pangeaController.userController.analyticsProfile!.xpOffset!, + MatrixState + .pangeaController + .userController + .publicProfile! + .analytics + .xpOffset!, ); } diff --git a/lib/pangea/analytics_data/analytics_database.dart b/lib/pangea/analytics_data/analytics_database.dart index 7355b7db5..91515bee2 100644 --- a/lib/pangea/analytics_data/analytics_database.dart +++ b/lib/pangea/analytics_data/analytics_database.dart @@ -197,7 +197,7 @@ class AnalyticsDatabase with DatabaseFileStorage { int? count, String? roomId, DateTime? since, - ConstructUseTypeEnum? type, + List? types, }) async { final stopwatch = Stopwatch()..start(); final results = []; @@ -209,7 +209,7 @@ class AnalyticsDatabase with DatabaseFileStorage { if (roomId != null && use.metadata.roomId != roomId) { return true; // skip but continue } - if (type != null && use.useType != type) { + if (types != null && !types.contains(use.useType)) { return true; // skip but continue } diff --git a/lib/pangea/analytics_details_popup/lemma_use_example_messages.dart b/lib/pangea/analytics_details_popup/lemma_use_example_messages.dart index 6aa1b53bb..761ffda8c 100644 --- a/lib/pangea/analytics_details_popup/lemma_use_example_messages.dart +++ b/lib/pangea/analytics_details_popup/lemma_use_example_messages.dart @@ -8,9 +8,7 @@ import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/pangea/analytics_misc/construct_use_model.dart'; -import 'package:fluffychat/pangea/analytics_misc/construct_use_type_enum.dart'; import 'package:fluffychat/pangea/analytics_misc/constructs_model.dart'; -import 'package:fluffychat/pangea/analytics_misc/learning_skills_enum.dart'; import 'package:fluffychat/pangea/constructs/construct_level_enum.dart'; import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/events/models/pangea_token_model.dart'; @@ -24,10 +22,7 @@ class LemmaUseExampleMessages extends StatelessWidget { Future> _getExampleMessages() async { final List examples = []; for (final OneConstructUse use in construct.cappedUses) { - if (use.useType.skillsEnumType != LearningSkillsEnum.writing || - use.metadata.eventId == null || - use.form == null || - use.xp <= 0) { + if (use.metadata.eventId == null || use.form == null || use.xp <= 0) { continue; } diff --git a/lib/pangea/analytics_misc/example_message_util.dart b/lib/pangea/analytics_misc/example_message_util.dart index f9c5713aa..498c6129a 100644 --- a/lib/pangea/analytics_misc/example_message_util.dart +++ b/lib/pangea/analytics_misc/example_message_util.dart @@ -4,14 +4,93 @@ import 'package:matrix/matrix.dart'; import 'package:fluffychat/pangea/analytics_misc/client_analytics_extension.dart'; import 'package:fluffychat/pangea/analytics_misc/construct_use_model.dart'; +import 'package:fluffychat/pangea/analytics_practice/analytics_practice_session_model.dart'; import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/events/models/pangea_token_model.dart'; +/// Internal result class that holds all computed data from building an example message. +class _ExampleMessageResult { + final List displaySpans; + final List includedTokens; + final String text; + final int adjustedTargetIndex; + final String? eventId; + final String? roomId; + + _ExampleMessageResult({ + required this.displaySpans, + required this.includedTokens, + required this.text, + required this.adjustedTargetIndex, + this.eventId, + this.roomId, + }); + + List toSpans() => displaySpans; + AudioExampleMessage toAudioExampleMessage() => AudioExampleMessage( + tokens: includedTokens, + eventId: eventId, + roomId: roomId, + exampleMessage: ExampleMessageInfo(exampleMessage: displaySpans), + ); +} + class ExampleMessageUtil { static Future?> getExampleMessage( ConstructUses construct, Client client, { String? form, + bool noBold = false, + }) async { + final result = await _getExampleMessageResult( + construct, + client, + form: form, + noBold: noBold, + ); + return result?.toSpans(); + } + + static Future getAudioExampleMessage( + ConstructUses construct, + Client client, { + String? form, + bool noBold = false, + }) async { + final result = await _getExampleMessageResult( + construct, + client, + form: form, + noBold: noBold, + ); + return result?.toAudioExampleMessage(); + } + + static Future>> getExampleMessages( + ConstructUses construct, + Client client, + int maxMessages, { + bool noBold = false, + }) async { + final List> allSpans = []; + for (final use in construct.cappedUses) { + if (allSpans.length >= maxMessages) break; + final event = await client.getEventByConstructUse(use); + if (event == null) continue; + + final result = _buildExampleMessage(use.form, event, noBold: noBold); + if (result != null) { + allSpans.add(result.toSpans()); + } + } + return allSpans; + } + + static Future<_ExampleMessageResult?> _getExampleMessageResult( + ConstructUses construct, + Client client, { + String? form, + bool noBold = false, }) async { for (final use in construct.cappedUses) { if (form != null && use.form != form) continue; @@ -19,36 +98,17 @@ class ExampleMessageUtil { final event = await client.getEventByConstructUse(use); if (event == null) continue; - final spans = _buildExampleMessage(use.form, event); - if (spans != null) return spans; + final result = _buildExampleMessage(use.form, event, noBold: noBold); + if (result != null) return result; } - return null; } - static Future>> getExampleMessages( - ConstructUses construct, - Client client, - int maxMessages, - ) async { - final List> allSpans = []; - for (final use in construct.cappedUses) { - if (allSpans.length >= maxMessages) break; - final event = await client.getEventByConstructUse(use); - if (event == null) continue; - - final spans = _buildExampleMessage(use.form, event); - if (spans != null) { - allSpans.add(spans); - } - } - return allSpans; - } - - static List? _buildExampleMessage( + static _ExampleMessageResult? _buildExampleMessage( String? form, - PangeaMessageEvent messageEvent, - ) { + PangeaMessageEvent messageEvent, { + bool noBold = false, + }) { String? text; List? tokens; int targetTokenIndex = -1; @@ -99,6 +159,7 @@ class ExampleMessageUtil { // ---------- BEFORE ---------- int beforeStartOffset = 0; bool trimmedBefore = false; + int firstIncludedTokenIndex = 0; if (beforeAvailable > beforeBudget) { final desiredStart = targetStart - beforeBudget; @@ -110,6 +171,7 @@ class ExampleMessageUtil { if (tokenEnd > desiredStart) { beforeStartOffset = token.text.offset; + firstIncludedTokenIndex = i; trimmedBefore = true; break; } @@ -124,6 +186,7 @@ class ExampleMessageUtil { // ---------- AFTER ---------- int afterEndOffset = totalChars; bool trimmedAfter = false; + int lastIncludedTokenIndex = tokens.length - 1; if (afterAvailable > afterBudget) { final desiredEnd = targetEnd + afterBudget; @@ -132,6 +195,7 @@ class ExampleMessageUtil { final token = tokens[i]; if (token.text.offset >= desiredEnd) { afterEndOffset = token.text.offset; + lastIncludedTokenIndex = i - 1; trimmedAfter = true; break; } @@ -144,15 +208,36 @@ class ExampleMessageUtil { .toString() .trimRight(); - return [ + final displaySpans = [ if (trimmedBefore) const TextSpan(text: '… '), TextSpan(text: before), TextSpan( text: targetToken.text.content, - style: const TextStyle(fontWeight: FontWeight.bold), + style: noBold ? null : const TextStyle(fontWeight: FontWeight.bold), ), TextSpan(text: after), if (trimmedAfter) const TextSpan(text: '…'), ]; + + // Extract only the tokens that are included in the displayed text + final includedTokens = tokens.sublist( + firstIncludedTokenIndex, + lastIncludedTokenIndex + 1, + ); + + // Adjust target token index relative to the included tokens + final adjustedTargetIndex = targetTokenIndex - firstIncludedTokenIndex; + + return _ExampleMessageResult( + displaySpans: displaySpans, + includedTokens: includedTokens, + text: text.characters + .skip(beforeStartOffset) + .take(afterEndOffset - beforeStartOffset) + .toString(), + adjustedTargetIndex: adjustedTargetIndex, + eventId: messageEvent.eventId, + roomId: messageEvent.room.id, + ); } } diff --git a/lib/pangea/analytics_misc/level_display_name.dart b/lib/pangea/analytics_misc/level_display_name.dart index ae0371960..6c4c36920 100644 --- a/lib/pangea/analytics_misc/level_display_name.dart +++ b/lib/pangea/analytics_misc/level_display_name.dart @@ -19,9 +19,11 @@ class LevelDisplayName extends StatelessWidget { return Padding( padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 2.0), child: FutureBuilder( - future: MatrixState.pangeaController.userController - .getPublicAnalyticsProfile(userId), + future: MatrixState.pangeaController.userController.getPublicProfile( + userId, + ), builder: (context, snapshot) { + final analytics = snapshot.data?.analytics; return Row( mainAxisSize: MainAxisSize.min, children: [ @@ -39,11 +41,18 @@ class LevelDisplayName extends StatelessWidget { else Row( children: [ - if (snapshot.data?.baseLanguage != null && - snapshot.data?.targetLanguage != null) + if (snapshot.data?.countryEmoji != null) + Padding( + padding: const EdgeInsets.only(right: 4.0), + child: Text( + snapshot.data!.countryEmoji!, + style: textStyle ?? const TextStyle(fontSize: 16.0), + ), + ), + if (analytics?.baseLanguage != null && + analytics?.targetLanguage != null) Text( - snapshot.data!.baseLanguage!.langCodeShort - .toUpperCase(), + analytics!.baseLanguage!.langCodeShort.toUpperCase(), style: textStyle ?? TextStyle( @@ -51,16 +60,15 @@ class LevelDisplayName extends StatelessWidget { color: Theme.of(context).colorScheme.primary, ), ), - if (snapshot.data?.baseLanguage != null && - snapshot.data?.targetLanguage != null) + if (analytics?.baseLanguage != null && + analytics?.targetLanguage != null) Icon( Icons.chevron_right_outlined, size: iconSize ?? 16.0, ), - if (snapshot.data?.targetLanguage != null) + if (analytics?.targetLanguage != null) Text( - snapshot.data!.targetLanguage!.langCodeShort - .toUpperCase(), + analytics!.targetLanguage!.langCodeShort.toUpperCase(), style: textStyle ?? TextStyle( @@ -69,11 +77,10 @@ class LevelDisplayName extends StatelessWidget { ), ), const SizedBox(width: 4.0), - if (snapshot.data?.level != null) - Text("⭐", style: textStyle), - if (snapshot.data?.level != null) + if (analytics?.level != null) Text("⭐", style: textStyle), + if (analytics?.level != null) Text( - "${snapshot.data!.level!}", + "${analytics!.level!}", style: textStyle ?? TextStyle( diff --git a/lib/pangea/analytics_practice/analytics_practice_page.dart b/lib/pangea/analytics_practice/analytics_practice_page.dart index 2c5467c05..42d3e452a 100644 --- a/lib/pangea/analytics_practice/analytics_practice_page.dart +++ b/lib/pangea/analytics_practice/analytics_practice_page.dart @@ -13,17 +13,21 @@ import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart'; import 'package:fluffychat/pangea/analytics_misc/construct_use_type_enum.dart'; import 'package:fluffychat/pangea/analytics_misc/constructs_model.dart'; import 'package:fluffychat/pangea/analytics_misc/example_message_util.dart'; +import 'package:fluffychat/pangea/analytics_practice/analytics_practice_constants.dart'; import 'package:fluffychat/pangea/analytics_practice/analytics_practice_session_model.dart'; import 'package:fluffychat/pangea/analytics_practice/analytics_practice_session_repo.dart'; import 'package:fluffychat/pangea/analytics_practice/analytics_practice_view.dart'; import 'package:fluffychat/pangea/common/utils/async_state.dart'; import 'package:fluffychat/pangea/constructs/construct_identifier.dart'; +import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/lemmas/lemma_info_repo.dart'; import 'package:fluffychat/pangea/morphs/morph_features_enum.dart'; +import 'package:fluffychat/pangea/practice_activities/activity_type_enum.dart'; import 'package:fluffychat/pangea/practice_activities/message_activity_request.dart'; import 'package:fluffychat/pangea/practice_activities/practice_activity_model.dart'; import 'package:fluffychat/pangea/practice_activities/practice_generation_repo.dart'; import 'package:fluffychat/pangea/text_to_speech/tts_controller.dart'; +import 'package:fluffychat/pangea/toolbar/message_practice/message_audio_card.dart'; import 'package:fluffychat/pangea/toolbar/message_practice/practice_record_controller.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; @@ -93,8 +97,16 @@ class AnalyticsPracticeState extends State final ValueNotifier hintPressedNotifier = ValueNotifier(false); + final Set _selectedCorrectAnswers = {}; + + // Track if we're showing the completion message for audio activities + final ValueNotifier showingAudioCompletion = ValueNotifier(false); + final ValueNotifier hintsUsedNotifier = ValueNotifier(0); + static const int maxHints = 5; + final Map> _choiceTexts = {}; final Map> _choiceEmojis = {}; + final Map _audioFiles = {}; StreamSubscription? _languageStreamSubscription; @@ -121,6 +133,8 @@ class AnalyticsPracticeState extends State enableChoicesNotifier.dispose(); selectedMorphChoice.dispose(); hintPressedNotifier.dispose(); + showingAudioCompletion.dispose(); + hintsUsedNotifier.dispose(); super.dispose(); } @@ -207,8 +221,10 @@ class AnalyticsPracticeState extends State activityTarget.value = null; selectedMorphChoice.value = null; hintPressedNotifier.value = false; + hintsUsedNotifier.value = 0; enableChoicesNotifier.value = true; progressNotifier.value = 0.0; + showingAudioCompletion.value = false; _queue.clear(); _choiceTexts.clear(); _choiceEmojis.clear(); @@ -225,7 +241,11 @@ class AnalyticsPracticeState extends State void _playAudio() { if (activityTarget.value == null) return; - if (widget.type != ConstructTypeEnum.vocab) return; + if (widget.type == ConstructTypeEnum.vocab && + _currentActivity is VocabMeaningPracticeActivityModel) { + } else { + return; + } TtsController.tryToSpeak( activityTarget.value!.target.tokens.first.vocabConstructID.lemma, langCode: MatrixState.pangeaController.userController.userL2!.langCode, @@ -315,6 +335,7 @@ class AnalyticsPracticeState extends State if (_continuing) return; _continuing = true; enableChoicesNotifier.value = true; + showingAudioCompletion.value = false; try { if (activityState.value @@ -326,6 +347,7 @@ class AnalyticsPracticeState extends State activityState.value = const AsyncState.loading(); selectedMorphChoice.value = null; hintPressedNotifier.value = false; + _selectedCorrectAnswers.clear(); final nextActivityCompleter = _queue.removeFirst(); try { @@ -418,9 +440,57 @@ class AnalyticsPracticeState extends State await _fetchLemmaInfo(activityModel.storageKey, choices); } + // Prefetch audio for audio activities before marking ready + if (activityModel is VocabAudioPracticeActivityModel) { + await _loadAudioForActivity(activityModel); + } + return activityModel; } + Future _loadAudioForActivity( + VocabAudioPracticeActivityModel activity, + ) async { + final eventId = activity.eventId; + final roomId = activity.roomId; + + if (eventId == null || roomId == null) { + throw L10n.of(context).oopsSomethingWentWrong; + } + + final client = MatrixState.pangeaController.matrixState.client; + final room = client.getRoomById(roomId); + + if (room == null) { + throw L10n.of(context).oopsSomethingWentWrong; + } + + final event = await room.getEventById(eventId); + if (event == null) { + throw L10n.of(context).oopsSomethingWentWrong; + } + + final pangeaEvent = PangeaMessageEvent( + event: event, + timeline: await room.getTimeline(), + ownMessage: event.senderId == client.userID, + ); + + // Prefetch the audio file + final audioFile = await pangeaEvent.requestTextToSpeech( + activity.langCode, + MatrixState.pangeaController.userController.voice, + ); + + // Store the audio file with the eventId as key + _audioFiles[eventId] = audioFile; + } + + PangeaAudioFile? getAudioFile(String? eventId) { + if (eventId == null) return null; + return _audioFiles[eventId]; + } + Future _fetchLemmaInfo( String requestKey, List choiceIds, @@ -468,7 +538,27 @@ class AnalyticsPracticeState extends State } void onHintPressed() { - hintPressedNotifier.value = !hintPressedNotifier.value; + if (hintsUsedNotifier.value >= maxHints) return; + if (!hintPressedNotifier.value) { + hintsUsedNotifier.value++; + } + hintPressedNotifier.value = true; + } + + Future onAudioContinuePressed() async { + showingAudioCompletion.value = false; + + //Mark this activity as completed, and either load the next or complete the session + _sessionLoader.value!.completeActivity(); + progressNotifier.value = _sessionLoader.value!.progress; + + if (_queue.isEmpty) { + await _completeSession(); + } else if (_isComplete) { + await _completeSession(); + } else { + await _continueSession(); + } } Future onSelectChoice(String choiceContent) async { @@ -482,8 +572,17 @@ class AnalyticsPracticeState extends State tag: choiceContent, ); } + final isCorrect = activity.multipleChoiceContent.isCorrect(choiceContent); - if (isCorrect) { + + final isAudioActivity = + activity.activityType == ActivityTypeEnum.lemmaAudio; + if (isAudioActivity && isCorrect) { + _selectedCorrectAnswers.add(choiceContent); + } + + if (isCorrect && !isAudioActivity) { + // Non-audio activities disable choices after first correct answer enableChoicesNotifier.value = false; } @@ -501,7 +600,25 @@ class AnalyticsPracticeState extends State [use], ); - if (!activity.multipleChoiceContent.isCorrect(choiceContent)) return; + if (!isCorrect) return; + + // For audio activities, check if all answers have been selected + if (isAudioActivity) { + final allAnswers = activity.multipleChoiceContent.answers; + final allSelected = allAnswers.every( + (answer) => _selectedCorrectAnswers.contains(answer), + ); + + if (!allSelected) { + return; + } + + // All answers selected, disable choices and show completion message + enableChoicesNotifier.value = false; + await Future.delayed(const Duration(milliseconds: 1000)); + showingAudioCompletion.value = true; + return; + } _playAudio(); @@ -529,7 +646,7 @@ class AnalyticsPracticeState extends State final construct = target.targetTokenConstructID(token); if (widget.type == ConstructTypeEnum.morph) { - return activityRequest.morphExampleInfo?.exampleMessage; + return activityRequest.exampleMessage?.exampleMessage; } return ExampleMessageUtil.getExampleMessage( @@ -538,9 +655,48 @@ class AnalyticsPracticeState extends State ); } + List? getAudioExampleMessage() { + final activity = _currentActivity; + if (activity is VocabAudioPracticeActivityModel) { + return activity.exampleMessage.exampleMessage; + } + return null; + } + Future get derivedAnalyticsData => _analyticsService.derivedData; + /// Returns congratulations message based on performance + String getCompletionMessage(BuildContext context) { + final accuracy = _sessionLoader.value?.state.accuracy ?? 0; + final hasTimeBonus = + (_sessionLoader.value?.state.elapsedSeconds ?? 0) <= + AnalyticsPracticeConstants.timeForBonus; + final hintsUsed = hintsUsedNotifier.value; + + final bool perfectAccuracy = accuracy == 100; + final bool noHintsUsed = hintsUsed == 0; + final bool hintsAvailable = widget.type == ConstructTypeEnum.morph; + + //check how many conditions for bonuses the user met and return message accordingly + final conditionsMet = [ + perfectAccuracy, + !hintsAvailable || noHintsUsed, + hasTimeBonus, + ].where((c) => c).length; + + if (conditionsMet == 3) { + return L10n.of(context).perfectPractice; + } + if (conditionsMet >= 2) { + return L10n.of(context).greatPractice; + } + if (hintsAvailable && noHintsUsed) { + return L10n.of(context).usedNoHints; + } + return L10n.of(context).youveCompletedPractice; + } + @override Widget build(BuildContext context) => AnalyticsPracticeView(this); } diff --git a/lib/pangea/analytics_practice/analytics_practice_session_model.dart b/lib/pangea/analytics_practice/analytics_practice_session_model.dart index 4291dfbb6..c7c58cfc3 100644 --- a/lib/pangea/analytics_practice/analytics_practice_session_model.dart +++ b/lib/pangea/analytics_practice/analytics_practice_session_model.dart @@ -3,13 +3,14 @@ import 'package:flutter/painting.dart'; import 'package:fluffychat/pangea/analytics_misc/construct_use_type_enum.dart'; import 'package:fluffychat/pangea/analytics_misc/constructs_model.dart'; import 'package:fluffychat/pangea/analytics_practice/analytics_practice_constants.dart'; +import 'package:fluffychat/pangea/events/models/pangea_token_model.dart'; import 'package:fluffychat/pangea/practice_activities/message_activity_request.dart'; import 'package:fluffychat/pangea/practice_activities/practice_target.dart'; -class MorphExampleInfo { +class ExampleMessageInfo { final List exampleMessage; - const MorphExampleInfo({required this.exampleMessage}); + const ExampleMessageInfo({required this.exampleMessage}); Map toJson() { final segments = >[]; @@ -26,7 +27,7 @@ class MorphExampleInfo { return {'segments': segments}; } - factory MorphExampleInfo.fromJson(Map json) { + factory ExampleMessageInfo.fromJson(Map json) { final segments = json['segments'] as List? ?? []; final spans = []; @@ -42,25 +43,57 @@ class MorphExampleInfo { ); } - return MorphExampleInfo(exampleMessage: spans); + return ExampleMessageInfo(exampleMessage: spans); + } +} + +/// An extended example message that includes both formatted display spans and tokens to generate audio practice activities. +/// eventId/roomId are needed for audio playback. +class AudioExampleMessage { + final List tokens; + final String? eventId; + final String? roomId; + final ExampleMessageInfo exampleMessage; + + const AudioExampleMessage({ + required this.tokens, + this.eventId, + this.roomId, + required this.exampleMessage, + }); + + Map toJson() { + return {'eventId': eventId, 'roomId': roomId}; + } + + factory AudioExampleMessage.fromJson(Map json) { + return AudioExampleMessage( + tokens: const [], + eventId: json['eventId'] as String?, + roomId: json['roomId'] as String?, + exampleMessage: const ExampleMessageInfo(exampleMessage: []), + ); } } class AnalyticsActivityTarget { final PracticeTarget target; final GrammarErrorRequestInfo? grammarErrorInfo; - final MorphExampleInfo? morphExampleInfo; + final ExampleMessageInfo? exampleMessage; + final AudioExampleMessage? audioExampleMessage; AnalyticsActivityTarget({ required this.target, this.grammarErrorInfo, - this.morphExampleInfo, + this.exampleMessage, + this.audioExampleMessage, }); Map toJson() => { 'target': target.toJson(), 'grammarErrorInfo': grammarErrorInfo?.toJson(), - 'morphExampleInfo': morphExampleInfo?.toJson(), + 'exampleMessage': exampleMessage?.toJson(), + 'audioExampleMessage': audioExampleMessage?.toJson(), }; factory AnalyticsActivityTarget.fromJson(Map json) => @@ -69,8 +102,11 @@ class AnalyticsActivityTarget { grammarErrorInfo: json['grammarErrorInfo'] != null ? GrammarErrorRequestInfo.fromJson(json['grammarErrorInfo']) : null, - morphExampleInfo: json['morphExampleInfo'] != null - ? MorphExampleInfo.fromJson(json['morphExampleInfo']) + exampleMessage: json['exampleMessage'] != null + ? ExampleMessageInfo.fromJson(json['exampleMessage']) + : null, + audioExampleMessage: json['audioExampleMessage'] != null + ? AudioExampleMessage.fromJson(json['audioExampleMessage']) : null, ); } @@ -133,7 +169,8 @@ class AnalyticsPracticeSessionModel { activityQualityFeedback: null, target: target.target, grammarErrorInfo: target.grammarErrorInfo, - morphExampleInfo: target.morphExampleInfo, + exampleMessage: target.exampleMessage, + audioExampleMessage: target.audioExampleMessage, ); }).toList(); } diff --git a/lib/pangea/analytics_practice/analytics_practice_session_repo.dart b/lib/pangea/analytics_practice/analytics_practice_session_repo.dart index e575542c3..41dc98542 100644 --- a/lib/pangea/analytics_practice/analytics_practice_session_repo.dart +++ b/lib/pangea/analytics_practice/analytics_practice_session_repo.dart @@ -34,29 +34,45 @@ class AnalyticsPracticeSessionRepo { throw UnsubscribedException(); } - final r = Random(); - final activityTypes = ActivityTypeEnum.analyticsPracticeTypes(type); - - final types = List.generate( - AnalyticsPracticeConstants.practiceGroupSize + - AnalyticsPracticeConstants.errorBufferSize, - (_) => activityTypes[r.nextInt(activityTypes.length)], - ); - final List targets = []; if (type == ConstructTypeEnum.vocab) { - final constructs = await _fetchVocab(); - final targetCount = min(constructs.length, types.length); - targets.addAll([ - for (var i = 0; i < targetCount; i++) + const totalNeeded = + AnalyticsPracticeConstants.practiceGroupSize + + AnalyticsPracticeConstants.errorBufferSize; + final halfNeeded = (totalNeeded / 2).ceil(); + + // Fetch audio constructs (with example messages) + final audioMap = await _fetchAudio(); + final audioCount = min(audioMap.length, halfNeeded); + + // Fetch vocab constructs to fill the rest + final vocabNeeded = totalNeeded - audioCount; + final vocabConstructs = await _fetchVocab(); + final vocabCount = min(vocabConstructs.length, vocabNeeded); + + for (final entry in audioMap.entries.take(audioCount)) { + targets.add( AnalyticsActivityTarget( target: PracticeTarget( - tokens: [constructs[i].asToken], - activityType: types[i], + tokens: [entry.key.asToken], + activityType: ActivityTypeEnum.lemmaAudio, + ), + audioExampleMessage: entry.value, + ), + ); + } + for (var i = 0; i < vocabCount; i++) { + targets.add( + AnalyticsActivityTarget( + target: PracticeTarget( + tokens: [vocabConstructs[i].asToken], + activityType: ActivityTypeEnum.lemmaMeaning, ), ), - ]); + ); + } + targets.shuffle(); } else { final errorTargets = await _fetchErrors(); targets.addAll(errorTargets); @@ -78,7 +94,7 @@ class AnalyticsPracticeSessionRepo { activityType: ActivityTypeEnum.grammarCategory, morphFeature: entry.feature, ), - morphExampleInfo: MorphExampleInfo( + exampleMessage: ExampleMessageInfo( exampleMessage: entry.exampleMessage, ), ), @@ -135,6 +151,64 @@ class AnalyticsPracticeSessionRepo { return targets; } + static Future> + _fetchAudio() async { + final constructs = await MatrixState + .pangeaController + .matrixState + .analyticsDataService + .getAggregatedConstructs(ConstructTypeEnum.vocab) + .then((map) => map.values.toList()); + + // sort by last used descending, nulls first + constructs.sort((a, b) { + final dateA = a.lastUsed; + final dateB = b.lastUsed; + if (dateA == null && dateB == null) return 0; + if (dateA == null) return -1; + if (dateB == null) return 1; + return dateA.compareTo(dateB); + }); + + final Set seenLemmas = {}; + final Set seenEventIds = {}; + final targets = {}; + + for (final construct in constructs) { + if (targets.length >= + (AnalyticsPracticeConstants.practiceGroupSize + + AnalyticsPracticeConstants.errorBufferSize)) { + break; + } + + if (seenLemmas.contains(construct.lemma)) continue; + + // Try to get an audio example message with token data for this lemma + final audioExampleMessage = + await ExampleMessageUtil.getAudioExampleMessage( + await MatrixState.pangeaController.matrixState.analyticsDataService + .getConstructUse(construct.id), + MatrixState.pangeaController.matrixState.client, + noBold: true, + ); + + // Only add to targets if we found an example message AND its eventId hasn't been used + if (audioExampleMessage != null) { + final eventId = audioExampleMessage.eventId; + if (eventId != null && seenEventIds.contains(eventId)) { + continue; + } + + seenLemmas.add(construct.lemma); + if (eventId != null) { + seenEventIds.add(eventId); + } + targets[construct.id] = audioExampleMessage; + } + } + return targets; + } + static Future> _fetchMorphs() async { final constructs = await MatrixState .pangeaController @@ -245,19 +319,26 @@ class AnalyticsPracticeSessionRepo { } static Future> _fetchErrors() async { - // Fetch all recent uses in one call (not filtering blocked constructs) final allRecentUses = await MatrixState .pangeaController .matrixState .analyticsDataService - .getUses(count: 200, filterCapped: false); + .getUses( + count: 300, + filterCapped: false, + types: [ + ConstructUseTypeEnum.ga, + ConstructUseTypeEnum.corGE, + ConstructUseTypeEnum.incGE, + ], + ); // Filter for grammar error uses final grammarErrorUses = allRecentUses .where((use) => use.useType == ConstructUseTypeEnum.ga) .toList(); - // Create list of recently used constructs + // Create list of recently practiced constructs (last 24 hours) final cutoffTime = DateTime.now().subtract(const Duration(hours: 24)); final recentlyPracticedConstructs = allRecentUses .where( diff --git a/lib/pangea/analytics_practice/analytics_practice_view.dart b/lib/pangea/analytics_practice/analytics_practice_view.dart index 8b24d488a..9046f840a 100644 --- a/lib/pangea/analytics_practice/analytics_practice_view.dart +++ b/lib/pangea/analytics_practice/analytics_practice_view.dart @@ -4,11 +4,11 @@ import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat/events/audio_player.dart'; import 'package:fluffychat/pangea/analytics_details_popup/morph_meaning_widget.dart'; import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart'; import 'package:fluffychat/pangea/analytics_practice/analytics_practice_page.dart'; import 'package:fluffychat/pangea/analytics_practice/analytics_practice_session_model.dart'; -import 'package:fluffychat/pangea/analytics_practice/choice_cards/audio_choice_card.dart'; import 'package:fluffychat/pangea/analytics_practice/choice_cards/game_choice_card.dart'; import 'package:fluffychat/pangea/analytics_practice/choice_cards/grammar_choice_card.dart'; import 'package:fluffychat/pangea/analytics_practice/choice_cards/meaning_choice_card.dart'; @@ -114,48 +114,84 @@ class _AnalyticsActivityView extends StatelessWidget { : Theme.of(context).textTheme.titleMedium; titleStyle = titleStyle?.copyWith(fontWeight: FontWeight.bold); - return ListView( + return Column( children: [ - //per-activity instructions, add switch statement once there are more types - const InstructionsInlineTooltip( - instructionsEnum: InstructionsEnum.selectMeaning, - padding: EdgeInsets.symmetric(vertical: 8.0), - ), - SizedBox( - height: 75.0, - child: ValueListenableBuilder( - valueListenable: controller.activityTarget, - builder: (context, target, _) => target != null - ? Column( - children: [ - Text( - target.promptText(context), - textAlign: TextAlign.center, - style: titleStyle, - maxLines: 2, - overflow: TextOverflow.ellipsis, - ), - if (controller.widget.type == ConstructTypeEnum.vocab) - PhoneticTranscriptionWidget( - text: - target.target.tokens.first.vocabConstructID.lemma, - textLanguage: MatrixState - .pangeaController - .userController - .userL2!, - style: const TextStyle(fontSize: 14.0), + Expanded( + child: ListView( + children: [ + //Hints counter bar for grammar activities only + if (controller.widget.type == ConstructTypeEnum.morph) + Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: _HintsCounterBar(controller: controller), + ), + //per-activity instructions, add switch statement once there are more types + const InstructionsInlineTooltip( + instructionsEnum: InstructionsEnum.selectMeaning, + padding: EdgeInsets.symmetric(vertical: 8.0), + ), + SizedBox( + height: 75.0, + child: ValueListenableBuilder( + valueListenable: controller.activityTarget, + builder: (context, target, _) { + if (target == null) return const SizedBox.shrink(); + + final isAudioActivity = + target.target.activityType == + ActivityTypeEnum.lemmaAudio; + final isVocabType = + controller.widget.type == ConstructTypeEnum.vocab; + + return Column( + children: [ + Text( + isAudioActivity && isVocabType + ? L10n.of(context).selectAllWords + : target.promptText(context), + textAlign: TextAlign.center, + style: titleStyle, + maxLines: 2, + overflow: TextOverflow.ellipsis, ), - ], - ) - : const SizedBox.shrink(), + if (isVocabType && !isAudioActivity) + PhoneticTranscriptionWidget( + text: target + .target + .tokens + .first + .vocabConstructID + .lemma, + textLanguage: MatrixState + .pangeaController + .userController + .userL2!, + style: const TextStyle(fontSize: 14.0), + ), + ], + ); + }, + ), + ), + const SizedBox(height: 16.0), + Center( + child: _AnalyticsPracticeCenterContent(controller: controller), + ), + const SizedBox(height: 16.0), + (controller.widget.type == ConstructTypeEnum.morph) + ? Center(child: _HintSection(controller: controller)) + : const SizedBox.shrink(), + const SizedBox(height: 16.0), + _ActivityChoicesWidget(controller), + const SizedBox(height: 16.0), + _WrongAnswerFeedback(controller: controller), + ], ), ), - const SizedBox(height: 16.0), - Center(child: _AnalyticsPracticeCenterContent(controller: controller)), - const SizedBox(height: 16.0), - _ActivityChoicesWidget(controller), - const SizedBox(height: 16.0), - _WrongAnswerFeedback(controller: controller), + Container( + alignment: Alignment.bottomCenter, + child: _AudioContinueButton(controller: controller), + ), ], ); } @@ -172,49 +208,60 @@ class _AnalyticsPracticeCenterContent extends StatelessWidget { valueListenable: controller.activityTarget, builder: (context, target, _) => switch (target?.target.activityType) { null => const SizedBox(), - ActivityTypeEnum.grammarError => SizedBox( - height: 160.0, - child: SingleChildScrollView( - child: ValueListenableBuilder( - valueListenable: controller.activityState, - builder: (context, state, _) => switch (state) { - AsyncLoaded( - value: final GrammarErrorPracticeActivityModel activity, - ) => - Column( - mainAxisSize: MainAxisSize.min, - children: [ - _ErrorBlankWidget( - key: ValueKey( - '${activity.eventID}_${activity.errorOffset}_${activity.errorLength}', - ), - activity: activity, - ), - const SizedBox(height: 12), - ], - ), - _ => const SizedBox(), - }, - ), + ActivityTypeEnum.grammarError => SingleChildScrollView( + child: ListenableBuilder( + listenable: Listenable.merge([ + controller.activityState, + controller.hintPressedNotifier, + ]), + builder: (context, _) { + final state = controller.activityState.value; + if (state is! AsyncLoaded) { + return const SizedBox(); + } + final activity = state.value; + if (activity is! GrammarErrorPracticeActivityModel) { + return const SizedBox(); + } + return _ErrorBlankWidget( + key: ValueKey( + '${activity.eventID}_${activity.errorOffset}_${activity.errorLength}', + ), + activity: activity, + showTranslation: controller.hintPressedNotifier.value, + ); + }, ), ), ActivityTypeEnum.grammarCategory => Center( - child: Column( - children: [ - _CorrectAnswerHint(controller: controller), - _ExampleMessageWidget(controller.getExampleMessage(target!)), - const SizedBox(height: 12), - ValueListenableBuilder( - valueListenable: controller.hintPressedNotifier, - builder: (context, hintPressed, _) { - return HintButton( - depressed: hintPressed, - onPressed: controller.onHintPressed, - ); - }, + child: _ExampleMessageWidget(controller.getExampleMessage(target!)), + ), + ActivityTypeEnum.lemmaAudio => ValueListenableBuilder( + valueListenable: controller.activityState, + builder: (context, state, _) => switch (state) { + AsyncLoaded( + value: final VocabAudioPracticeActivityModel activity, + ) => + SizedBox( + height: 100.0, + child: Center( + child: AudioPlayerWidget( + null, + color: Theme.of(context).colorScheme.primary, + linkColor: Theme.of(context).colorScheme.secondary, + fontSize: + AppSettings.fontSizeFactor.value * + AppConfig.messageFontSize, + eventId: '${activity.eventId}_practice', + roomId: activity.roomId!, + senderId: Matrix.of(context).client.userID!, + matrixFile: controller.getAudioFile(activity.eventId)!, + autoplay: true, + ), + ), ), - ], - ), + _ => const SizedBox(height: 100.0), + }, ), _ => SizedBox( height: 100.0, @@ -227,6 +274,45 @@ class _AnalyticsPracticeCenterContent extends StatelessWidget { } } +class _AudioCompletionWidget extends StatelessWidget { + final AnalyticsPracticeState controller; + + const _AudioCompletionWidget({super.key, required this.controller}); + + @override + Widget build(BuildContext context) { + final exampleMessage = controller.getAudioExampleMessage(); + + if (exampleMessage == null || exampleMessage.isEmpty) { + return const SizedBox(height: 100.0); + } + + return Padding( + padding: const EdgeInsets.all(16.0), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + decoration: BoxDecoration( + color: Color.alphaBlend( + Colors.white.withAlpha(180), + ThemeData.dark().colorScheme.primary, + ), + borderRadius: BorderRadius.circular(16), + ), + child: RichText( + text: TextSpan( + style: TextStyle( + color: Theme.of(context).colorScheme.onPrimaryFixed, + fontSize: + AppSettings.fontSizeFactor.value * AppConfig.messageFontSize, + ), + children: exampleMessage, + ), + ), + ), + ); + } +} + class _ExampleMessageWidget extends StatelessWidget { final Future?> future; @@ -267,43 +353,95 @@ class _ExampleMessageWidget extends StatelessWidget { } } -class _CorrectAnswerHint extends StatelessWidget { +class _HintsCounterBar extends StatelessWidget { final AnalyticsPracticeState controller; - const _CorrectAnswerHint({required this.controller}); + const _HintsCounterBar({required this.controller}); @override Widget build(BuildContext context) { return ValueListenableBuilder( - valueListenable: controller.hintPressedNotifier, - builder: (context, hintPressed, _) { - if (!hintPressed) { + valueListenable: controller.hintsUsedNotifier, + builder: (context, hintsUsed, _) { + return Padding( + padding: const EdgeInsets.only(top: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: List.generate( + AnalyticsPracticeState.maxHints, + (index) => Padding( + padding: const EdgeInsets.symmetric(horizontal: 4.0), + child: Icon( + index < hintsUsed ? Icons.lightbulb : Icons.lightbulb_outline, + size: 18, + color: Theme.of(context).colorScheme.primary, + ), + ), + ), + ), + ); + }, + ); + } +} + +class _HintSection extends StatelessWidget { + final AnalyticsPracticeState controller; + + const _HintSection({required this.controller}); + + @override + Widget build(BuildContext context) { + return ListenableBuilder( + listenable: Listenable.merge([ + controller.activityState, + controller.hintPressedNotifier, + controller.hintsUsedNotifier, + ]), + builder: (context, _) { + final state = controller.activityState.value; + if (state is! AsyncLoaded) { return const SizedBox.shrink(); } - return ValueListenableBuilder( - valueListenable: controller.activityState, - builder: (context, state, _) { - if (state is! AsyncLoaded) { - return const SizedBox.shrink(); - } + final activity = state.value; + final hintPressed = controller.hintPressedNotifier.value; + final hintsUsed = controller.hintsUsedNotifier.value; + final maxHintsReached = hintsUsed >= AnalyticsPracticeState.maxHints; - final activity = state.value; - if (activity is! MorphPracticeActivityModel) { - return const SizedBox.shrink(); - } + return ConstrainedBox( + constraints: const BoxConstraints(minHeight: 50.0), + child: Builder( + builder: (context) { + // For grammar category: fade out button and show hint content + if (activity is MorphPracticeActivityModel) { + return AnimatedCrossFade( + duration: const Duration(milliseconds: 200), + crossFadeState: hintPressed + ? CrossFadeState.showSecond + : CrossFadeState.showFirst, + firstChild: HintButton( + onPressed: maxHintsReached + ? () {} + : controller.onHintPressed, + depressed: maxHintsReached, + ), + secondChild: MorphMeaningWidget( + feature: activity.morphFeature, + tag: activity.multipleChoiceContent.answers.first, + ), + ); + } - final correctAnswerTag = - activity.multipleChoiceContent.answers.first; - - return Padding( - padding: const EdgeInsets.only(bottom: 8.0), - child: MorphMeaningWidget( - feature: activity.morphFeature, - tag: correctAnswerTag, - ), - ); - }, + // For grammar error: button stays pressed, hint shows in ErrorBlankWidget + return HintButton( + onPressed: (hintPressed || maxHintsReached) + ? () {} + : controller.onHintPressed, + depressed: hintPressed || maxHintsReached, + ); + }, + ), ); }, ); @@ -354,30 +492,21 @@ class _WrongAnswerFeedback extends StatelessWidget { } } -class _ErrorBlankWidget extends StatefulWidget { +class _ErrorBlankWidget extends StatelessWidget { final GrammarErrorPracticeActivityModel activity; + final bool showTranslation; - const _ErrorBlankWidget({super.key, required this.activity}); - - @override - State<_ErrorBlankWidget> createState() => _ErrorBlankWidgetState(); -} - -class _ErrorBlankWidgetState extends State<_ErrorBlankWidget> { - late final String translation = widget.activity.translation; - bool _showTranslation = false; - - void _toggleTranslation() { - setState(() { - _showTranslation = !_showTranslation; - }); - } + const _ErrorBlankWidget({ + super.key, + required this.activity, + required this.showTranslation, + }); @override Widget build(BuildContext context) { - final text = widget.activity.text; - final errorOffset = widget.activity.errorOffset; - final errorLength = widget.activity.errorLength; + final text = activity.text; + final errorOffset = activity.errorOffset; + final errorLength = activity.errorLength; const maxContextChars = 50; @@ -426,65 +555,72 @@ class _ErrorBlankWidgetState extends State<_ErrorBlankWidget> { final after = chars.skip(errorEnd).take(afterEnd - errorEnd).toString(); - return Column( - children: [ - Container( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), - decoration: BoxDecoration( - color: Color.alphaBlend( - Colors.white.withAlpha(180), - ThemeData.dark().colorScheme.primary, - ), - borderRadius: BorderRadius.circular(16), - ), - child: Column( - children: [ - RichText( - text: TextSpan( - style: TextStyle( - color: Theme.of(context).colorScheme.onPrimaryFixed, - fontSize: - AppSettings.fontSizeFactor.value * - AppConfig.messageFontSize, - ), - children: [ - if (trimmedBefore) const TextSpan(text: '…'), - if (before.isNotEmpty) TextSpan(text: before), - WidgetSpan( - child: Container( - height: 4.0, - width: (errorLength * 8).toDouble(), - padding: const EdgeInsets.only(bottom: 2.0), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.primary, - ), - ), - ), - if (after.isNotEmpty) TextSpan(text: after), - if (trimmedAfter) const TextSpan(text: '…'), - ], - ), - ), - const SizedBox(height: 8), - _showTranslation - ? Text( - translation, - style: TextStyle( - color: Theme.of(context).colorScheme.onPrimaryFixed, - fontSize: - AppSettings.fontSizeFactor.value * - AppConfig.messageFontSize, - fontStyle: FontStyle.italic, - ), - textAlign: TextAlign.left, - ) - : const SizedBox.shrink(), - ], - ), + return Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + decoration: BoxDecoration( + color: Color.alphaBlend( + Colors.white.withAlpha(180), + ThemeData.dark().colorScheme.primary, ), - const SizedBox(height: 8), - HintButton(depressed: _showTranslation, onPressed: _toggleTranslation), - ], + borderRadius: BorderRadius.circular(16), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + RichText( + text: TextSpan( + style: TextStyle( + color: Theme.of(context).colorScheme.onPrimaryFixed, + fontSize: + AppSettings.fontSizeFactor.value * + AppConfig.messageFontSize, + ), + children: [ + if (trimmedBefore) const TextSpan(text: '…'), + if (before.isNotEmpty) TextSpan(text: before), + WidgetSpan( + child: Container( + height: 4.0, + width: (errorLength * 8).toDouble(), + padding: const EdgeInsets.only(bottom: 2.0), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.primary, + ), + ), + ), + if (after.isNotEmpty) TextSpan(text: after), + if (trimmedAfter) const TextSpan(text: '…'), + ], + ), + ), + AnimatedSize( + duration: const Duration(milliseconds: 200), + curve: Curves.easeInOut, + alignment: Alignment.topCenter, + child: showTranslation + ? Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 8), + Text( + activity.translation, + style: TextStyle( + color: Theme.of(context).colorScheme.onPrimaryFixed, + fontSize: + AppSettings.fontSizeFactor.value * + AppConfig.messageFontSize, + fontStyle: FontStyle.italic, + ), + textAlign: TextAlign.center, + maxLines: 3, + overflow: TextOverflow.ellipsis, + ), + ], + ) + : const SizedBox.shrink(), + ), + ], + ), ); } } @@ -565,6 +701,62 @@ class _ActivityChoicesWidget extends StatelessWidget { valueListenable: controller.enableChoicesNotifier, builder: (context, enabled, _) { final choices = controller.filteredChoices(value); + final isAudioActivity = + value.activityType == ActivityTypeEnum.lemmaAudio; + + if (isAudioActivity) { + // For audio activities, use AnimatedSwitcher to fade between choices and example message + return ValueListenableBuilder( + valueListenable: controller.showingAudioCompletion, + builder: (context, showingCompletion, _) { + return AnimatedSwitcher( + duration: const Duration(milliseconds: 500), + layoutBuilder: (currentChild, previousChildren) { + return Stack( + alignment: Alignment.topCenter, + children: [ + ...previousChildren, + ?currentChild, + ], + ); + }, + child: showingCompletion + ? _AudioCompletionWidget( + key: const ValueKey('completion'), + controller: controller, + ) + : Padding( + key: const ValueKey('choices'), + padding: const EdgeInsets.all(16.0), + child: Wrap( + alignment: WrapAlignment.center, + spacing: 8.0, + runSpacing: 8.0, + children: choices + .map( + (choice) => _ChoiceCard( + activity: value, + targetId: controller.choiceTargetId( + choice.choiceId, + ), + choiceId: choice.choiceId, + onPressed: () => controller + .onSelectChoice(choice.choiceId), + cardHeight: 48.0, + choiceText: choice.choiceText, + choiceEmoji: choice.choiceEmoji, + enabled: enabled, + shrinkWrap: true, + ), + ) + .toList(), + ), + ), + ); + }, + ); + } + return Column( spacing: 8.0, mainAxisAlignment: MainAxisAlignment.center, @@ -596,6 +788,54 @@ class _ActivityChoicesWidget extends StatelessWidget { } } +class _AudioContinueButton extends StatelessWidget { + final AnalyticsPracticeState controller; + + const _AudioContinueButton({required this.controller}); + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder( + valueListenable: controller.activityState, + builder: (context, state, _) { + // Only show for audio activities + if (state is! AsyncLoaded) { + return const SizedBox.shrink(); + } + + final activity = state.value; + if (activity.activityType != ActivityTypeEnum.lemmaAudio) { + return const SizedBox.shrink(); + } + + return ValueListenableBuilder( + valueListenable: controller.showingAudioCompletion, + builder: (context, showingCompletion, _) { + return Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + onPressed: showingCompletion + ? controller.onAudioContinuePressed + : null, + style: ElevatedButton.styleFrom( + padding: const EdgeInsets.symmetric( + horizontal: 48.0, + vertical: 16.0, + ), + ), + child: Text( + L10n.of(context).continueText, + style: const TextStyle(fontSize: 18.0), + ), + ), + ); + }, + ); + }, + ); + } +} + class _ChoiceCard extends StatelessWidget { final MultipleChoicePracticeActivityModel activity; final String choiceId; @@ -606,6 +846,7 @@ class _ChoiceCard extends StatelessWidget { final String choiceText; final String? choiceEmoji; final bool enabled; + final bool shrinkWrap; const _ChoiceCard({ required this.activity, @@ -616,6 +857,7 @@ class _ChoiceCard extends StatelessWidget { required this.choiceText, required this.choiceEmoji, this.enabled = true, + this.shrinkWrap = false, }); @override @@ -641,16 +883,18 @@ class _ChoiceCard extends StatelessWidget { ); case ActivityTypeEnum.lemmaAudio: - return AudioChoiceCard( + return GameChoiceCard( key: ValueKey( '${constructId.string}_${activityType.name}_audio_$choiceId', ), - text: choiceId, + shouldFlip: false, targetId: targetId, onPressed: onPressed, isCorrect: isCorrect, height: cardHeight, isEnabled: enabled, + shrinkWrap: shrinkWrap, + child: Text(choiceText, textAlign: TextAlign.center), ); case ActivityTypeEnum.grammarCategory: diff --git a/lib/pangea/analytics_practice/choice_cards/game_choice_card.dart b/lib/pangea/analytics_practice/choice_cards/game_choice_card.dart index 88ee9b7f9..0fb452e4d 100644 --- a/lib/pangea/analytics_practice/choice_cards/game_choice_card.dart +++ b/lib/pangea/analytics_practice/choice_cards/game_choice_card.dart @@ -14,6 +14,7 @@ class GameChoiceCard extends StatefulWidget { final bool shouldFlip; final String targetId; final bool isEnabled; + final bool shrinkWrap; const GameChoiceCard({ required this.child, @@ -24,6 +25,7 @@ class GameChoiceCard extends StatefulWidget { this.height = 72.0, this.shouldFlip = false, this.isEnabled = true, + this.shrinkWrap = false, super.key, }); @@ -90,7 +92,7 @@ class _GameChoiceCardState extends State link: MatrixState.pAnyState.layerLinkAndKey(widget.targetId).link, child: HoverBuilder( builder: (context, hovered) => SizedBox( - width: double.infinity, + width: widget.shrinkWrap ? null : double.infinity, height: widget.height, child: GestureDetector( onTap: _handleTap, @@ -109,6 +111,7 @@ class _GameChoiceCardState extends State overlayColor: _revealed ? tintColor : (hovered ? hoverColor : Colors.transparent), + shrinkWrap: widget.shrinkWrap, child: Opacity( opacity: showContent ? 1 : 0, child: _revealed ? widget.altChild! : widget.child, @@ -123,6 +126,7 @@ class _GameChoiceCardState extends State overlayColor: _clicked ? tintColor : (hovered ? hoverColor : Colors.transparent), + shrinkWrap: widget.shrinkWrap, child: widget.child, ), ), @@ -137,19 +141,24 @@ class _CardContainer extends StatelessWidget { final Color baseColor; final Color overlayColor; final Widget child; + final bool shrinkWrap; const _CardContainer({ required this.height, required this.baseColor, required this.overlayColor, required this.child, + this.shrinkWrap = false, }); @override Widget build(BuildContext context) { return Container( - height: height, - alignment: Alignment.center, + height: shrinkWrap ? null : height, + padding: shrinkWrap + ? const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12.0) + : null, + alignment: shrinkWrap ? null : Alignment.center, decoration: BoxDecoration( color: baseColor, borderRadius: BorderRadius.circular(16), diff --git a/lib/pangea/analytics_practice/completed_activity_session_view.dart b/lib/pangea/analytics_practice/completed_activity_session_view.dart index 7cac8c218..9d351110d 100644 --- a/lib/pangea/analytics_practice/completed_activity_session_view.dart +++ b/lib/pangea/analytics_practice/completed_activity_session_view.dart @@ -47,7 +47,7 @@ class CompletedActivitySessionView extends StatelessWidget { child: Column( children: [ Text( - L10n.of(context).congratulationsYouveCompletedPractice, + controller.getCompletionMessage(context), style: Theme.of( context, ).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold), @@ -163,7 +163,7 @@ class CompletedActivitySessionView extends StatelessWidget { }, child: Row( mainAxisAlignment: MainAxisAlignment.center, - children: [Text(L10n.of(context).quit)], + children: [Text(L10n.of(context).done)], ), ), ], diff --git a/lib/pangea/analytics_practice/morph_category_activity_generator.dart b/lib/pangea/analytics_practice/morph_category_activity_generator.dart index 1d24967e6..709dd7219 100644 --- a/lib/pangea/analytics_practice/morph_category_activity_generator.dart +++ b/lib/pangea/analytics_practice/morph_category_activity_generator.dart @@ -55,8 +55,8 @@ class MorphCategoryActivityGenerator { choices: choices.toSet(), answers: {morphTag}, ), - morphExampleInfo: - req.morphExampleInfo ?? const MorphExampleInfo(exampleMessage: []), + exampleMessageInfo: + req.exampleMessage ?? const ExampleMessageInfo(exampleMessage: []), ), ); } diff --git a/lib/pangea/analytics_practice/vocab_audio_activity_generator.dart b/lib/pangea/analytics_practice/vocab_audio_activity_generator.dart index 6605db90e..f13839116 100644 --- a/lib/pangea/analytics_practice/vocab_audio_activity_generator.dart +++ b/lib/pangea/analytics_practice/vocab_audio_activity_generator.dart @@ -1,3 +1,4 @@ +import 'package:fluffychat/pangea/analytics_practice/analytics_practice_session_model.dart'; import 'package:fluffychat/pangea/practice_activities/lemma_activity_generator.dart'; import 'package:fluffychat/pangea/practice_activities/message_activity_request.dart'; import 'package:fluffychat/pangea/practice_activities/multiple_choice_activity_model.dart'; @@ -6,21 +7,62 @@ import 'package:fluffychat/pangea/practice_activities/practice_activity_model.da class VocabAudioActivityGenerator { static Future get(MessageActivityRequest req) async { final token = req.target.tokens.first; + final audioExample = req.audioExampleMessage; + + final Set answers = {token.text.content.toLowerCase()}; + final Set wordsInMessage = {}; + if (audioExample != null) { + for (final t in audioExample.tokens) { + wordsInMessage.add(t.text.content.toLowerCase()); + } + + // Extract up to 3 additional words as answers + final otherWords = audioExample.tokens + .where( + (t) => + t.lemma.saveVocab && + t.text.content.toLowerCase() != + token.text.content.toLowerCase() && + t.text.content.trim().isNotEmpty, + ) + .take(3) + .map((t) => t.text.content.toLowerCase()) + .toList(); + + answers.addAll(otherWords); + } + + // Generate distractors, filtering out anything in the message or answers final choices = await LemmaActivityGenerator.lemmaActivityDistractors( token, + maxChoices: 20, ); + final choicesList = choices + .map((c) => c.lemma) + .where( + (lemma) => + !answers.contains(lemma.toLowerCase()) && + !wordsInMessage.contains(lemma.toLowerCase()), + ) + .take(4) + .toList(); - final choicesList = choices.map((c) => c.lemma).toList(); - choicesList.shuffle(); + final allChoices = [...choicesList, ...answers]; + allChoices.shuffle(); return MessageActivityResponse( activity: VocabAudioPracticeActivityModel( tokens: req.target.tokens, langCode: req.userL2, multipleChoiceContent: MultipleChoiceActivity( - choices: choicesList.toSet(), - answers: {token.lemma.text}, + choices: allChoices.toSet(), + answers: answers, ), + roomId: audioExample?.roomId, + eventId: audioExample?.eventId, + exampleMessage: + audioExample?.exampleMessage ?? + const ExampleMessageInfo(exampleMessage: []), ), ); } diff --git a/lib/pangea/chat/widgets/pangea_chat_input_row.dart b/lib/pangea/chat/widgets/pangea_chat_input_row.dart index 63787a4d3..1543e9232 100644 --- a/lib/pangea/chat/widgets/pangea_chat_input_row.dart +++ b/lib/pangea/chat/widgets/pangea_chat_input_row.dart @@ -277,6 +277,8 @@ class PangeaChatInputRow extends StatelessWidget { onChanged: controller.onInputBarChanged, choreographer: controller.choreographer, showNextMatch: controller.showNextMatch, + onFeedbackSubmitted: (feedback) => controller + .onRequestWritingAssistance(feedback: feedback), suggestionEmojis: getDefaultEmojiLocale( AppSettings diff --git a/lib/pangea/chat_settings/pages/pangea_chat_access_settings.dart b/lib/pangea/chat_settings/pages/pangea_chat_access_settings.dart index e5e000812..a70fd6f72 100644 --- a/lib/pangea/chat_settings/pages/pangea_chat_access_settings.dart +++ b/lib/pangea/chat_settings/pages/pangea_chat_access_settings.dart @@ -117,15 +117,16 @@ class ChatAccessTitle extends StatelessWidget { final theme = Theme.of(context); final isColumnMode = FluffyThemes.isColumnMode(context); return Row( - mainAxisSize: MainAxisSize.min, children: [ Icon(icon, size: isColumnMode ? 32.0 : 24.0), SizedBox(width: isColumnMode ? 32.0 : 16.0), - Text( - title, - style: isColumnMode - ? theme.textTheme.titleLarge - : theme.textTheme.titleMedium, + Flexible( + child: Text( + title, + style: isColumnMode + ? theme.textTheme.titleLarge + : theme.textTheme.titleMedium, + ), ), ], ); diff --git a/lib/pangea/choreographer/choreographer.dart b/lib/pangea/choreographer/choreographer.dart index 10b20b9bb..285e3ba73 100644 --- a/lib/pangea/choreographer/choreographer.dart +++ b/lib/pangea/choreographer/choreographer.dart @@ -281,11 +281,22 @@ class Choreographer extends ChangeNotifier { } _stopLoading(); - if (!igcController.openMatches.any( - (match) => match.updatedMatch.isITStart, - )) { - igcController.fetchAllSpanDetails().catchError((e) => clearMatches(e)); + } + + /// Re-runs IGC with user feedback and updates the UI. + Future rerunWithFeedback(String feedbackText) async { + MatrixState.pAnyState.closeAllOverlays(); + igcController.clearMatches(); + igcController.clearCurrentText(); + + _startLoading(); + final success = await igcController.rerunWithFeedback(feedbackText); + if (success && igcController.openAutomaticMatches.isNotEmpty) { + await igcController.acceptNormalizationMatches(); } + _stopLoading(); + + return success; } Future getMessageContent(String message) async { diff --git a/lib/pangea/choreographer/edit_type_auto_apply.md b/lib/pangea/choreographer/edit_type_auto_apply.md new file mode 100644 index 000000000..f55ac0d0b --- /dev/null +++ b/lib/pangea/choreographer/edit_type_auto_apply.md @@ -0,0 +1,97 @@ +# Edit Type Auto-Apply Planning + +## Current Behavior + +The client currently auto-applies edits (without user interaction) based on a single condition: +- **Normalization errors**: Edits where the correction is the same as the original when normalized (punctuation, spacing, accents removed) + +This is implemented in: +- [span_data_model.dart](igc/span_data_model.dart#L147) - `isNormalizationError()` method +- [igc_controller.dart](igc/igc_controller.dart#L43) - `openAutomaticMatches` getter +- [igc_controller.dart](igc/igc_controller.dart#L227) - `acceptNormalizationMatches()` method + +Current `isNormalizationError()` logic: +```dart +bool isNormalizationError() { + final correctChoice = choices?.firstWhereOrNull((c) => c.isBestCorrection)?.value; + final l2Code = MatrixState.pangeaController.userController.userL2?.langCodeShort; + + return correctChoice != null && + l2Code != null && + normalizeString(correctChoice, l2Code) == normalizeString(errorSpan, l2Code); +} +``` + +The `normalizeString` function (in [text_normalization_util.dart](igc/text_normalization_util.dart)): +- Converts to lowercase +- Removes diacritics (language-specific) +- Replaces hyphens with spaces +- Removes punctuation +- Normalizes whitespace + +## Proposed Change + +Split auto-apply behavior based on **edit type** instead of just normalization matching. + +### Questions to Answer + +1. **What edit types should we distinguish?** + - Punctuation-only edits + - Accent/diacritic-only edits + - Capitalization-only edits + - Spelling errors + - Grammar errors (conjugation, agreement, etc.) + - Word choice / vocabulary suggestions + - Code-switching corrections (L1 word replaced with L2) + +2. **Which edit types should auto-apply?** + - Current: All "normalization" edits (punctuation + accent + case) + - Proposed: Make this configurable by type? + +3. **Where does the edit type come from?** + - Currently from `SpanData.rule` (has `Rule.id`, `Rule.category`, etc.) + - Or from `SpanDataTypeEnum` (grammar, correction, etc.) + - May need choreo/backend to provide explicit type classification + +4. **What user interaction modes exist?** + - Auto-apply (no interaction, edit applied silently) + - Notification (edit applied but user is informed) + - Selection (user must choose from options) + - Full interaction (span card with explanation) + +## Files to Modify + +### Client-side (this repo) +- `igc/span_data_model.dart` - Add edit type classification methods +- `igc/igc_controller.dart` - Update auto-apply logic based on type +- `choreographer.dart` - Handle different interaction modes +- Potentially new enum for edit categories + +### Backend (choreo) +- May need to return explicit edit type/category in response +- See [2-step-choreographer next_steps.md](../../../../../2-step-choreographer/app/handlers/wa/next_steps.md) + +## Current SpanData Structure + +```dart +class SpanData { + final String? message; + final String? shortMessage; + final List? choices; + final int offset; + final int length; + final String fullText; + final SpanDataTypeEnum type; // grammar, correction, etc. + final Rule? rule; // has id, category, description +} +``` + +## Tasks + +- [ ] Define edit type categories/enum +- [ ] Determine classification logic (client-side vs server-side) +- [ ] Design interaction mode mapping (type → mode) +- [ ] Implement type classification in SpanData +- [ ] Update IgcController to use type-based auto-apply +- [ ] Add user preference support (optional) +- [ ] Coordinate with choreo backend if needed diff --git a/lib/pangea/choreographer/igc/SPAN_CARD_REDESIGN_FINALIZED.md b/lib/pangea/choreographer/igc/SPAN_CARD_REDESIGN_FINALIZED.md new file mode 100644 index 000000000..330678eeb --- /dev/null +++ b/lib/pangea/choreographer/igc/SPAN_CARD_REDESIGN_FINALIZED.md @@ -0,0 +1,269 @@ +# Span Card UI Redesign - Finalized Plan + +## Overview + +Redesign the `SpanCard` widget to improve UX and add user feedback capabilities. This document consolidates all decisions from the design Q&A. + +--- + +## New Layout + +### Visual Structure + +``` +┌─────────────────────────────────────────┐ +│ [X] 🤖 [🚩] │ <- Header: Close, BotFace, Flag +├─────────────────────────────────────────┤ +│ Span Type Label │ <- Error category (e.g., "Grammar") +├─────────────────────────────────────────┤ +│ [ Choice 1 ] [ Choice 2 ] [ ... ] │ <- ChoicesArray +├─────────────────────────────────────────┤ +│ "Best choice feedback text..." │ <- Feedback shown on open +├─────────────────────────────────────────┤ +│ [ Ignore ] [ Replace ] │ <- Action buttons +└─────────────────────────────────────────┘ +``` + +### Header Row Details + +Follow `WordZoomWidget` pattern exactly: + +```dart +SizedBox( + height: 40.0, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + IconButton( + color: Theme.of(context).iconTheme.color, + icon: const Icon(Icons.close), + onPressed: widget.showNextMatch, + ), + Flexible( + child: Container( + constraints: const BoxConstraints(minHeight: 40.0), + alignment: Alignment.center, + child: BotFace(width: 40, expression: BotExpression.idle), + ), + ), + IconButton( + color: Theme.of(context).iconTheme.color, + icon: const Icon(Icons.flag_outlined), + onPressed: _onFlagPressed, + ), + ], + ), +), +``` + +--- + +## Color Scheme + +### Underline Colors by Type + +Use `AppConfig.primaryColor` (#8560E0) for IT/auto-apply types. + +| Category | Types | Color | +| ------------- | ------------------------------------------------ | ----------------------------------------- | +| IT/Auto-apply | `itStart`, `punct`, `diacritics`, `spell`, `cap` | `AppConfig.primaryColor.withOpacity(0.7)` | +| Grammar | All `grammarTypes` list | `AppConfig.warning.withOpacity(0.7)` | +| Word Choice | All `wordChoiceTypes` list | `Colors.blue.withOpacity(0.7)` | +| Style/Fluency | `style`, `fluency` | `Colors.teal.withOpacity(0.7)` | +| Other/Unknown | Everything else | `colorScheme.error.withOpacity(0.7)` | + +### Implementation + +Add to `replacement_type_enum.dart`: + +```dart +extension ReplacementTypeEnumColors on ReplacementTypeEnum { + Color underlineColor(BuildContext context) { + if (this == ReplacementTypeEnum.itStart || isAutoApply) { + return AppConfig.primaryColor.withOpacity(0.7); + } + if (isGrammarType) { + return AppConfig.warning.withOpacity(0.7); + } + if (isWordChoiceType) { + return Colors.blue.withOpacity(0.7); + } + switch (this) { + case ReplacementTypeEnum.style: + case ReplacementTypeEnum.fluency: + return Colors.teal.withOpacity(0.7); + default: + return Theme.of(context).colorScheme.error.withOpacity(0.7); + } + } +} +``` + +--- + +## Feedback Flow + +### Flag Button (Explicit Feedback) + +1. User taps 🚩 flag icon +2. Show `FeedbackDialog` for user to enter feedback text +3. Close span card, show spinning IGC indicator +4. Call grammar_v2 endpoint with feedback attached via new `IgcController.rerunWithFeedback()` method +5. Clear existing matches, replace with new response +6. Display new span card if matches exist + +### Ignore Button (Auto-Feedback) + +1. User taps "Ignore" +2. Fire-and-forget call to grammar_v2 with auto-generated feedback: + ``` + "user ignored the correction ({old} -> {new}) without feedback. not sure why" + ``` +3. Don't wait for response, proceed to next match +4. Silent fail on errors (logged server-side for finetuning) + +### Feedback Schema + +Use existing `LLMFeedbackSchema` structure: + +```dart +{ + "feedback": "user's feedback text", + "content": { /* original IGCResponseModel as JSON */ } +} +``` + +### Implementation Details + +1. **Store last response**: Add `IGCResponseModel? _lastResponse` field to `IgcController` +2. **New method**: Add `rerunWithFeedback(String feedbackText)` to `IgcController` +3. **Feedback always included**: No loading state needed - feedback text comes with initial response +4. **No snackbar initially**: Just use spinning IGC indicator (may add UX feedback later if too abrupt) + +--- + +## Span Type Display + +### Display Names + +Add `displayName(context)` method to `ReplacementTypeEnum`: + +| Type Category | Display String | +| ------------- | ---------------- | +| Grammar types | "Grammar" | +| Word choice | "Word Choice" | +| `spell` | "Spelling" | +| `punct` | "Punctuation" | +| `style` | "Style" | +| `fluency` | "Fluency" | +| `diacritics` | "Accents" | +| `cap` | "Capitalization" | +| Other | "Correction" | + +--- + +## Choices Behavior + +### Alts vs Distractors + +- **Alts**: Equally valid alternatives (e.g., "él" vs "ella" when gender ambiguous) +- **Distractors**: Intentionally wrong options to test learner + +These arrive as `SpanChoice` objects in `SpanData.choices`. + +### Selection Behavior + +| Choice Type | On Select | +| ----------- | ----------------------------------- | +| Best | Enable "Replace" button | +| Alt | Treat as accepted, apply that value | +| Distractor | Show "try again" feedback | + +### Single Choice + +If only one choice exists, show it without choice UI chrome. + +--- + +## Button Behaviors + +| Button | Action | +| ------- | -------------------------------------------------- | +| X | Close card, show next match (same as Ignore) | +| Replace | Apply selected choice, close card, show next match | +| Ignore | Auto-feedback (fire-and-forget), show next match | +| Flag | Open feedback dialog, re-run WA with user feedback | + +--- + +## Files to Modify + +| File | Changes | +| ----------------------------- | -------------------------------------------------------- | +| `replacement_type_enum.dart` | Add `underlineColor(context)` and `displayName(context)` | +| `pangea_text_controller.dart` | Update `_underlineColor` to use type-based colors | +| `span_card.dart` | Restructure layout per new design | +| `intl_en.arb` | Add new l10n strings | + +--- + +## Localization Strings + +Add to `intl_en.arb`: + +```json +{ + "spanFeedbackTitle": "Report correction issue", + "spanTypeGrammar": "Grammar", + "spanTypeWordChoice": "Word Choice", + "spanTypeSpelling": "Spelling", + "spanTypePunctuation": "Punctuation", + "spanTypeStyle": "Style", + "spanTypeFluency": "Fluency", + "spanTypeAccents": "Accents", + "spanTypeCapitalization": "Capitalization", + "spanTypeCorrection": "Correction" +} +``` + +**TODO**: Run translation script after adding strings. + +--- + +## Implementation Order + +1. [ ] Update `replacement_type_enum.dart` + - [ ] Add `underlineColor(context)` method + - [ ] Add `displayName(context)` method +2. [ ] Update `pangea_text_controller.dart` + - [ ] Change `_underlineColor` to use type-based colors +3. [ ] Add l10n strings to `intl_en.arb` +4. [ ] Update `igc_controller.dart` + - [ ] Add `IGCResponseModel? _lastResponse` field + - [ ] Store response in `getIGCTextData()` after fetch + - [ ] Add `rerunWithFeedback(String feedbackText)` method + - [ ] Add `sendAutoFeedback(PangeaMatch match)` method (fire-and-forget) +5. [ ] Restructure `span_card.dart` + - [ ] Add header row (X, BotFace, Flag) + - [ ] Add span type display row + - [ ] Show feedback on card open (no loading state needed) + - [ ] Wire up flag button to feedback flow + - [ ] Wire up ignore button to auto-feedback +6. [ ] Test full flow + +--- + +## Testing Considerations + +- Verify underline colors display correctly for each error type +- Test feedback dialog flow end-to-end +- Test auto-feedback on ignore (verify silent fail) +- Ensure span card closes properly after all actions +- Test with various span types to verify type labels +- Test distractor selection shows "try again" +- Test alt selection applies the alt value + +## NEXT STEPS + +- Figure out why feedback isn't displaying +- Considering migrating to using match message field instead of choice feedback diff --git a/lib/pangea/choreographer/igc/SPAN_CARD_REDESIGN_Q_AND_A.md b/lib/pangea/choreographer/igc/SPAN_CARD_REDESIGN_Q_AND_A.md new file mode 100644 index 000000000..6587ea63c --- /dev/null +++ b/lib/pangea/choreographer/igc/SPAN_CARD_REDESIGN_Q_AND_A.md @@ -0,0 +1,574 @@ +# Span Card UI Redesign Plan + +## Overview + +Redesign the `SpanCard` widget to improve UX and add user feedback capabilities. This document outlines the changes needed for the new layout and feedback flow. + +## Decisions Made ✅ + +### 1. Feedback Endpoint Behavior ✅ + +**Decision**: Re-run WA analysis with feedback to get different/better correction + +**Implementation notes**: + +- Use `gpt_5_2` model on regeneration +- Use `prompt_version="verbose"` +- Pull at least 3 varied examples in +- Need choreo-side testing to verify feedback is included in re-run + +### 2. Close Button (X) Behavior ✅ + +**Decision**: Close span card and show next match (same as current "Ignore") + +### 3. Best Choice Feedback Display ✅ + +**Decision**: Show immediately on card open + +> _Pedagogical note: Since the user has already seen their error highlighted and the choices displayed, the feedback explains "why" after they've had a chance to think about it. Hiding it behind a button adds friction without clear benefit._ + +### 4. Span Type Copy Format ✅ + +**Decision**: Use short labels defined in `replacement_type_enum.dart` + +Will add `displayName(context)` method returning l10n strings like: + +- "Grammar" / "Word Choice" / "Spelling" / "Punctuation" / "Style" + +### 5. Color Scheme ✅ + +**Decision**: Use brand colors from `app_config.dart`: + +- **Primary/Purple**: `AppConfig.primaryColor` (#8560E0) - for IT/auto-apply +- **Warning/Orange**: `AppConfig.warning` (rgba 210,124,12) - for grammar errors +- **Error/Red**: Use `colorScheme.error` - for unknown/other +- **Style/Teal**: Keep proposed teal for style/fluency +- **Word Choice**: Keep proposed blue + +### 6. Auto-Feedback on Ignore ✅ + +**Decision**: Auto-submit feedback on ignore (fire-and-forget) + +**Implementation**: + +- Submit async, don't block UI +- Catch errors internally (silent fail) +- Default message: `"user ignored the correction ({old} -> {new}) without feedback. not sure why"` + +### 7. Re-run Feedback Flow UX ✅ + +**Decision**: Close card → show spinning IGC indicator → snackbar with bot face "Got it! Recalculating..." + +- Shows card again when complete if there are more matches +- Uses existing spinning indicator pattern in input bar + +### 8. What if re-run returns no correction? ✅ + +**Decision**: Spinner turns green and it's done (no special message) + +### 9. Choices Layout ✅ + +**Decision**: Include alts/distractors in initial WA call with expanded TSV format + +--- + +## Discussion: Expanded TSV Format for Alts/Distractors + +### Proposed Format + +``` +old new type reason alt_1 alt_2 distractor_1 distractor_2 +``` + +### Your Pros + +1. Include alts when subjective (gender ambiguity, etc.) - user can pick +2. Include distractors when it makes a good learning exercise +3. Single handler = less to finetune, less feedback loops to manage + +### My Analysis on Complexity vs Quality + +**Short answer**: I think it's fine, with some guardrails. + +**Reasoning**: + +1. **Column count is manageable** - 8 columns is still very parseable for the model. The current 4-column format works well; doubling it shouldn't degrade accuracy much. + +2. **Optional columns help** - Making alt/distractor columns optional (empty when not applicable) keeps simple cases simple. The model only populates them when genuinely useful. + +3. **Clear semantics matter most** - As long as the prompt clearly defines: + - `alt_1/alt_2`: Equally valid alternatives (subjective/ambiguous cases) + - `distractor_1/distractor_2`: Plausible-but-wrong options (learning exercise) + + ...the model should handle it fine. + +4. **Finetuning examples will solidify it** - If your training examples show when to use alts vs not, the model will learn the pattern. + +### Potential Risks + +1. **Over-generation of alts** - Model might add alts when not needed. Mitigation: Prompt to say "only include alts if genuinely ambiguous" + +2. **Distractor quality** - Bad distractors could confuse learners. Mitigation: Could validate distractors are grammatically plausible but semantically wrong + +3. **Parsing edge cases** - Tab characters in reasons could break TSV. Already handled? + +### My Recommendation + +Go for it. The benefits (unified handler, better UX for ambiguous cases) outweigh the complexity cost. Just make sure: + +- Clear prompt instructions on when to use each column +- Good training examples showing both populated and empty cases +- Keep distractor generation optional/conservative initially + +--- + +## Follow-up Questions + +### 10. Alts vs Distractors Distinction ✅ + +**Clarified**: + +- **Alts**: All correct options given the context (e.g., "él" vs "ella" when gender unclear) +- **Distractors**: Intentionally wrong options to test the learner + +### 11. What if user picks an alt? ✅ + +**Decision**: Treat as "accepted" - apply that alt as the correction + +### 12. Distractor selection behavior ✅ + +**Decision**: Show "try again" feedback, don't apply the distractor + +### 13. Empty alts/distractors ✅ + +**Decision**: Just show the single `new` choice (no choice UI for single option) + +--- + +## All Questions Resolved ✅ + +No more open questions. Ready for implementation. + +--- + +## Current Implementation + +**File**: [span_card.dart](span_card.dart) + +Current layout (top to bottom): + +1. `ChoicesArray` - answer options +2. `_SpanCardFeedback` - feedback text with lightbulb button +3. `_SpanCardButtons` - Ignore / Replace buttons + +## New Layout + +### Visual Structure + +``` +┌─────────────────────────────────────────┐ +│ [X] 🤖 [🚩] │ <- Row 1: Close, BotFace, Flag +├─────────────────────────────────────────┤ +│ Span Type Copy │ <- Row 2: Error category label +├─────────────────────────────────────────┤ +│ [ Choice 1 ] [ Choice 2 ] [ ... ] │ <- Row 3: ChoicesArray +├─────────────────────────────────────────┤ +│ "Best choice feedback text..." │ <- Row 4: Best choice feedback +├─────────────────────────────────────────┤ +│ [ Ignore ] [ Replace ] │ <- Row 5: Action buttons +└─────────────────────────────────────────┘ +``` + +### Detailed Rows + +1. **Top Row (Header)** + - Left: X button (close overlay) - `IconButton(Icons.close)` + - Center: Bot face - `BotFace(width: 40, expression: BotExpression.idle)` + - Right: Flag button (feedback) - `IconButton(Icons.flag_outlined)` + +2. **Span Type Row** + - Display the error category from `match.updatedMatch.match.type` + - Use `ReplacementTypeEnum.defaultPrompt(context)` for human-readable text + - Consider adding l10n strings for each type's display name + +3. **Choices Row** + - Keep existing `ChoicesArray` widget + - No changes needed here + +4. **Best Choice Feedback Row** + - Display `bestChoice.feedback` text when available + - Show on card open (no button needed) since feedback is now always included + - Fall back to loading state if feedback needs fetching + +5. **Action Buttons Row** + - Keep existing `_SpanCardButtons` widget + - No changes needed here + +## Underline Color by Type + +### Files to Modify + +**File**: [pangea_text_controller.dart](../text_editing/pangea_text_controller.dart) + +Current `_underlineColor` method uses `match.match.rule?.id` to determine color. Change to use `match.match.type` (ReplacementTypeEnum). + +### Proposed Color Mapping + +Add extension method to `ReplacementTypeEnum`: + +```dart +// In replacement_type_enum.dart +extension ReplacementTypeEnumColors on ReplacementTypeEnum { + Color get underlineColor { + if (isAutoApply) { + return Colors.purple.withOpacity(0.7); // punct, diacritics, spell, cap + } + if (isGrammarType) { + return Colors.orange.withOpacity(0.7); // grammar errors + } + if (isWordChoiceType) { + return Colors.blue.withOpacity(0.7); // word choice issues + } + // Higher-level suggestions + switch (this) { + case ReplacementTypeEnum.style: + case ReplacementTypeEnum.fluency: + return Colors.teal.withOpacity(0.7); + case ReplacementTypeEnum.itStart: + return Colors.purple.withOpacity(0.7); + default: + return Colors.red.withOpacity(0.7); // other/unknown + } + } +} +``` + +Update `pangea_text_controller.dart`: + +```dart +Color _underlineColor(PangeaMatch match) { + if (match.status == PangeaMatchStatusEnum.automatic) { + return const Color.fromARGB(187, 132, 96, 224); + } + + // Use type-based coloring instead of rule ID + return match.match.type.underlineColor; +} +``` + +## Feedback Flag Flow + +### Reference Implementation + +See activity feedback flow in: + +- [activity_sessions_start_view.dart](../../activity_sessions/activity_session_start/activity_sessions_start_view.dart#L83-L139) +- [feedback_dialog.dart](../../common/widgets/feedback_dialog.dart) + +### Flow Steps + +1. User taps flag icon in SpanCard header +2. Show `FeedbackDialog` with optional text input +3. On submit, call WA endpoint with feedback +4. Show `FeedbackResponseDialog` with response +5. Close span card + +### New Files to Create + +1. **`span_feedback_request.dart`** - Request model for WA feedback +2. **`span_feedback_repo.dart`** - Repository to call WA endpoint with feedback + +### Endpoint Integration + +The WA endpoint already supports feedback via `GrammarRequestV2.feedback` field. + +**Choreo endpoint**: `POST /choreo/grammar_v2` + +**Request with feedback**: + +```json +{ + "full_text": "original user text", + "user_l1": "en", + "user_l2": "es", + "feedback": [ + { + "user_feedback": "This correction doesn't make sense", + "input": { ... original request ... }, + "output": { ... original response ... } + } + ] +} +``` + +### Implementation in SpanCard + +```dart +// In SpanCardState + +Future _onFlagPressed() async { + final feedback = await showDialog( + context: context, + builder: (context) => FeedbackDialog( + title: L10n.of(context).spanFeedbackTitle, + onSubmit: (feedback) => Navigator.of(context).pop(feedback), + scrollable: false, + ), + ); + + if (feedback == null || feedback.isEmpty) return; + + final resp = await showFutureLoadingDialog( + context: context, + future: () => SpanFeedbackRepo.submitFeedback( + SpanFeedbackRequest( + span: widget.match.updatedMatch.match, + feedbackText: feedback, + userId: Matrix.of(context).client.userID!, + userL1: MatrixState.pangeaController.userController.userL1Code!, + userL2: MatrixState.pangeaController.userController.userL2Code!, + ), + ), + ); + + if (resp.isError) return; + + await showDialog( + context: context, + builder: (context) => FeedbackResponseDialog( + title: L10n.of(context).feedbackTitle, + feedback: resp.result!.userFriendlyResponse, + description: L10n.of(context).feedbackRespDesc, + ), + ); + + // Close the span card + widget.showNextMatch(); +} +``` + +## Localization Strings Needed + +Add to `intl_en.arb`: + +```json +{ + "spanFeedbackTitle": "Report correction issue", + "spanTypeGrammar": "Grammar", + "spanTypeWordChoice": "Word Choice", + "spanTypeSpelling": "Spelling", + "spanTypePunctuation": "Punctuation", + "spanTypeStyle": "Style", + "spanTypeFluency": "Fluency" +} +``` + +## Files to Modify + +| File | Changes | +| ----------------------------- | ----------------------------------------------------------------- | +| `span_card.dart` | Restructure layout, add header row with X/BotFace/Flag | +| `replacement_type_enum.dart` | Add `underlineColor` extension, add `displayName(context)` method | +| `pangea_text_controller.dart` | Update `_underlineColor` to use type-based colors | + +## New Files to Create + +| File | Purpose | +| ---------------------------- | -------------------------------------- | +| `span_feedback_request.dart` | Request model for span feedback | +| `span_feedback_repo.dart` | API calls for submitting span feedback | + +## Implementation Order + +1. [ ] Update `replacement_type_enum.dart` with `underlineColor` and `displayName` +2. [ ] Update `pangea_text_controller.dart` to use type-based underline colors +3. [ ] Create `span_feedback_request.dart` and `span_feedback_repo.dart` +4. [ ] Restructure `span_card.dart` layout: + - [ ] Add header row (X, BotFace, Flag) + - [ ] Add span type display row + - [ ] Move ChoicesArray + - [ ] Show best choice feedback on open + - [ ] Implement flag button handler +5. [ ] Add localization strings +6. [ ] Test full flow + +## Testing Considerations + +- Verify underline colors display correctly for each error type +- Test feedback dialog flow end-to-end +- Ensure span card closes properly after feedback submission +- Test with various span types to verify type label displays correctly + +--- + +## Pre-Implementation Questions + +### 1. Re-run Feedback Flow Architecture + +The plan says feedback triggers a re-run of WA analysis with `gpt_5_2` model and `prompt_version="verbose"`. + +- **Q1a**: Does the choreo endpoint (`POST /choreo/grammar_v2`) already support the `prompt_version` parameter, or does this need to be added? +- **Q1b**: Where should the model override (`gpt_5_2`) be configured? On the request from the client, or hardcoded in the handler when feedback is present? + +this will be handled server-side. the client just needs to send the feedback in the request object. you can remove the notes about the serverside implemention, those have been added to server doc wa/next_steps.md + +### 2. Alts/Distractors in TSV Format + +The plan mentions expanding TSV format to include `alt_1`, `alt_2`, `distractor_1`, `distractor_2` columns. + +- **Q2a**: Is this TSV format expansion already implemented in choreo, or is this a future change we're planning for? +- **Q2b**: If not implemented yet, should the SpanCard redesign proceed without the alts/distractors UI, or should we stub it out? + +don't worry about this. they'll be SpanChoices in SpanData + +### 3. SpanFeedbackRepo Return Type + +The plan shows `resp.result!.userFriendlyResponse` after submitting feedback (similar to activity feedback). + +- **Q3**: For span feedback, what should the response contain? A new `GrammarResponseV2` with re-analyzed corrections? Or a simple acknowledgment with `userFriendlyResponse`? + +the client will call grammar_v2 endpoint again with feedback. it'll return a new grammar response object. + +### 4. Auto-Feedback on Ignore + +The plan states auto-submit feedback on ignore with message: `"user ignored the correction ({old} -> {new}) without feedback"`. + +- **Q4**: Should this auto-feedback actually trigger a re-run of WA analysis (like explicit feedback does), or should it just be logged/stored for finetuning purposes without re-analysis? + +it should send it via the grammar_v2 endpoint again but not worry about the result. the choreo will audit and store. + +### 5. Localization + +The plan lists new l10n strings to add. + +- **Q5**: Should I add these to `intl_en.arb` only, or are there other language files that need the new keys as well? + +some may be existing, others will be new. just add to intl_en.arb. make a TODO about them to run the translation script. + +### 6. Color Implementation + +The plan uses `Colors.purple.withOpacity(0.7)` for auto-apply types, but references `AppConfig.primaryColor` (#8560E0) in the decisions section. + +- **Q6**: Should I use the literal `Colors.purple.withOpacity(0.7)` or the app's `AppConfig.primaryColor` with opacity? (They're slightly different shades) + +use the primary with opacity. it's what itStart uses. + +--- + +## Follow-up Questions (Round 2) + +### 7. Feedback Request Structure + +The existing `GrammarRequestV2` has a `feedback` field of type `List`. Looking at the activity feedback flow, it uses a separate `ActivityFeedbackRequest` model. + +- **Q7a**: Should the span feedback flow modify the existing `IGCController` to re-call the grammar endpoint with feedback attached to the request, or create a separate `SpanFeedbackRepo` that wraps the grammar call? + +reuse the existing flow unless you spot complications with that. + +- **Q7b**: What fields should be included in the feedback object? Just `user_feedback` text, or also the original `input`/`output` as shown in the plan's JSON example? + +LLMFeedbackSchema calls for the response object plus the user_feedback text + +### 8. UI Flow on Re-run + +The plan says: "Close card → show spinning IGC indicator → snackbar with bot face 'Got it! Recalculating...'" + +- **Q8a**: After the re-run completes, if the same span now has a different correction (or no correction), how should we update the existing match state? Replace in-place, or clear all matches and re-process? + +it will return all new matches. clear the IGC match data and replace it with new + +- **Q8b**: Should the snackbar be shown, or is the spinning IGC indicator sufficient feedback? + +sure, let's skip the snackbar for now and see. + +### 9. SpanCard Header Layout + +The plan shows `[X] 🤖 [🚩]` in the header. + +- **Q9**: Should the X button and Flag button be the same size for visual symmetry, or should flag be smaller/less prominent? + +same size and color for visual symmetry. see the word card for example and follow that exactly + +--- + +## All Questions Resolved ✅ + +Ready to implement. Summary of key decisions from Q&A: + +1. **Feedback flow**: Reuse existing `IGCController` to call grammar endpoint with feedback attached +2. **Feedback schema**: `LLMFeedbackSchema` with `feedback` (user text) + `content` (original response object) +3. **Re-run result**: Clear existing IGC matches and replace with new response +4. **No snackbar**: Just use spinning IGC indicator +5. **Header layout**: Follow `WordZoomWidget` exactly - both buttons same size/color using `IconButton` with `Theme.of(context).iconTheme.color` +6. **Colors**: Use `AppConfig.primaryColor` with opacity for IT/auto-apply +7. **Localization**: Add to `intl_en.arb` only, TODO for translation script + +--- + +## Follow-up Questions (Round 3) + +### 10. Best Choice Feedback Loading State + +The original plan mentioned "Fall back to loading state if feedback needs fetching." + +**Q10**: Is feedback always included in the initial WA response now (so no fetching needed), or should we still handle a loading state for feedback? + +yes, both feedback and choices will always be included + +### 11. FeedbackResponseDialog After Flag + +The original plan showed a `FeedbackResponseDialog` after submitting feedback, but Q8b decided "skip the snackbar" and Q3 clarified the response is a new `GrammarResponseV2` (not a `userFriendlyResponse` string). + +**Q11**: After flag feedback re-run, should we: + +- (A) Just close card → spinner → show new matches (no dialog), or +- (B) Show a dialog acknowledging the feedback before showing new results? + +i think we probably need something. just closing the card would be abrupt. that's why i was thinking the snackbar. let's start without it and see though. + +### 12. Re-run Trigger Method + +The feedback calls grammar_v2 which returns a new response. + +**Q12**: How does the SpanCard trigger the re-run through IGCController? Should it: + +- (A) Call a new method like `igcController.rerunWithFeedback(feedback, originalResponse)`, or +- (B) Call the existing flow but with feedback attached to the request somehow? + +probably a new method is a good idea so we can add in any logic needed for this + +### 13. Original Response Reference + +`LLMFeedbackSchema` needs the original response (`content` field). + +yes. send the contested grammar response + +**Q13**: Where is the original `GrammarResponseV2` stored that we can reference when building the feedback object? Is it on `IGCController` or `Choreographer`? + +i'm not sure exactly. actually, i think it should be accessible via igc_repo.dart which will have cached it + +--- + +## All Round 3 Questions Answered ✅ + +Summary of Round 3 decisions: + +10. **Feedback always included**: No loading state needed for feedback text +11. **Post-feedback UX**: Start without snackbar/dialog, may add later if too abrupt +12. **New method needed**: Create `igcController.rerunWithFeedback(feedback, originalResponse)` +13. **Original response location**: Access via `IgcRepo` cache (keyed by request hashcode) + +--- + +## Follow-up Questions (Round 4) + +### 14. IgcRepo Cache Access + +Looking at `igc_repo.dart`, the cache is keyed by `IGCRequestModel.hashCode.toString()` and stores `Future`. The cache is private (`_igcCache`). + +**Q14**: To access the cached response for feedback, should I: + +- (A) Add a public method to `IgcRepo` like `getLastResponse()` or `getCachedResponse(request)`, or +- (B) Store the response on `IgcController` after fetch completes (simpler)? + +not sure. use your judgment. diff --git a/lib/pangea/choreographer/igc/igc_controller.dart b/lib/pangea/choreographer/igc/igc_controller.dart index 6cf2e8f1e..5387d87f3 100644 --- a/lib/pangea/choreographer/igc/igc_controller.dart +++ b/lib/pangea/choreographer/igc/igc_controller.dart @@ -7,11 +7,11 @@ import 'package:collection/collection.dart'; import 'package:fluffychat/pangea/choreographer/igc/igc_repo.dart'; import 'package:fluffychat/pangea/choreographer/igc/igc_request_model.dart'; +import 'package:fluffychat/pangea/choreographer/igc/igc_response_model.dart'; import 'package:fluffychat/pangea/choreographer/igc/pangea_match_state_model.dart'; import 'package:fluffychat/pangea/choreographer/igc/pangea_match_status_enum.dart'; import 'package:fluffychat/pangea/choreographer/igc/span_data_model.dart'; -import 'package:fluffychat/pangea/choreographer/igc/span_data_repo.dart'; -import 'package:fluffychat/pangea/choreographer/igc/span_data_request.dart'; +import 'package:fluffychat/pangea/common/models/llm_feedback_model.dart'; import 'package:fluffychat/pangea/common/utils/error_handler.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; @@ -24,6 +24,12 @@ class IgcController { bool _isFetching = false; String? _currentText; + /// Last request made - stored for feedback rerun + IGCRequestModel? _lastRequest; + + /// Last response received - stored for feedback rerun + IGCResponseModel? _lastResponse; + final List _openMatches = []; final List _closedMatches = []; @@ -70,21 +76,11 @@ class IgcController { ) => IGCRequestModel( fullText: text, userId: MatrixState.pangeaController.userController.client.userID!, - userL1: MatrixState.pangeaController.userController.userL1Code!, - userL2: MatrixState.pangeaController.userController.userL2Code!, enableIGC: true, enableIT: true, prevMessages: prevMessages, ); - SpanDetailsRequest _spanDetailsRequest(SpanData span) => SpanDetailsRequest( - userL1: MatrixState.pangeaController.userController.userL1Code!, - userL2: MatrixState.pangeaController.userController.userL2Code!, - enableIGC: true, - enableIT: true, - span: span, - ); - void dispose() { matchUpdateStream.close(); } @@ -92,6 +88,8 @@ class IgcController { void clear() { _isFetching = false; _currentText = null; + _lastRequest = null; + _lastResponse = null; _openMatches.clear(); _closedMatches.clear(); MatrixState.pAnyState.closeAllOverlays(); @@ -102,6 +100,8 @@ class IgcController { _closedMatches.clear(); } + void clearCurrentText() => _currentText = null; + void _filterPreviouslyIgnoredMatches() { for (final match in _openMatches) { if (IgcRepo.isIgnored(match.updatedMatch)) { @@ -287,28 +287,89 @@ class IgcController { ) async { if (text.isEmpty) return clear(); if (_isFetching) return; + + final request = _igcRequest(text, prevMessages); + await _fetchIGC(request); + } + + /// Re-runs IGC with user feedback about the previous response. + /// Returns true if feedback was submitted, false if no previous data. + Future rerunWithFeedback(String feedbackText) async { + debugPrint('rerunWithFeedback called with: $feedbackText'); + debugPrint('_lastRequest: $_lastRequest, _lastResponse: $_lastResponse'); + if (_lastRequest == null || _lastResponse == null) { + ErrorHandler.logError( + e: StateError( + 'rerunWithFeedback called without prior request/response', + ), + data: { + 'hasLastRequest': _lastRequest != null, + 'hasLastResponse': _lastResponse != null, + 'currentText': _currentText, + }, + ); + return false; + } + if (_isFetching) { + debugPrint('rerunWithFeedback: already fetching, returning false'); + return false; + } + + // Create feedback containing the original response + final feedback = LLMFeedbackModel( + feedback: feedbackText, + content: _lastResponse!, + contentToJson: (r) => r.toJson(), + ); + + // Clear existing matches and state + clearMatches(); + + // Create request with feedback attached + final requestWithFeedback = _lastRequest!.copyWithFeedback([feedback]); + debugPrint( + 'requestWithFeedback.feedback.length: ${requestWithFeedback.feedback.length}', + ); + debugPrint('requestWithFeedback.hashCode: ${requestWithFeedback.hashCode}'); + debugPrint('_lastRequest.hashCode: ${_lastRequest!.hashCode}'); + debugPrint('Calling IgcRepo.get...'); + return _fetchIGC(requestWithFeedback); + } + + Future _fetchIGC(IGCRequestModel request) async { _isFetching = true; + _lastRequest = request; final res = await IgcRepo.get( MatrixState.pangeaController.userController.accessToken, - _igcRequest(text, prevMessages), + request, ).timeout( - (const Duration(seconds: 10)), + const Duration(seconds: 10), onTimeout: () { - return Result.error(TimeoutException('IGC request timed out')); + return Result.error( + TimeoutException( + request.feedback.isNotEmpty + ? 'IGC feedback request timed out' + : 'IGC request timed out', + ), + ); }, ); if (res.isError) { + debugPrint('IgcRepo.get error: ${res.asError}'); onError(res.asError!); clear(); - return; - } else { - onFetch(); + return false; } - if (!_isFetching) return; + debugPrint('IgcRepo.get success, calling onFetch'); + onFetch(); + + if (!_isFetching) return false; + + _lastResponse = res.result!; _currentText = res.result!.originalInput; for (final match in res.result!.matches) { final matchState = PangeaMatchState( @@ -324,39 +385,6 @@ class IgcController { } _filterPreviouslyIgnoredMatches(); _isFetching = false; - } - - Future fetchSpanDetails({ - required PangeaMatchState match, - bool force = false, - }) async { - final span = match.updatedMatch.match; - if (span.isNormalizationError() && !force) { - return; - } - - final response = - await SpanDataRepo.get( - MatrixState.pangeaController.userController.accessToken, - request: _spanDetailsRequest(span), - ).timeout( - (const Duration(seconds: 10)), - onTimeout: () { - return Result.error( - TimeoutException('Span details request timed out'), - ); - }, - ); - - if (response.isError) throw response.error!; - setSpanData(match, response.result!); - } - - Future fetchAllSpanDetails() async { - final fetches = []; - for (final match in _openMatches) { - fetches.add(fetchSpanDetails(match: match)); - } - await Future.wait(fetches); + return true; } } diff --git a/lib/pangea/choreographer/igc/igc_repo.dart b/lib/pangea/choreographer/igc/igc_repo.dart index 85e29c7fb..749b92ef9 100644 --- a/lib/pangea/choreographer/igc/igc_repo.dart +++ b/lib/pangea/choreographer/igc/igc_repo.dart @@ -50,10 +50,15 @@ class IgcRepo { String? accessToken, IGCRequestModel igcRequest, ) { + debugPrint( + '[IgcRepo.get] called, request.hashCode: ${igcRequest.hashCode}', + ); final cached = _getCached(igcRequest); if (cached != null) { + debugPrint('[IgcRepo.get] cache HIT'); return _getResult(igcRequest, cached); } + debugPrint('[IgcRepo.get] cache MISS, fetching from server...'); final future = _fetch(accessToken, igcRequest: igcRequest); _setCached(igcRequest, future); diff --git a/lib/pangea/choreographer/igc/igc_request_model.dart b/lib/pangea/choreographer/igc/igc_request_model.dart index bda0edac7..5b17ea9f8 100644 --- a/lib/pangea/choreographer/igc/igc_request_model.dart +++ b/lib/pangea/choreographer/igc/igc_request_model.dart @@ -1,37 +1,72 @@ import 'dart:convert'; +import 'package:fluffychat/pangea/choreographer/igc/igc_response_model.dart'; import 'package:fluffychat/pangea/common/constants/model_keys.dart'; +import 'package:fluffychat/pangea/common/models/base_request_model.dart'; +import 'package:fluffychat/pangea/common/models/llm_feedback_model.dart'; +import 'package:fluffychat/widgets/matrix.dart'; -class IGCRequestModel { +class IGCRequestModel with BaseRequestModel { final String fullText; - final String userL1; - final String userL2; final bool enableIT; final bool enableIGC; final String userId; final List prevMessages; + final List> feedback; + + @override + String get userCefr => MatrixState + .pangeaController + .userController + .profile + .userSettings + .cefrLevel + .string; + + @override + String get userL1 => MatrixState.pangeaController.userController.userL1Code!; + + @override + String get userL2 => MatrixState.pangeaController.userController.userL2Code!; const IGCRequestModel({ required this.fullText, - required this.userL1, - required this.userL2, required this.enableIGC, required this.enableIT, required this.userId, required this.prevMessages, + this.feedback = const [], }); - Map toJson() => { - ModelKey.fullText: fullText, - ModelKey.userL1: userL1, - ModelKey.userL2: userL2, - ModelKey.enableIT: enableIT, - ModelKey.enableIGC: enableIGC, - ModelKey.userId: userId, - ModelKey.prevMessages: jsonEncode( - prevMessages.map((x) => x.toJson()).toList(), - ), - }; + /// Creates a copy of this request with optional feedback. + IGCRequestModel copyWithFeedback( + List> newFeedback, + ) => IGCRequestModel( + fullText: fullText, + enableIGC: enableIGC, + enableIT: enableIT, + userId: userId, + prevMessages: prevMessages, + feedback: newFeedback, + ); + + Map toJson() { + final json = { + ModelKey.fullText: fullText, + ModelKey.userL1: userL1, + ModelKey.userL2: userL2, + ModelKey.enableIT: enableIT, + ModelKey.enableIGC: enableIGC, + ModelKey.userId: userId, + ModelKey.prevMessages: jsonEncode( + prevMessages.map((x) => x.toJson()).toList(), + ), + }; + if (feedback.isNotEmpty) { + json[ModelKey.feedback] = feedback.map((f) => f.toJson()).toList(); + } + return json; + } @override bool operator ==(Object other) { @@ -44,12 +79,24 @@ class IGCRequestModel { userL1 == other.userL1 && userL2 == other.userL2 && enableIT == other.enableIT && - userId == other.userId; + userId == other.userId && + _feedbackHash == other._feedbackHash; } + /// Hash of feedback content for cache differentiation + int get _feedbackHash => + feedback.isEmpty ? 0 : Object.hashAll(feedback.map((f) => f.feedback)); + @override - int get hashCode => - Object.hash(fullText.trim(), userL1, userL2, enableIT, enableIGC, userId); + int get hashCode => Object.hash( + fullText.trim(), + userL1, + userL2, + enableIT, + enableIGC, + userId, + _feedbackHash, + ); } /// Previous text/audio message sent in chat diff --git a/lib/pangea/choreographer/igc/igc_response_model.dart b/lib/pangea/choreographer/igc/igc_response_model.dart index 23ad87086..9aa4e9236 100644 --- a/lib/pangea/choreographer/igc/igc_response_model.dart +++ b/lib/pangea/choreographer/igc/igc_response_model.dart @@ -7,7 +7,13 @@ class IGCResponseModel { final List matches; final String userL1; final String userL2; + + /// Whether interactive translation is enabled. + /// Defaults to true for V2 responses which don't include this field. final bool enableIT; + + /// Whether in-context grammar is enabled. + /// Defaults to true for V2 responses which don't include this field. final bool enableIGC; IGCResponseModel({ @@ -16,33 +22,39 @@ class IGCResponseModel { required this.matches, required this.userL1, required this.userL2, - required this.enableIT, - required this.enableIGC, + this.enableIT = true, + this.enableIGC = true, }); factory IGCResponseModel.fromJson(Map json) { + final String originalInput = json["original_input"]; return IGCResponseModel( matches: json["matches"] != null ? (json["matches"] as Iterable) - .map((e) { - return PangeaMatch.fromJson(e as Map); - }) + .map( + (e) => PangeaMatch.fromJson( + e as Map, + fullText: originalInput, + ), + ) .toList() .cast() : [], - originalInput: json["original_input"], + originalInput: originalInput, fullTextCorrection: json["full_text_correction"], userL1: json[ModelKey.userL1], userL2: json[ModelKey.userL2], - enableIT: json[ModelKey.enableIT], - enableIGC: json[ModelKey.enableIGC], + // V2 responses don't include these fields; default to true + enableIT: json[ModelKey.enableIT] ?? true, + enableIGC: json[ModelKey.enableIGC] ?? true, ); } Map toJson() => { "original_input": originalInput, "full_text_correction": fullTextCorrection, - "matches": matches.map((e) => e.toJson()).toList(), + // Serialize as flat SpanData objects matching server's SpanDataV2 schema + "matches": matches.map((e) => e.match.toJson()).toList(), ModelKey.userL1: userL1, ModelKey.userL2: userL2, ModelKey.enableIT: enableIT, diff --git a/lib/pangea/choreographer/igc/pangea_match_model.dart b/lib/pangea/choreographer/igc/pangea_match_model.dart index b7230553d..0292560f6 100644 --- a/lib/pangea/choreographer/igc/pangea_match_model.dart +++ b/lib/pangea/choreographer/igc/pangea_match_model.dart @@ -1,5 +1,5 @@ import 'package:fluffychat/pangea/choreographer/igc/pangea_match_status_enum.dart'; -import 'package:fluffychat/pangea/choreographer/igc/span_data_type_enum.dart'; +import 'package:fluffychat/pangea/choreographer/igc/replacement_type_enum.dart'; import 'match_rule_id_model.dart'; import 'span_data_model.dart'; @@ -9,10 +9,26 @@ class PangeaMatch { const PangeaMatch({required this.match, required this.status}); - factory PangeaMatch.fromJson(Map json) { + /// Parse PangeaMatch from JSON. + /// + /// Supports two formats: + /// - V1/Legacy: {"match": {...span_data...}, "status": "open"} + /// - V2: {...span_data...} (SpanData directly, status defaults to open) + /// + /// [fullText] is passed to SpanData as fallback when the span JSON doesn't + /// contain full_text (e.g., when using original_input from parent response). + factory PangeaMatch.fromJson(Map json, {String? fullText}) { + // Check if this is V1 format (has "match" wrapper) or V2 format (flat SpanData) + final bool isV1Format = json[_matchKey] is Map; + + final Map spanJson = isV1Format + ? json[_matchKey] as Map + : json; + return PangeaMatch( - match: SpanData.fromJson(json[_matchKey] as Map), - status: json[_statusKey] != null + match: SpanData.fromJson(spanJson, parentFullText: fullText), + // V1 format may have status; V2 format always defaults to open + status: isV1Format && json[_statusKey] != null ? PangeaMatchStatusEnum.fromString(json[_statusKey] as String) : PangeaMatchStatusEnum.open, ); @@ -28,10 +44,7 @@ class PangeaMatch { bool get isITStart => match.rule?.id == MatchRuleIdModel.interactiveTranslation || - [ - SpanDataTypeEnum.itStart, - SpanDataTypeEnum.itStart.name, - ].contains(match.type.typeName); + match.type == ReplacementTypeEnum.itStart; bool get _needsTranslation => match.rule?.id != null ? [ diff --git a/lib/pangea/choreographer/igc/replacement_type_enum.dart b/lib/pangea/choreographer/igc/replacement_type_enum.dart new file mode 100644 index 000000000..65272ed15 --- /dev/null +++ b/lib/pangea/choreographer/igc/replacement_type_enum.dart @@ -0,0 +1,312 @@ +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +enum ReplacementTypeEnum { + // Client-specific types + definition, + practice, + itStart, + + // === GRAMMAR CATEGORIES (granular for teacher analytics) === + verbConjugation, // Wrong form for person/number/tense + verbTense, // Using wrong tense for context + verbMood, // Indicative vs subjunctive vs imperative + subjectVerbAgreement, // "he go" -> "he goes" + genderAgreement, // "la libro" -> "el libro" + numberAgreement, // Singular/plural mismatches + caseError, // For languages with grammatical cases + article, // Missing, wrong, or unnecessary articles + preposition, // Wrong preposition choice + pronoun, // Wrong form, reference, or missing + wordOrder, // Syntax/structure issues + negation, // Double negatives, wrong placement + questionFormation, // Incorrect question structure + relativeClause, // who/which/that errors + connector, // Conjunction usage (but/and/however) + possessive, // Apostrophe usage, possessive pronouns + comparative, // Comparative/superlative forms + passiveVoice, // Passive construction errors + conditional, // If clauses, would/could + infinitiveGerund, // Infinitive vs gerund usage + modal, // Modal verb usage (can/could/should/must) + // === SURFACE-LEVEL CORRECTIONS (auto-applied) === + punct, + diacritics, + spell, + cap, + + // === WORD CHOICE CATEGORIES (granular for teacher analytics) === + falseCognate, // False friends (e.g., "embarazada" ≠ "embarrassed") + l1Interference, // L1 patterns bleeding through incorrectly + collocation, // Wrong word pairing (e.g., "do a mistake" → "make a mistake") + semanticConfusion, // Similar meanings, wrong choice (e.g., "see/watch/look") + // === HIGHER-LEVEL SUGGESTIONS === + transcription, + style, + fluency, + didYouMean, + translation, + other, +} + +extension SpanDataTypeEnumExt on ReplacementTypeEnum { + /// Types that should be auto-applied without user interaction. + /// These are minor corrections like punctuation, spacing, accents, etc. + static const List autoApplyTypes = [ + ReplacementTypeEnum.punct, + ReplacementTypeEnum.diacritics, + ReplacementTypeEnum.spell, + ReplacementTypeEnum.cap, + ]; + + /// Grammar types that require explanatory reasons for learning. + static const List grammarTypes = [ + ReplacementTypeEnum.verbConjugation, + ReplacementTypeEnum.verbTense, + ReplacementTypeEnum.verbMood, + ReplacementTypeEnum.subjectVerbAgreement, + ReplacementTypeEnum.genderAgreement, + ReplacementTypeEnum.numberAgreement, + ReplacementTypeEnum.caseError, + ReplacementTypeEnum.article, + ReplacementTypeEnum.preposition, + ReplacementTypeEnum.pronoun, + ReplacementTypeEnum.wordOrder, + ReplacementTypeEnum.negation, + ReplacementTypeEnum.questionFormation, + ReplacementTypeEnum.relativeClause, + ReplacementTypeEnum.connector, + ReplacementTypeEnum.possessive, + ReplacementTypeEnum.comparative, + ReplacementTypeEnum.passiveVoice, + ReplacementTypeEnum.conditional, + ReplacementTypeEnum.infinitiveGerund, + ReplacementTypeEnum.modal, + ]; + + /// Word choice types that require explanatory reasons for learning. + static const List wordChoiceTypes = [ + ReplacementTypeEnum.falseCognate, + ReplacementTypeEnum.l1Interference, + ReplacementTypeEnum.collocation, + ReplacementTypeEnum.semanticConfusion, + ]; + + /// Whether this type should be auto-applied without user interaction. + bool get isAutoApply => autoApplyTypes.contains(this); + + /// Whether this is a grammar-related type (for analytics grouping). + bool get isGrammarType => grammarTypes.contains(this); + + /// Whether this is a word-choice-related type (for analytics grouping). + bool get isWordChoiceType => wordChoiceTypes.contains(this); + + /// Convert enum to snake_case string for JSON serialization. + String get name { + switch (this) { + // Client-specific types + case ReplacementTypeEnum.definition: + return "definition"; + case ReplacementTypeEnum.practice: + return "practice"; + case ReplacementTypeEnum.itStart: + return "itStart"; + + // Grammar types + case ReplacementTypeEnum.verbConjugation: + return "verb_conjugation"; + case ReplacementTypeEnum.verbTense: + return "verb_tense"; + case ReplacementTypeEnum.verbMood: + return "verb_mood"; + case ReplacementTypeEnum.subjectVerbAgreement: + return "subject_verb_agreement"; + case ReplacementTypeEnum.genderAgreement: + return "gender_agreement"; + case ReplacementTypeEnum.numberAgreement: + return "number_agreement"; + case ReplacementTypeEnum.caseError: + return "case_error"; + case ReplacementTypeEnum.article: + return "article"; + case ReplacementTypeEnum.preposition: + return "preposition"; + case ReplacementTypeEnum.pronoun: + return "pronoun"; + case ReplacementTypeEnum.wordOrder: + return "word_order"; + case ReplacementTypeEnum.negation: + return "negation"; + case ReplacementTypeEnum.questionFormation: + return "question_formation"; + case ReplacementTypeEnum.relativeClause: + return "relative_clause"; + case ReplacementTypeEnum.connector: + return "connector"; + case ReplacementTypeEnum.possessive: + return "possessive"; + case ReplacementTypeEnum.comparative: + return "comparative"; + case ReplacementTypeEnum.passiveVoice: + return "passive_voice"; + case ReplacementTypeEnum.conditional: + return "conditional"; + case ReplacementTypeEnum.infinitiveGerund: + return "infinitive_gerund"; + case ReplacementTypeEnum.modal: + return "modal"; + + // Surface-level corrections + case ReplacementTypeEnum.punct: + return "punct"; + case ReplacementTypeEnum.diacritics: + return "diacritics"; + case ReplacementTypeEnum.spell: + return "spell"; + case ReplacementTypeEnum.cap: + return "cap"; + + // Word choice types + case ReplacementTypeEnum.falseCognate: + return "false_cognate"; + case ReplacementTypeEnum.l1Interference: + return "l1_interference"; + case ReplacementTypeEnum.collocation: + return "collocation"; + case ReplacementTypeEnum.semanticConfusion: + return "semantic_confusion"; + + // Higher-level suggestions + case ReplacementTypeEnum.transcription: + return "transcription"; + case ReplacementTypeEnum.style: + return "style"; + case ReplacementTypeEnum.fluency: + return "fluency"; + case ReplacementTypeEnum.didYouMean: + return "did_you_mean"; + case ReplacementTypeEnum.translation: + return "translation"; + case ReplacementTypeEnum.other: + return "other"; + } + } + + /// Parse type string from JSON, handling backward compatibility + /// for old saved data and snake_case to camelCase conversion. + static ReplacementTypeEnum? fromString(String? typeString) { + if (typeString == null) return null; + + // Normalize snake_case to camelCase and handle backward compatibility + final normalized = switch (typeString) { + // Legacy mappings - grammar and word_choice were split into subtypes + 'correction' => 'subjectVerbAgreement', // Legacy fallback + 'grammar' => 'subjectVerbAgreement', // Legacy fallback + 'word_choice' => 'semanticConfusion', // Legacy fallback + // Snake_case to camelCase conversions - grammar types + 'did_you_mean' => 'didYouMean', + 'verb_conjugation' => 'verbConjugation', + 'verb_tense' => 'verbTense', + 'verb_mood' => 'verbMood', + 'subject_verb_agreement' => 'subjectVerbAgreement', + 'gender_agreement' => 'genderAgreement', + 'number_agreement' => 'numberAgreement', + 'case_error' => 'caseError', + 'word_order' => 'wordOrder', + 'question_formation' => 'questionFormation', + 'relative_clause' => 'relativeClause', + 'passive_voice' => 'passiveVoice', + 'infinitive_gerund' => 'infinitiveGerund', + + // Snake_case to camelCase conversions - word choice types + 'false_cognate' => 'falseCognate', + 'l1_interference' => 'l1Interference', + 'semantic_confusion' => 'semanticConfusion', + // 'collocation' is already single word, no conversion needed + + // Already camelCase or single word - pass through + _ => typeString, + }; + + return ReplacementTypeEnum.values.firstWhereOrNull( + (e) => e.name == normalized || e.toString().split('.').last == normalized, + ); + } + + String defaultPrompt(BuildContext context) { + switch (this) { + case ReplacementTypeEnum.definition: + return L10n.of(context).definitionDefaultPrompt; + case ReplacementTypeEnum.practice: + return L10n.of(context).practiceDefaultPrompt; + case ReplacementTypeEnum.itStart: + return L10n.of(context).needsItMessage( + MatrixState.pangeaController.userController.userL2?.getDisplayName( + context, + ) ?? + L10n.of(context).targetLanguage, + ); + // All grammar types and other corrections use the same default prompt + default: + return L10n.of(context).correctionDefaultPrompt; + } + } + + /// Returns the underline color for this replacement type. + /// Used to visually distinguish different error categories in the text field. + Color underlineColor() { + // IT start and auto-apply types use primary color + if (this == ReplacementTypeEnum.itStart || isAutoApply) { + return AppConfig.primaryColor.withAlpha(180); + } + // Grammar errors use warning/orange + if (isGrammarType) { + return AppConfig.warning.withAlpha(180); + } + // Word choice uses blue + if (isWordChoiceType) { + return Colors.blue.withAlpha(180); + } + // Style and fluency use teal + switch (this) { + case ReplacementTypeEnum.style: + case ReplacementTypeEnum.fluency: + return Colors.teal.withAlpha(180); + default: + // Other/unknown use error color + return AppConfig.error.withAlpha(180); + } + } + + /// Returns a human-readable display name for this replacement type. + /// Used in the SpanCard UI to show the error category. + String displayName(BuildContext context) { + if (isGrammarType) { + return L10n.of(context).spanTypeGrammar; + } + if (isWordChoiceType) { + return L10n.of(context).spanTypeWordChoice; + } + switch (this) { + case ReplacementTypeEnum.spell: + return L10n.of(context).spanTypeSpelling; + case ReplacementTypeEnum.punct: + return L10n.of(context).spanTypePunctuation; + case ReplacementTypeEnum.style: + return L10n.of(context).spanTypeStyle; + case ReplacementTypeEnum.fluency: + return L10n.of(context).spanTypeFluency; + case ReplacementTypeEnum.diacritics: + return L10n.of(context).spanTypeAccents; + case ReplacementTypeEnum.cap: + return L10n.of(context).spanTypeCapitalization; + default: + return L10n.of(context).spanTypeCorrection; + } + } +} diff --git a/lib/pangea/choreographer/igc/span_card.dart b/lib/pangea/choreographer/igc/span_card.dart index dc8774437..52b926cb7 100644 --- a/lib/pangea/choreographer/igc/span_card.dart +++ b/lib/pangea/choreographer/igc/span_card.dart @@ -4,14 +4,15 @@ import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pangea/bot/utils/bot_style.dart'; +import 'package:fluffychat/pangea/bot/widgets/bot_face_svg.dart'; import 'package:fluffychat/pangea/choreographer/choreographer.dart'; import 'package:fluffychat/pangea/choreographer/igc/pangea_match_state_model.dart'; import 'package:fluffychat/pangea/choreographer/igc/pangea_match_status_enum.dart'; +import 'package:fluffychat/pangea/choreographer/igc/replacement_type_enum.dart'; import 'package:fluffychat/pangea/choreographer/igc/span_choice_type_enum.dart'; import 'package:fluffychat/pangea/choreographer/igc/span_data_model.dart'; -import 'package:fluffychat/pangea/common/utils/async_state.dart'; import 'package:fluffychat/pangea/common/utils/error_handler.dart'; -import 'package:fluffychat/pangea/common/widgets/error_indicator.dart'; +import 'package:fluffychat/pangea/common/widgets/feedback_dialog.dart'; import '../../../widgets/matrix.dart'; import '../../common/widgets/choice_array.dart'; @@ -19,12 +20,14 @@ class SpanCard extends StatefulWidget { final PangeaMatchState match; final Choreographer choreographer; final VoidCallback showNextMatch; + final Future Function(String) onFeedbackSubmitted; const SpanCard({ super.key, required this.match, required this.choreographer, required this.showNextMatch, + required this.onFeedbackSubmitted, }); @override @@ -32,95 +35,24 @@ class SpanCard extends StatefulWidget { } class SpanCardState extends State { - bool _loadingChoices = true; - final ValueNotifier> _feedbackState = - ValueNotifier>(const AsyncIdle()); - final ScrollController scrollController = ScrollController(); @override void initState() { super.initState(); - _fetchChoices(); } @override void dispose() { - _feedbackState.dispose(); scrollController.dispose(); super.dispose(); } - List? get _choices => widget.match.updatedMatch.match.choices; - SpanChoice? get _selectedChoice => widget.match.updatedMatch.match.selectedChoice; - String? get _selectedFeedback => _selectedChoice?.feedback; - - Future _fetchChoices() async { - if (_choices != null && _choices!.length > 1) { - setState(() => _loadingChoices = false); - return; - } - - setState(() => _loadingChoices = true); - - try { - await widget.choreographer.igcController.fetchSpanDetails( - match: widget.match, - ); - - if (_choices == null || _choices!.isEmpty) { - widget.choreographer.clearMatches( - 'No choices available for span ${widget.match.updatedMatch.match.message}', - ); - } - } catch (e) { - widget.choreographer.clearMatches(e); - } finally { - if (mounted) { - setState(() => _loadingChoices = false); - } - } - } - - Future _fetchFeedback() async { - if (_selectedFeedback != null) { - _feedbackState.value = AsyncLoaded(_selectedFeedback!); - return; - } - - try { - _feedbackState.value = const AsyncLoading(); - await widget.choreographer.igcController.fetchSpanDetails( - match: widget.match, - force: true, - ); - - if (!mounted) return; - if (_selectedFeedback != null) { - _feedbackState.value = AsyncLoaded(_selectedFeedback!); - } else { - _feedbackState.value = AsyncError( - L10n.of(context).failedToLoadFeedback, - ); - } - } catch (e) { - if (mounted) { - _feedbackState.value = AsyncError(e); - } - } - } - void _onChoiceSelect(int index) { - final selected = _choices![index]; widget.match.selectChoice(index); - - _feedbackState.value = selected.feedback != null - ? AsyncLoaded(selected.feedback!) - : const AsyncIdle(); - setState(() {}); } @@ -140,12 +72,51 @@ class SpanCardState extends State { } } + Future _showFeedbackDialog() async { + final resp = await showDialog( + context: context, + builder: (context) => FeedbackDialog( + title: L10n.of(context).spanFeedbackTitle, + onSubmit: (feedback) => Navigator.of(context).pop(feedback), + ), + ); + if (resp == null || resp.isEmpty) { + return; + } + + await widget.onFeedbackSubmitted(resp); + } + @override Widget build(BuildContext context) { return SizedBox( height: 300.0, child: Column( children: [ + // Header row: Close, Type Label + BotFace, Flag + SizedBox( + height: 40.0, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + IconButton( + icon: const Icon(Icons.close), + color: Theme.of(context).iconTheme.color, + onPressed: () => _updateMatch(PangeaMatchStatusEnum.ignored), + ), + const Flexible( + child: Center( + child: BotFace(width: 32.0, expression: BotExpression.idle), + ), + ), + IconButton( + icon: const Icon(Icons.flag_outlined), + color: Theme.of(context).iconTheme.color, + onPressed: _showFeedbackDialog, + ), + ], + ), + ), Expanded( child: Scrollbar( controller: scrollController, @@ -160,13 +131,13 @@ class SpanCardState extends State { spacing: 12.0, children: [ ChoicesArray( - isLoading: _loadingChoices, + isLoading: false, choices: widget.match.updatedMatch.match.choices ?.map( (e) => Choice( text: e.value, color: e.selected ? e.type.color : null, - isGold: e.type.name == 'bestCorrection', + isGold: e.type.isSuggestion, ), ) .toList(), @@ -180,11 +151,7 @@ class SpanCardState extends State { .userL2Code!, ), const SizedBox(), - _SpanCardFeedback( - _selectedChoice != null, - _fetchFeedback, - _feedbackState, - ), + _SpanCardFeedback(widget.match.updatedMatch.match), ], ), ), @@ -203,52 +170,30 @@ class SpanCardState extends State { } class _SpanCardFeedback extends StatelessWidget { - final bool hasSelectedChoice; - final VoidCallback fetchFeedback; - final ValueNotifier> feedbackState; - - const _SpanCardFeedback( - this.hasSelectedChoice, - this.fetchFeedback, - this.feedbackState, - ); + final SpanData? span; + const _SpanCardFeedback(this.span); @override Widget build(BuildContext context) { + String prompt = L10n.of(context).correctionDefaultPrompt; + if (span != null) { + prompt = span!.type.defaultPrompt(context); + } + + final defaultContent = Text( + prompt, + style: BotStyle.text(context).copyWith(fontStyle: FontStyle.italic), + ); + return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - ValueListenableBuilder( - valueListenable: feedbackState, - builder: (context, state, _) { - return switch (state) { - AsyncIdle() => - hasSelectedChoice - ? IconButton( - onPressed: fetchFeedback, - icon: const Icon(Icons.lightbulb_outline, size: 24), - ) - : Text( - L10n.of(context).correctionDefaultPrompt, - style: BotStyle.text( - context, - ).copyWith(fontStyle: FontStyle.italic), - ), - AsyncLoading() => const SizedBox( - width: 24, - height: 24, - child: CircularProgressIndicator(), - ), - AsyncError(:final error) => ErrorIndicator( - message: error.toString(), - ), - AsyncLoaded(:final value) => Text( - value, + span == null || span!.selectedChoice == null + ? defaultContent + : Text( + span!.selectedChoice!.feedbackToDisplay(context), style: BotStyle.text(context), ), - }; - }, - ), ], ); } diff --git a/lib/pangea/choreographer/igc/span_choice_type_enum.dart b/lib/pangea/choreographer/igc/span_choice_type_enum.dart index 829e120c3..94e03fbba 100644 --- a/lib/pangea/choreographer/igc/span_choice_type_enum.dart +++ b/lib/pangea/choreographer/igc/span_choice_type_enum.dart @@ -2,50 +2,65 @@ import 'package:flutter/material.dart'; import 'package:fluffychat/l10n/l10n.dart'; -enum SpanChoiceTypeEnum { bestCorrection, distractor, bestAnswer } +enum SpanChoiceTypeEnum { + suggestion, + alt, + distractor, + @Deprecated('Use suggestion instead') + bestCorrection, + @Deprecated('Use suggestion instead') + bestAnswer, +} extension SpanChoiceExt on SpanChoiceTypeEnum { - String get name { - switch (this) { - case SpanChoiceTypeEnum.bestCorrection: - return "bestCorrection"; - case SpanChoiceTypeEnum.distractor: - return "distractor"; - case SpanChoiceTypeEnum.bestAnswer: - return "bestAnswer"; - } - } + bool get isSuggestion => + this == SpanChoiceTypeEnum.suggestion || + // ignore: deprecated_member_use_from_same_package + this == SpanChoiceTypeEnum.bestCorrection || + // ignore: deprecated_member_use_from_same_package + this == SpanChoiceTypeEnum.bestAnswer; String defaultFeedback(BuildContext context) { switch (this) { + case SpanChoiceTypeEnum.suggestion: + // ignore: deprecated_member_use_from_same_package case SpanChoiceTypeEnum.bestCorrection: return L10n.of(context).bestCorrectionFeedback; - case SpanChoiceTypeEnum.distractor: - return L10n.of(context).distractorFeedback; + case SpanChoiceTypeEnum.alt: + // ignore: deprecated_member_use_from_same_package case SpanChoiceTypeEnum.bestAnswer: return L10n.of(context).bestAnswerFeedback; + case SpanChoiceTypeEnum.distractor: + return L10n.of(context).distractorFeedback; } } IconData get icon { switch (this) { + case SpanChoiceTypeEnum.suggestion: + // ignore: deprecated_member_use_from_same_package case SpanChoiceTypeEnum.bestCorrection: + case SpanChoiceTypeEnum.alt: + // ignore: deprecated_member_use_from_same_package + case SpanChoiceTypeEnum.bestAnswer: return Icons.check_circle; case SpanChoiceTypeEnum.distractor: return Icons.cancel; - case SpanChoiceTypeEnum.bestAnswer: - return Icons.check_circle; } } Color get color { switch (this) { + case SpanChoiceTypeEnum.suggestion: + // ignore: deprecated_member_use_from_same_package case SpanChoiceTypeEnum.bestCorrection: return Colors.green; + case SpanChoiceTypeEnum.alt: + // ignore: deprecated_member_use_from_same_package + case SpanChoiceTypeEnum.bestAnswer: + return Colors.green; case SpanChoiceTypeEnum.distractor: return Colors.red; - case SpanChoiceTypeEnum.bestAnswer: - return Colors.green; } } } diff --git a/lib/pangea/choreographer/igc/span_data_model.dart b/lib/pangea/choreographer/igc/span_data_model.dart index 99fcda558..8861c6ba5 100644 --- a/lib/pangea/choreographer/igc/span_data_model.dart +++ b/lib/pangea/choreographer/igc/span_data_model.dart @@ -4,8 +4,8 @@ import 'package:collection/collection.dart'; import 'package:fluffychat/pangea/choreographer/igc/text_normalization_util.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'replacement_type_enum.dart'; import 'span_choice_type_enum.dart'; -import 'span_data_type_enum.dart'; class SpanData { final String? message; @@ -14,7 +14,7 @@ class SpanData { final int offset; final int length; final String fullText; - final SpanDataType type; + final ReplacementTypeEnum type; final Rule? rule; SpanData({ @@ -35,7 +35,7 @@ class SpanData { int? offset, int? length, String? fullText, - SpanDataType? type, + ReplacementTypeEnum? type, Rule? rule, }) { return SpanData( @@ -50,8 +50,28 @@ class SpanData { ); } - factory SpanData.fromJson(Map json) { + /// Parse SpanData from JSON. + /// + /// [parentFullText] is used as fallback when the span JSON doesn't contain + /// full_text (e.g., when the server omits it to reduce payload size and + /// the full text is available at the response level as original_input). + factory SpanData.fromJson( + Map json, { + String? parentFullText, + }) { final Iterable? choices = json['choices'] ?? json['replacements']; + final dynamic rawType = + json['type'] ?? json['type_name'] ?? json['typeName']; + final String? typeString = rawType is Map + ? (rawType['type_name'] ?? rawType['type'] ?? rawType['typeName']) + as String? + : rawType as String?; + + // Try to get fullText from span JSON, fall back to parent's original_input + final String? spanFullText = + json['sentence'] ?? json['full_text'] ?? json['fullText']; + final String fullText = spanFullText ?? parentFullText ?? ''; + return SpanData( message: json['message'], shortMessage: json['shortMessage'] ?? json['short_message'], @@ -62,9 +82,10 @@ class SpanData { .toList(), offset: json['offset'] as int, length: json['length'] as int, - fullText: - json['sentence'] ?? json['full_text'] ?? json['fullText'] as String, - type: SpanDataType.fromJson(json['type'] as Map), + fullText: fullText, + type: + SpanDataTypeEnumExt.fromString(typeString) ?? + ReplacementTypeEnum.other, rule: json['rule'] != null ? Rule.fromJson(json['rule'] as Map) : null, @@ -76,7 +97,7 @@ class SpanData { 'offset': offset, 'length': length, 'full_text': fullText, - 'type': type.toJson(), + 'type': type.name, }; if (message != null) { @@ -133,7 +154,17 @@ class SpanData { String get errorSpan => fullText.characters.skip(offset).take(length).toString(); + /// Whether this span is a minor correction that should be auto-applied. + /// Returns true if: + /// 1. The type is explicitly marked as auto-apply (e.g., punct, spell, cap, diacritics), OR + /// 2. For backwards compatibility with old data that lacks new types: + /// the type is NOT auto-apply AND the normalized strings match. bool isNormalizationError() { + // New data with explicit auto-apply types + if (type.isAutoApply) { + return true; + } + final correctChoice = choices ?.firstWhereOrNull((c) => c.isBestCorrection) ?.value; @@ -223,8 +254,8 @@ class SpanChoice { ? SpanChoiceTypeEnum.values.firstWhereOrNull( (element) => element.name == json['type'], ) ?? - SpanChoiceTypeEnum.bestCorrection - : SpanChoiceTypeEnum.bestCorrection, + SpanChoiceTypeEnum.suggestion + : SpanChoiceTypeEnum.suggestion, feedback: json['feedback'], selected: json['selected'] ?? false, timestamp: json['timestamp'] != null @@ -236,18 +267,15 @@ class SpanChoice { Map toJson() { final Map data = {'value': value, 'type': type.name}; - if (selected) { - data['selected'] = selected; + // V2 format: use selected_at instead of separate selected + timestamp + if (selected && timestamp != null) { + data['selected_at'] = timestamp!.toIso8601String(); } if (feedback != null) { data['feedback'] = feedback; } - if (timestamp != null) { - data['timestamp'] = timestamp!.toIso8601String(); - } - return data; } @@ -258,7 +286,7 @@ class SpanChoice { return feedback!; } - bool get isBestCorrection => type == SpanChoiceTypeEnum.bestCorrection; + bool get isBestCorrection => type.isSuggestion; Color get color => type.color; @@ -307,36 +335,3 @@ class Rule { return id.hashCode; } } - -class SpanDataType { - final SpanDataTypeEnum typeName; - - const SpanDataType({required this.typeName}); - - factory SpanDataType.fromJson(Map json) { - final String? type = - json['typeName'] ?? json['type'] ?? json['type_name'] as String?; - return SpanDataType( - typeName: type != null - ? SpanDataTypeEnum.values.firstWhereOrNull( - (element) => element.name == type, - ) ?? - SpanDataTypeEnum.correction - : SpanDataTypeEnum.correction, - ); - } - - Map toJson() => {'type_name': typeName.name}; - - @override - bool operator ==(Object other) { - if (identical(this, other)) return true; - if (other is! SpanDataType) return false; - return other.typeName == typeName; - } - - @override - int get hashCode { - return typeName.hashCode; - } -} diff --git a/lib/pangea/choreographer/igc/span_data_type_enum.dart b/lib/pangea/choreographer/igc/span_data_type_enum.dart deleted file mode 100644 index 567ae2658..000000000 --- a/lib/pangea/choreographer/igc/span_data_type_enum.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -enum SpanDataTypeEnum { definition, practice, correction, itStart } - -extension SpanDataTypeEnumExt on SpanDataTypeEnum { - String get name { - switch (this) { - case SpanDataTypeEnum.definition: - return "definition"; - case SpanDataTypeEnum.practice: - return "practice"; - case SpanDataTypeEnum.correction: - return "correction"; - case SpanDataTypeEnum.itStart: - return "itStart"; - } - } - - String defaultPrompt(BuildContext context) { - switch (this) { - case SpanDataTypeEnum.definition: - return L10n.of(context).definitionDefaultPrompt; - case SpanDataTypeEnum.practice: - return L10n.of(context).practiceDefaultPrompt; - case SpanDataTypeEnum.correction: - return L10n.of(context).correctionDefaultPrompt; - case SpanDataTypeEnum.itStart: - return L10n.of(context).needsItMessage( - MatrixState.pangeaController.userController.userL2?.getDisplayName( - context, - ) ?? - L10n.of(context).targetLanguage, - ); - } - } -} diff --git a/lib/pangea/choreographer/text_editing/pangea_text_controller.dart b/lib/pangea/choreographer/text_editing/pangea_text_controller.dart index ad26b08f7..4a8920c74 100644 --- a/lib/pangea/choreographer/text_editing/pangea_text_controller.dart +++ b/lib/pangea/choreographer/text_editing/pangea_text_controller.dart @@ -2,12 +2,13 @@ import 'package:flutter/material.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/choreographer/choreo_constants.dart'; import 'package:fluffychat/pangea/choreographer/igc/autocorrect_span.dart'; -import 'package:fluffychat/pangea/choreographer/igc/match_rule_id_model.dart'; import 'package:fluffychat/pangea/choreographer/igc/pangea_match_model.dart'; import 'package:fluffychat/pangea/choreographer/igc/pangea_match_state_model.dart'; import 'package:fluffychat/pangea/choreographer/igc/pangea_match_status_enum.dart'; +import 'package:fluffychat/pangea/choreographer/igc/replacement_type_enum.dart'; import 'package:fluffychat/pangea/common/utils/error_handler.dart'; import 'package:fluffychat/pangea/subscription/controllers/subscription_controller.dart'; import 'package:fluffychat/widgets/matrix.dart'; @@ -32,19 +33,13 @@ class PangeaTextController extends TextEditingController { ); Color _underlineColor(PangeaMatch match) { + // Automatic corrections use primary color if (match.status == PangeaMatchStatusEnum.automatic) { - return const Color.fromARGB(187, 132, 96, 224); + return AppConfig.primaryColor.withAlpha(180); } - switch (match.match.rule?.id ?? "unknown") { - case MatchRuleIdModel.interactiveTranslation: - return const Color.fromARGB(187, 132, 96, 224); - case MatchRuleIdModel.tokenNeedsTranslation: - case MatchRuleIdModel.tokenSpanNeedsTranslation: - return const Color.fromARGB(186, 255, 132, 0); - default: - return const Color.fromARGB(149, 255, 17, 0); - } + // Use type-based coloring + return match.match.type.underlineColor(); } TextStyle _textStyle( diff --git a/lib/pangea/common/constants/model_keys.dart b/lib/pangea/common/constants/model_keys.dart index 84b69e97b..74d28e6e3 100644 --- a/lib/pangea/common/constants/model_keys.dart +++ b/lib/pangea/common/constants/model_keys.dart @@ -9,6 +9,7 @@ class ModelKey { static const String userDateOfBirth = 'date_of_birth'; static const String userSpeaks = 'speaks'; static const String userCountry = 'country'; + static const String userAbout = 'about'; static const String hasJoinedHelpSpace = 'has_joined_help_space'; static const String userInterests = 'interests'; static const String publicProfile = 'public_profile'; @@ -106,6 +107,8 @@ class ModelKey { static const String currentText = "current"; static const String bestContinuance = "best_continuance"; static const String feedbackLang = "feedback_lang"; + static const String feedback = "feedback"; + static const String content = "content"; static const String transcription = "transcription"; static const String botTranscription = 'bot_transcription'; diff --git a/lib/pangea/common/controllers/pangea_controller.dart b/lib/pangea/common/controllers/pangea_controller.dart index 677348ce8..4d75abbd5 100644 --- a/lib/pangea/common/controllers/pangea_controller.dart +++ b/lib/pangea/common/controllers/pangea_controller.dart @@ -114,9 +114,12 @@ class PangeaController { ); _settingsSubscription?.cancel(); - _settingsSubscription = userController.settingsUpdateStream.stream.listen( - (update) => matrixState.client.updateBotOptions(update.userSettings), - ); + _settingsSubscription = userController.settingsUpdateStream.stream.listen(( + update, + ) async { + await matrixState.client.updateBotOptions(update.userSettings); + await userController.updatePublicProfile(); + }); _joinSpaceSubscription?.cancel(); _joinSpaceSubscription ??= matrixState.client.onSync.stream @@ -161,8 +164,11 @@ class PangeaController { ]); } - _clearCache(exclude: exclude); - matrixState.client.updateBotOptions(userController.profile.userSettings); + await _clearCache(exclude: exclude); + await matrixState.client.updateBotOptions( + userController.profile.userSettings, + ); + await userController.updatePublicProfile(); } static final List _storageKeys = [ diff --git a/lib/pangea/common/models/base_request_model.dart b/lib/pangea/common/models/base_request_model.dart new file mode 100644 index 000000000..f3f48f75e --- /dev/null +++ b/lib/pangea/common/models/base_request_model.dart @@ -0,0 +1,46 @@ +import 'package:fluffychat/pangea/common/constants/model_keys.dart'; +import 'package:fluffychat/pangea/learning_settings/gender_enum.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +/// Base request schema matching the backend's BaseRequestSchema. +/// Common fields for all LLM-based requests. +mixin BaseRequestModel { + /// User's native language code (L1) + String get userL1; + + /// User's target language code (L2) + String get userL2; + + /// User's CEFR proficiency level (defaults to "pre_a1") + String get userCefr; + + /// Convert to JSON map with common fields + Map toBaseJson() => { + ModelKey.userL1: userL1, + ModelKey.userL2: userL2, + ModelKey.cefrLevel: userCefr, + ModelKey.userGender: MatrixState + .pangeaController + .userController + .profile + .userSettings + .gender + .string, + }; + + /// Injects user context (CEFR level, gender) into a request body. + /// Safely handles cases where MatrixState is not yet initialized. + /// Does not overwrite existing values. + static Map injectUserContext(Map body) { + final result = Map.from(body); + try { + final settings = + MatrixState.pangeaController.userController.profile.userSettings; + result[ModelKey.cefrLevel] ??= settings.cefrLevel.string; + result[ModelKey.userGender] ??= settings.gender.string; + } catch (_) { + // MatrixState not initialized - leave existing values or omit + } + return result; + } +} diff --git a/lib/pangea/common/models/llm_feedback_model.dart b/lib/pangea/common/models/llm_feedback_model.dart new file mode 100644 index 000000000..cd43942b3 --- /dev/null +++ b/lib/pangea/common/models/llm_feedback_model.dart @@ -0,0 +1,25 @@ +import 'package:fluffychat/pangea/common/constants/model_keys.dart'; + +/// Generic feedback schema matching the backend's LLMFeedbackSchema. +/// Used for providing user corrections to LLM-generated content. +class LLMFeedbackModel { + /// User's feedback text describing the issue + final String feedback; + + /// Original response that user is providing feedback on + final T content; + + /// Function to serialize the content to JSON + final Map Function(T) contentToJson; + + const LLMFeedbackModel({ + required this.feedback, + required this.content, + required this.contentToJson, + }); + + Map toJson() => { + ModelKey.feedback: feedback, + ModelKey.content: contentToJson(content), + }; +} diff --git a/lib/pangea/common/network/requests.dart b/lib/pangea/common/network/requests.dart index e68ff4bad..e0c6e0982 100644 --- a/lib/pangea/common/network/requests.dart +++ b/lib/pangea/common/network/requests.dart @@ -5,9 +5,7 @@ import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:sentry_flutter/sentry_flutter.dart'; -import 'package:fluffychat/pangea/common/constants/model_keys.dart'; -import 'package:fluffychat/pangea/learning_settings/gender_enum.dart'; -import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/pangea/common/models/base_request_model.dart'; class Requests { late String? accessToken; @@ -19,23 +17,10 @@ class Requests { required String url, required Map body, }) async { - body[ModelKey.cefrLevel] = MatrixState - .pangeaController - .userController - .profile - .userSettings - .cefrLevel - .string; - body[ModelKey.userGender] = MatrixState - .pangeaController - .userController - .profile - .userSettings - .gender - .string; + final enrichedBody = BaseRequestModel.injectUserContext(body); dynamic encoded; - encoded = jsonEncode(body); + encoded = jsonEncode(enrichedBody); final http.Response response = await http.post( Uri.parse(url), diff --git a/lib/pangea/common/network/urls.dart b/lib/pangea/common/network/urls.dart index a9b027e01..e8102bf55 100644 --- a/lib/pangea/common/network/urls.dart +++ b/lib/pangea/common/network/urls.dart @@ -29,7 +29,7 @@ class PApiUrls { static String languageDetection = "${PApiUrls._choreoEndpoint}/language_detection"; - static String igcLite = "${PApiUrls._choreoEndpoint}/grammar_lite"; + static String igcLite = "${PApiUrls._choreoEndpoint}/grammar_v2"; static String spanDetails = "${PApiUrls._choreoEndpoint}/span_details"; static String simpleTranslation = diff --git a/lib/pangea/common/utils/overlay.dart b/lib/pangea/common/utils/overlay.dart index 16e4e88f9..10d2fa6df 100644 --- a/lib/pangea/common/utils/overlay.dart +++ b/lib/pangea/common/utils/overlay.dart @@ -223,6 +223,7 @@ class OverlayUtil { Choreographer choreographer, BuildContext context, VoidCallback showNextMatch, + Future Function(String) onFeedbackSubmitted, ) { MatrixState.pAnyState.closeAllOverlays(); showPositionedCard( @@ -233,6 +234,7 @@ class OverlayUtil { match: match, choreographer: choreographer, showNextMatch: showNextMatch, + onFeedbackSubmitted: onFeedbackSubmitted, ), maxHeight: 325, maxWidth: 325, diff --git a/lib/pangea/common/widgets/shimmer_background.dart b/lib/pangea/common/widgets/shimmer_background.dart index e3f5b83c7..d1eb34a6f 100644 --- a/lib/pangea/common/widgets/shimmer_background.dart +++ b/lib/pangea/common/widgets/shimmer_background.dart @@ -1,55 +1,119 @@ import 'package:flutter/material.dart'; -import 'package:shimmer/shimmer.dart'; - import 'package:fluffychat/config/app_config.dart'; -class ShimmerBackground extends StatelessWidget { +class ShimmerBackground extends StatefulWidget { final Widget child; final Color shimmerColor; - final Color? baseColor; final bool enabled; final BorderRadius? borderRadius; + final Duration delayBetweenPulses; const ShimmerBackground({ super.key, required this.child, this.shimmerColor = AppConfig.goldLight, - this.baseColor, this.enabled = true, this.borderRadius, + this.delayBetweenPulses = Duration.zero, }); + @override + State createState() => _ShimmerBackgroundState(); +} + +class _ShimmerBackgroundState extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + late Animation _animation; + Duration pulseDuration = const Duration(milliseconds: 1000); + + @override + void initState() { + super.initState(); + _controller = AnimationController(duration: pulseDuration, vsync: this); + + _animation = Tween( + begin: 0.0, + end: 0.3, + ).animate(CurvedAnimation(parent: _controller, curve: Curves.easeInOut)); + + if (widget.enabled) { + _startPulsing(); + } + } + + void _startPulsing() { + if (widget.delayBetweenPulses == Duration.zero) { + _controller.repeat(reverse: true); + } else { + _pulseOnce(); + } + } + + void _pulseOnce() async { + await _controller.forward(); + await _controller.reverse(); + if (mounted && widget.enabled) { + await Future.delayed(widget.delayBetweenPulses); + if (mounted && widget.enabled) { + _pulseOnce(); + } + } + } + + @override + void didUpdateWidget(ShimmerBackground oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.enabled != oldWidget.enabled) { + if (widget.enabled) { + _startPulsing(); + } else { + _controller.stop(); + _controller.reset(); + } + } + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { - if (!enabled) { - return child; + if (!widget.enabled) { + return widget.child; } final borderRadius = - this.borderRadius ?? BorderRadius.circular(AppConfig.borderRadius); - return Stack( - children: [ - child, - Positioned.fill( - child: IgnorePointer( - child: ClipRRect( - borderRadius: borderRadius, - child: Shimmer.fromColors( - baseColor: baseColor ?? shimmerColor.withValues(alpha: 0.1), - highlightColor: shimmerColor.withValues(alpha: 0.6), - direction: ShimmerDirection.ltr, - child: Container( - decoration: BoxDecoration( - color: shimmerColor.withValues(alpha: 0.3), - borderRadius: borderRadius, + widget.borderRadius ?? BorderRadius.circular(AppConfig.borderRadius); + + return AnimatedBuilder( + animation: _animation, + builder: (context, child) { + return Stack( + children: [ + widget.child, + Positioned.fill( + child: IgnorePointer( + child: ClipRRect( + borderRadius: borderRadius, + child: Container( + decoration: BoxDecoration( + color: widget.shimmerColor.withValues( + alpha: _animation.value, + ), + borderRadius: borderRadius, + ), ), ), ), ), - ), - ), - ], + ], + ); + }, ); } } diff --git a/lib/pangea/learning_settings/country_picker_tile.dart b/lib/pangea/learning_settings/country_picker_tile.dart index 84ef86f1a..7eb08ce7e 100644 --- a/lib/pangea/learning_settings/country_picker_tile.dart +++ b/lib/pangea/learning_settings/country_picker_tile.dart @@ -70,7 +70,7 @@ class CountryPickerDropdownState extends State { ), ), ], - onChanged: widget.learningController.changeCountry, + onChanged: widget.learningController.setCountry, value: widget.learningController.country, dropdownSearchData: DropdownSearchData( searchController: _searchController, diff --git a/lib/pangea/learning_settings/settings_learning.dart b/lib/pangea/learning_settings/settings_learning.dart index 739f5514a..34521a6a2 100644 --- a/lib/pangea/learning_settings/settings_learning.dart +++ b/lib/pangea/learning_settings/settings_learning.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:developer'; import 'dart:io'; @@ -41,11 +42,14 @@ class SettingsLearningController extends State { String? languageMatchError; final ScrollController scrollController = ScrollController(); + final TextEditingController aboutTextController = TextEditingController(); + Timer? _textDebounce; @override void initState() { super.initState(); _profile = pangeaController.userController.profile.copy(); + aboutTextController.text = _profile.userSettings.about ?? ''; TtsController.setAvailableLanguages().then((_) => setState(() {})); } @@ -53,6 +57,8 @@ class SettingsLearningController extends State { void dispose() { TtsController.stop(); scrollController.dispose(); + aboutTextController.dispose(); + _textDebounce?.cancel(); super.dispose(); } @@ -175,11 +181,19 @@ class SettingsLearningController extends State { if (mounted) setState(() {}); } - void changeCountry(Country? country) { + void setCountry(Country? country) { _profile.userSettings.country = country?.name; if (mounted) setState(() {}); } + void setAbout(String about) { + _profile.userSettings.about = about; + _textDebounce?.cancel(); + _textDebounce = Timer(const Duration(milliseconds: 500), () { + if (mounted) setState(() {}); + }); + } + void updateToolSetting(ToolSetting toolSetting, bool value) { switch (toolSetting) { case ToolSetting.interactiveTranslator: @@ -335,6 +349,8 @@ class SettingsLearningController extends State { Country? get country => CountryService().findByName(_profile.userSettings.country); + String? get about => _profile.userSettings.about; + @override Widget build(BuildContext context) { return SettingsLearningView(this); diff --git a/lib/pangea/learning_settings/settings_learning_view.dart b/lib/pangea/learning_settings/settings_learning_view.dart index b665fac00..9a1f949e4 100644 --- a/lib/pangea/learning_settings/settings_learning_view.dart +++ b/lib/pangea/learning_settings/settings_learning_view.dart @@ -150,6 +150,16 @@ class SettingsLearningView extends StatelessWidget { initialGender: controller.gender, onChanged: controller.setGender, ), + TextField( + controller: controller.aboutTextController, + decoration: InputDecoration( + hintText: L10n.of(context).aboutMeHint, + ), + onChanged: (val) => + controller.setAbout(val), + minLines: 1, + maxLines: 3, + ), ], ), ), diff --git a/lib/pangea/lemmas/lemma_highlight_emoji_row.dart b/lib/pangea/lemmas/lemma_highlight_emoji_row.dart index fe49071ed..5378bf935 100644 --- a/lib/pangea/lemmas/lemma_highlight_emoji_row.dart +++ b/lib/pangea/lemmas/lemma_highlight_emoji_row.dart @@ -1,5 +1,3 @@ -import 'dart:async'; - import 'package:flutter/material.dart'; import 'package:shimmer/shimmer.dart'; @@ -136,49 +134,6 @@ class EmojiChoiceItem extends StatefulWidget { } class EmojiChoiceItemState extends State { - bool shimmer = false; - Timer? _shimmerTimer; - - @override - void initState() { - super.initState(); - _showShimmer(); - } - - @override - void didUpdateWidget(covariant EmojiChoiceItem oldWidget) { - super.didUpdateWidget(oldWidget); - if (oldWidget.emoji != widget.emoji) { - _showShimmer(); - } - } - - @override - void dispose() { - _shimmerTimer?.cancel(); - super.dispose(); - } - - void _showShimmer() { - if (!widget.showShimmer || !widget.enabled) return; - - setState(() => shimmer = true); - _shimmerTimer?.cancel(); - _shimmerTimer = Timer(const Duration(milliseconds: 1500), () { - if (mounted) { - setState(() => shimmer = false); - _repeatShimmer(); - } - }); - } - - void _repeatShimmer() { - _shimmerTimer?.cancel(); - _shimmerTimer = Timer(const Duration(seconds: 5), () { - if (mounted) _showShimmer(); - }); - } - @override Widget build(BuildContext context) { return HoverBuilder( @@ -191,11 +146,8 @@ class EmojiChoiceItemState extends State { child: Stack( children: [ ShimmerBackground( - enabled: shimmer, - shimmerColor: (Theme.of(context).brightness == Brightness.dark) - ? Colors.white - : Theme.of(context).colorScheme.primary, - baseColor: Colors.transparent, + enabled: widget.showShimmer && widget.enabled, + delayBetweenPulses: const Duration(seconds: 5), child: CompositedTransformTarget( link: MatrixState.pAnyState .layerLinkAndKey(widget.transformTargetId) diff --git a/lib/pangea/practice_activities/activity_type_enum.dart b/lib/pangea/practice_activities/activity_type_enum.dart index 366a8fb9d..38724d88d 100644 --- a/lib/pangea/practice_activities/activity_type_enum.dart +++ b/lib/pangea/practice_activities/activity_type_enum.dart @@ -234,7 +234,7 @@ enum ActivityTypeEnum { static List get _vocabPracticeTypes => [ ActivityTypeEnum.lemmaMeaning, - // ActivityTypeEnum.lemmaAudio, + ActivityTypeEnum.lemmaAudio, ]; static List get _grammarPracticeTypes => [ diff --git a/lib/pangea/practice_activities/lemma_activity_generator.dart b/lib/pangea/practice_activities/lemma_activity_generator.dart index a42322e04..291462ea5 100644 --- a/lib/pangea/practice_activities/lemma_activity_generator.dart +++ b/lib/pangea/practice_activities/lemma_activity_generator.dart @@ -31,8 +31,9 @@ class LemmaActivityGenerator { } static Future> lemmaActivityDistractors( - PangeaToken token, - ) async { + PangeaToken token, { + int? maxChoices = 4, + }) async { final constructs = await MatrixState .pangeaController .matrixState @@ -53,13 +54,13 @@ class LemmaActivityGenerator { // Skip the first 7 lemmas (to avoid very similar and conjugated forms of verbs) if we have enough lemmas final int startIndex = sortedLemmas.length > 11 ? 7 : 0; - // Take up to 4 lemmas ensuring uniqueness by lemma text + // Take up to 4 (or maxChoices) lemmas ensuring uniqueness by lemma text final List uniqueByLemma = []; for (int i = startIndex; i < sortedLemmas.length; i++) { final cid = sortedLemmas[i]; if (!uniqueByLemma.any((c) => c.lemma == cid.lemma)) { uniqueByLemma.add(cid); - if (uniqueByLemma.length == 4) break; + if (uniqueByLemma.length == maxChoices) break; } } diff --git a/lib/pangea/practice_activities/message_activity_request.dart b/lib/pangea/practice_activities/message_activity_request.dart index 4657b364a..0fe576a90 100644 --- a/lib/pangea/practice_activities/message_activity_request.dart +++ b/lib/pangea/practice_activities/message_activity_request.dart @@ -80,7 +80,8 @@ class MessageActivityRequest { final PracticeTarget target; final ActivityQualityFeedback? activityQualityFeedback; final GrammarErrorRequestInfo? grammarErrorInfo; - final MorphExampleInfo? morphExampleInfo; + final ExampleMessageInfo? exampleMessage; + final AudioExampleMessage? audioExampleMessage; MessageActivityRequest({ required this.userL1, @@ -88,7 +89,8 @@ class MessageActivityRequest { required this.activityQualityFeedback, required this.target, this.grammarErrorInfo, - this.morphExampleInfo, + this.exampleMessage, + this.audioExampleMessage, }) { if (target.tokens.isEmpty) { throw Exception('Target tokens must not be empty'); diff --git a/lib/pangea/practice_activities/practice_activity_model.dart b/lib/pangea/practice_activities/practice_activity_model.dart index f185c6760..29dc56791 100644 --- a/lib/pangea/practice_activities/practice_activity_model.dart +++ b/lib/pangea/practice_activities/practice_activity_model.dart @@ -103,9 +103,9 @@ sealed class PracticeActivityModel { tokens: tokens, morphFeature: morph!, multipleChoiceContent: multipleChoiceContent!, - morphExampleInfo: json['morph_example_info'] != null - ? MorphExampleInfo.fromJson(json['morph_example_info']) - : const MorphExampleInfo(exampleMessage: []), + exampleMessageInfo: json['example_message_info'] != null + ? ExampleMessageInfo.fromJson(json['example_message_info']) + : const ExampleMessageInfo(exampleMessage: []), ); case ActivityTypeEnum.lemmaAudio: assert( @@ -116,6 +116,11 @@ sealed class PracticeActivityModel { langCode: langCode, tokens: tokens, multipleChoiceContent: multipleChoiceContent!, + roomId: json['room_id'] as String?, + eventId: json['event_id'] as String?, + exampleMessage: json['example_message'] != null + ? ExampleMessageInfo.fromJson(json['example_message']) + : const ExampleMessageInfo(exampleMessage: []), ); case ActivityTypeEnum.lemmaMeaning: assert( @@ -292,13 +297,13 @@ sealed class MorphPracticeActivityModel } class MorphCategoryPracticeActivityModel extends MorphPracticeActivityModel { - final MorphExampleInfo morphExampleInfo; + final ExampleMessageInfo exampleMessageInfo; MorphCategoryPracticeActivityModel({ required super.tokens, required super.langCode, required super.morphFeature, required super.multipleChoiceContent, - required this.morphExampleInfo, + required this.exampleMessageInfo, }); @override @@ -324,7 +329,7 @@ class MorphCategoryPracticeActivityModel extends MorphPracticeActivityModel { @override Map toJson() { final json = super.toJson(); - json['morph_example_info'] = morphExampleInfo.toJson(); + json['example_message_info'] = exampleMessageInfo.toJson(); return json; } } @@ -340,11 +345,27 @@ class MorphMatchPracticeActivityModel extends MorphPracticeActivityModel { class VocabAudioPracticeActivityModel extends MultipleChoicePracticeActivityModel { + final String? roomId; + final String? eventId; + final ExampleMessageInfo exampleMessage; + VocabAudioPracticeActivityModel({ required super.tokens, required super.langCode, required super.multipleChoiceContent, + this.roomId, + this.eventId, + required this.exampleMessage, }); + + @override + Map toJson() { + final json = super.toJson(); + json['room_id'] = roomId; + json['event_id'] = eventId; + json['example_message'] = exampleMessage.toJson(); + return json; + } } class VocabMeaningPracticeActivityModel diff --git a/lib/pangea/toolbar/message_practice/practice_controller.dart b/lib/pangea/toolbar/message_practice/practice_controller.dart index 1cdef8ae7..03d3af822 100644 --- a/lib/pangea/toolbar/message_practice/practice_controller.dart +++ b/lib/pangea/toolbar/message_practice/practice_controller.dart @@ -16,6 +16,7 @@ import 'package:fluffychat/pangea/practice_activities/practice_generation_repo.d import 'package:fluffychat/pangea/practice_activities/practice_selection.dart'; import 'package:fluffychat/pangea/practice_activities/practice_selection_repo.dart'; import 'package:fluffychat/pangea/practice_activities/practice_target.dart'; +import 'package:fluffychat/pangea/text_to_speech/tts_controller.dart'; import 'package:fluffychat/pangea/toolbar/message_practice/message_practice_mode_enum.dart'; import 'package:fluffychat/pangea/toolbar/message_practice/morph_selection.dart'; import 'package:fluffychat/pangea/toolbar/message_practice/practice_record_controller.dart'; @@ -220,6 +221,14 @@ class PracticeController with ChangeNotifier { } } + if (_activity is LemmaMeaningPracticeActivityModel || + _activity is EmojiPracticeActivityModel) { + TtsController.tryToSpeak( + token.text.content, + langCode: MatrixState.pangeaController.userController.userL2!.langCode, + ); + } + notifyListeners(); } } diff --git a/lib/pangea/toolbar/message_selection_overlay.dart b/lib/pangea/toolbar/message_selection_overlay.dart index 84254d64e..fc0e2a242 100644 --- a/lib/pangea/toolbar/message_selection_overlay.dart +++ b/lib/pangea/toolbar/message_selection_overlay.dart @@ -220,6 +220,8 @@ class MessageOverlayController extends State "word-zoom-card-${token.text.uniqueKey}", token, Matrix.of(context).analyticsDataService, + roomId: event.room.id, + eventId: event.eventId, ).then((_) { if (mounted) setState(() {}); }); diff --git a/lib/pangea/user/about_me_display.dart b/lib/pangea/user/about_me_display.dart new file mode 100644 index 000000000..f35d34d68 --- /dev/null +++ b/lib/pangea/user/about_me_display.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/widgets/matrix.dart'; + +class AboutMeDisplay extends StatelessWidget { + final String userId; + final double maxWidth; + final double textSize; + + const AboutMeDisplay({ + super.key, + required this.userId, + this.maxWidth = 200, + this.textSize = 12, + }); + + @override + Widget build(BuildContext context) { + return ConstrainedBox( + constraints: BoxConstraints(maxWidth: maxWidth), + child: FutureBuilder( + future: MatrixState.pangeaController.userController.getPublicProfile( + userId, + ), + builder: (context, snapshot) => snapshot.data?.about == null + ? const SizedBox.shrink() + : Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Text( + snapshot.data!.about!, + style: TextStyle(fontSize: textSize), + maxLines: 3, + overflow: TextOverflow.ellipsis, + ), + ), + ), + ); + } +} diff --git a/lib/pangea/user/public_profile_model.dart b/lib/pangea/user/public_profile_model.dart new file mode 100644 index 000000000..66d3e17ba --- /dev/null +++ b/lib/pangea/user/public_profile_model.dart @@ -0,0 +1,57 @@ +import 'package:country_picker/country_picker.dart'; + +import 'package:fluffychat/pangea/events/constants/pangea_event_types.dart'; +import 'package:fluffychat/pangea/user/analytics_profile_model.dart'; + +class PublicProfileModel { + final AnalyticsProfileModel analytics; + final String? country; + final String? about; + + const PublicProfileModel({required this.analytics, this.country, this.about}); + + String? get countryEmoji => + country != null ? CountryService().findByName(country!)?.flagEmoji : null; + + Map toJson() { + final json = analytics.toJson(); + + if (country != null) { + json['country'] = country; + } + + if (about != null) { + json['about'] = about; + } + + return json; + } + + factory PublicProfileModel.fromJson(Map json) { + final analytics = AnalyticsProfileModel.fromJson(json); + + final profileJson = + json[PangeaEventTypes.profileAnalytics] as Map?; + + final String? country = profileJson != null ? profileJson['country'] : null; + final String? about = profileJson != null ? profileJson['about'] : null; + + return PublicProfileModel( + analytics: analytics, + country: country, + about: about, + ); + } + + PublicProfileModel copyWith({ + AnalyticsProfileModel? analytics, + String? country, + String? about, + }) { + return PublicProfileModel( + analytics: analytics ?? this.analytics, + country: country ?? this.country, + about: about ?? this.about, + ); + } +} diff --git a/lib/pangea/user/user_controller.dart b/lib/pangea/user/user_controller.dart index ff3cc0d8e..668aa06a6 100644 --- a/lib/pangea/user/user_controller.dart +++ b/lib/pangea/user/user_controller.dart @@ -15,6 +15,7 @@ import 'package:fluffychat/pangea/languages/language_service.dart'; import 'package:fluffychat/pangea/languages/p_language_store.dart'; import 'package:fluffychat/pangea/learning_settings/tool_settings_enum.dart'; import 'package:fluffychat/pangea/user/analytics_profile_model.dart'; +import 'package:fluffychat/pangea/user/public_profile_model.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'user_model.dart'; @@ -43,7 +44,7 @@ class UserController { /// to be read in from client's account data each time it is accessed. Profile? _cachedProfile; - AnalyticsProfileModel? analyticsProfile; + PublicProfileModel? publicProfile; /// Listens for account updates and updates the cached profile StreamSubscription? _profileListener; @@ -170,19 +171,19 @@ class UserController { if (client.userID == null) return; try { final resp = await client.getUserProfile(client.userID!); - analyticsProfile = AnalyticsProfileModel.fromJson( - resp.additionalProperties, - ); + publicProfile = PublicProfileModel.fromJson(resp.additionalProperties); } catch (e) { // getting a 404 error for some users without pre-existing profile // still want to set other properties, so catch this error - analyticsProfile = AnalyticsProfileModel(); + publicProfile = PublicProfileModel(analytics: AnalyticsProfileModel()); } + await updatePublicProfile(); + // Do not await. This function pulls level from analytics, // so it waits for analytics to finish initializing. Analytics waits for user controller to // finish initializing, so this would cause a deadlock. - if (analyticsProfile!.isEmpty) { + if (publicProfile!.analytics.isEmpty) { final analyticsService = MatrixState.pangeaController.matrixState.analyticsDataService; @@ -265,7 +266,17 @@ class UserController { Future _savePublicProfileUpdate( String type, Map content, - ) async => client.setUserProfile(client.userID!, type, content); + ) async { + try { + await client.setUserProfile(client.userID!, type, content); + } catch (e, s) { + ErrorHandler.logError( + e: e, + s: s, + data: {'type': type, 'content': content}, + ); + } + } Future updateAnalyticsProfile({ required int level, @@ -274,69 +285,98 @@ class UserController { }) async { targetLanguage ??= userL2; baseLanguage ??= userL1; - if (targetLanguage == null || analyticsProfile == null) return; + if (targetLanguage == null || publicProfile == null) return; final analyticsRoom = client.analyticsRoomLocal(targetLanguage); - if (analyticsProfile!.targetLanguage == targetLanguage && - analyticsProfile!.baseLanguage == baseLanguage && - analyticsProfile!.languageAnalytics?[targetLanguage]?.level == level && - analyticsProfile!.analyticsRoomIdByLanguage(targetLanguage) == + if (publicProfile!.analytics.targetLanguage == targetLanguage && + publicProfile!.analytics.baseLanguage == baseLanguage && + publicProfile!.analytics.languageAnalytics?[targetLanguage]?.level == + level && + publicProfile!.analytics.analyticsRoomIdByLanguage(targetLanguage) == analyticsRoom?.id) { return; } - analyticsProfile!.baseLanguage = baseLanguage; - analyticsProfile!.targetLanguage = targetLanguage; - analyticsProfile!.setLanguageInfo(targetLanguage, level, analyticsRoom?.id); + publicProfile!.analytics.baseLanguage = baseLanguage; + publicProfile!.analytics.targetLanguage = targetLanguage; + publicProfile!.analytics.setLanguageInfo( + targetLanguage, + level, + analyticsRoom?.id, + ); + await _savePublicProfileUpdate( PangeaEventTypes.profileAnalytics, - analyticsProfile!.toJson(), + publicProfile!.toJson(), ); } Future _addAnalyticsRoomIdsToPublicProfile() async { - if (analyticsProfile?.languageAnalytics == null) return; + if (publicProfile?.analytics.languageAnalytics == null) return; final analyticsRooms = client.allMyAnalyticsRooms; if (analyticsRooms.isEmpty) return; for (final analyticsRoom in analyticsRooms) { final lang = analyticsRoom.madeForLang?.split("-").first; - if (lang == null || analyticsProfile?.languageAnalytics == null) continue; - final langKey = analyticsProfile!.languageAnalytics!.keys + if (lang == null || publicProfile?.analytics.languageAnalytics == null) { + continue; + } + final langKey = publicProfile!.analytics.languageAnalytics!.keys .firstWhereOrNull((l) => l.langCodeShort == lang); if (langKey == null) continue; - if (analyticsProfile!.languageAnalytics![langKey]!.analyticsRoomId == + if (publicProfile! + .analytics + .languageAnalytics![langKey]! + .analyticsRoomId == analyticsRoom.id) { continue; } - analyticsProfile!.setLanguageInfo( + publicProfile!.analytics.setLanguageInfo( langKey, - analyticsProfile!.languageAnalytics![langKey]!.level, + publicProfile!.analytics.languageAnalytics![langKey]!.level, analyticsRoom.id, ); } await _savePublicProfileUpdate( PangeaEventTypes.profileAnalytics, - analyticsProfile!.toJson(), + publicProfile!.toJson(), ); } Future addXPOffset(int offset) async { final targetLanguage = userL2; - if (targetLanguage == null || analyticsProfile == null) return; + if (targetLanguage == null || publicProfile == null) return; - analyticsProfile!.addXPOffset( + publicProfile!.analytics.addXPOffset( targetLanguage, offset, client.analyticsRoomLocal(targetLanguage)?.id, ); await _savePublicProfileUpdate( PangeaEventTypes.profileAnalytics, - analyticsProfile!.toJson(), + publicProfile!.toJson(), + ); + } + + Future updatePublicProfile() async { + if (publicProfile == null || + (publicProfile!.country == profile.userSettings.country && + publicProfile!.about == profile.userSettings.about)) { + return; + } + + publicProfile = publicProfile!.copyWith( + country: profile.userSettings.country, + about: profile.userSettings.about, + ); + + await _savePublicProfileUpdate( + PangeaEventTypes.profileAnalytics, + publicProfile!.toJson(), ); } @@ -354,6 +394,20 @@ class UserController { } } + Future getPublicProfile(String userId) async { + try { + if (userId == BotName.byEnvironment) { + return PublicProfileModel(analytics: AnalyticsProfileModel()); + } + + final resp = await client.getUserProfile(userId); + return PublicProfileModel.fromJson(resp.additionalProperties); + } catch (e, s) { + ErrorHandler.logError(e: e, s: s, data: {userId: userId}); + return null; + } + } + bool isToolEnabled(ToolSetting setting) { return userToolSetting(setting); } diff --git a/lib/pangea/user/user_model.dart b/lib/pangea/user/user_model.dart index 05e21210b..19c312c83 100644 --- a/lib/pangea/user/user_model.dart +++ b/lib/pangea/user/user_model.dart @@ -18,6 +18,7 @@ class UserSettings { String? sourceLanguage; GenderEnum gender; String? country; + String? about; LanguageLevelTypeEnum cefrLevel; String? voice; @@ -29,6 +30,7 @@ class UserSettings { this.sourceLanguage, this.gender = GenderEnum.unselected, this.country, + this.about, this.cefrLevel = LanguageLevelTypeEnum.a1, this.voice, }); @@ -47,6 +49,7 @@ class UserSettings { ? GenderEnumExtension.fromString(json[ModelKey.userGender]) : GenderEnum.unselected, country: json[ModelKey.userCountry], + about: json[ModelKey.userAbout], cefrLevel: json[ModelKey.cefrLevel] is String ? LanguageLevelTypeEnum.fromString(json[ModelKey.cefrLevel]) : LanguageLevelTypeEnum.a1, @@ -62,6 +65,7 @@ class UserSettings { data[ModelKey.sourceLanguage] = sourceLanguage; data[ModelKey.userGender] = gender.string; data[ModelKey.userCountry] = country; + data[ModelKey.userAbout] = about; data[ModelKey.cefrLevel] = cefrLevel.string; data[ModelKey.voice] = voice; return data; @@ -126,6 +130,7 @@ class UserSettings { sourceLanguage: sourceLanguage, gender: gender, country: country, + about: about, cefrLevel: cefrLevel, voice: voice, ); @@ -143,6 +148,7 @@ class UserSettings { other.sourceLanguage == sourceLanguage && other.gender == gender && other.country == country && + other.about == about && other.cefrLevel == cefrLevel && other.voice == voice; } @@ -156,6 +162,7 @@ class UserSettings { sourceLanguage.hashCode, gender.hashCode, country.hashCode, + about.hashCode, cefrLevel.hashCode, voice.hashCode, ]); diff --git a/lib/widgets/adaptive_dialogs/user_dialog.dart b/lib/widgets/adaptive_dialogs/user_dialog.dart index 8f8cb753a..ec347dc02 100644 --- a/lib/widgets/adaptive_dialogs/user_dialog.dart +++ b/lib/widgets/adaptive_dialogs/user_dialog.dart @@ -7,6 +7,7 @@ import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pangea/analytics_misc/level_display_name.dart'; +import 'package:fluffychat/pangea/user/about_me_display.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; import 'package:fluffychat/widgets/avatar.dart'; @@ -163,9 +164,11 @@ class UserDialog extends StatelessWidget { // ), Padding( padding: const EdgeInsets.all(4.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [LevelDisplayName(userId: profile.userId)], + child: Column( + children: [ + LevelDisplayName(userId: profile.userId), + AboutMeDisplay(userId: profile.userId), + ], ), ), // Pangea# diff --git a/lib/widgets/member_actions_popup_menu_button.dart b/lib/widgets/member_actions_popup_menu_button.dart index 0a30f6371..57058c2f2 100644 --- a/lib/widgets/member_actions_popup_menu_button.dart +++ b/lib/widgets/member_actions_popup_menu_button.dart @@ -8,6 +8,7 @@ import 'package:fluffychat/pangea/analytics_misc/level_display_name.dart'; import 'package:fluffychat/pangea/bot/utils/bot_name.dart'; import 'package:fluffychat/pangea/bot/widgets/bot_chat_settings_dialog.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; +import 'package:fluffychat/pangea/user/about_me_display.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/permission_slider_dialog.dart'; import 'adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; @@ -58,51 +59,59 @@ void showMemberActionsPopupMenu({ items: >[ PopupMenuItem( value: _MemberActions.info, - child: Row( - // Pangea# - spacing: 12.0, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Avatar( - name: displayname, - mxContent: user.avatarUrl, - presenceUserId: user.id, - presenceBackgroundColor: theme.colorScheme.surfaceContainer, - ), - Column( - mainAxisSize: .min, - crossAxisAlignment: .start, + Row( + // Pangea# + spacing: 12.0, children: [ - ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 128), - child: Text( - displayname, - textAlign: TextAlign.center, - style: theme.textTheme.labelLarge, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), + Avatar( + name: displayname, + mxContent: user.avatarUrl, + presenceUserId: user.id, + presenceBackgroundColor: theme.colorScheme.surfaceContainer, ), - ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 128), - child: Text( - user.id, - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 10), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 128), + child: Text( + displayname, + textAlign: TextAlign.center, + style: theme.textTheme.labelLarge, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 128), + child: Text( + user.id, + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 10), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + // #Pangea + Padding( + padding: const EdgeInsets.all(4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [LevelDisplayName(userId: user.id)], + ), + ), + // Pangea# + ], ), - // #Pangea - Padding( - padding: const EdgeInsets.all(4.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [LevelDisplayName(userId: user.id)], - ), - ), - // Pangea# ], ), + // #Pangea + AboutMeDisplay(userId: user.id), + // Pangea# ], ), ), diff --git a/pubspec.yaml b/pubspec.yaml index be4f9e7a3..188e91b74 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,7 +6,7 @@ description: Learn a language while texting your friends. # Pangea# publish_to: none # On version bump also increase the build number for F-Droid -version: 4.1.16+6 +version: 4.1.17+7 environment: sdk: ">=3.10.0 <4.0.0" diff --git a/test/pangea/igc_response_model_test.dart b/test/pangea/igc_response_model_test.dart new file mode 100644 index 000000000..d26e40151 --- /dev/null +++ b/test/pangea/igc_response_model_test.dart @@ -0,0 +1,246 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:fluffychat/pangea/choreographer/igc/igc_response_model.dart'; + +void main() { + group('IGCResponseModel.fromJson', () { + test('passes originalInput to matches as fullText fallback', () { + final Map jsonData = { + 'original_input': 'I want to know the United States', + 'full_text_correction': null, + 'matches': [ + { + 'match': { + 'message': 'Grammar error', + 'short_message': 'grammar', + 'choices': [ + {'value': 'learn about', 'type': 'bestCorrection'}, + ], + 'offset': 10, + 'length': 4, + // Note: no full_text in match - should use original_input + 'type': 'grammar', + }, + 'status': 'open', + }, + ], + 'user_l1': 'en', + 'user_l2': 'es', + 'enable_it': true, + 'enable_igc': true, + }; + + final IGCResponseModel response = IGCResponseModel.fromJson(jsonData); + + expect(response.matches.length, 1); + expect( + response.matches[0].match.fullText, + 'I want to know the United States', + ); + }); + + test('match full_text takes precedence over originalInput', () { + final Map jsonData = { + 'original_input': 'Original input text', + 'full_text_correction': null, + 'matches': [ + { + 'match': { + 'message': 'Grammar error', + 'short_message': 'grammar', + 'choices': [ + {'value': 'correction', 'type': 'bestCorrection'}, + ], + 'offset': 0, + 'length': 5, + 'full_text': 'Full text from span', // This should take precedence + 'type': 'grammar', + }, + 'status': 'open', + }, + ], + 'user_l1': 'en', + 'user_l2': 'es', + 'enable_it': true, + 'enable_igc': true, + }; + + final IGCResponseModel response = IGCResponseModel.fromJson(jsonData); + + expect(response.matches.length, 1); + expect(response.matches[0].match.fullText, 'Full text from span'); + }); + + test('handles empty matches array', () { + final Map jsonData = { + 'original_input': 'Clean text with no errors', + 'full_text_correction': null, + 'matches': [], + 'user_l1': 'en', + 'user_l2': 'es', + 'enable_it': true, + 'enable_igc': true, + }; + + final IGCResponseModel response = IGCResponseModel.fromJson(jsonData); + + expect(response.matches.length, 0); + expect(response.originalInput, 'Clean text with no errors'); + }); + + test('handles null matches', () { + final Map jsonData = { + 'original_input': 'Text', + 'full_text_correction': null, + 'matches': null, + 'user_l1': 'en', + 'user_l2': 'es', + 'enable_it': true, + 'enable_igc': true, + }; + + final IGCResponseModel response = IGCResponseModel.fromJson(jsonData); + + expect(response.matches.length, 0); + }); + }); + + group('IGCResponseModel V2 format compatibility', () { + test('parses V2 response without enable_it and enable_igc', () { + // V2 response format from /choreo/grammar_v2 endpoint + final Map jsonData = { + 'original_input': 'Me gusta el café', + 'matches': [ + { + // V2 format: flat SpanData, no "match" wrapper + 'choices': [ + { + 'value': 'Me encanta', + 'type': 'bestCorrection', + 'feedback': 'Use "encantar" for expressing love', + }, + ], + 'offset': 0, + 'length': 8, + 'type': 'vocabulary', + }, + ], + 'user_l1': 'en', + 'user_l2': 'es', + // Note: no enable_it, enable_igc in V2 response + }; + + final IGCResponseModel response = IGCResponseModel.fromJson(jsonData); + + expect(response.originalInput, 'Me gusta el café'); + expect(response.userL1, 'en'); + expect(response.userL2, 'es'); + // Should default to true when not present + expect(response.enableIT, true); + expect(response.enableIGC, true); + expect(response.matches.length, 1); + expect(response.matches[0].match.offset, 0); + expect(response.matches[0].match.length, 8); + }); + + test('parses V2 response with empty matches', () { + final Map jsonData = { + 'original_input': 'Perfect sentence with no errors', + 'matches': [], + 'user_l1': 'en', + 'user_l2': 'fr', + }; + + final IGCResponseModel response = IGCResponseModel.fromJson(jsonData); + + expect(response.matches.length, 0); + expect(response.enableIT, true); + expect(response.enableIGC, true); + expect(response.fullTextCorrection, isNull); + }); + + test('parses V2 response with multiple matches', () { + final Map jsonData = { + 'original_input': 'Yo soy ir a la tienda', + 'matches': [ + { + 'choices': [ + { + 'value': 'voy', + 'type': 'bestCorrection', + 'feedback': 'Use conjugated form', + }, + ], + 'offset': 7, + 'length': 2, + 'type': 'grammar', + }, + { + 'choices': [ + {'value': 'Voy', 'type': 'bestCorrection'}, + ], + 'offset': 0, + 'length': 6, + 'type': 'grammar', + }, + ], + 'user_l1': 'en', + 'user_l2': 'es', + }; + + final IGCResponseModel response = IGCResponseModel.fromJson(jsonData); + + expect(response.matches.length, 2); + expect(response.matches[0].match.offset, 7); + expect(response.matches[1].match.offset, 0); + }); + + test('V1 format with explicit enable_it=false still works', () { + final Map jsonData = { + 'original_input': 'Test text', + 'full_text_correction': 'Corrected text', + 'matches': [], + 'user_l1': 'en', + 'user_l2': 'es', + 'enable_it': false, + 'enable_igc': false, + }; + + final IGCResponseModel response = IGCResponseModel.fromJson(jsonData); + + expect(response.enableIT, false); + expect(response.enableIGC, false); + expect(response.fullTextCorrection, 'Corrected text'); + }); + + test('V2 response choice includes feedback field', () { + final Map jsonData = { + 'original_input': 'Je suis alle', + 'matches': [ + { + 'choices': [ + { + 'value': 'allé', + 'type': 'bestCorrection', + 'feedback': 'Add accent to past participle', + }, + ], + 'offset': 8, + 'length': 4, + 'type': 'diacritics', + }, + ], + 'user_l1': 'en', + 'user_l2': 'fr', + }; + + final IGCResponseModel response = IGCResponseModel.fromJson(jsonData); + + expect(response.matches.length, 1); + expect( + response.matches[0].match.bestChoice?.feedback, + 'Add accent to past participle', + ); + }); + }); +} diff --git a/test/pangea/pangea_match_model_test.dart b/test/pangea/pangea_match_model_test.dart new file mode 100644 index 000000000..73783dcd8 --- /dev/null +++ b/test/pangea/pangea_match_model_test.dart @@ -0,0 +1,179 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:fluffychat/pangea/choreographer/igc/pangea_match_model.dart'; +import 'package:fluffychat/pangea/choreographer/igc/pangea_match_status_enum.dart'; + +void main() { + group('PangeaMatch.fromJson', () { + group('V1 format (wrapped with match key)', () { + test('parses match wrapper correctly', () { + final Map jsonData = { + 'match': { + 'message': 'Grammar error', + 'short_message': 'grammar', + 'choices': [ + {'value': 'correction', 'type': 'bestCorrection'}, + ], + 'offset': 10, + 'length': 4, + 'full_text': 'Some full text', + 'type': 'grammar', + }, + 'status': 'open', + }; + + final PangeaMatch match = PangeaMatch.fromJson(jsonData); + + expect(match.match.offset, 10); + expect(match.match.length, 4); + expect(match.match.fullText, 'Some full text'); + expect(match.status, PangeaMatchStatusEnum.open); + }); + + test('uses parentFullText as fallback when no full_text in match', () { + final Map jsonData = { + 'match': { + 'message': 'Error', + 'choices': [ + {'value': 'fix', 'type': 'bestCorrection'}, + ], + 'offset': 5, + 'length': 3, + 'type': 'grammar', + }, + 'status': 'open', + }; + + final PangeaMatch match = PangeaMatch.fromJson( + jsonData, + fullText: 'Parent original input', + ); + + expect(match.match.fullText, 'Parent original input'); + }); + + test('parses status from V1 format', () { + final Map jsonData = { + 'match': { + 'message': 'Error', + 'choices': [], + 'offset': 0, + 'length': 1, + 'type': 'grammar', + }, + 'status': 'accepted', + }; + + final PangeaMatch match = PangeaMatch.fromJson(jsonData); + + expect(match.status, PangeaMatchStatusEnum.accepted); + }); + }); + + group('V2 format (flat SpanData)', () { + test('parses flat SpanData correctly', () { + final Map jsonData = { + 'message': 'Grammar error', + 'short_message': 'grammar', + 'choices': [ + {'value': 'correction', 'type': 'bestCorrection'}, + ], + 'offset': 10, + 'length': 4, + 'type': 'grammar', + }; + + final PangeaMatch match = PangeaMatch.fromJson(jsonData); + + expect(match.match.offset, 10); + expect(match.match.length, 4); + expect(match.match.message, 'Grammar error'); + // V2 format always defaults to open status + expect(match.status, PangeaMatchStatusEnum.open); + }); + + test('uses parentFullText when provided', () { + final Map jsonData = { + 'message': 'Error', + 'choices': [ + {'value': 'fix', 'type': 'bestCorrection'}, + ], + 'offset': 5, + 'length': 3, + 'type': 'vocabulary', + }; + + final PangeaMatch match = PangeaMatch.fromJson( + jsonData, + fullText: 'The original input text', + ); + + expect(match.match.fullText, 'The original input text'); + }); + + test('parses type as string in V2 format', () { + final Map jsonData = { + 'message': 'Out of target', + 'choices': [], + 'offset': 0, + 'length': 5, + 'type': 'itStart', // String type in V2 + }; + + final PangeaMatch match = PangeaMatch.fromJson(jsonData); + + expect(match.isITStart, true); + }); + + test('handles V2 format with string type grammar', () { + final Map jsonData = { + 'message': 'Tense error', + 'choices': [ + {'value': 'went', 'type': 'bestCorrection'}, + ], + 'offset': 2, + 'length': 4, + 'type': 'grammar', // String type in V2 + }; + + final PangeaMatch match = PangeaMatch.fromJson(jsonData); + + expect(match.isGrammarMatch, true); + expect(match.isITStart, false); + }); + }); + + group('backward compatibility', () { + test('V1 format with type as object still works', () { + final Map jsonData = { + 'match': { + 'message': 'Error', + 'choices': [], + 'offset': 0, + 'length': 1, + 'type': {'type_name': 'grammar'}, // Old object format + }, + 'status': 'open', + }; + + final PangeaMatch match = PangeaMatch.fromJson(jsonData); + + expect(match.isGrammarMatch, true); + }); + + test('V2 format with type as string works', () { + final Map jsonData = { + 'message': 'Error', + 'choices': [], + 'offset': 0, + 'length': 1, + 'type': 'grammar', // New string format + }; + + final PangeaMatch match = PangeaMatch.fromJson(jsonData); + + expect(match.isGrammarMatch, true); + }); + }); + }); +} diff --git a/test/pangea/span_data_model_test.dart b/test/pangea/span_data_model_test.dart new file mode 100644 index 000000000..3e3cc1e24 --- /dev/null +++ b/test/pangea/span_data_model_test.dart @@ -0,0 +1,180 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:fluffychat/pangea/choreographer/igc/replacement_type_enum.dart'; +import 'package:fluffychat/pangea/choreographer/igc/span_data_model.dart'; + +void main() { + test( + 'SpanData.fromJson handles legacy correction type (maps to grammar)', + () { + final Map legacyJson = { + 'message': null, + 'short_message': null, + 'choices': [], + 'offset': 0, + 'length': 4, + 'full_text': 'Test', + 'type': {'type_name': 'correction'}, + }; + + expect(() => SpanData.fromJson(legacyJson), returnsNormally); + final SpanData span = SpanData.fromJson(legacyJson); + // 'correction' is mapped to 'grammar' for backward compatibility + expect(span.type, ReplacementTypeEnum.subjectVerbAgreement); + }, + ); + + test('SpanData.fromJson handles legacy typeName object', () { + final Map legacyJson = { + 'message': null, + 'short_message': null, + 'choices': [], + 'offset': 0, + 'length': 4, + 'full_text': 'Test', + 'type': {'typeName': 'itStart'}, + }; + + expect(() => SpanData.fromJson(legacyJson), returnsNormally); + final SpanData span = SpanData.fromJson(legacyJson); + expect(span.type, ReplacementTypeEnum.itStart); + }); + + test('SpanData.fromJson handles did_you_mean string', () { + final Map jsonData = { + 'message': null, + 'short_message': null, + 'choices': [], + 'offset': 0, + 'length': 4, + 'full_text': 'Test', + 'type': 'did_you_mean', + }; + + expect(() => SpanData.fromJson(jsonData), returnsNormally); + final SpanData span = SpanData.fromJson(jsonData); + expect(span.type, ReplacementTypeEnum.didYouMean); + }); + + test( + 'SpanData.fromJson handles legacy vocabulary type (maps to wordChoice)', + () { + final Map legacyJson = { + 'message': null, + 'short_message': null, + 'choices': [], + 'offset': 0, + 'length': 4, + 'full_text': 'Test', + 'type': 'vocabulary', + }; + + expect(() => SpanData.fromJson(legacyJson), returnsNormally); + final SpanData span = SpanData.fromJson(legacyJson); + expect(span.type, ReplacementTypeEnum.other); + }, + ); + + test('SpanData.fromJson handles new grammar type directly', () { + final Map jsonData = { + 'message': null, + 'short_message': null, + 'choices': [], + 'offset': 0, + 'length': 4, + 'full_text': 'Test', + 'type': 'grammar', + }; + + expect(() => SpanData.fromJson(jsonData), returnsNormally); + final SpanData span = SpanData.fromJson(jsonData); + expect(span.type, ReplacementTypeEnum.subjectVerbAgreement); + }); + + test('SpanData.fromJson handles translation type', () { + final Map jsonData = { + 'message': null, + 'short_message': null, + 'choices': [], + 'offset': 0, + 'length': 4, + 'full_text': 'Test', + 'type': 'translation', + }; + + expect(() => SpanData.fromJson(jsonData), returnsNormally); + final SpanData span = SpanData.fromJson(jsonData); + expect(span.type, ReplacementTypeEnum.translation); + }); + + group('SpanData.fromJson fullText fallback', () { + test('uses full_text from JSON when present', () { + final Map jsonData = { + 'message': null, + 'short_message': null, + 'choices': [], + 'offset': 0, + 'length': 4, + 'full_text': 'Text from span', + 'type': 'grammar', + }; + + final SpanData span = SpanData.fromJson( + jsonData, + parentFullText: 'Text from parent', + ); + expect(span.fullText, 'Text from span'); + }); + + test('uses parentFullText when full_text not in JSON', () { + final Map jsonData = { + 'message': null, + 'short_message': null, + 'choices': [], + 'offset': 0, + 'length': 4, + // Note: no full_text field + 'type': 'grammar', + }; + + final SpanData span = SpanData.fromJson( + jsonData, + parentFullText: 'Text from parent', + ); + expect(span.fullText, 'Text from parent'); + }); + + test( + 'uses empty string when neither full_text nor parentFullText present', + () { + final Map jsonData = { + 'message': null, + 'short_message': null, + 'choices': [], + 'offset': 0, + 'length': 4, + 'type': 'grammar', + }; + + final SpanData span = SpanData.fromJson(jsonData); + expect(span.fullText, ''); + }, + ); + + test('prefers sentence over full_text (legacy field name)', () { + final Map jsonData = { + 'message': null, + 'short_message': null, + 'choices': [], + 'offset': 0, + 'length': 4, + 'sentence': 'Text from sentence field', + 'full_text': 'Text from full_text field', + 'type': 'grammar', + }; + + final SpanData span = SpanData.fromJson(jsonData); + expect(span.fullText, 'Text from sentence field'); + }); + }); +}