diff --git a/.agents/skills b/.agents/skills new file mode 120000 index 0000000000000..0d981c82f4683 --- /dev/null +++ b/.agents/skills @@ -0,0 +1 @@ +../.skills/ \ No newline at end of file diff --git a/.claude/skills b/.claude/skills new file mode 120000 index 0000000000000..4ca0ec66cd63a --- /dev/null +++ b/.claude/skills @@ -0,0 +1 @@ +../.skills \ No newline at end of file diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index d948dcc053503..092b0b0b66893 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -85,3 +85,6 @@ e41897a3066199f3b7f4c019fb638615dfe1f007 # remove route-template usage 88d4e242ead238b353f441533a0c4b8ce3fa1f7b + +# MT: Switch to nested module style across migrations/ (#38564) +89f26da39d8c977c3dde7ef7e0a5c3f2a4b58e44 diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 1e55344b30a96..4cb14690ae7e8 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -16,7 +16,7 @@ updates: prefix: "DEPS" cooldown: default-days: 7 - open-pull-requests-limit: 20 + open-pull-requests-limit: 40 versioning-strategy: lockfile-only allow: - dependency-type: direct @@ -74,10 +74,9 @@ updates: prefix: "DEPS" cooldown: default-days: 7 - exclude: [ - "@discourse/*" - ] - open-pull-requests-limit: 20 + exclude: + - "@discourse/*" + open-pull-requests-limit: 40 versioning-strategy: increase ignore: - dependency-name: "webpack" # Recent versions have bugs with `/static` loading. We're working to move away from webpack anyway. diff --git a/.github/workflows/dependabot-pnpm-dedupe.yml b/.github/workflows/dependabot-pnpm-dedupe.yml index bf112b0e78856..21e4f11f5b593 100644 --- a/.github/workflows/dependabot-pnpm-dedupe.yml +++ b/.github/workflows/dependabot-pnpm-dedupe.yml @@ -23,10 +23,10 @@ jobs: token: ${{ secrets.GH_PUSH_TOKEN }} - name: Set up pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@v5 - name: Set up Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: 22 diff --git a/.github/workflows/developer-docs-lint.yml b/.github/workflows/developer-docs-lint.yml index 522e74821cbf8..5054a5fa6fa62 100644 --- a/.github/workflows/developer-docs-lint.yml +++ b/.github/workflows/developer-docs-lint.yml @@ -31,13 +31,14 @@ jobs: steps: - uses: actions/checkout@v6 + with: + fetch-depth: 1 - - uses: pnpm/action-setup@v4 + - uses: pnpm/action-setup@v5 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: - cache: "pnpm" - cache-dependency-path: docs/developer-guides/pnpm-lock.yaml + node-version: 24 - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 6e6778f9ca0fd..54bca5fcbf799 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -72,7 +72,11 @@ jobs: - name: ESLint if: ${{ !cancelled() }} - run: pnpm lint:js + run: pnpm lint:js --max-warnings 0 + + - name: Types + if: ${{ !cancelled() }} + run: pnpm lint:types - name: Prettier if: ${{ !cancelled() }} @@ -95,7 +99,3 @@ jobs: - name: English locale lint (core plugins) if: ${{ !cancelled() }} run: bundle exec ruby script/i18n_lint.rb "plugins/**/locales/{client,server}.en.yml" - - - name: Types - if: ${{ !cancelled() }} - run: pnpm lint:types diff --git a/.github/workflows/migration-tests.yml b/.github/workflows/migration-tests.yml index 996c1091f9869..37b1cf7fd3fac 100644 --- a/.github/workflows/migration-tests.yml +++ b/.github/workflows/migration-tests.yml @@ -112,12 +112,35 @@ jobs: - name: Validate IntermediateDB schema run: | + # Show structured differences between DSL config and database + migrations/bin/cli schema diff --db=intermediate_db || true + + # Regenerate schema from DSL config migrations/bin/cli schema generate --db=intermediate_db - if [ ! -z "$(git status --porcelain migrations/db/intermediate_db_schema/)" ]; then + # Check if generated output matches what's committed + if [ ! -z "$(git status --porcelain migrations/db/intermediate_db_schema/ migrations/lib/database/intermediate_db/ migrations/lib/database/intermediate_db/enums/)" ]; then + echo "" + echo "==========================================" echo "IntermediateDB schema is not up to date." - echo "---------------------------------------------" - git -c color.ui=always diff migrations/db/intermediate_db_schema/ + echo "==========================================" + echo "" + echo "The generated schema files differ from what is committed." + echo "This usually means the schema DSL config or the database" + echo "structure changed without regenerating." + echo "" + echo "To fix:" + echo " 1. Run: migrations/bin/cli schema diff" + echo " to see what changed between config and database" + echo " 2. Update config files in migrations/config/schema/intermediate_db/" + echo " - New tables: migrations/bin/cli schema add " + echo " - Ignore tables: migrations/bin/cli schema ignore
--reason '...'" + echo " - New columns: add to the table's include list or ignore with reason" + echo " 3. Run: migrations/bin/cli schema generate" + echo " 4. Commit the updated config and generated files" + echo "" + echo "Generated file diff:" + git -c color.ui=always diff -- migrations/db/intermediate_db_schema/ migrations/lib/database/intermediate_db/ migrations/lib/database/intermediate_db/enums/ exit 1 fi diff --git a/.github/workflows/publish-assets.yml b/.github/workflows/publish-assets.yml index 82effc5cb52db..cefdde98f9dbc 100644 --- a/.github/workflows/publish-assets.yml +++ b/.github/workflows/publish-assets.yml @@ -6,6 +6,7 @@ on: - main - stable - release/* + - precompile-asset-improvements tags: - beta - v* @@ -20,7 +21,7 @@ jobs: runs-on: 'cdck-linux-8-core' container: discourse/discourse_test:release timeout-minutes: 30 - + steps: - name: Install gh cli run: | @@ -46,6 +47,18 @@ jobs: git config --global user.email "ci@ci.invalid" git config --global user.name "Discourse CI" + - name: Symlink vendor/bundle from image + run: | + ln -s /var/www/discourse/vendor/bundle vendor/bundle + + - name: Setup gems + run: | + bundle config --local path vendor/bundle + bundle config --local deployment true + bundle config --local without development + bundle install --jobs $(($(nproc) - 1)) + bundle clean + - name: pnpm install run: pnpm install --frozen-lockfile diff --git a/.github/workflows/publish-types.yml b/.github/workflows/publish-types.yml new file mode 100644 index 0000000000000..311ba3747014b --- /dev/null +++ b/.github/workflows/publish-types.yml @@ -0,0 +1,58 @@ +name: Publish @discourse/types package + +on: + workflow_dispatch: + push: + branches: + - main + paths: + - "lib/version.rb" + +permissions: + contents: read + id-token: write + +jobs: + publish: + name: publish + runs-on: ubuntu-latest + if: github.repository == 'discourse/discourse' + timeout-minutes: 5 + + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 1 + + - uses: ruby/setup-ruby@v1 + with: + ruby-version: "3.4" + + - uses: pnpm/action-setup@v5 + + - uses: actions/setup-node@v6 + with: + node-version: 24 + + - name: pnpm install + run: pnpm install --frozen-lockfile + + - name: Generate external type definitions + run: pnpm types:generate + + - name: Generate type definitions + run: pnpm lint:types + + - name: Prepare version + shell: bash + run: | + discourse_version=$(ruby -r ./lib/version.rb -e 'puts "#{Discourse::VERSION::MAJOR}.#{Discourse::VERSION::MINOR}.#{Discourse::VERSION::TINY}"') + commit_hash=$(git rev-parse --short HEAD) + package_version="${discourse_version}-${commit_hash}" + + echo "@discourse/types version: ${package_version}" + sed -i -E "s/\"version\": \"0\.0\.0\"/\"version\": \"${package_version}\"/" frontend/discourse-types/package.json + + - name: Publish the package + working-directory: frontend/discourse-types + run: pnpm publish --no-git-checks --tag latest diff --git a/.github/workflows/release-notes.yml b/.github/workflows/release-notes.yml index 950170b34a701..3b408afb25b16 100644 --- a/.github/workflows/release-notes.yml +++ b/.github/workflows/release-notes.yml @@ -75,7 +75,7 @@ jobs: bin/rake "release_note:plugins:generate[ ${{ steps.dates.outputs.from }} , ${{ steps.dates.outputs.to }} , ./tmp/all-the-plugins/official/* , discourse ]" | tee tmp/notes/plugins.txt - name: Export files - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: release-notes path: ./tmp/notes/*.txt diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a24e05b31c743..6e3f00b97df9d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -24,7 +24,7 @@ permissions: jobs: build: if: github.event_name == 'pull_request' || github.repository != 'discourse/discourse-private-mirror' - name: ${{ matrix.target }} ${{ matrix.build_type }}${{ (matrix.target == 'core' && matrix.build_type == 'frontend' && format(' ({0})', matrix.browser)) || '' }} # Update fetch-job-id step if changing this + name: ${{ matrix.target }} ${{ matrix.build_type }}${{ (matrix.target == 'core' && matrix.build_type == 'frontend' && format(' ({0})', matrix.browser)) || '' }}${{ matrix.plugin_compiler == 'legacy' && ' (legacy)' || '' }} runs-on: >- ${{ github.repository_owner == 'discourse' && ( @@ -62,6 +62,7 @@ jobs: LOAD_PLUGINS: ${{ (matrix.target == 'core-plugins' || matrix.target == 'official-plugins' || matrix.target == 'plugins' || matrix.target == 'chat') && '1' || '0' }} ACTIONS_STEP_DEBUG: ${{ secrets.ACTIONS_STEP_DEBUG }} QUNIT_REUSE_BUILD: 1 + ROLLUP_PLUGIN_COMPILER: ${{ matrix.plugin_compiler == 'rollup' && '1' || '0' }} strategy: fail-fast: false @@ -70,6 +71,7 @@ jobs: build_type: [backend, frontend, system] target: [core, plugins, themes] browser: [Chrome] + plugin_compiler: ["rollup"] exclude: - build_type: backend target: themes @@ -87,6 +89,9 @@ jobs: - build_type: system target: chat browser: Chrome + - build_type: frontend + target: plugins + plugin_compiler: "legacy" # - build_type: frontend # target: core # browser: Firefox Evergreen @@ -317,7 +322,7 @@ jobs: if: matrix.build_type == 'frontend' && matrix.target == 'themes' run: DISCOURSE_DEV_DB=discourse_test bin/rake themes:qunit_all_official - - uses: actions/upload-artifact@v6 + - uses: actions/upload-artifact@v7 if: always() && matrix.build_type == 'frontend' with: name: ember-exam-execution-${{ matrix.target }}-${{ matrix.browser }}-frontend-${{ hashFiles('./frontend/discourse/test-execution-*.json') }} @@ -370,7 +375,7 @@ jobs: fi - name: Upload failed system test artifacts - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 if: always() && steps.check-failed-system-test-artifacts.outputs.exists == 'true' with: name: failed-system-test-artifacts-${{ matrix.build_type }}-${{ matrix.target }} @@ -394,7 +399,7 @@ jobs: run: cp tmp/turbo_rspec_flaky_tests.json tmp/turbo_rspec_flaky_tests-${{ matrix.build_type }}-${{ matrix.target }}-${{ job.check_run_id }}.json - name: Upload flaky tests report - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 if: steps.check-flaky-spec-report.outputs.exists == 'true' with: name: flaky-test-reports-${{ matrix.build_type }}-${{ matrix.target }} @@ -406,7 +411,7 @@ jobs: needs: build steps: - name: Merge Artifacts - uses: actions/upload-artifact/merge@v6 + uses: actions/upload-artifact/merge@v7 with: name: failed-system-test-artifacts pattern: failed-system-test-artifacts-* @@ -416,7 +421,7 @@ jobs: continue-on-error: true - name: Merge Artifacts - uses: actions/upload-artifact/merge@v6 + uses: actions/upload-artifact/merge@v7 with: name: flaky-test-reports pattern: flaky-test-reports-* diff --git a/.gitignore b/.gitignore index 668e5365ca2cc..c10a772687813 100644 --- a/.gitignore +++ b/.gitignore @@ -75,6 +75,7 @@ !/plugins/discourse-ai !/plugins/discourse-cakeday !/plugins/discourse-rewind +!/plugins/discourse-workflows /plugins/*/auto_generated /spec/fixtures/plugins/my_plugin/auto_generated @@ -125,6 +126,10 @@ openapi/* # Types frontend/discourse-types/declarations +frontend/discourse-types/external-types +frontend/discourse-types/external-types.d.ts +frontend/discourse-i18n/src/index.d.ts +frontend/discourse-i18n/src/index.d.ts.map *.tsbuildinfo # discourse-ai evals @@ -136,3 +141,4 @@ frontend/discourse-types/declarations /.claude /.cursor .playwright-mcp +/frontend/discourse-types/dts-generator.js diff --git a/.prettierignore b/.prettierignore index fe06c902eb738..ac481a74096bb 100644 --- a/.prettierignore +++ b/.prettierignore @@ -15,6 +15,7 @@ public/ vendor/ frontend/discourse/tests/unit/utils/decorators-test.js frontend/discourse/tests/fixtures +frontend/discourse-types/dts-generator.js spec/ node_modules/ dist/ @@ -23,4 +24,5 @@ tmp/ **/*.rb **/*.html **/*.json +!**/tsconfig.json **/*.md diff --git a/.rubocop.yml b/.rubocop.yml index f1e4cca7ad39c..64372cac16199 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,6 +1,10 @@ inherit_gem: rubocop-discourse: stree-compat.yml +inherit_mode: + merge: + - Exclude + # Still work to do in ensuring we don't link old files Discourse/NoAddReferenceOrAliasesActiveRecordMigration: Enabled: false diff --git a/.skills/discourse-service-authoring/SKILL.md b/.skills/discourse-service-authoring/SKILL.md new file mode 100644 index 0000000000000..c20a91a4fbd9b --- /dev/null +++ b/.skills/discourse-service-authoring/SKILL.md @@ -0,0 +1,220 @@ +--- +name: discourse-service-authoring +description: Use when creating, editing, or reviewing Discourse service objects that include Service::Base - covers contracts, models, policies, steps, transactions, controller integration, and service specs +--- + +We want high quality code and very senior engineering work. Best oriented object practices are observed. Think principles like SOLID and battle-tested patterns. We also want to write idiomatic ruby. Good reference authors are Sandi Metz, Katrina Owen or Avdi Grimm. Your only source of truth to write services is the documentation at docs/developer-guides/docs/03-code-internals/19-service-objects.md, don't look at examples in the codebase. + +DONT USE ANY WRITING PLAN SKILL DURING THE SESSION + +## Autonomous Mode + +When the user says "autonomous mode" (or similar), apply these overrides: +- Do NOT use AskUserQuestion — make your best judgment call and state what you chose +- Do NOT wait for user approval at phase gates — present the deliverable and proceed immediately +- Still present audit tables, but fix all FAILs and continue without waiting for confirmation +- Still present service name suggestions, but pick the best one yourself + +## Task Tracking + +**MANDATORY:** At the start of every session using this skill, create a task for each phase using TaskCreate: + +1. "Phase 1: Deep Understanding" +2. "Phase 2: Assessment" +3. "Phase 3: Implementation" +4. "Phase 4: Quality" +5. "Phase 5: Business logic" +6. "Phase 6: Security" +7. "Phase 7: Specs" +8. "Phase 8: Finalization" + +Create ALL tasks upfront before starting any work. Mark each task as `in_progress` when you begin it and `completed` when the user approves the phase gate. + +## Execution Discipline + +Every phase is a discrete step. Complete one phase fully before starting the next. Each phase ends with a user-visible deliverable — findings, an audit table, or a confirmation. NEVER silently advance to the next phase. + +**Review phases (4, 5, 6) use a strict audit loop:** +1. Evaluate every rule in the phase's checklist against the current code +2. Present a numbered verdict table — one row per rule, each with PASS / FAIL / NA and a one-line evidence citation (file:line or brief rationale) +3. If any FAIL: fix the violations, then go back to step 1 and re-evaluate the **full** checklist (not just the items you fixed) +4. The phase ends only when the user sees an all-PASS table and approves + +**Audit table format** (used by phases 4, 5, 6): + +``` +| # | Rule | Verdict | Evidence | +|---|------|---------|----------| +| 1 | Service name describes core business concept | PASS | `Chat::Message::Trash` — uses domain vocabulary | +| 2 | Steps have one concern each | FAIL | `update_message` both validates and persists | +| 3 | No utility methods in service | NA | No utility methods present | +``` + +- **Every rule in the phase's checklist gets a row** — no omissions +- **FAIL rows must cite file:line** where the violation occurs +- **PASS rows need brief evidence** — not just "looks good" but what you actually verified +- **NA requires justification** — why the rule doesn't apply to this service +- After fixes, produce a **complete new table** (not a diff or "fixed items only") + +## Phase 1: Deep Understanding + +Build a thorough understanding of the codepath being refactored. Read every file involved: the controller action, the class method or inline logic being extracted, all models touched, guardian/policy extensions, serializers, routes, and every caller (production code, specs, import scripts, dev tools, other plugins). + +**Gate:** Present a summary to the user listing every file read and the key responsibilities discovered. Wait for user confirmation that the understanding is complete before proceeding to Phase 2. + +## Phase 2: Assessment + +Surface gaps, architectural decisions, and issues for user approval before writing any code. + +- Identify logic that belongs in a model (callbacks, computed values, configuration-driven setup) rather than in the service. The service orchestrates; models own their own setup concerns. +- Split computed values across the models that own each layer. Each model should own its own configuration; higher-level models compose from lower-level ones with fallbacks. +- Extract magic numbers into named constants on the module. +- Add `-> { with_deleted }` scope to `belongs_to` associations that may reference soft-deleted records. +- Note any bugs or security issues found during research — these will be addressed during implementation. +- Identify any plain-class serializers (not inheriting from ApplicationSerializer) and flag them for conversion to ActiveModel::Serializer. + +Present all findings to the user and get approval on scope before proceeding. + +## Phase 3: Implementation + +Write the service, controller, update all callers, and remove dead code. + +- Write model improvements first (associations, constants, extracted methods) +- Write the service class +- Write the controller integration +- Update ALL callers to use the service directly — specs, import scripts, dev tools, event handlers, other plugins. Update test `before` blocks with any site settings the service's policy requires. +- Remove dead code: if a helper method is no longer called by any production code after extraction, delete it. +- When converting serializers to AMS, update ALL callers (controllers, services, publishers) and remove any wrapper methods that just delegated to the old serializer. + +**Gate:** Present a summary of all files created, modified, and deleted. Wait for user acknowledgment before proceeding to Phase 4. + +## Phase 4: Quality + +Review the service against these structural rules. List every violation found. + +- Service name should describe the core concept business, makes 5 suggestions to the user using AskUserQuestion, don't hesitate to namespace, eg: PluginName::BusinessSubject::Action +- Steps are simple with one concern each +- Step names describe domain behavior, not code (`revoke_previous_accepted_answer` not `destroy_old_record`). ALWAYS use Discourse core domain vocabulary. Ask "why is this happening?" not "what ActiveRecord method am I calling?" +- Descriptive param names: `post_id` not `id`, `channel_id` not `target` +- `context[:]` is a code smell. Verify a `model`, `options`, or step keyword argument cannot achieve the same result. Refactoring should almost always let you use a model instead. +- `transaction` wraps ONLY DB writes that must succeed or fail together. Side effects (webhooks, events, MessageBus) live outside. +- `lock` wraps ONLY steps vulnerable to concurrent modification. Side effects are idempotent and MUST live outside the lock. +- No `return if`/`return unless` at the top of step methods — use `only_if` wrappers. Guard clauses in `only_if` predicate methods use bare `return` (not `return false`). +- NEVER have an utility methods in a service, use model, step or a dedicated action instead +- Instead of manipulating data from the contract directly in various steps, attempt to extract logic on the contract itself +- NEVER rate limiting in the service — if necessary, it belongs in the controller via `before_action` +- NEVER use an optional model steps just to store a value for condition checks +- `create` over `new` + separate `save!` in model steps +- Each side effect is its own step with its own `only_if` wrapper — never bundle conditional side effects with internal if-statements +- ALWAYS Group related side effects into one step ONLY when they are truly one conceptual action AND share the same condition +- No over-protection with `try` — trust internal bang methods, use non-bang persistence in model steps +- Consistent security constraints: if one MessageBus publish uses `secure_audience`, ALL publishes on that channel must +- Custom step names for model steps that CREATE (not the default `fetch_` prefix) +- When converting if/else to `only_if`, ask whether the else branch is truly conditional or default behavior that should always run +- Inline small external helper methods rather than delegating to other modules +- Idiomatic ActiveRecord: prefer association-based lookups (`target_post: record`) over foreign-key lookups +- Guard clauses in fetch methods for privilege-based branching (privileged path is the early return) +- No backward-compatible wrapper methods or `skip_policy` options +- Mutation steps ordered so rollback leaves consistent state (dependent writes after what they depend on) +- Serializers MUST inherit from `ApplicationSerializer` — never use plain classes with class-method `.serialize()` patterns +- Use `include_*?` methods for conditional attributes, not if/else hash building +- Extract nested serialization into separate serializer classes (e.g., topic data inside a card gets its own `CardTopicSerializer`) +- Use serializers directly at call sites: `MySerializer.new(object, root: false).as_json` — never hide them behind controller helper methods +- Pass pre-loaded data (e.g., batch-loaded assignments) through the serializer's options hash: `MySerializer.new(object, root: false, my_data:).as_json` accessed via `@options[:my_data]` +- ALWAYS use service_params and service_params.deep_merge(foo: bar) to pass params to the service from the controller + +When in doubt AskUserQuestion. + +**Audit loop:** +1. Produce the full audit table covering every rule above +2. Present the table to the user +3. If any FAIL verdicts exist: + a. Fix every FAIL violation + b. Return to step 1 — re-evaluate **all** rules, not just the ones you fixed (fixes can introduce new violations or invalidate previous PASS verdicts) +4. When the table is all PASS/NA, present it to the user for approval +5. Proceed to Phase 5 only after user approval + +## Phase 5: Business logic + +Trace every code path in the original implementation against the new service. List every bug found by criticality. + +- Confirm no code path is dropped or subtly altered +- Verify side effects (DB writes, notifications, events, webhooks) fire under the same conditions and in the same order +- Check transactional boundaries: what was atomic before must remain atomic + +**Audit loop:** +1. Produce the full audit table covering every rule above +2. Present the table to the user (including bugs from the prior implementation) +3. If any FAIL verdicts exist: + a. Fix user-approved items + b. Return to step 1 — re-trace **all** rules, not just the ones you fixed (fixes can introduce new regressions) +4. When the table is all PASS/NA, present it to the user for approval +5. Proceed to Phase 6 only after user approval + +## Phase 6: Security + +Review for security concerns. List every issue found by criticality. + +- Access control: are policies enforced consistently regardless of caller? +- Category moderation: for category-scoped resources, never rely on `user.moderator?` / `guardian.is_moderator?` alone. Verify whether category moderators for the specific category should be allowed, and whether the actor can see or act on that exact resource via an existing guardian/policy method or `guardian.is_category_group_moderator?(category)` plus the relevant visibility check. +- MessageBus: secure audience applied to all publishes on secured channels? +- Data leakage: can non-privileged users infer existence of soft-deleted or private resources? + +**Audit loop:** +1. Produce the full audit table covering every rule above +2. Present the table to the user +3. If any FAIL verdicts exist: + a. Fix user-approved items + b. Return to step 1 — re-review **all** rules, not just the ones you fixed +4. When the table is all PASS/NA, present it to the user for approval +5. Proceed to Phase 7 only after user approval + +## Phase 7: Specs + +**MANDATORY: Run this entire phase in a subagent.** Use the Agent tool to spawn a dedicated agent for writing and running specs. Pass it the service file path, the spec file path, and the full checklist below. Do NOT write specs in the main conversation. + +### Reference sources + +Two authoritative references govern how specs are written. Whenever you are unsure about an RSpec pattern, naming convention, matcher usage, or structural rule, **fetch the relevant section** before writing code: + +1. **RSpec Style Guide** — https://rspec.rubystyle.guide + Fetch this page and search for the keyword you need guidance on (e.g. "subject", "context", "let", "shared examples", "named subject", "aggregate_failures", "one expectation"). Use it as the definitive authority on RSpec idioms and style. + +2. **Service documentation** — `docs/developer-guides/docs/03-code-internals/19-service-objects.md`, section **Testing** + This is the definitive authority on testing Discourse services: structure, custom matchers, and conventions. Every spec must follow the patterns shown there. + +### Checklist + +- Test the contract in a separate `describe described_class::Contract, type: :model` block with shoulda matchers +- Use a `describe ".call"` block for the service execution +- Declare `subject(:result) { described_class.call(params:, **dependencies) }` as the first declaration in the `.call` block — the subject must be shared and parameterizable across contexts +- Declare setup data with `fab!`, params as `let(:params)`, dependencies as `let(:dependencies)` — order: subject, fab!, let, before +- One `context` per possible branching point, following the step order defined in the service +- Use the service-specific matchers for step failures: `fail_a_contract`, `fail_to_find_a_model(:name)`, `fail_a_policy(:name)`, `fail_with_an_invalid_model(:name)`, `fail_with_exception`, `fail_a_step(:name)`, `run_successfully` +- Do NOT re-test exhaustive contract validations in the `.call` block — the contract is tested above; the `.call` context only needs one example proving the step halts execution (e.g. one invalid value) +- The happy path context uses `run_successfully` and then tests side effects (DB changes, events, logs) +- Override `let` values in nested contexts to trigger each failure branch — NEVER duplicate the subject call +- Override `fab!` in nested contexts to change actors (e.g., `fab!(:acting_user, :admin)`) rather than overriding `let(:guardian)` +- ALWAYS use specific RSpec matchers (`change`, `eq`, `include`, `be_empty`, predicate matchers like `be_published`) — never bare `be` or vague assertions +- Context descriptions use "when …" / "with …" / "without …" phrasing +- Use `DiscourseEvent.track_events(:event_name) { result }` to test event triggers — NEVER manual `on`/`off` +- Use `let(:messages) { MessageBus.track_publish(channel) { result } }` as a lazy `let` +- Use fabricators for setup data, not raw `Model.create!` +- Use `:topic_with_op` fabricator when the topic needs an OP post for validations to pass +- Write model specs for any model callbacks introduced during the refactoring +- If an action is complex (many edge cases / branching), test it in isolation in its own spec file; the service spec only verifies it is called +- Follow the step order when writing contexts and methods + +**Audit loop:** +1. Produce the full audit table covering every rule above +2. Present the table to the user +3. If any FAIL verdicts exist: + a. Fix every FAIL violation + b. Return to step 1 — re-evaluate **all** rules, not just the ones you fixed +4. When the table is all PASS/NA, present it to the user for approval +5. Run specs and lint. Fix failures and re-run until green +6. Proceed to Phase 8 only after user approval + +## Phase 8: Finalization + +Run the full plugin spec suite and any cross-plugin specs that touch the refactored code. Lint all changed files. Verify everything is green before presenting the completed work. diff --git a/AI-AGENTS.md b/AI-AGENTS.md index 12764b3ae4e0f..57cb4bf8c92c2 100644 --- a/AI-AGENTS.md +++ b/AI-AGENTS.md @@ -11,16 +11,18 @@ Discourse is large with long history. Understand context before changes. ### All Files - Always lint changed files -- Make display strings translatable (use placeholders, not split strings) - Create subagent to review changes against this file after completing tasks ### Toolset - Use `pnpm` for JavaScript, `bundle` for Ruby -- Use helpers in bin over bundle exec (bin/rspec, bin/rake) +- Use helpers in bin over bundle exec (bin/rspec, bin/rake, bin/lint) -### JavaScript +### JavaScript and UI - No empty backing classes for template-only components unless requested -- Use FormKit for forms: https://meta.discourse.org/t/discourse-toolkit-to-render-forms/326439 (`app/assets/javascripts/discourse/app/form-kit`) +- Use FormKit for forms, see ./docs/developer-guides/docs/03-code-internals/21-form-kit.md (`frontend/discourse/app/form-kit`) +- Use BEM for CSS, see ./docs/developer-guides/docs/03-code-internals/25-css-guidelines-bem.md +- Make display strings translatable (use placeholders, not split strings) +- Use "Sentence case" for strings, not "Proper Case" or "lower case" ### JSDoc - Do not add JSDoc to any new code you write. @@ -87,12 +89,14 @@ ALWAYS lint any changes you make ## Services - Extract business logic (validation, models, permissions) from controllers -- https://meta.discourse.org/t/using-service-objects-in-discourse/333641 +- docs/developer-guides/docs/03-code-internals/19-service-objects.md +- Use the skill at .skills/discourse-service-authoring - Examples: `app/services` (only classes with `Service::Base`) ## Database & Performance - ActiveRecord: use `includes()`/`preload()` (N+1), `find_each()`/`in_batches()` (large sets), `update_all`/`delete_all` (bulk), `exists?` over `present?` -- Migrations: rollback logic, `algorithm: :concurrently` for large tables, deprecate before removing columns, use `bin/rails generate migration` for new migrations +- Migrations: rollback logic, `algorithm: :concurrently` for large tables, deprecate before removing columns +- Use `bin/rails generate migration` for new migrations - Queries: use `explain`, specify columns, strategic indexing, `counter_cache` for counts ## HTTP Response Codes diff --git a/Gemfile b/Gemfile index ceae914117431..1b2f247ec5d93 100644 --- a/Gemfile +++ b/Gemfile @@ -97,7 +97,7 @@ gem "rake" gem "thor", require: false gem "diffy", require: false gem "rinku" -gem "sidekiq" +gem "sidekiq", ">= 7.3.10" # ensuring it won't get downgraded to accomodate a connection_pool upgrade gem "mini_scheduler" gem "mini_racer" @@ -127,6 +127,7 @@ group :test do gem "rails-dom-testing", require: false gem "minio_runner", require: false gem "capybara-playwright-driver" + gem "puma", require: false end group :test, :development do @@ -142,7 +143,6 @@ group :test, :development do gem "shoulda-matchers", require: false gem "rspec-html-matchers" - gem "pry-stack_explorer", require: false gem "debug", ">= 1.0.0", require: "debug/prelude" gem "rubocop-discourse", require: false gem "parallel_tests" @@ -160,7 +160,6 @@ group :development do gem "ruby-prof", require: false, platform: :mri gem "bullet", require: !!ENV["BULLET"] gem "better_errors", platform: :mri, require: !!ENV["BETTER_ERRORS"] - gem "binding_of_caller" gem "yaml-lint" gem "yard" gem "ruby-lsp", require: false @@ -195,7 +194,6 @@ gem "htmlentities", require: false gem "rack-mini-profiler", require: ["enable_rails_patches"] gem "unicorn", require: false, platform: :ruby -gem "puma", require: false gem "pitchfork", require: false gem "rbtrace", require: false, platform: :mri diff --git a/Gemfile.lock b/Gemfile.lock index a86beec6710a5..9168152c30875 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -51,7 +51,7 @@ GEM securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) uri (>= 0.13.1) - addressable (2.8.8) + addressable (2.8.9) public_suffix (>= 2.0.2, < 8.0) afm (1.0.0) annotaterb (4.20.0) @@ -89,9 +89,7 @@ GEM rack (>= 0.9.0) rouge (>= 1.0.0) bigdecimal (3.3.1) - binding_of_caller (1.0.1) - debug_inspector (>= 1.2.0) - bootsnap (1.19.0) + bootsnap (1.23.0) msgpack (~> 1.2) builder (3.3.0) bullet (8.1.0) @@ -106,17 +104,17 @@ GEM rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) - capybara-playwright-driver (0.5.7) + capybara-playwright-driver (0.5.8) addressable capybara playwright-ruby-client (>= 1.16.0) cbor (0.5.10.1) certified (1.0.0) - cgi (0.5.0) + cgi (0.5.1) chunky_png (1.4.0) coderay (1.1.3) colored2 (4.0.3) - concurrent-ruby (1.3.5) + concurrent-ruby (1.3.6) connection_pool (2.5.5) cose (1.3.1) cbor (~> 0.5.9) @@ -126,14 +124,13 @@ GEM bigdecimal rexml crass (1.0.6) - css_parser (1.21.1) + css_parser (2.0.0) addressable csv (3.3.5) - date (3.5.0) - debug (1.11.0) + date (3.5.1) + debug (1.11.1) irb (~> 1.10) reline (>= 0.3.8) - debug_inspector (1.2.0) diff-lcs (1.6.2) diffy (3.4.4) digest (3.2.1) @@ -156,12 +153,12 @@ GEM dry-initializer (3.2.0) ed25519 (1.4.0) email_reply_trimmer (0.2.0) - erb (6.0.0) + erb (6.0.2) erubi (1.13.1) - excon (1.3.2) + excon (1.4.0) logger - exifr (1.4.1) - extralite-bundle (2.13) + exifr (1.5.1) + extralite-bundle (2.14) fabrication (3.0.0) faker (3.5.3) i18n (>= 1.8.11, < 2) @@ -169,59 +166,60 @@ GEM faraday-net_http (>= 2.0, < 3.5) json logger - faraday-multipart (1.1.1) + faraday-multipart (1.2.0) multipart-post (~> 2.0) faraday-net_http (3.4.2) net-http (~> 0.5) - faraday-retry (2.3.2) + faraday-retry (2.4.0) faraday (~> 2.0) fast_blank (1.0.1) fastimage (2.3.1) - ffi (1.17.2-aarch64-linux-gnu) - ffi (1.17.2-aarch64-linux-musl) - ffi (1.17.2-arm-linux-gnu) - ffi (1.17.2-arm-linux-musl) - ffi (1.17.2-arm64-darwin) - ffi (1.17.2-x86_64-darwin) - ffi (1.17.2-x86_64-linux-gnu) - ffi (1.17.2-x86_64-linux-musl) + ffi (1.17.3-aarch64-linux-gnu) + ffi (1.17.3-aarch64-linux-musl) + ffi (1.17.3-arm-linux-gnu) + ffi (1.17.3-arm-linux-musl) + ffi (1.17.3-arm64-darwin) + ffi (1.17.3-x86_64-darwin) + ffi (1.17.3-x86_64-linux-gnu) + ffi (1.17.3-x86_64-linux-musl) fspath (3.1.2) globalid (1.3.0) activesupport (>= 6.1) goldiloader (6.0.0) activerecord (>= 7.2, < 8.3) activesupport (>= 7.2, < 8.3) - google-protobuf (4.33.2) + google-protobuf (4.34.0) bigdecimal - rake (>= 13) - google-protobuf (4.33.2-aarch64-linux-gnu) + rake (~> 13.3) + google-protobuf (4.34.0-aarch64-linux-gnu) bigdecimal - rake (>= 13) - google-protobuf (4.33.2-aarch64-linux-musl) + rake (~> 13.3) + google-protobuf (4.34.0-aarch64-linux-musl) bigdecimal - rake (>= 13) - google-protobuf (4.33.2-arm64-darwin) + rake (~> 13.3) + google-protobuf (4.34.0-arm64-darwin) bigdecimal - rake (>= 13) - google-protobuf (4.33.2-x86_64-darwin) + rake (~> 13.3) + google-protobuf (4.34.0-x86_64-darwin) bigdecimal - rake (>= 13) - google-protobuf (4.33.2-x86_64-linux-gnu) + rake (~> 13.3) + google-protobuf (4.34.0-x86_64-linux-gnu) bigdecimal - rake (>= 13) - google-protobuf (4.33.2-x86_64-linux-musl) + rake (~> 13.3) + google-protobuf (4.34.0-x86_64-linux-musl) bigdecimal - rake (>= 13) + rake (~> 13.3) guess_html_encoding (0.0.11) hana (1.3.7) hashdiff (1.2.1) hashery (2.1.2) - hashie (5.0.0) + hashie (5.1.0) + logger highline (3.1.2) reline htmlentities (4.4.2) http_accept_language (2.1.1) - i18n (1.14.7) + i18n (1.14.8) concurrent-ruby (~> 1.0) image_optim (0.31.4) exifr (~> 1.2, >= 1.2.2) @@ -232,17 +230,18 @@ GEM image_size (3.4.0) in_threads (1.6.0) inflection (1.0.0) - io-console (0.8.1) - irb (1.15.3) + io-console (0.8.2) + irb (1.17.0) pp (>= 0.6.0) + prism (>= 1.3.0) rdoc (>= 4.0.0) reline (>= 0.4.2) iso8601 (0.13.0) jmespath (1.6.2) - json (2.17.1) - json-schema (6.0.0) + json (2.19.2) + json-schema (6.2.0) addressable (~> 2.8) - bigdecimal (~> 3.1) + bigdecimal (>= 3.1, < 5) json_schemer (2.5.0) bigdecimal hana (~> 1.3) @@ -260,7 +259,8 @@ GEM libv8-node (24.12.0.1-x86_64-linux) libv8-node (24.12.0.1-x86_64-linux-musl) lint_roller (1.1.0) - listen (3.9.0) + listen (3.10.0) + logger rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) literate_randomizer (0.4.0) @@ -272,7 +272,7 @@ GEM request_store (~> 1.0) logstash-event (1.2.02) logster (2.20.1) - loofah (2.24.1) + loofah (2.25.1) crass (~> 1.0.2) nokogiri (>= 1.12.0) lru_redux (1.1.0) @@ -285,6 +285,8 @@ GEM net-smtp matrix (0.4.3) maxminddb (0.1.22) + mcp (0.8.0) + json-schema (>= 4.1) memory_profiler (1.1.0) message_bus (4.5.2) rack (> 2, < 4) @@ -294,9 +296,9 @@ GEM mime-types (3.7.0) logger mime-types-data (~> 3.2025, >= 3.2025.0507) - mime-types-data (3.2025.0924) + mime-types-data (3.2026.0303) mini_mime (1.1.5) - mini_racer (0.19.2) + mini_racer (0.20.0) libv8-node (~> 24.12.0.1) mini_scheduler (0.18.0) sidekiq (>= 6.5, < 8.0) @@ -304,16 +306,18 @@ GEM mini_suffix (0.3.3) ffi (~> 1.9) minio_runner (1.0.0) - minitest (5.26.2) - mocha (2.8.2) + minitest (6.0.2) + drb (~> 2.0) + prism (~> 1.5) + mocha (3.1.0) ruby2_keywords (>= 0.0.5) msgpack (1.8.0) multi_json (1.18.0) - multi_xml (0.7.2) - bigdecimal (~> 3.1) + multi_xml (0.8.1) + bigdecimal (>= 3.1, < 5) multipart-post (2.4.1) - mustache (1.1.1) - net-http (0.8.0) + mustache (1.1.2) + net-http (0.9.1) uri (>= 0.11.1) net-imap (0.5.12) date @@ -390,54 +394,53 @@ GEM optimist (3.2.1) ostruct (0.6.3) parallel (1.27.0) - parallel_tests (5.5.0) + parallel_tests (5.6.0) parallel - parser (3.3.10.0) + parser (3.3.10.2) ast (~> 2.4.1) racc pastel (0.8.0) tty-color (~> 0.5) - pdf-reader (2.15.0) + pdf-reader (2.15.1) Ascii85 (>= 1.0, < 3.0, != 2.0.0) afm (>= 0.2.1, < 2) hashery (~> 2.0) ruby-rc4 ttfunk - pg (1.6.2) - pg (1.6.2-aarch64-linux) - pg (1.6.2-aarch64-linux-musl) - pg (1.6.2-arm64-darwin) - pg (1.6.2-x86_64-darwin) - pg (1.6.2-x86_64-linux) - pg (1.6.2-x86_64-linux-musl) - pitchfork (0.18.1) + pg (1.6.3) + pg (1.6.3-aarch64-linux) + pg (1.6.3-aarch64-linux-musl) + pg (1.6.3-arm64-darwin) + pg (1.6.3-x86_64-darwin) + pg (1.6.3-x86_64-linux) + pg (1.6.3-x86_64-linux-musl) + pitchfork (0.18.2) logger rack (>= 2.0) - playwright-ruby-client (1.57.0) + playwright-ruby-client (1.58.1) + base64 concurrent-ruby (>= 1.1.6) mime-types (>= 3.0) pp (0.6.3) prettyprint prettier_print (1.2.1) prettyprint (0.2.0) - prism (1.6.0) + prism (1.9.0) progress (3.6.0) propshaft (1.3.1) actionpack (>= 7.0.0) activesupport (>= 7.0.0) rack - pry (0.15.2) + pry (0.16.0) coderay (~> 1.1) method_source (~> 1.0) + reline (>= 0.6.0) pry-rails (0.3.11) pry (>= 0.13.0) - pry-stack_explorer (0.6.1) - binding_of_caller (~> 1.0) - pry (~> 0.13) - psych (5.2.6) + psych (5.3.1) date stringio - public_suffix (7.0.0) + public_suffix (7.0.5) puma (7.1.0) nio4r (~> 2.0) racc (1.8.1) @@ -458,8 +461,8 @@ GEM activesupport (>= 5.0.0) minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.6.2) - loofah (~> 2.21) + rails-html-sanitizer (1.7.0) + loofah (~> 2.25) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) rails_failover (2.3.0) activerecord (>= 6.1, < 9.0) @@ -480,27 +483,29 @@ GEM rainbow (3.1.1) raindrops (0.20.1) rake (13.3.1) - rake-compiler-dock (1.10.0) + rake-compiler-dock (1.11.0) rb-fsevent (0.11.2) rb-inotify (0.11.1) ffi (~> 1.0) - rb_sys (0.9.119) - rake-compiler-dock (= 1.10.0) - rbs (3.9.5) + rb_sys (0.9.124) + rake-compiler-dock (= 1.11.0) + rbs (4.0.0) logger + prism (>= 1.6.0) + tsort rbtrace (0.5.3) ffi (>= 1.0.6) msgpack (>= 0.4.3) optimist (>= 3.0.0) rchardet (1.10.0) - rdoc (6.17.0) + rdoc (7.2.0) erb psych (>= 4.0.0) tsort redcarpet (3.6.1) redis (5.4.0) redis-client (>= 0.22.0) - redis-client (0.26.1) + redis-client (0.27.0) connection_pool redis-namespace (1.11.0) redis (>= 4) @@ -513,10 +518,10 @@ GEM rinku (2.0.6) rotp (6.3.0) rouge (4.7.0) - rqrcode (3.1.1) + rqrcode (3.2.0) chunky_png (~> 1.0) rqrcode_core (~> 2.0) - rqrcode_core (2.0.1) + rqrcode_core (2.1.0) rrule (0.7.0) activesupport (>= 2.3) rspec (3.13.2) @@ -531,21 +536,21 @@ GEM rspec-html-matchers (0.10.0) nokogiri (~> 1) rspec (>= 3.0.0.a) - rspec-mocks (3.13.7) + rspec-mocks (3.13.8) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) rspec-multi-mock (0.3.1) rspec (>= 3.7.0) - rspec-rails (8.0.2) + rspec-rails (8.0.4) actionpack (>= 7.2) activesupport (>= 7.2) railties (>= 7.2) - rspec-core (~> 3.13) - rspec-expectations (~> 3.13) - rspec-mocks (~> 3.13) - rspec-support (~> 3.13) - rspec-support (3.13.6) - rss (0.3.1) + rspec-core (>= 3.13.0, < 5.0.0) + rspec-expectations (>= 3.13.0, < 5.0.0) + rspec-mocks (>= 3.13.0, < 5.0.0) + rspec-support (>= 3.13.0, < 5.0.0) + rspec-support (3.13.7) + rss (0.3.2) rexml rswag-specs (2.17.0) activesupport (>= 5.2, < 8.2) @@ -554,61 +559,65 @@ GEM rspec-core (>= 2.14) rtlcss (0.2.1) mini_racer (>= 0.6.3) - rubocop (1.81.7) + rubocop (1.85.1) json (~> 2.3) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.1.0) + mcp (~> 0.6) parallel (~> 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 2.9.3, < 3.0) - rubocop-ast (>= 1.47.1, < 2.0) + rubocop-ast (>= 1.49.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 4.0) - rubocop-ast (1.48.0) + rubocop-ast (1.49.1) parser (>= 3.3.7.2) - prism (~> 1.4) + prism (~> 1.7) rubocop-capybara (2.22.1) lint_roller (~> 1.1) rubocop (~> 1.72, >= 1.72.1) - rubocop-discourse (3.13.3) + rubocop-discourse (3.16.0) activesupport (>= 6.1) lint_roller (>= 1.1.0) - rubocop (>= 1.73.2) rubocop-capybara (>= 2.22.0) + rubocop-discourse-base (>= 1.0.0) rubocop-factory_bot (>= 2.27.0) rubocop-rails (>= 2.30.3) rubocop-rspec (>= 3.0.1) rubocop-rspec_rails (>= 2.31.0) + rubocop-discourse-base (1.0.0) + rubocop (>= 1.80.0) rubocop-factory_bot (2.28.0) lint_roller (~> 1.1) rubocop (~> 1.72, >= 1.72.1) - rubocop-rails (2.33.4) + rubocop-rails (2.34.3) activesupport (>= 4.2.0) lint_roller (~> 1.1) rack (>= 1.1) rubocop (>= 1.75.0, < 2.0) rubocop-ast (>= 1.44.0, < 2.0) - rubocop-rspec (3.8.0) + rubocop-rspec (3.9.0) lint_roller (~> 1.1) rubocop (~> 1.81) rubocop-rspec_rails (2.32.0) lint_roller (~> 1.1) rubocop (~> 1.72, >= 1.72.1) rubocop-rspec (~> 3.5) - ruby-lsp (0.26.4) + ruby-lsp (0.26.8) language_server-protocol (~> 3.17.0) prism (>= 1.2, < 2.0) rbs (>= 3, < 5) ruby-lsp-rails (0.4.8) ruby-lsp (>= 0.26.0, < 0.27.0) - ruby-lsp-rspec (0.1.28) + ruby-lsp-rspec (0.1.29) ruby-lsp (~> 0.26.0) - ruby-prof (1.7.2) + ruby-prof (2.0.4) base64 + ostruct ruby-progressbar (1.13.0) ruby-rc4 (0.1.5) - ruby-readability (0.7.2) + ruby-readability (0.7.3) guess_html_encoding (>= 0.0.4) nokogiri (>= 1.6.0) ruby2_keywords (0.0.5) @@ -640,12 +649,12 @@ GEM securerandom (0.4.1) shoulda-matchers (7.0.1) activesupport (>= 7.1) - sidekiq (7.3.9) + sidekiq (7.3.10) base64 - connection_pool (>= 2.3.0) + connection_pool (>= 2.3.0, < 3) logger - rack (>= 2.2.4) - redis-client (>= 0.22.2) + rack (>= 2.2.4, < 3.3) + redis-client (>= 0.23.0, < 1) simplecov (0.22.0) docile (~> 1.1) simplecov-html (~> 0.11) @@ -656,22 +665,22 @@ GEM snaky_hash (2.0.3) hashie (>= 0.1.0, < 6) version_gem (>= 1.1.8, < 3) - sqlite3 (2.8.1-aarch64-linux-gnu) - sqlite3 (2.8.1-aarch64-linux-musl) - sqlite3 (2.8.1-arm-linux-gnu) - sqlite3 (2.8.1-arm-linux-musl) - sqlite3 (2.8.1-arm64-darwin) - sqlite3 (2.8.1-x86_64-darwin) - sqlite3 (2.8.1-x86_64-linux-gnu) - sqlite3 (2.8.1-x86_64-linux-musl) + sqlite3 (2.9.2-aarch64-linux-gnu) + sqlite3 (2.9.2-aarch64-linux-musl) + sqlite3 (2.9.2-arm-linux-gnu) + sqlite3 (2.9.2-arm-linux-musl) + sqlite3 (2.9.2-arm64-darwin) + sqlite3 (2.9.2-x86_64-darwin) + sqlite3 (2.9.2-x86_64-linux-gnu) + sqlite3 (2.9.2-x86_64-linux-musl) sshkey (3.0.0) - stackprof (0.2.27) - stringio (3.1.9) + stackprof (0.2.28) + stringio (3.2.0) stripe (11.1.0) syntax_tree (6.3.0) prettier_print (>= 1.2.0) - test-prof (1.5.0) - thor (1.4.0) + test-prof (1.5.2) + thor (1.5.0) tiktoken_ruby (0.0.15.1-aarch64-linux) tiktoken_ruby (0.0.15.1-aarch64-linux-musl) tiktoken_ruby (0.0.15.1-arm-linux) @@ -679,7 +688,7 @@ GEM tiktoken_ruby (0.0.15.1-x86_64-darwin) tiktoken_ruby (0.0.15.1-x86_64-linux) tiktoken_ruby (0.0.15.1-x86_64-linux-musl) - timeout (0.5.0) + timeout (0.6.1) tokenizers (0.6.3) rb_sys tokenizers (0.6.3-aarch64-linux) @@ -688,7 +697,8 @@ GEM tokenizers (0.6.3-x86_64-darwin) tokenizers (0.6.3-x86_64-linux) tokenizers (0.6.3-x86_64-linux-musl) - trilogy (2.9.0) + trilogy (2.10.0) + bigdecimal tsort (0.2.0) ttfunk (1.8.0) bigdecimal (~> 3.1) @@ -704,12 +714,12 @@ GEM tty-screen (0.8.2) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - tzinfo-data (1.2025.2) + tzinfo-data (1.2026.1) tzinfo (>= 1.0.0) unf (0.2.0) unicode-display_width (3.2.0) unicode-emoji (~> 4.1) - unicode-emoji (4.1.0) + unicode-emoji (4.2.0) unicorn (6.1.0) kgio (~> 2.6) raindrops (~> 0.7) @@ -730,7 +740,7 @@ GEM nokogiri (~> 1.8) yaml-lint (0.1.2) yard (0.9.38) - zeitwerk (2.7.3) + zeitwerk (2.7.5) zendesk_api (1.38.0.rc1) faraday (> 2.0.0) faraday-multipart @@ -771,7 +781,6 @@ DEPENDENCIES aws-sdk-s3 aws-sdk-sns better_errors - binding_of_caller bootsnap bullet capybara @@ -857,7 +866,6 @@ DEPENDENCIES pitchfork propshaft pry-rails - pry-stack_explorer puma rack (< 3) rack-mini-profiler @@ -897,7 +905,7 @@ DEPENDENCIES sassc-embedded sawyer shoulda-matchers - sidekiq + sidekiq (>= 7.3.10) simplecov sqlite3 sshkey @@ -932,7 +940,7 @@ CHECKSUMS activemodel (8.0.4) sha256=8f4e4fac3cd104b1bf30419c3745206f6f724c0e2902a939b4113f4c90730dfd activerecord (8.0.4) sha256=bda32c171799e5ca5460447d3b7272ed14447244e2497abf2107f87fc44cbf32 activesupport (8.0.4) sha256=894a3a6c7733b5fae5a7df3acd76c4b563f38687df8a04fa3cbd25360f3fe95a - addressable (2.8.8) sha256=7c13b8f9536cf6364c03b9d417c19986019e28f7c00ac8132da4eb0fe393b057 + addressable (2.8.9) sha256=cc154fcbe689711808a43601dee7b980238ce54368d23e127421753e46895485 afm (1.0.0) sha256=5bd4d6f6241e7014ef090985ec6f4c3e9745f6de0828ddd58bc1efdd138f4545 annotaterb (4.20.0) sha256=871b2e898d1d60c23bdc59b72a5b840678a56355bf5f6fdeb8c79d317ff98bf7 ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 @@ -948,29 +956,27 @@ CHECKSUMS benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c better_errors (2.10.1) sha256=f798f1bac93f3e775925b7fcb24cffbcf0bb62ee2210f5350f161a6b75fc0a73 bigdecimal (3.3.1) sha256=eaa01e228be54c4f9f53bf3cc34fe3d5e845c31963e7fcc5bedb05a4e7d52218 - binding_of_caller (1.0.1) sha256=2b2902abff4246ddcfbc4da9b69bc4a019e22aeb300c2ff6289a173d4b90b29a - bootsnap (1.19.0) sha256=d3e54558c1a9ea10cb095eb1eb8e921ae83fd4d5764b8809f63aec18ce9f60b5 + bootsnap (1.23.0) sha256=c1254f458d58558b58be0f8eb8f6eec2821456785b7cdd1e16248e2020d3f214 builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f bullet (8.1.0) sha256=604b7e2636ec2137dcab3ba61a56248c39a0004a0c9405d58bad0686d23b98ff capybara (3.40.0) sha256=42dba720578ea1ca65fd7a41d163dd368502c191804558f6e0f71b391054aeef - capybara-playwright-driver (0.5.7) sha256=875a1928077d56be8b484f84674901a2374752d7842d93de2045bbede1aad242 + capybara-playwright-driver (0.5.8) sha256=120145bc66afa0ef873c20a02c290d2776d386f35e4dda796decd7631185c6ca cbor (0.5.10.1) sha256=79cdf79f18dcd9ee97e0b849c6d573e5a2e3ddc1954d180f384d6ed2612b6df0 certified (1.0.0) sha256=aa4cdf0e90e7ee96f6e0ce3daae39eaa8f0486124e0d92daf64d2105aeb9069c - cgi (0.5.0) sha256=fe99f65bb2c146e294372ebb27602adbc3b4c008e9ea7038c6bd48c1ec9759da + cgi (0.5.1) sha256=e93fcafc69b8a934fe1e6146121fa35430efa8b4a4047c4893764067036f18e9 chunky_png (1.4.0) sha256=89d5b31b55c0cf4da3cf89a2b4ebc3178d8abe8cbaf116a1dba95668502fdcfe coderay (1.1.3) sha256=dc530018a4684512f8f38143cd2a096c9f02a1fc2459edcfe534787a7fc77d4b colored2 (4.0.3) sha256=63e1038183976287efc43034f5cca17fb180b4deef207da8ba78d051cbce2b37 - concurrent-ruby (1.3.5) sha256=813b3e37aca6df2a21a3b9f1d497f8cbab24a2b94cab325bffe65ee0f6cbebc6 + concurrent-ruby (1.3.6) sha256=6b56837e1e7e5292f9864f34b69c5a2cbc75c0cf5338f1ce9903d10fa762d5ab connection_pool (2.5.5) sha256=e54ff92855753df1fd7c59fa04a398833355f27dd14c074f8c83a05f72a716ad cose (1.3.1) sha256=d5d4dbcd6b035d513edc4e1ab9bc10e9ce13b4011c96e3d1b8fe5e6413fd6de5 cppjieba_rb (0.4.4) sha256=319a7ab57b6ec28a8d1b223487ecd114432f1930d7740db2f99c1991e6c8faaf crack (1.0.1) sha256=ff4a10390cd31d66440b7524eb1841874db86201d5b70032028553130b6d4c7e crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d - css_parser (1.21.1) sha256=6cfd3ffc0a97333b39d2b1b49c95397b05e0e3b684d68f77ec471ba4ec2ef7c7 + css_parser (2.0.0) sha256=af5c759a127b125b635006a6c6c2e05b96a1ebdeec21b3c415fd5f09ec714a0a csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f - date (3.5.0) sha256=5e74fd6c04b0e65d97ad4f3bb5cb2d8efb37f386cc848f46310b4593ffc46ee5 - debug (1.11.0) sha256=1425db64cfa0130c952684e3dc974985be201dd62899bf4bbe3f8b5d6cf1aef2 - debug_inspector (1.2.0) sha256=9bdfa02eebc3da163833e6a89b154084232f5766087e59573b70521c77ea68a2 + date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 + debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3 digest (3.2.1) sha256=ab3312b4e272d7d5dc41c564c86a25861a1f34ac5153374199a0b74861395947 @@ -986,56 +992,56 @@ CHECKSUMS dry-initializer (3.2.0) sha256=37d59798f912dc0a1efe14a4db4a9306989007b302dcd5f25d0a2a20c166c4e3 ed25519 (1.4.0) sha256=16e97f5198689a154247169f3453ef4cfd3f7a47481fde0ae33206cdfdcac506 email_reply_trimmer (0.2.0) sha256=05843fa5ee1a2037235f1f3c876e922f613e2b4406fea5bb14212d1708d6c525 - erb (6.0.0) sha256=2730893f9d8c9733f16cab315a4e4b71c1afa9cabc1a1e7ad1403feba8f52579 + erb (6.0.2) sha256=9fe6264d44f79422c87490a1558479bd0e7dad4dd0e317656e67ea3077b5242b erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9 - excon (1.3.2) sha256=a089babe98638e58042a7d542b2bbd183304527e33d612b6dde22fa491a544a5 - exifr (1.4.1) sha256=768374cc6b6ff3743acba57c1c35229bdd8c6b9fbc1285952047fc1215c4b894 - extralite-bundle (2.13) sha256=0d00338dd3b348f44a02bb9e93db3714231e7240a48320f1ee3a1db5197db3cc + excon (1.4.0) sha256=5d2bc9d2c79511a562e7fcac77cc7a40acd9cebcc55b80e537975ad8187f2924 + exifr (1.5.1) sha256=ad87a5dbc92946fbf1d8ccd178d557d95d9168e8b3c5c5f381ea2bffcc312521 + extralite-bundle (2.14) sha256=906c6e61dba586d6a0857e96ba985eef458ecd1b5ee009c8495c2c92ce6f18f4 fabrication (3.0.0) sha256=a6a0bfad9071348ad3cb1701df788524b888c0cdd044b988893e7509f7463be3 faker (3.5.3) sha256=b961482dc0bb15ccb9a98ea7878b925669e9ae8f5e59b607da540b768137d765 faraday (2.14.1) sha256=a43cceedc1e39d188f4d2cdd360a8aaa6a11da0c407052e426ba8d3fb42ef61c - faraday-multipart (1.1.1) sha256=77a18ff40149030fd1aef55bb4fc7a67ce46419a8a3fcd010e28c2526e8d8903 + faraday-multipart (1.2.0) sha256=7d89a949693714176f612323ca13746a2ded204031a6ba528adee788694ef757 faraday-net_http (3.4.2) sha256=f147758260d3526939bf57ecf911682f94926a3666502e24c69992765875906c - faraday-retry (2.3.2) sha256=2402d2029032ebd238a2046221e67f6ef0da78c5a8ce8cd4f8b9c62e4d6451d1 + faraday-retry (2.4.0) sha256=7b79c48fb7e56526faf247b12d94a680071ff40c9fda7cf1ec1549439ad11ebe fast_blank (1.0.1) sha256=269fc30414fed4e6403bc4a49081e1ea539f8b9226e59276ed1efaefabaa17ea fastimage (2.3.1) sha256=23c629f1f3e7d61bcfcc06c25b3d2418bc6bf41d2e615dbf5132c0e3b63ecce9 - ffi (1.17.2-aarch64-linux-gnu) sha256=c910bd3cae70b76690418cce4572b7f6c208d271f323d692a067d59116211a1a - ffi (1.17.2-aarch64-linux-musl) sha256=69e6556b091d45df83e6c3b19d3c54177c206910965155a6ec98de5e893c7b7c - ffi (1.17.2-arm-linux-gnu) sha256=d4a438f2b40224ae42ec72f293b3ebe0ba2159f7d1bd47f8417e6af2f68dbaa5 - ffi (1.17.2-arm-linux-musl) sha256=977dfb7f3a6381206dbda9bc441d9e1f9366bf189a634559c3b7c182c497aaa3 - ffi (1.17.2-arm64-darwin) sha256=54dd9789be1d30157782b8de42d8f887a3c3c345293b57ffb6b45b4d1165f813 - ffi (1.17.2-x86_64-darwin) sha256=981f2d4e32ea03712beb26e55e972797c2c5a7b0257955d8667ba58f2da6440e - ffi (1.17.2-x86_64-linux-gnu) sha256=05d2026fc9dbb7cfd21a5934559f16293815b7ce0314846fee2ac8efbdb823ea - ffi (1.17.2-x86_64-linux-musl) sha256=97c0eb3981414309285a64dc4d466bd149e981c279a56371ef811395d68cb95c + ffi (1.17.3-aarch64-linux-gnu) sha256=28ad573df26560f0aedd8a90c3371279a0b2bd0b4e834b16a2baa10bd7a97068 + ffi (1.17.3-aarch64-linux-musl) sha256=020b33b76775b1abacc3b7d86b287cef3251f66d747092deec592c7f5df764b2 + ffi (1.17.3-arm-linux-gnu) sha256=5bd4cea83b68b5ec0037f99c57d5ce2dd5aa438f35decc5ef68a7d085c785668 + ffi (1.17.3-arm-linux-musl) sha256=0d7626bb96265f9af78afa33e267d71cfef9d9a8eb8f5525344f8da6c7d76053 + ffi (1.17.3-arm64-darwin) sha256=0c690555d4cee17a7f07c04d59df39b2fba74ec440b19da1f685c6579bb0717f + ffi (1.17.3-x86_64-darwin) sha256=1f211811eb5cfaa25998322cdd92ab104bfbd26d1c4c08471599c511f2c00bb5 + ffi (1.17.3-x86_64-linux-gnu) sha256=3746b01f677aae7b16dc1acb7cb3cc17b3e35bdae7676a3f568153fb0e2c887f + ffi (1.17.3-x86_64-linux-musl) sha256=086b221c3a68320b7564066f46fed23449a44f7a1935f1fe5a245bd89d9aea56 fspath (3.1.2) sha256=b5ac9bafb97e2c8f8f9e303cd98ebd484be76fe9aa588bc4d01c6d99e78c9d75 globalid (1.3.0) sha256=05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11 goldiloader (6.0.0) sha256=613db1b28e9964291255a67a521f04d481b6afd6b9ca56ea1a612fd86e9a89c7 - google-protobuf (4.33.2) sha256=748150d6c642fd655ef39efa23ecf2abe6d616020039a6d1c1764be1da530315 - google-protobuf (4.33.2-aarch64-linux-gnu) sha256=822b2dcb707e94e652cd994642c31035935fca021adfac6164772c511eb7acd4 - google-protobuf (4.33.2-aarch64-linux-musl) sha256=c4b64428183cfd1953ec8c37beec1036668c8ec0865cfb0b18df21181ca397ee - google-protobuf (4.33.2-arm64-darwin) sha256=6d0ac185fed18768e5f16338455b1e4b7c38a97fc46f352e709f7a3007b64e1d - google-protobuf (4.33.2-x86_64-darwin) sha256=87cde586234674562cf099e2b708a65e376e2d39b0f0f48281f4b4ea182b47f8 - google-protobuf (4.33.2-x86_64-linux-gnu) sha256=73cba041477afcac92ff383fcbdec195ea28d96b994876d1deaa944d18f91786 - google-protobuf (4.33.2-x86_64-linux-musl) sha256=97cdf4f772c5540f9274603b00f1474ed5e6e2238b1d8b1585e77f941a36bd2c + google-protobuf (4.34.0) sha256=bffaea30fbe2807c80667a78953b15645b3bef62b25c10ca187e4418119be531 + google-protobuf (4.34.0-aarch64-linux-gnu) sha256=0ab8a8a97976a2265d647e69b3ff1980c89184abdaf06d36091856c5ab37cc55 + google-protobuf (4.34.0-aarch64-linux-musl) sha256=0632a86df6d320eac3b335bd779499d43ad8ee6d1f8c8494b773ed5d3d5c6ab4 + google-protobuf (4.34.0-arm64-darwin) sha256=f83967a8095a9da676b79ba372c58fef2ca3878428bd40febfce65b3752c90d1 + google-protobuf (4.34.0-x86_64-darwin) sha256=4a5b67281993345adca54bb32947f25a289597eafaa240e5b714d0a740f99321 + google-protobuf (4.34.0-x86_64-linux-gnu) sha256=bbb333fbe79c16f35a2e2154cf29f3ce26f60390dba286b339861206d5435ef9 + google-protobuf (4.34.0-x86_64-linux-musl) sha256=0b75858a388b17e73aa4176df2e722762dbc92551b7075fdc562d33c1c6de0b0 guess_html_encoding (0.0.11) sha256=cab6468b945f38673fc41ad147fbbc89693b3c6c34b03b071e2ed669a603e098 hana (1.3.7) sha256=5425db42d651fea08859811c29d20446f16af196308162894db208cac5ce9b0d hashdiff (1.2.1) sha256=9c079dbc513dfc8833ab59c0c2d8f230fa28499cc5efb4b8dd276cf931457cd1 hashery (2.1.2) sha256=d239cc2310401903f6b79d458c2bbef5bf74c46f3f974ae9c1061fb74a404862 - hashie (5.0.0) sha256=9d6c4e51f2a36d4616cbc8a322d619a162d8f42815a792596039fc95595603da + hashie (5.1.0) sha256=c266471896f323c446ea8207f8ffac985d2718df0a0ba98651a3057096ca3870 highline (3.1.2) sha256=67cbd34d19f6ef11a7ee1d82ffab5d36dfd5b3be861f450fc1716c7125f4bb4a htmlentities (4.4.2) sha256=bbafbdf69f2eca9262be4efef7e43e6a1de54c95eb600f26984f71d2fe96c5c3 http_accept_language (2.1.1) sha256=0043f0d55a148cf45b604dbdd197cb36437133e990016c68c892d49dbea31634 - i18n (1.14.7) sha256=ceba573f8138ff2c0915427f1fc5bdf4aa3ab8ae88c8ce255eb3ecf0a11a5d0f + i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5 image_optim (0.31.4) sha256=5bffd0891268e8d189d46ee4b8599918581bba1032d244e6ace4779a434776c0 image_size (3.4.0) sha256=c6a580513fe74947e25e5d3f0aea1e33add6c20f7d0007efa65504317b7f029a in_threads (1.6.0) sha256=91a7e6138d279dc632f59b8a9a409e47148948e297c0f69c92f9a2479a182149 inflection (1.0.0) sha256=ceba9b26fc28b9af82e33e822d28f78a4312af75687efec81d5ef1062498d355 - io-console (0.8.1) sha256=1e15440a6b2f67b6ea496df7c474ed62c860ad11237f29b3bd187f054b925fcb - irb (1.15.3) sha256=4349edff1efa7ff7bfd34cb9df74a133a588ba88c2718098b3b4468b81184aaa + io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc + irb (1.17.0) sha256=168c4ddb93d8a361a045c41d92b2952c7a118fa73f23fe14e55609eb7a863aae iso8601 (0.13.0) sha256=298c2b15b7be5fa95a1372813d36a2257656cd8e906dfbc1f5cb409851425aa2 jmespath (1.6.2) sha256=238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1 - json (2.17.1) sha256=e0e4824541336a44915436f53e7ea74c687314fb8f88080fa1456f6a34ead92e - json-schema (6.0.0) sha256=79ecaffba197008912933f66f6c5428f5ce7716e42bb1a8f0d56079f2d58633f + json (2.19.2) sha256=e7e1bd318b2c37c4ceee2444841c86539bc462e81f40d134cf97826cb14e83cf + json-schema (6.2.0) sha256=e8bff46ed845a22c1ab2bd0d7eccf831c01fe23bb3920caa4c74db4306813666 json_schemer (2.5.0) sha256=2f01fb4cce721a4e08dd068fc2030cffd0702a7f333f1ea2be6e8991f00ae396 jwt (2.10.1) sha256=e6424ae1d813f63e761a04d6284e10e7ec531d6f701917fadcd0d9b2deaf1cc5 kgio (2.11.4) sha256=bda7a2146115998a5b07154e708e0ac02c38dcee7e793c33e2e14f600fdfffc6 @@ -1048,38 +1054,39 @@ CHECKSUMS libv8-node (24.12.0.1-x86_64-linux) sha256=e1236be4765edc109bd6ecef2989cf781bdcbac6f6e2cb3236ec9568540a9cfa libv8-node (24.12.0.1-x86_64-linux-musl) sha256=7563175534c40893815bfd28e8fe27e12ff1656700c7208f53de06d14001712b lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 - listen (3.9.0) sha256=db9e4424e0e5834480385197c139cb6b0ae0ef28cc13310cfd1ca78377d59c67 + listen (3.10.0) sha256=c6e182db62143aeccc2e1960033bebe7445309c7272061979bb098d03760c9d2 literate_randomizer (0.4.0) sha256=05073c9b383983b1ed7e26c40b963468e91bc86e663b3eeff3a4af91b84217b1 logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 lograge (0.14.0) sha256=42371a75823775f166f727639f5ddce73dd149452a55fc94b90c303213dc9ae1 logstash-event (1.2.02) sha256=89a7dc60fac67070a5f60ba07409e541b09cb58906c391e90cb74b9f217467ae logster (2.20.1) sha256=a84bbe58e7f99c4eb0246ea3a952ed87950f63aeea3cdbe7147018d10cc9a2a8 - loofah (2.24.1) sha256=655a30842b70ec476410b347ab1cd2a5b92da46a19044357bbd9f401b009a337 + loofah (2.25.1) sha256=d436c73dbd0c1147b16c4a41db097942d217303e1f7728704b37e4df9f6d2e04 lru_redux (1.1.0) sha256=ee71d0ccab164c51de146c27b480a68b3631d5b4297b8ffe8eda1c72de87affb lz4-ruby (0.3.3) sha256=011be5ee230cfddc8308d4e2e0b05300c7bc755a887de799377ca6c5b6aede89 mail (2.9.0) sha256=6fa6673ecd71c60c2d996260f9ee3dd387d4673b8169b502134659ece6d34941 matrix (0.4.3) sha256=a0d5ab7ddcc1973ff690ab361b67f359acbb16958d1dc072b8b956a286564c5b maxminddb (0.1.22) sha256=50933be438fbed9dceabef4163eab41884bd8830d171fdb8f739bee769c4907e + mcp (0.8.0) sha256=ae8bd146bb8e168852866fd26f805f52744f6326afb3211e073f78a95e0c34fb memory_profiler (1.1.0) sha256=79a17df7980a140c83c469785905409d3027ca614c42c086089d128b805aa8f8 message_bus (4.5.2) sha256=f1381bce05d9560e5ea7dfa56e44dfdf0080bda0ac02f4011eb662bb7dd9e778 messageformat-wrapper (1.1.0) sha256=ecea879626e412d1bc841c457dacfcbb1a62cf88ca83573e4ea34bb371f160bc method_source (1.1.0) sha256=181301c9c45b731b4769bc81e8860e72f9161ad7d66dd99103c9ab84f560f5c5 mime-types (3.7.0) sha256=dcebf61c246f08e15a4de34e386ebe8233791e868564a470c3fe77c00eed5e56 - mime-types-data (3.2025.0924) sha256=f276bca15e59f35767cbcf2bc10e023e9200b30bd6a572c1daf7f4cc24994728 + mime-types-data (3.2026.0303) sha256=164af1de5824c5195d4b503b0a62062383b65c08671c792412450cd22d3bc224 mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef - mini_racer (0.19.2) sha256=ef3328e7e164d5ef2d38bb25d0da0fde3a9199a6f467461dd5f5e0b6443dd7ef + mini_racer (0.20.0) sha256=860e944c20894413c0e4921f8531166b22180d988e75a5dc152be9505da91ff2 mini_scheduler (0.18.0) sha256=d2f084f38da8d76c5844a92f0d6bd01fc9982a8b5e6c7679b6cf44c82da33503 mini_sql (1.6.0) sha256=5296637f6a4af5bb43e06788037e9a2968ff9c8eb65928befcba8cb41f42d6ee mini_suffix (0.3.3) sha256=8d1d33f92f69a2247c9b7d27173235da90479d955cdb863b63a7f53843b722e7 minio_runner (1.0.0) sha256=ca0fc56a90c63b65a26cda632938c9075046835d41f4b9d1e165b0550eae0538 - minitest (5.26.2) sha256=f021118a6185b9ba9f5af71f2ba103ad770c75afde9f2ab8da512677c550cde3 - mocha (2.8.2) sha256=1f77e729db47e72b4ef776461ce20caeec2572ffdf23365b0a03608fee8f4eee + minitest (6.0.2) sha256=db6e57956f6ecc6134683b4c87467d6dd792323c7f0eea7b93f66bd284adbc3d + mocha (3.1.0) sha256=75f42d69ebfb1f10b32489dff8f8431d37a418120ecdfc07afe3bc183d4e1d56 msgpack (1.8.0) sha256=e64ce0212000d016809f5048b48eb3a65ffb169db22238fb4b72472fecb2d732 multi_json (1.18.0) sha256=23f70cf73e2895a33e6d10f0ec955b28ef5627ca4bbad0f292e7d16f4675596f - multi_xml (0.7.2) sha256=307a96dc48613badb7b2fc174fd4e62d7c7b619bc36ea33bfd0c49f64f5787ce + multi_xml (0.8.1) sha256=addba0290bac34e9088bfe73dc4878530297a82a7bbd66cb44dcd0a4b86edf5a multipart-post (2.4.1) sha256=9872d03a8e552020ca096adadbf5e3cb1cd1cdd6acd3c161136b8a5737cdb4a8 - mustache (1.1.1) sha256=90891fdd50b53919ca334c8c1031eada1215e78d226d5795e523d6123a2717d0 - net-http (0.8.0) sha256=df42c47ce9f9e95ad32a317c97c12f945bc1af365288837ea4ff259876ecb46d + mustache (1.1.2) sha256=d420243400354da78ded2d81541b381ad8d94e8e9b95022d0d71d66f8ef36c00 + net-http (0.9.1) sha256=25ba0b67c63e89df626ed8fac771d0ad24ad151a858af2cc8e6a716ca4336996 net-imap (0.5.12) sha256=cb8cd05bd353fcc19b6cbc530a9cb06b577a969ea10b7ddb0f37787f74be4444 net-pop (0.1.2) sha256=848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3 net-protocol (0.2.2) sha256=aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8 @@ -1110,30 +1117,29 @@ CHECKSUMS optimist (3.2.1) sha256=8cf8a0fd69f3aa24ab48885d3a666717c27bc3d9edd6e976e18b9d771e72e34e ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130 - parallel_tests (5.5.0) sha256=783c1e4da27c4096a7b360f080ae03cf1122cb0dfdb4fe827013e0521642f666 - parser (3.3.10.0) sha256=ce3587fa5cc55a88c4ba5b2b37621b3329aadf5728f9eafa36bbd121462aabd6 + parallel_tests (5.6.0) sha256=b2d7af382d1c0289daba65308d9143b3ad82d817d500c0ad1b4bde468beb13af + parser (3.3.10.2) sha256=6f60c84aa4bdcedb6d1a2434b738fe8a8136807b6adc8f7f53b97da9bc4e9357 pastel (0.8.0) sha256=481da9fb7d2f6e6b1a08faf11fa10363172dc40fd47848f096ae21209f805a75 - pdf-reader (2.15.0) sha256=c5025750bec8de7b11cfd1d1ccc2b944d2782c3638cd15b5ee1531d1206c0886 - pg (1.6.2) sha256=58614afd405cc9c2c9e15bffe8432e0d6cfc58b722344ad4a47c73a85189c875 - pg (1.6.2-aarch64-linux) sha256=0503c6be5b0ca5ca3aaf91f2ed638f90843313cb81e8e7d7b60ad4bb62c3d131 - pg (1.6.2-aarch64-linux-musl) sha256=c4402447c56279bea80472770522e95c8a2ff49b7f3e534d0cdb01eb27fd6eb8 - pg (1.6.2-arm64-darwin) sha256=4d44500b28d5193b26674583d199a6484f80f1f2ea9cf54f7d7d06a1b7e316b6 - pg (1.6.2-x86_64-darwin) sha256=c441a55723584e2ae41749bf26024d7ffdfe1841b442308ed50cd6b7fda04115 - pg (1.6.2-x86_64-linux) sha256=525f438137f2d1411a1ebcc4208ec35cb526b5a3b285a629355c73208506a8ea - pg (1.6.2-x86_64-linux-musl) sha256=e5c8668ffeaf7a9c3458a3dcb002dffa6d8ee1fca9ae534ffef861d2b15644ca - pitchfork (0.18.1) sha256=98f294024352c208d28732f7c009eed0d9ccae48d878a3b42722687338713059 - playwright-ruby-client (1.57.0) sha256=978bd6a25a0e85c633216bf0d73e050217ca640025b8258caf6ea8034f3e9ef4 + pdf-reader (2.15.1) sha256=18c6a986a84a3117fa49f4279fc2de51f5d2399b71833df5d2bccd595c7068ce + pg (1.6.3) sha256=1388d0563e13d2758c1089e35e973a3249e955c659592d10e5b77c468f628a99 + pg (1.6.3-aarch64-linux) sha256=0698ad563e02383c27510b76bf7d4cd2de19cd1d16a5013f375dd473e4be72ea + pg (1.6.3-aarch64-linux-musl) sha256=06a75f4ea04b05140146f2a10550b8e0d9f006a79cdaf8b5b130cde40e3ecc2c + pg (1.6.3-arm64-darwin) sha256=7240330b572e6355d7c75a7de535edb5dfcbd6295d9c7777df4d9dddfb8c0e5f + pg (1.6.3-x86_64-darwin) sha256=ee2e04a17c0627225054ffeb43e31a95be9d7e93abda2737ea3ce4a62f2729d6 + pg (1.6.3-x86_64-linux) sha256=5d9e188c8f7a0295d162b7b88a768d8452a899977d44f3274d1946d67920ae8d + pg (1.6.3-x86_64-linux-musl) sha256=9c9c90d98c72f78eb04c0f55e9618fe55d1512128e411035fe229ff427864009 + pitchfork (0.18.2) sha256=95d0b5a25792ebc94d627abd8a206652ff22acff1cc32ecd42c71669ead4ab94 + playwright-ruby-client (1.58.1) sha256=0678b227eb469c551858784441891577b402163e9b2d50bddce4a5a904e3a5ca pp (0.6.3) sha256=2951d514450b93ccfeb1df7d021cae0da16e0a7f95ee1e2273719669d0ab9df6 prettier_print (1.2.1) sha256=a72838b5f23facff21f90a5423cdcdda19e4271092b41f4ea7f50b83929e6ff9 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 - prism (1.6.0) sha256=bfc0281a81718c4872346bc858dc84abd3a60cae78336c65ad35c8fbff641c6b + prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 progress (3.6.0) sha256=360ed306dfa43d6174e847d563c70736dca249e2333cfec4b0387306c86cd573 propshaft (1.3.1) sha256=9acc664ef67e819ffa3d95bd7ad4c3623ea799110c5f4dee67fa7e583e74c392 - pry (0.15.2) sha256=12d54b8640d3fa29c9211dd4ffb08f3fd8bf7a4fd9b5a73ce5b59c8709385b6b + pry (0.16.0) sha256=d76c69065698ed1f85e717bd33d7942c38a50868f6b0673c636192b3d1b6054e pry-rails (0.3.11) sha256=a69e28e24a34d75d1f60bcf241192a54253f8f7ef8a62cba1e75750a9653593d - pry-stack_explorer (0.6.1) sha256=a2dbea9b47c4ad00cf5c1ce21499f8128b915089e90015f7bafb6e9453baf340 - psych (5.2.6) sha256=814328aa5dcb6d604d32126a20bc1cbcf05521a5b49dbb1a8b30a07e580f316e - public_suffix (7.0.0) sha256=f7090b5beb0e56f9f10d79eed4d5fbe551b3b425da65877e075dad47a6a1b095 + psych (5.3.1) sha256=eb7a57cef10c9d70173ff74e739d843ac3b2c019a003de48447b2963d81b1974 + public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 puma (7.1.0) sha256=e45c10cb124f224d448c98db653a75499794edbecadc440ad616cf50f2fd49dd racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f rack (2.2.22) sha256=c5cf0b7f872559966d974abe3101a57d51caf12504ee76290b98720004f64542 @@ -1143,24 +1149,24 @@ CHECKSUMS rack-test (2.2.0) sha256=005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463 rackup (1.0.1) sha256=ba86604a28989fe1043bff20d819b360944ca08156406812dca6742b24b3c249 rails-dom-testing (2.3.0) sha256=8acc7953a7b911ca44588bf08737bc16719f431a1cc3091a292bca7317925c1d - rails-html-sanitizer (1.6.2) sha256=35fce2ca8242da8775c83b6ba9c1bcaad6751d9eb73c1abaa8403475ab89a560 + rails-html-sanitizer (1.7.0) sha256=28b145cceaf9cc214a9874feaa183c3acba036c9592b19886e0e45efc62b1e89 rails_failover (2.3.0) sha256=eed6ea0674fd6f9f6b070ad297ad2ead121ecf9202920f6068b6a4f29d9491c9 rails_multisite (7.0.0) sha256=7aacf364ed86d2bee73fb679cbfe6c343ce89067b9746b3d5857fffc57f036f2 railties (8.0.4) sha256=8203d853dcffab4abcdd05c193f101676a92068075464694790f6d8f72d5cb47 rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a raindrops (0.20.1) sha256=aa0eb9ff6834f2d9e232ba688bd49cb30be893bc5a3452e74722c94c1fab4730 rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c - rake-compiler-dock (1.10.0) sha256=dd62ee19df2a185a3315697e560cfa8cc9129901332152851e023fab0e94bf11 + rake-compiler-dock (1.11.0) sha256=eab51f2cd533eb35cea6b624a75281f047123e70a64c58b607471bb49428f8c2 rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e - rb_sys (0.9.119) sha256=64393fa148e402e1b79b64496d2aabfc7df79da6b822b8bb48dc1141eaf40b4b - rbs (3.9.5) sha256=eabaaf60aee84e38cbf94839c6e1b9cd145c7295fc3cc0e88c92e4069b1119b0 + rb_sys (0.9.124) sha256=513476557b12eaf73764b3da9f8746024558fe8699bda785fb548c9aa3877ae7 + rbs (4.0.0) sha256=b700e75a8ea721a66b94c4e3af7df26d1e61a786d1205d0b8de93828718c4771 rbtrace (0.5.3) sha256=c432292f305d9ab12fd47d9722e0d5210d983758a951fe6107c36cc955cb923f rchardet (1.10.0) sha256=d5ea2ed61a720a220f1914778208e718a0c7ed2a484b6d357ba695aa7001390f - rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7 + rdoc (7.2.0) sha256=8650f76cd4009c3b54955eb5d7e3a075c60a57276766ebf36f9085e8c9f23192 redcarpet (3.6.1) sha256=d444910e6aa55480c6bcdc0cdb057626e8a32c054c29e793fa642ba2f155f445 redis (5.4.0) sha256=798900d869418a9fc3977f916578375b45c38247a556b61d58cba6bb02f7d06b - redis-client (0.26.1) sha256=1e39d2862c4516a75ff777ee6ed08827af39336bfece4a48e944244891d9a073 + redis-client (0.27.0) sha256=00e5918c1ba3fcd54b28e7be24b36fbf7b073e842c3c021ac072173c3eac42bd redis-namespace (1.11.0) sha256=e91a1aa2b2d888b6dea1d4ab8d39e1ae6fac3426161feb9d91dd5cca598a2239 regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4 reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835 @@ -1169,35 +1175,36 @@ CHECKSUMS rinku (2.0.6) sha256=8b60670e3143f3db2b37efa262971ce3619ec23092045498ef9f077d82828d7d rotp (6.3.0) sha256=75d40087e65ed0d8022c33055a6306c1c400d1c12261932533b5d6cbcd868854 rouge (4.7.0) sha256=dba5896715c0325c362e895460a6d350803dbf6427454f49a47500f3193ea739 - rqrcode (3.1.1) sha256=4c2e1e36dab80720062388cfc827986ab622dc652437214a5fb6382985b6f00f - rqrcode_core (2.0.1) sha256=52f76d97ec837fa91b15a15a95c5c2740b22d722db5d6b071f76d4b40a3ba98a + rqrcode (3.2.0) sha256=64c1494ca6bb67d731330f38b50e3fd09eeab4f5dcd04b608e21218d1d0b9542 + rqrcode_core (2.1.0) sha256=f303b85df89c1b8fc5ee8dc19808c9dc4330e6329b660d99d4a8cbb36ca13051 rrule (0.7.0) sha256=816b6ac33c5705addfe25de3c3de05003ae68ae2ca02cf5c0e805ee387851f87 rspec (3.13.2) sha256=206284a08ad798e61f86d7ca3e376718d52c0bc944626b2349266f239f820587 rspec-core (3.13.6) sha256=a8823c6411667b60a8bca135364351dda34cd55e44ff94c4be4633b37d828b2d rspec-expectations (3.13.5) sha256=33a4d3a1d95060aea4c94e9f237030a8f9eae5615e9bd85718fe3a09e4b58836 rspec-html-matchers (0.10.0) sha256=d424bfeb0104884478be299b6695b56c2d0432bb77dc9cedecb5138e91c0e9ae - rspec-mocks (3.13.7) sha256=0979034e64b1d7a838aaaddf12bf065ea4dc40ef3d4c39f01f93ae2c66c62b1c + rspec-mocks (3.13.8) sha256=086ad3d3d17533f4237643de0b5c42f04b66348c28bf6b9c2d3f4a3b01af1d47 rspec-multi-mock (0.3.1) sha256=289470f28d1d9dcdecabf70e9a14f97b0dc7e3dba090dfbe4c98c64ebd53794c - rspec-rails (8.0.2) sha256=113139a53f5d068d4f48d1c29ad5f982013ed9b0daa69d7f7b266eda5d433ace - rspec-support (3.13.6) sha256=2e8de3702427eab064c9352fe74488cc12a1bfae887ad8b91cba480ec9f8afb2 - rss (0.3.1) sha256=b46234c04551b925180f8bedfc6f6045bf2d9998417feda72f300e7980226737 + rspec-rails (8.0.4) sha256=06235692fc0892683d3d34977e081db867434b3a24ae0dd0c6f3516bad4e22df + rspec-support (3.13.7) sha256=0640e5570872aafefd79867901deeeeb40b0c9875a36b983d85f54fb7381c47c + rss (0.3.2) sha256=3bd0446d32d832cda00ba07f4b179401f903b52ea1fdaac0f1f08de61a501efa rswag-specs (2.17.0) sha256=a3b2bdf6df89f8741fe4a4ee47ceb1e77dc13e1c96bbe07352117d6e61afa9e3 rtlcss (0.2.1) sha256=213d5a00bf61267f93a7a516d699d77e1cc5f396743abb33c01e3f3243a7bf60 - rubocop (1.81.7) sha256=6fb5cc298c731691e2a414fe0041a13eb1beed7bab23aec131da1bcc527af094 - rubocop-ast (1.48.0) sha256=22df9bbf3f7a6eccde0fad54e68547ae1e2a704bf8719e7c83813a99c05d2e76 + rubocop (1.85.1) sha256=3dbcf9e961baa4c376eeeb2a03913dca5e3987033b04d38fa538aa1e7406cc77 + rubocop-ast (1.49.1) sha256=4412f3ee70f6fe4546cc489548e0f6fcf76cafcfa80fa03af67098ffed755035 rubocop-capybara (2.22.1) sha256=ced88caef23efea53f46e098ff352f8fc1068c649606ca75cb74650970f51c0c - rubocop-discourse (3.13.3) sha256=637395e37ac45f0c5ba4376d7648b5f1e3a8406697c38befb66a9729738a059f + rubocop-discourse (3.16.0) sha256=a5119262b62d727226c40661649dc937e80cb3e92b4b652fd44e04cd73930da0 + rubocop-discourse-base (1.0.0) sha256=a4121f0f2a8e32c3259fee22106af9fd35372cbeac14b0c69673bdee79b472b7 rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb - rubocop-rails (2.33.4) sha256=34ec8f6637706dc224483d949ccc88b3e41596a81a11a1ec0c7d74ecbea356b5 - rubocop-rspec (3.8.0) sha256=28440dccb3f223a9938ca1f946bd3438275b8c6c156dab909e2cb8bc424cab33 + rubocop-rails (2.34.3) sha256=10d37989024865ecda8199f311f3faca990143fbac967de943f88aca11eb9ad2 + rubocop-rspec (3.9.0) sha256=8fa70a3619408237d789aeecfb9beef40576acc855173e60939d63332fdb55e2 rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 - ruby-lsp (0.26.4) sha256=1cb3046a066c8f1983dfe5f0cd3baa76034d6ba156e8ab460b15ab129d37a9f7 + ruby-lsp (0.26.8) sha256=fa607c342736c6ea791c945ae05025bc306ef9dd72c640b0b660478c5832f968 ruby-lsp-rails (0.4.8) sha256=f09d1f926d4063deeb2f3049311925c20dfe6c912371e3bcd04a265a865c44ae - ruby-lsp-rspec (0.1.28) sha256=0db3b3ffba08c6d70eb7831e79090a1863f572fe131ed0ecfce8a2f7d01bf491 - ruby-prof (1.7.2) sha256=270424fcac37e611f2d15a55226c4628e234f8434e1d7c25ca8a2155b9fc4340 + ruby-lsp-rspec (0.1.29) sha256=798be579723376cd56b17d32373288fb1163e4cfe2024c7d068516a1cf214ee5 + ruby-prof (2.0.4) sha256=42190ff6870e055a9d58b39df63e83442113ef7169c0e27b599942c3f15d1435 ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby-rc4 (0.1.5) sha256=00cc40a39d20b53f5459e7ea006a92cf584e9bc275e2a6f7aa1515510e896c03 - ruby-readability (0.7.2) sha256=7351ddc89ac62ecdd35336acb1313ac29dc1dad9745d59f25109ec2215c6580c + ruby-readability (0.7.3) sha256=bd213fab037118cc15d999e167a8ea2cc6b689dc78c033e78fb36a2a37efc241 ruby2_keywords (0.0.5) sha256=ffd13740c573b7301cf7a2e61fc857b2a8e3d3aff32545d6f8300d8bae10e3ef rubyzip (2.4.1) sha256=8577c88edc1fde8935eb91064c5cb1aef9ad5494b940cf19c775ee833e075615 sanitize (7.0.0) sha256=269d1b9d7326e69307723af5643ec032ff86ad616e72a3b36d301ac75a273984 @@ -1213,27 +1220,27 @@ CHECKSUMS sawyer (0.9.3) sha256=0d0f19298408047037638639fe62f4794483fb04320269169bd41af2bdcf5e41 securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1 shoulda-matchers (7.0.1) sha256=b4bfd8744c10e0a36c8ac1a687f921ee7e25ed529e50488d61b79a8688749c77 - sidekiq (7.3.9) sha256=1108712e1def89002b28e3545d5ae15d4a57ffd4d2c25d97bb1360988826b5a7 + sidekiq (7.3.10) sha256=781eb4f65ef36042534ad73d72f211283afb7fee82eec786ada4ed1972ef8e3c simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246 simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428 simpleidn (0.2.3) sha256=08ce96f03fa1605286be22651ba0fc9c0b2d6272c9b27a260bc88be05b0d2c29 snaky_hash (2.0.3) sha256=25a3d299566e8153fb02fa23fd9a9358845950f7a523ddbbe1fa1e0d79a6d456 - sqlite3 (2.8.1-aarch64-linux-gnu) sha256=9bce166d3e3595a42fc92c28d986ea11d499b55be8bd1cd491be04af30029543 - sqlite3 (2.8.1-aarch64-linux-musl) sha256=34912f6acf3e9c43c7998c6f99ba3146708e654cf9716b2983e260315cdeed72 - sqlite3 (2.8.1-arm-linux-gnu) sha256=9118d6abb5ca7ea4f1b50a6c42c763e612670f5eb673bbdf12e8d3bd63339bde - sqlite3 (2.8.1-arm-linux-musl) sha256=48a50815521f812713310190589a8ae196fa48b70b62b72f5766bafebae77e33 - sqlite3 (2.8.1-arm64-darwin) sha256=3cb617640577ec9c1b7c09744d1e368ad3d3851c2494540f5f007387da943477 - sqlite3 (2.8.1-x86_64-darwin) sha256=0028f5dd0b7a1ee6f1dadf31fc632abf7d815cb0baa0606549634fa45578f92e - sqlite3 (2.8.1-x86_64-linux-gnu) sha256=878f4a0c5c2c4d9d4345afe2a142a87805f388a24aa8a3c2dfe2f964d7686b7a - sqlite3 (2.8.1-x86_64-linux-musl) sha256=0c191ddfd71437b439e107a0d148630bef29a1eebd7b28bcc931470c328f657d + sqlite3 (2.9.2-aarch64-linux-gnu) sha256=eeb86db55645b85327ba75129e3614658d974bf4da8fdc87018a0d42c59f6e42 + sqlite3 (2.9.2-aarch64-linux-musl) sha256=4feff91fb8c2b13688da34b5627c9d1ed9cedb3ee87a7114ec82209147f07a6d + sqlite3 (2.9.2-arm-linux-gnu) sha256=1ee2eb06b5301aaf5ce343a6e88d99ac932d95202d7b350f0e7b6d8d588580d7 + sqlite3 (2.9.2-arm-linux-musl) sha256=8ca0de6aceede968de0394e22e95d549834c4d8e318f69a92a52f049878a0057 + sqlite3 (2.9.2-arm64-darwin) sha256=d15bd9609a05f9d54930babe039585efc8cadd57517c15b64ec7dfa75158a5e9 + sqlite3 (2.9.2-x86_64-darwin) sha256=ed691b5021674d72582d03c5a38e89634b961902735fb6225273892805421d13 + sqlite3 (2.9.2-x86_64-linux-gnu) sha256=dce83ffcb7e72f9f7aeb6e5404f15d277a45332fe18ccce8a8b3ed51e8d23aee + sqlite3 (2.9.2-x86_64-linux-musl) sha256=e8dd906a613f13b60f6d47ae9dda376384d9de1ab3f7e3f2fdf2fd18a871a2d7 sshkey (3.0.0) sha256=655ba351d6e01a48dfe59d65530af8975c777b8cc57a061770de3228ff2d11cd - stackprof (0.2.27) sha256=aff6d28656c852e74cf632cc2046f849033dc1dedffe7cb8c030d61b5745e80c - stringio (3.1.9) sha256=c111af13d3a73eab96a3bc2655ecf93788d13d28cb8e25c1dcbff89ace885121 + stackprof (0.2.28) sha256=4ec2ace02f386012b40ca20ef80c030ad711831f59511da12e83b34efb0f9a04 + stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 stripe (11.1.0) sha256=a76e82cc7e4d2433803ca5fbe9453d019df376236f0b9fbcb7f36e6dd327f98d syntax_tree (6.3.0) sha256=56e25a9692c798ec94c5442fe94c5e94af76bef91edc8bb02052cbdecf35f13d - test-prof (1.5.0) sha256=da487be26216fdd2cf3a4901c9a3e63c8af87964aa28740757f9c26a4cd4eae8 - thor (1.4.0) sha256=8763e822ccb0f1d7bee88cde131b19a65606657b847cc7b7b4b82e772bcd8a3d + test-prof (1.5.2) sha256=185839fb7d3745b3770ec48e3e5718eff9e28c327a50a1e18a3a9ef1060f8576 + thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 tiktoken_ruby (0.0.15.1-aarch64-linux) sha256=e2c5d00b20c10bd220a103a271011bfa828e159cfba3b99d2c4029069bbb9198 tiktoken_ruby (0.0.15.1-aarch64-linux-musl) sha256=2b58d9f2b0615d876a767b756c117b1438e68354513aff3d540b665b8eb6559c tiktoken_ruby (0.0.15.1-arm-linux) sha256=078faa950c93ec0929d6f70acc7f7374b044cb2561ee74fccf8ffbaf71068ed9 @@ -1241,7 +1248,7 @@ CHECKSUMS tiktoken_ruby (0.0.15.1-x86_64-darwin) sha256=e7978a186e548c7c81ac5183f5ed2b57c69924aeec5d0a1ce2222892628fdab1 tiktoken_ruby (0.0.15.1-x86_64-linux) sha256=cc53f9c43e8a4d434831b5a5b10d94d4eb07ad15d0582d568e0e9c8293447dfc tiktoken_ruby (0.0.15.1-x86_64-linux-musl) sha256=84c8fe1a94732cb241a3f353d2c191df56c6242614237d2433e510d8fab3ee26 - timeout (0.5.0) sha256=852aefd13f41d84c2d0d83099b275034c6517395884b58e635acc8847c9190cb + timeout (0.6.1) sha256=78f57368a7e7bbadec56971f78a3f5ecbcfb59b7fcbb0a3ed6ddc08a5094accb tokenizers (0.6.3) sha256=cb76b8e86893695f6cfe661861cb24680755bf1fb42dca1ddd3cdfef9f657994 tokenizers (0.6.3-aarch64-linux) sha256=9d54a23f2e2246cc942d183af4549e3972b937d9b01f7a387cb146bf698eee84 tokenizers (0.6.3-aarch64-linux-musl) sha256=c178d8556769256857d77fb396f8ab004b29d058f59c620a2cfc56b01b501e27 @@ -1249,7 +1256,7 @@ CHECKSUMS tokenizers (0.6.3-x86_64-darwin) sha256=4b71386cc08ceff5f86b448c74b2b297c00a280a1d502399b6cda23ef94e01fd tokenizers (0.6.3-x86_64-linux) sha256=77a45cbde59daac33bdda1a74d45c18080478992a00ee7d898e7b8d15d0b3149 tokenizers (0.6.3-x86_64-linux-musl) sha256=a4b08c53bf0c8f7674c3abd03e013f0bb7c0c2457174b116c2872a37c64f0297 - trilogy (2.9.0) sha256=a2d63b663ba68a4758e15d1f9afb228f5d16efc7fe7cea68699e1c106ef6067f + trilogy (2.10.0) sha256=b58ed5fe568bbcccc1f0423bf654bb2af329c6dabb21453fb7481f76808edc93 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f ttfunk (1.8.0) sha256=a7cbc7e489cc46e979dde04d34b5b9e4f5c8f1ee5fc6b1a7be39b829919d20ca tty-color (0.6.0) sha256=6f9c37ca3a4e2367fb2e6d09722762647d6f455c111f05b59f35730eeb24332a @@ -1258,10 +1265,10 @@ CHECKSUMS tty-reader (0.9.0) sha256=c62972c985c0b1566f0e56743b6a7882f979d3dc32ff491ed490a076f899c2b1 tty-screen (0.8.2) sha256=c090652115beae764336c28802d633f204fb84da93c6a968aa5d8e319e819b50 tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b - tzinfo-data (1.2025.2) sha256=a92375a1fbb47d38fe88fd514c40a38cc8f97d168da2a6479f15185e86470939 + tzinfo-data (1.2026.1) sha256=4ea36519ae5ae2cf0fad471207a519be006daf42e3b2359ee9e9c53f113609fd unf (0.2.0) sha256=e6bcc2e101d80e3f9459753db747d5926aada1aaaf61e629e93359da9a5b04ab unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 - unicode-emoji (4.1.0) sha256=4997d2d5df1ed4252f4830a9b6e86f932e2013fbff2182a9ce9ccabda4f325a5 + unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f unicorn (6.1.0) sha256=45dd987add4c2b084c1880a68373af42797a704ad7441faff9b14b4982aa0fc0 uniform_notifier (1.18.0) sha256=4787785556f66f6418486da0f1d78b3239aaff98e2e7938fb05e2062b0ffce9d uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6 @@ -1274,7 +1281,7 @@ CHECKSUMS xpath (3.2.0) sha256=6dfda79d91bb3b949b947ecc5919f042ef2f399b904013eb3ef6d20dd3a4082e yaml-lint (0.1.2) sha256=e3960b171766ae187338a169815e99fe10fcb0d9c22b1c539e8d57e114324c8a yard (0.9.38) sha256=721fb82afb10532aa49860655f6cc2eaa7130889df291b052e1e6b268283010f - zeitwerk (2.7.3) sha256=b2e86b4a9b57d26ba68a15230dcc7fe6f040f06831ce64417b0621ad96ba3e85 + zeitwerk (2.7.5) sha256=d8da92128c09ea6ec62c949011b00ed4a20242b255293dd66bf41545398f73dd zendesk_api (1.38.0.rc1) sha256=9ebe2575d223ed1c0651b2d10df6c010141cda49d524c38532b472f7e8bb3f7a RUBY VERSION diff --git a/README.md b/README.md index 11fd0c00bf764..0b3d7cb7fc89b 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ We look forward to seeing your pull requests! We take security very seriously at Discourse; all our code is 100% open source and peer reviewed. Please read [our security guide](https://github.com/discourse/discourse/blob/main/docs/SECURITY.md) for an overview of security measures in Discourse, or if you wish to report a security issue. -Security fixes are listed in the [release notes](https://meta.discourse.org/tags/c/announcements/67/release-notes) for each version. +Security fixes are listed in the [release notes](https://releases.discourse.org) for each version. ## The Discourse Team diff --git a/app/assets/stylesheets/admin/admin_base.scss b/app/assets/stylesheets/admin/admin_base.scss index 77121fc1273ce..3b96756ec5316 100644 --- a/app/assets/stylesheets/admin/admin_base.scss +++ b/app/assets/stylesheets/admin/admin_base.scss @@ -910,7 +910,7 @@ $mobile-breakpoint: 700px; background-color: var(--secondary); margin-left: 0; border-left: solid 1px var(--content-border-color); - padding: 30px 0 90px 30px; + padding: 30px 0 0 30px; width: 82%; box-sizing: border-box; diff --git a/app/assets/stylesheets/admin/admin_config_area.scss b/app/assets/stylesheets/admin/admin_config_area.scss index c7d9496574d66..7f076b729f0c4 100644 --- a/app/assets/stylesheets/admin/admin_config_area.scss +++ b/app/assets/stylesheets/admin/admin_config_area.scss @@ -125,7 +125,8 @@ flex-direction: column; width: calc(100% - 1em); border: 1px solid var(--content-border-color); - padding: 0.5em; + padding: var(--space-4); + border-radius: var(--d-border-radius); @media (max-width: $mobile-breakpoint) { flex-direction: column; diff --git a/app/assets/stylesheets/admin/admin_new_category_setup.scss b/app/assets/stylesheets/admin/admin_new_category_setup.scss index 5dc50b57f9bda..277acdd338172 100644 --- a/app/assets/stylesheets/admin/admin_new_category_setup.scss +++ b/app/assets/stylesheets/admin/admin_new_category_setup.scss @@ -1,68 +1,94 @@ -.admin-new-category-setup { - max-width: 600px; - margin: 0 auto; +@use "lib/viewport"; +.admin-new-category-setup { .category-type-cards { - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 1em; - margin-top: 1em; + display: flex; + flex-direction: column; + gap: var(--space-6); + margin-top: var(--space-8); &__card { - display: flex; - flex-direction: column; - align-items: center; - gap: 0.5em; - padding: 2em 1.5em; + position: relative; border: 1px solid var(--primary-low); border-radius: var(--d-border-radius); - background: var(--secondary); - cursor: pointer; - transition: border-color 0.15s; - text-align: center; + + &-select { + all: unset; // reset browser button styles + width: 100%; + display: grid; + grid-template-areas: "icon title" "icon description"; + grid-template-columns: auto 1fr; + cursor: pointer; + text-align: left; + gap: 0 var(--space-6); + padding: var(--space-9) 0 var(--space-9); + + @include viewport.from(sm) { + padding: var(--space-8) 0 var(--space-9); + gap: 0 var(--space-8); + } + } + + &-icon { + grid-area: icon; + font-size: 2.75em; + margin-top: -0.1em; + padding-left: var(--space-6); + } + + &-name { + grid-area: title; + font-size: var(--font-up-1); + font-weight: bold; + } + + &-description { + grid-area: description; + color: var(--primary-high); + } + + &-bottom { + display: flex; + } &:hover, &:focus-visible { border-color: var(--tertiary); - outline: none; } &.--unavailable { - opacity: 0.5; - cursor: not-allowed; + padding-bottom: 0; + + .category-type-cards__card-select { + cursor: not-allowed; + } &:hover, &:focus-visible { border-color: var(--primary-low); } - } - } - &__card-icon { - font-size: var(--font-up-4); - color: var(--tertiary); + [class^="category-type-cards__card-"] { + opacity: 0.5; + } - .--unavailable & { - color: var(--primary-medium); + .category-type-cards__card-bottom, + .category-type-cards__card-badge { + opacity: 1; + } } } - &__card-name { - font-weight: 700; - font-size: var(--font-up-1); - } - - &__card-description { - font-size: var(--font-down-1); - color: var(--primary-medium); - } - &__card-badge { + position: absolute; + right: 0; + top: 0; font-size: var(--font-down-2); - color: var(--primary-medium); - background: var(--primary-very-low); - padding: 0.15em 0.5em; - border-radius: var(--d-border-radius); + color: var(--primary); + padding: var(--space-1) var(--space-2); + background: var(--highlight-low); + border-radius: 0 calc(var(--d-border-radius) - 1px) 0 + var(--d-border-radius); } } } diff --git a/app/assets/stylesheets/admin/admin_report.scss b/app/assets/stylesheets/admin/admin_report.scss index 910bc79cfc95c..7b0d857cb4dfb 100644 --- a/app/assets/stylesheets/admin/admin_report.scss +++ b/app/assets/stylesheets/admin/admin_report.scss @@ -1,6 +1,17 @@ @use "lib/viewport"; .admin-report { + .select-kit { + @include viewport.from(sm) { + width: auto; + max-width: 250px; + } + + @include viewport.until(sm) { + width: 100% !important; + } + } + .conditional-loading-section { &.is-loading { margin: 0; @@ -10,9 +21,7 @@ .header { display: flex; align-items: center; - border-bottom: 1px solid var(--content-border-color); margin-bottom: 0.5em; - padding-bottom: 0.5em; } .header .breadcrumb { @@ -79,17 +88,11 @@ } } - .body { - display: flex; - flex-direction: row; - } - - .main { - flex: 1; - min-width: 0; // allow chart.js to shrink below intrinsic width + .d-page-subheader__title a { + color: var(--primary); } - .main .report-alert { + .report-alert { margin: 0; text-align: center; padding: 3em; @@ -123,6 +126,18 @@ color: var(--danger); } } +} + +body:not(.uc-reporting-improvements) .admin-report { + .body { + display: flex; + flex-direction: row; + } + + .main { + flex: 1; + min-width: 0; // allow chart.js to shrink below intrinsic width + } .average-chart { font-style: italic; @@ -187,10 +202,6 @@ } } } - - .d-page-subheader__title a { - color: var(--primary); - } } .rtl .admin-report { diff --git a/app/assets/stylesheets/admin/admin_report_chart.scss b/app/assets/stylesheets/admin/admin_report_chart.scss index f39e2f9aa6908..0f7598f302f53 100644 --- a/app/assets/stylesheets/admin/admin_report_chart.scss +++ b/app/assets/stylesheets/admin/admin_report_chart.scss @@ -1,3 +1,5 @@ +@use "lib/viewport"; + .admin-report-chart { animation: fadein 2s; @@ -5,3 +7,151 @@ animation-duration: 0s; } } + +body.uc-reporting-improvements .admin-contents:not(.dashboard) .chart { + &__wrapper { + display: flex; + flex-direction: column; + } + + &__body { + margin-block: var(--space-4); + flex: 1; + min-width: 0; // allow chart.js to shrink below intrinsic width + + .report-alert { + margin: 0; + text-align: center; + padding: 3em; + border: 1px solid transparent; + + a { + color: var(--primary-high); + } + + .d-icon { + color: var(--primary-medium); + font-size: var(--font-up-5); + display: block; + margin: 0.25em auto; + } + + &.no-data, + &.rate-limited { + background: var(--secondary); + border-color: var(--primary-low); + color: var(--primary); + } + + &.rate-limited .d-icon { + color: var(--danger); + } + + &.timeout, + &.exception { + border-color: var(--danger-low); + color: var(--danger); + } + } + + .average-chart { + font-style: italic; + color: var(--primary-high); + text-align: right; + } + } + + &__filters { + display: flex; + align-items: flex-start; // aligned to top to provide alignment when subcat checkbox is in play + gap: var(--space-2); + margin-bottom: var(--space-4); + + @include viewport.until(sm) { + flex-direction: column; + align-items: stretch; + } + + .chart-groupings { + display: flex; + gap: var(--space-2); + background-color: var(--primary-very-low); + border-radius: var(--d-border-radius-large); + padding: var(--space-1) var(--space-2); + + @include viewport.from(sm) { + margin-right: auto; + } + + .chart-grouping { + border-radius: var(--d-border-radius-large); + background: transparent; + + @include viewport.until(sm) { + flex-grow: 1; + } + + &:hover { + background: transparent; + color: var(--primary); + } + + &.active { + background: var(--secondary); + box-shadow: var(--shadow-card); + } + } + } + } + + &__filter-label { + margin-top: var(--space-1); + } + + &__additional-filters { + display: flex; + gap: var(--space-2); + + @include viewport.until(sm) { + flex-direction: column; + } + } + + &__dates { + .d-date-time-input-range { + display: flex; + gap: var(--space-2); + + > * { + margin: 0; + } + } + + .d-date-time-input { + @include viewport.until(sm) { + flex-grow: 1; + } + } + } + + &__actions { + display: flex; + gap: var(--space-4); + justify-content: flex-end; + margin-top: var(--space-4); + } + + &__modes { + list-style: none; + margin-right: auto; + + .mode { + display: inline-flex; + flex: 1 0 0px; + + .mode-btn.is-current { + color: var(--tertiary); + } + } + } +} diff --git a/app/assets/stylesheets/admin/admin_report_stacked_chart.scss b/app/assets/stylesheets/admin/admin_report_stacked_chart.scss index e6e0267ac01bc..55a26ec4b2391 100644 --- a/app/assets/stylesheets/admin/admin_report_stacked_chart.scss +++ b/app/assets/stylesheets/admin/admin_report_stacked_chart.scss @@ -1,4 +1,4 @@ -.admin-report-stacked-chart { +body:not(.uc-reporting-improvements) .admin-report-stacked-chart { .chart-canvas-container { height: 250px; } diff --git a/app/assets/stylesheets/admin/admin_reports.scss b/app/assets/stylesheets/admin/admin_reports.scss index 6e2f7a31da7df..83fd5878edf27 100644 --- a/app/assets/stylesheets/admin/admin_reports.scss +++ b/app/assets/stylesheets/admin/admin_reports.scss @@ -9,8 +9,8 @@ } } - .admin-report-chart .chart-canvas-container .chart-canvas { - height: 400px; + .admin-report-chart .chart-canvas-container { + height: clamp(200px, 50vh, 350px); } } diff --git a/app/assets/stylesheets/admin/badges.scss b/app/assets/stylesheets/admin/badges.scss index 4da01218ddb93..d611f0ffd3e5d 100644 --- a/app/assets/stylesheets/admin/badges.scss +++ b/app/assets/stylesheets/admin/badges.scss @@ -98,6 +98,7 @@ .readonly-field { color: var(--primary-high); + font-size: var(--font-down-1-rem); } .badge-preview { diff --git a/app/assets/stylesheets/admin/dashboard.scss b/app/assets/stylesheets/admin/dashboard.scss index 2804b0525c440..da9b66564ca92 100644 --- a/app/assets/stylesheets/admin/dashboard.scss +++ b/app/assets/stylesheets/admin/dashboard.scss @@ -210,6 +210,10 @@ margin-left: -5px; } + .site-traffic .chart-canvas-container { + height: 250px; + } + .chart-canvas { width: 100%; height: 100%; @@ -352,7 +356,9 @@ padding: 0.65em 0.25em; } - .admin-report .main { + .admin-report .main, + //temp fix for reporting upcoming changes + .admin-report .chart__body { border: 1px solid var(--content-border-color); &:hover { @@ -360,6 +366,13 @@ } } + // temp fix for reporting upcoming changes + .alert { + .uc-reporting-improvements & { + margin-bottom: 0; + } + } + .admin-report:not(:last-child) { .main { border-bottom: 0; diff --git a/app/assets/stylesheets/admin/site-settings.scss b/app/assets/stylesheets/admin/site-settings.scss index 101980108e034..26d1d284cd4e1 100644 --- a/app/assets/stylesheets/admin/site-settings.scss +++ b/app/assets/stylesheets/admin/site-settings.scss @@ -10,16 +10,13 @@ margin-left: 0.5em; } -.admin-plugin-config-area { - &__settings { - .admin-filtered-site-settings { - padding: 0.5em 1em; - } +.admin-filtered-site-settings { + padding: 1em; +} - .setting-label { - margin-left: 18px; - } - } +body.has-admin-changes-banner #main-outlet { + // makes space so banner doesn't overlap content + padding-bottom: 6em; } .admin-changes-banner { @@ -36,6 +33,12 @@ box-shadow: var(--shadow-card); z-index: 1; + .footer-nav-visible & { + bottom: calc( + var(--footer-nav-height) + env(safe-area-inset-bottom) + var(--space-4) + ); + } + @include viewport.until(sm) { flex-direction: column; justify-content: flex-start; diff --git a/app/assets/stylesheets/admin/staff_logs.scss b/app/assets/stylesheets/admin/staff_logs.scss index 6999211372e35..673276e1e76be 100644 --- a/app/assets/stylesheets/admin/staff_logs.scss +++ b/app/assets/stylesheets/admin/staff_logs.scss @@ -142,11 +142,8 @@ gap: 0.5em; justify-content: space-between; margin: 0 0 1em 0; - - // for too small screen, we want it to also wrap - @media (width <= 400px) { - flex-wrap: wrap; - } + min-width: 0; + flex-wrap: wrap; .staff-action-logs-controls__left { flex: 1 1 auto; @@ -155,6 +152,7 @@ display: flex; flex-wrap: wrap; gap: 0.5em; + min-width: 0; // we want to put it in one line .date-filter-container .d-date-time-input-range { @@ -180,15 +178,16 @@ gap: 0.5em; align-items: center; } +} - a.filter { - .label { - font-weight: bold; - } +.staff-action-logs-filters { + display: flex; + flex-wrap: wrap; + gap: var(--space-2); - .d-icon { - margin-left: 0.5em; - } + .btn { + gap: var(--space-2); + text-align: left; } } diff --git a/app/assets/stylesheets/common/base/_topic-list.scss b/app/assets/stylesheets/common/base/_topic-list.scss index cbac395345b50..05e22639d75e7 100644 --- a/app/assets/stylesheets/common/base/_topic-list.scss +++ b/app/assets/stylesheets/common/base/_topic-list.scss @@ -135,6 +135,10 @@ } .bulk-select-topics-dropdown { + display: flex; + align-items: center; + gap: var(--space-1) var(--space-2); + .select-kit.single-select.dropdown-select-box .select-kit-row { .texts .name { font-weight: normal; @@ -149,6 +153,11 @@ } } +.bulk-select-topics-actions { + display: flex; + gap: var(--space-2); +} + .topic-list { width: 100%; border-collapse: collapse; @@ -524,6 +533,7 @@ .topic-list-data.bulk-select { padding: 0; width: 30px; + text-align: center; label { margin: 0; @@ -652,11 +662,10 @@ .bulk-select-topics { display: inline-flex; + flex-wrap: wrap; + gap: var(--space-2); + align-items: end; margin-left: -5px; - - .btn { - margin-right: var(--space-2); - } } } @@ -876,18 +885,7 @@ .discourse-tags { display: inline; - - &__tag-separator { - position: absolute; - display: inline-block; - vertical-align: middle; - margin-left: -0.5em; - margin-top: 0.25em; - } - - .discourse-tag { - margin: 0 0.5em 0 0; - } + vertical-align: bottom; } .badge-wrapper { diff --git a/app/assets/stylesheets/common/base/category-list.scss b/app/assets/stylesheets/common/base/category-list.scss index 59c945b7bf821..c19306544a2f1 100644 --- a/app/assets/stylesheets/common/base/category-list.scss +++ b/app/assets/stylesheets/common/base/category-list.scss @@ -1,5 +1,10 @@ @use "lib/viewport"; +:root { + --category-boxes-min-width: 15em; + --category-boxes-max-width: 1fr; +} + .category-list { table-layout: fixed; @@ -147,7 +152,10 @@ } .category-boxes { - grid-template-columns: repeat(auto-fit, minmax(15em, 1fr)); + grid-template-columns: repeat( + auto-fit, + minmax(var(--category-boxes-min-width), var(--category-boxes-max-width)) + ); .category-box { > a { diff --git a/app/assets/stylesheets/common/base/compose.scss b/app/assets/stylesheets/common/base/compose.scss index 0f4170081a68d..d1d969be22901 100644 --- a/app/assets/stylesheets/common/base/compose.scss +++ b/app/assets/stylesheets/common/base/compose.scss @@ -852,11 +852,13 @@ html.composer-open:not(.has-full-page-chat) { // especially while the software keyboard is visible, so we top-anchor it here // and shift it using transform .ipados-device { - #reply-control { - // the two properties below are equivalent to bottom: 0 - top: calc(var(--composer-vh, 1vh) * 100); - transform: translateY(-100%); - bottom: unset; + body:not(.peek-mode-active) { + #reply-control { + // the two properties below are equivalent to bottom: 0 + top: calc(var(--composer-vh, 1vh) * 100); + transform: translateY(-100%); + bottom: unset; + } } } @@ -986,7 +988,7 @@ html.composer-open:not(.has-full-page-chat) { ul { margin: 0; - padding: 0 0 0 1.5em; + padding: 0 0 0 var(--space-6); &.list, &.topics { @@ -996,12 +998,17 @@ html.composer-open:not(.has-full-page-chat) { li { font-weight: normal; - margin-top: 8px; + margin-top: var(--space-2); } } .discourse-tags { font-size: var(--font-down-1); + padding: 0; + + li { + margin: 0; + } } } @@ -1026,12 +1033,13 @@ html.composer-open:not(.has-full-page-chat) { .first-line { width: 100%; + line-height: var(--line-height-medium); } .second-line { display: flex; flex-wrap: wrap; - gap: var(--space-2); + gap: 0 var(--space-2); } } diff --git a/app/assets/stylesheets/common/base/discourse.scss b/app/assets/stylesheets/common/base/discourse.scss index 1e9d812c7fa4f..16d94a23af298 100644 --- a/app/assets/stylesheets/common/base/discourse.scss +++ b/app/assets/stylesheets/common/base/discourse.scss @@ -64,6 +64,8 @@ --d-header-padding-x: 0.67em; --d-table-border-top-height: 3px; --d-wrap-padding-x: 0.67em; + --d-post-aside-background: var(--blend-primary-secondary-5); + --d-post-aside-border-left: 5px solid var(--primary-300); --topic-title-font-weight: 400; --topic-title-font-weight--visited: 400; --topic-list-item-background-color: var(--secondary); @@ -71,6 +73,7 @@ --list-container-padding-x: 0em; --d-topic-list-header-font-size: initial; --skip-links-offset: -75px; + --heading-font-weight: bold; } // Animation Keyframes @@ -251,7 +254,8 @@ small { } blockquote { - @include post-aside; + background: var(--d-post-aside-background); + border-left: var(--d-post-aside-border-left); @include viewport.until(sm) { clear: both; @@ -275,6 +279,7 @@ h6 { font-family: var(--heading-font-family); margin-top: 0; margin-bottom: 0.5rem; + font-weight: var(--heading-font-weight); } a.cancel { @@ -319,7 +324,7 @@ label { align-items: flex-start; color: var(--primary-high); - &:not(.checkbox-label) { + &:not(.checkbox-label, .d-segmented-control__label) { font-weight: bold; } @@ -1166,7 +1171,6 @@ body.has-sidebar-page { #main-outlet-wrapper { grid-template-columns: var(--d-sidebar-width) minmax(0, 1fr); gap: 0 var(--d-main-content-gap); - padding-left: 0; @include viewport.until(lg) { --d-main-content-gap: var(--space-4); diff --git a/app/assets/stylesheets/common/base/edit-category.scss b/app/assets/stylesheets/common/base/edit-category.scss index 6740cbbc70d05..e04837d4252b1 100644 --- a/app/assets/stylesheets/common/base/edit-category.scss +++ b/app/assets/stylesheets/common/base/edit-category.scss @@ -123,6 +123,7 @@ div.edit-category { .category-permission-hint { font-size: var(--font-down-1); + color: var(--primary-high-or-secondary-low); } } @@ -228,7 +229,8 @@ div.edit-category { } .edit-category-tab-settings, - .edit-category-tab-tags { + .edit-category-tab-tags, + .edit-category-tab-topic-template { > section { margin-bottom: 1.5em; } @@ -385,7 +387,3 @@ div.edit-category { width: 100%; } } - -.edit-category .everyone-has-access-warning { - margin-top: 2em; -} diff --git a/app/assets/stylesheets/common/base/embedded-posts.scss b/app/assets/stylesheets/common/base/embedded-posts.scss index 615722c678e84..c6d17e1e0b6d3 100644 --- a/app/assets/stylesheets/common/base/embedded-posts.scss +++ b/app/assets/stylesheets/common/base/embedded-posts.scss @@ -2,6 +2,9 @@ // nested replies in topics .embedded-posts { + --border-color: var(--content-border-color); + --border-width: 1px; + @include viewport.until(sm) { position: relative; padding: 0.75em 0.5em 0.75em 0; @@ -9,13 +12,7 @@ margin-left: 0; } - @include viewport.from(sm) { - border: 1px solid var(--content-border-color); - } - .collapse-up { - color: var(--primary-high); - background: var(--primary-low); z-index: 1; .archetype-private_message & { @@ -24,27 +21,11 @@ @include viewport.until(sm) { position: relative; - padding: 6px; transform: translate(25%, -30%); - box-shadow: 0 0 0 1px var(--primary-300); - - .d-icon { - transform: scale(0.871); - } - - &:hover, - &:focus { - background: var(--primary-300); - - .d-icon { - color: var(--primary); - } - } } @include viewport.from(sm) { transform: translate(-50%, -164%); - border: 1px solid var(--primary-300); padding: var(--space-2); left: 32px; bottom: calc(-1 * var(--space-12)); @@ -67,7 +48,7 @@ top: calc(-2px - 0.75em); width: 1px; height: calc(100% + 1.5em + 5px); - background: var(--primary-300); + background: var(--border-color); left: 24px; } } @@ -112,7 +93,7 @@ .post-info.arrow { padding: 0.5em 0; margin-right: 0; - color: var(--primary-med-or-secondary-high); + color: var(--primary-medium); line-height: 1; &:hover, @@ -164,25 +145,7 @@ .collapse-up { position: absolute; color: var(--primary-medium); - background: var(--secondary); - border: 1px solid var(--content-border-color); - padding: 6px 9px 8px; z-index: 99; // Needs to be higher than topic-avatar - - .d-icon { - color: currentcolor; - } - - .discourse-no-touch & { - &:hover { - background: var(--primary-low); - color: var(--primary-high); - - .d-icon { - color: currentcolor; - } - } - } } // bottom means "reply expansion" below a post @@ -205,8 +168,8 @@ position: absolute; top: calc(-1 * var(--space-6)); width: 1px; - height: calc(100% + var(--space-5)); - background: var(--primary-300); + height: calc(100% + var(--space-3)); + background: var(--border-color); left: 32px; } } @@ -220,9 +183,9 @@ content: ""; position: absolute; top: calc(-1 * var(--space-6)); - width: 1px; + width: var(--border-width); height: calc(100% + var(--space-6)); - background: var(--primary-300); + background: var(--border-color); left: 32px; } @@ -241,7 +204,7 @@ .post-link-arrow { position: absolute; - bottom: var(--space-3); + bottom: var(--space-2); .archetype-private_message & { bottom: 0; @@ -276,20 +239,6 @@ } } - .collapse-up { - .d-icon { - transform: scale(0.871); - } - - .discourse-no-touch & { - &:hover, - &:focus { - color: var(--primary); - background: var(--primary-300); - } - } - } - .load-more-replies { font-size: var(--font-down-1); position: absolute; @@ -306,15 +255,19 @@ // top means "in reply to expansion" above a post &.top { margin-left: 0; - border: none; width: calc( var(--topic-body-width) + (var(--topic-body-width-padding) * 2) + var(--topic-avatar-width) - (var(--topic-avatar-width) + 2px) ); // 2px accounts for left and right borders + &.topic-body:first-of-type { + border-top: 1px solid var(--border-color); + } + .collapse-down { transform: translate(17%, 230%); z-index: 1; + margin-left: var(--border-width); } .row { @@ -334,9 +287,9 @@ content: ""; position: absolute; top: var(--space-6); - width: 1px; + width: var(--border-width); height: calc(100% + var(--space-6)); - background: var(--primary-300); + background: var(--border-color); left: -22px; } } @@ -380,3 +333,10 @@ } } } + +.replies-above > div:last-child { + .topic-avatar, + .topic-body { + border: none; + } +} diff --git a/app/assets/stylesheets/common/base/header.scss b/app/assets/stylesheets/common/base/header.scss index 3385a8d3ab4c5..a35606992417d 100644 --- a/app/assets/stylesheets/common/base/header.scss +++ b/app/assets/stylesheets/common/base/header.scss @@ -1,5 +1,13 @@ @use "lib/viewport"; +:root { + --d-header-icon-color: var(--header_primary-low-mid); + --d-header-icon-color--hover: var(--header_primary); + --d-header-icon-color--active: var(--header_primary-medium); + --d-header-icon-background--hover: var(--d-hover); + --d-header-icon-background--active: var(--secondary); +} + .d-header-wrap { position: sticky; top: 0; @@ -179,7 +187,11 @@ .discourse-no-touch &:hover, .discourse-no-touch &:focus-visible { - background-color: var(--d-hover); + background-color: var(--d-header-icon-background--hover); + + .d-icon { + color: var(--d-header-icon-color--hover); + } } } @@ -187,11 +199,11 @@ .active .icon, .header-color-scheme-toggle .-expanded { position: relative; - background-color: var(--secondary); + background-color: var(--d-header-icon-background--active); cursor: default; > .d-icon { - color: var(--primary-medium); + color: var(--d-header-icon-color--active); } } } @@ -201,7 +213,7 @@ font-size: var(--font-up-4); line-height: var(--line-height-large); display: inline-block; - color: var(--header_primary-low-mid); + color: var(--d-header-icon-color); } .notifications { @@ -268,19 +280,21 @@ .d-icon { font-size: var(--font-down-2); width: 1em; - color: var(--header_primary-high); + color: var(--d-header-icon-color); } .discourse-no-touch & { &:hover { + color: var(--d-header-icon-color--hover); border: 1px solid var(--header_primary-medium); + background: var(--d-header-icon-background--hover); .language-switcher__locale { color: var(--header_primary); } .d-icon { - color: var(--header_primary-high); + color: var(--d-header-icon-color--hover); } } } diff --git a/app/assets/stylesheets/common/base/history.scss b/app/assets/stylesheets/common/base/history.scss index 60fd9487887aa..be596e68c8b9b 100644 --- a/app/assets/stylesheets/common/base/history.scss +++ b/app/assets/stylesheets/common/base/history.scss @@ -313,15 +313,13 @@ } .hidden-revision-previous .row { - div:nth-of-type(1), - td:nth-of-type(1) { + .--previous { opacity: 0.5; } } .hidden-revision-current .row { - div:nth-of-type(2), - td:nth-of-type(2) { + .--current { opacity: 0.5; } } diff --git a/app/assets/stylesheets/common/base/menu-panel.scss b/app/assets/stylesheets/common/base/menu-panel.scss index 92ab6dd5571cb..adc050f86ec84 100644 --- a/app/assets/stylesheets/common/base/menu-panel.scss +++ b/app/assets/stylesheets/common/base/menu-panel.scss @@ -164,7 +164,7 @@ font-size: var(--font-down-1); } - div.discourse-tags { + .discourse-tags { font-size: var(--font-down-1); } diff --git a/app/assets/stylesheets/common/base/onebox.scss b/app/assets/stylesheets/common/base/onebox.scss index 0bd69c6e5798c..d8c7b0ec073d7 100644 --- a/app/assets/stylesheets/common/base/onebox.scss +++ b/app/assets/stylesheets/common/base/onebox.scss @@ -36,8 +36,8 @@ a.loading-onebox { margin-top: 15px; padding: 12px; font-size: var(--font-0); - - @include post-aside; + background: var(--d-post-aside-background); + border-left: var(--d-post-aside-border); .onebox-result-body { padding-top: 5px; @@ -387,7 +387,8 @@ aside.onebox .onebox-body .onebox-avatar { blockquote { aside.onebox { - @include post-aside; + background: var(--d-post-aside-background); + border-left: var(--d-post-aside-border); } } diff --git a/app/assets/stylesheets/common/base/sidebar-section-link.scss b/app/assets/stylesheets/common/base/sidebar-section-link.scss index d88e57ec57d02..3363802d5d35d 100644 --- a/app/assets/stylesheets/common/base/sidebar-section-link.scss +++ b/app/assets/stylesheets/common/base/sidebar-section-link.scss @@ -157,7 +157,9 @@ &.dropdown-menu__item .sidebar-section-link, .dropdown-menu__item .sidebar-section-link { - border-radius: 0; + height: var(--d-sidebar-row-height); + padding-inline: var(--d-sidebar-row-horizontal-padding); + border-radius: var(--d-border-radius); } .--link-button { diff --git a/app/assets/stylesheets/common/base/sidebar.scss b/app/assets/stylesheets/common/base/sidebar.scss index 043efa02e4ca4..c5ae664f2155c 100644 --- a/app/assets/stylesheets/common/base/sidebar.scss +++ b/app/assets/stylesheets/common/base/sidebar.scss @@ -85,6 +85,11 @@ align-self: start; overflow-y: auto; + @include viewport.until(md) { + // height gets in the way in slide-out mode + height: auto; + } + // back-compat for themes --1dvh: 1dvh; diff --git a/app/assets/stylesheets/common/base/tagging.scss b/app/assets/stylesheets/common/base/tagging.scss index cab49c6437e18..eb40388e33a17 100644 --- a/app/assets/stylesheets/common/base/tagging.scss +++ b/app/assets/stylesheets/common/base/tagging.scss @@ -132,6 +132,14 @@ .discourse-tags { display: inline-flex; flex-wrap: wrap; + list-style: none; + margin: 0; + + li { + display: inline-flex; + align-items: center; + flex-wrap: wrap; + } &:has(.box) { gap: var(--space-1); diff --git a/app/assets/stylesheets/common/base/topic-post.scss b/app/assets/stylesheets/common/base/topic-post.scss index 11088d7e13640..875fd81d4e522 100644 --- a/app/assets/stylesheets/common/base/topic-post.scss +++ b/app/assets/stylesheets/common/base/topic-post.scss @@ -559,17 +559,6 @@ nav.post-controls { } button { - &.expand-post { - @include viewport.until(sm) { - margin: var(--control-space) 0 var(--control-space) 0; - } - - @include viewport.from(sm) { - margin-top: var(--space-3); - margin-left: var(--topic-body-width-padding); - } - } - .discourse-no-touch & { &:hover, &:focus-visible, @@ -614,22 +603,26 @@ nav.post-controls { } .btn.show-replies { + --border-width: 1px; font-size: inherit; - padding: 10px; color: var(--primary-medium); display: flex; align-items: center; border-radius: var(--d-button-border-radius); - @include viewport.until(sm) { - padding: 9px; + &[aria-expanded="true"] { + background: var(--primary-low); + color: var(--primary-high); + z-index: 1; - &[aria-expanded="true"] { - background: var(--primary-low); + .d-icon { color: var(--primary-high); - box-shadow: 0 0 0 1px var(--primary-300); - z-index: 1; - margin-left: 1px; + } + } + + .discourse-no-touch & { + &:hover { + color: var(--primary); .d-icon { color: var(--primary-high); @@ -638,38 +631,11 @@ nav.post-controls { } @include viewport.from(sm) { - margin-left: 0; white-space: nowrap; .topic-post & { margin-right: var(--space-2); } - - &[aria-expanded="true"] { - background: var(--primary-low); - color: var(--primary-high); - box-shadow: 0 0 0 1px var(--primary-300); - z-index: 1; - - .d-icon { - color: var(--primary-high); - } - - &:hover, - &:focus { - background: var(--primary-300); - color: var(--primary); - } - } - } - - .discourse-no-touch & { - &:hover, - &:focus-visible { - outline: none; - color: var(--d-post-control-text-color--hover); - background: var(--d-post-control-background--hover); - } } .d-icon { @@ -715,6 +681,17 @@ nav.post-controls { } } +.expand-post { + @include viewport.until(sm) { + margin: var(--space-3) 0; + } + + @include viewport.from(sm) { + margin-top: var(--space-3); + margin-left: var(--topic-body-width-padding); + } +} + .deleted { .regular > .cooked { background-color: var(--danger-low-mid); @@ -822,8 +799,9 @@ aside.quote { gap: var(--space-2); color: var(--primary-high-or-secondary-low); padding: 0.8em 0.8em 0 0.8em; + background: var(--d-post-aside-background); + border-left: var(--d-post-aside-border-left); - @include post-aside; @include unselectable; &[data-can-toggle-quote] { diff --git a/app/assets/stylesheets/common/base/uc-modernize-foundation-theme.scss b/app/assets/stylesheets/common/base/uc-modernize-foundation-theme.scss index 32f8e9dc44394..cffc613dbbdd2 100644 --- a/app/assets/stylesheets/common/base/uc-modernize-foundation-theme.scss +++ b/app/assets/stylesheets/common/base/uc-modernize-foundation-theme.scss @@ -75,7 +75,12 @@ } .btn.no-text.btn-icon { - &:not(.user-menu-tab, .user-menu-tab-active, .composer-actions-btn) { + &:not( + .user-menu-tab, + .user-menu-tab-active, + .composer-actions-btn, + .dropdown-select-box-header + ) { width: var(--button-height); } } @@ -130,24 +135,6 @@ color: var(--d-nav-color--active); } - // dropdown menu - .dropdown-menu__item .btn, - .dropdown-menu__item .sidebar-section-link { - &:not(.notifications-tracking-btn, .--with-description) { - height: var(--d-sidebar-row-height) !important; - padding-inline: var(--d-sidebar-row-horizontal-padding); - } - } - - .sidebar-section-link-wrapper.dropdown-menu__item .sidebar-section-link, - .sidebar-section-link-wrapper .dropdown-menu__item .sidebar-section-link { - border-radius: var(--d-border-radius); - } - - .dropdown-menu__item { - border-radius: var(--d-border-radius); - } - .bookmark-menu-content .bookmark-menu__title, .bookmark-menu-content .bookmark-menu__row-title { padding-block: 0; @@ -164,29 +151,10 @@ margin-right: 0; } - .dropdown-menu { - display: flex; - flex-direction: column; - gap: var(--d-sidebar-vertical-gap); - padding: var(--space-1); - } - .sidebar-section-link-wrapper .sidebar-section-link-prefix .prefix-square { border-radius: calc(var(--d-border-radius) / 2); } - .dropdown-menu__item .btn { - display: inline-flex; - gap: var(--d-sidebar-section-link-prefix-margin-right); - padding-inline: var(--d-sidebar-row-horizontal-padding); - border-radius: var(--d-border-radius); - } - - .dropdown-menu__item .btn .svg-icon { - width: var(--d-sidebar-section-link-prefix-width); - margin-right: 0; - } - .sidebar-more-section-content .sidebar-row { padding-block: 0; } @@ -273,6 +241,7 @@ .select-kit .select-kit-header:not(.composer-actions-btn), .d-date-input .date-picker { height: var(--button-height); + border: var(--d-button-default-border); } .select-kit.is-expanded .select-kit-filter.is-expanded { diff --git a/app/assets/stylesheets/common/base/uc-simplified-category-setup-edit-categories.scss b/app/assets/stylesheets/common/base/uc-simplified-category-setup-edit-categories.scss index db40725be9756..f416329ac06b2 100644 --- a/app/assets/stylesheets/common/base/uc-simplified-category-setup-edit-categories.scss +++ b/app/assets/stylesheets/common/base/uc-simplified-category-setup-edit-categories.scss @@ -1,6 +1,11 @@ @use "lib/viewport"; .uc-enable-simplified-category-creation { + .d-page-header__title-row { + line-height: var(--line-height-medium); + gap: var(--space-4); + } + .edit-category-tab-security { .alert { --permission-table-max-width: var(--form-kit-max-input); @@ -28,8 +33,8 @@ width: 100%; margin: 0 auto; - .form-kit { - padding-bottom: 6em; // space for save footer + h1 { + font-size: var(--font-up-3); } .form-kit__field-toggle { @@ -45,7 +50,7 @@ .form-kit__conditional-display-content { // prevent content shift when changing style options - min-height: 2.8em; + min-height: 2.6em; &:has(.badge-category__wrapper) { justify-content: center; @@ -53,8 +58,6 @@ } .--radio-cards { - width: var(--form-kit-max-input); - .form-kit__container-title { max-width: var(--form-kit-max-input); width: 100%; @@ -133,10 +136,17 @@ border-bottom: 1px solid var(--content-border-color); } + .edit-category-page-header { + margin-bottom: 1.5em; + } + .edit-category-content { - margin-top: 2em; grid-area: unset; } + + .edit-category-type-schema-fields { + display: contents; + } } .edit-category-title-text { @@ -205,3 +215,54 @@ } } } + +.edit-category-description-container { + .readonly-field { + width: 100%; + font-size: var(--font-down-1); + color: var(--primary-high); + + > :first-child { + margin-top: 0; + } + + > :last-child { + margin-bottom: 0; + } + } + + .description-content { + &.--collapsed { + max-height: calc(4 * 1.5em); + overflow: hidden; + position: relative; + + &.--overflowing::after { + content: ""; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 1.5em; + background: linear-gradient(transparent, var(--secondary, white)); + pointer-events: none; + } + } + } + + .description-actions { + width: 100%; + display: flex; + align-items: center; + gap: var(--space-2); + margin-top: var(--space-2); + + .toggle-description { + color: var(--primary-medium); + + &:hover { + color: var(--primary-high); + } + } + } +} diff --git a/app/assets/stylesheets/common/base/upload.scss b/app/assets/stylesheets/common/base/upload.scss index bfbcd05969d19..9ec64d3daa402 100644 --- a/app/assets/stylesheets/common/base/upload.scss +++ b/app/assets/stylesheets/common/base/upload.scss @@ -198,6 +198,8 @@ align-items: center; justify-content: center; gap: var(--space-1); + padding: var(--space-2); + white-space: normal; &:hover, &:focus-visible { diff --git a/app/assets/stylesheets/common/base/user-badges.scss b/app/assets/stylesheets/common/base/user-badges.scss index c7889aaa5de63..a623b3587aa54 100644 --- a/app/assets/stylesheets/common/base/user-badges.scss +++ b/app/assets/stylesheets/common/base/user-badges.scss @@ -165,6 +165,8 @@ right: 0; bottom: 0; z-index: 1; + border-radius: var(--d-button-border-radius) 0 var(--d-button-border-radius) + 0; } .badge-contents { @@ -188,11 +190,15 @@ } } - .badge-summary:has(a) { - // for summary links to be reachable - // they must be positioned above .badge-link:after - position: relative; - z-index: 1; + .badge-summary { + overflow-wrap: break-word; + + &:has(a) { + // for summary links to be reachable + // they must be positioned above .badge-link:after + position: relative; + z-index: 1; + } } .badge-icon { @@ -226,6 +232,7 @@ } .badge-info { + min-width: 0; color: var(--primary); h3 { @@ -253,6 +260,15 @@ } } } + + &.--can-favorite { + // helps description text avoid favorite button overlap + .badge-summary { + width: 100%; + padding-right: var(--space-6); + box-sizing: border-box; + } + } } .badges-granted { diff --git a/app/assets/stylesheets/common/base/user.scss b/app/assets/stylesheets/common/base/user.scss index 4d6ff3548c277..362760506937e 100644 --- a/app/assets/stylesheets/common/base/user.scss +++ b/app/assets/stylesheets/common/base/user.scss @@ -1471,3 +1471,69 @@ width: 100%; } } + +.user-preferences .form-vertical:has(.calendar-subscriptions) { + width: 750px; +} + +.calendar-subscriptions { + &__description { + color: var(--primary-medium); + margin-bottom: 1em; + } + + &__warning { + display: flex; + align-items: center; + gap: 0.5em; + margin-bottom: 1em; + } + + &__urls { + margin-top: 1em; + } + + &__active-status { + display: flex; + align-items: center; + gap: 0.5em; + color: var(--success); + font-weight: bold; + margin-bottom: 1em; + } + + &__actions { + display: flex; + gap: 0.5em; + margin-top: 1em; + } +} + +.calendar-subscription-url { + padding: 0.75em 1em; + margin-bottom: 0.75em; + border: 1px solid var(--primary-low); + border-radius: var(--d-border-radius); + background: var(--secondary); + + &__header { + margin-bottom: 0.5em; + } + + &__label { + font-weight: bold; + } + + &__description { + color: var(--primary-medium); + font-size: var(--font-down-1); + margin-left: 0.25em; + } + + &__actions { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.5em; + } +} diff --git a/app/assets/stylesheets/common/components/_index.scss b/app/assets/stylesheets/common/components/_index.scss index b7e3b0a2702c5..804c04d1a31a7 100644 --- a/app/assets/stylesheets/common/components/_index.scss +++ b/app/assets/stylesheets/common/components/_index.scss @@ -10,6 +10,7 @@ @import "bookmark-modal"; @import "bookmark-menu"; @import "buttons"; +@import "d-segmented-control"; @import "d-select"; @import "color-input"; @import "char-counter"; @@ -73,7 +74,6 @@ @import "emoji-picker"; @import "filter-input"; @import "filter-navigation"; -@import "dropdown-menu"; @import "welcome-banner"; @import "d-multi-select"; @import "d-otp"; diff --git a/app/assets/stylesheets/common/components/bookmark-menu.scss b/app/assets/stylesheets/common/components/bookmark-menu.scss index c58e209ee337d..7b6c3791e93e1 100644 --- a/app/assets/stylesheets/common/components/bookmark-menu.scss +++ b/app/assets/stylesheets/common/components/bookmark-menu.scss @@ -1,72 +1,25 @@ .bookmark-menu-content { - .dropdown-menu { - padding: 0; - min-width: 200px; - } - .bookmark-menu__title { - display: flex; - align-items: center; - gap: 0.75em; background: var(--tertiary-low); color: var(--tertiary); - padding: 0.75rem 1rem; - font-weight: bold; .d-icon { color: var(--tertiary); } } - .bookmark-menu__row { + .bookmark-menu__row-title, + .bookmark-menu__title { display: flex; - - &:hover, - &:focus { - background: var(--d-hover); - - &.--remove { - background: var(--danger-low); - } - } - - &.--clear-reminder { - .d-icon { - color: var(--primary-low-mid); - } - } - } - - .bookmark-menu__row-title { - padding: 0.75rem 1rem; + align-items: center; font-weight: bold; - } - - .bookmark-menu__row-btn { - margin: 0; - width: 100%; - text-align: left; - justify-content: left !important; - gap: 0.75rem; - color: var(--primary); - - &:hover, - &:focus { - color: var(--primary) !important; - background: var(--tertiary-very-low); - } - - .--remove & { - color: var(--danger); - } - - .d-button-label { - color: inherit; - } + gap: var(--d-sidebar-section-link-prefix-margin-right); + height: var(--d-sidebar-row-height); + padding-inline: var(--d-sidebar-row-horizontal-padding); + border-radius: var(--d-border-radius); .d-icon { - color: inherit; - margin: 0 !important; + width: var(--d-sidebar-section-link-prefix-width); } } } diff --git a/app/assets/stylesheets/common/components/buttons.scss b/app/assets/stylesheets/common/components/buttons.scss index 8e5dee77f8acb..c6503c66170e5 100644 --- a/app/assets/stylesheets/common/components/buttons.scss +++ b/app/assets/stylesheets/common/components/buttons.scss @@ -196,6 +196,7 @@ padding: $vpad $hpad; cursor: pointer; line-height: normal; + white-space: nowrap; .d-button__suffix-icon { margin-left: auto; @@ -216,6 +217,7 @@ @include hover { background-color: transparent; color: var(--tertiary-hover); + border: 0; .d-icon { color: var(--tertiary-hover); @@ -516,7 +518,7 @@ } } - /* The full classname is the old way of combining transparent buttons with colours – no longer use like this + /* The full classname is the old way of combining transparent buttons with colours – no longer use like this Use the --modifiers approach instead */ diff --git a/app/assets/stylesheets/common/components/d-page-header.scss b/app/assets/stylesheets/common/components/d-page-header.scss index aae03467f6b0d..7ef3ce61d4dee 100644 --- a/app/assets/stylesheets/common/components/d-page-header.scss +++ b/app/assets/stylesheets/common/components/d-page-header.scss @@ -81,6 +81,10 @@ $mobile-breakpoint: 700px; display: flex; align-items: center; margin-bottom: var(--space-2); + + &:not(:has(*)) { + display: none; + } } } diff --git a/app/assets/stylesheets/common/components/d-segmented-control.scss b/app/assets/stylesheets/common/components/d-segmented-control.scss new file mode 100644 index 0000000000000..305dfc512a01d --- /dev/null +++ b/app/assets/stylesheets/common/components/d-segmented-control.scss @@ -0,0 +1,86 @@ +.d-segmented-control { + position: relative; + display: inline-flex; + align-items: center; + box-sizing: border-box; + background: var(--primary-very-low); + gap: var(--space-2); + border-radius: var(--d-border-radius-large); + padding: var(--space-1) var(--space-2); + + &__legend { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: 0; + overflow: hidden; + clip-path: inset(50%); + white-space: nowrap; + } + + &__slider { + position: absolute; + top: var(--space-1); + left: 0; + width: var(--slider-width, 0); + height: var(--space-9); + transform: translateX(var(--slider-x, 0)); + background: var(--secondary); + border-radius: var(--d-border-radius-large); + box-shadow: 0 1px 6px rgb(0, 0, 0, 0.1); + pointer-events: none; + + &.is-animated { + transition: + transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), + width 0.25s cubic-bezier(0.4, 0, 0.2, 1); + + @media (prefers-reduced-motion: reduce) { + transition-duration: 0ms; + } + } + } + + &__input[type="radio"] { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: 0; + overflow: hidden; + clip-path: inset(50%); + } + + &__label { + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + font-weight: normal; + padding: var(--space-1) var(--space-4); + margin: 0; + border-radius: var(--d-border-radius-large); + color: var(--primary-high); + height: var(--space-7); + cursor: pointer; + user-select: none; + white-space: nowrap; + + &:hover { + background: var(--primary-low); + color: var(--primary); + } + + &:has(:focus-visible) { + outline: 2px solid var(--tertiary); + outline-offset: -2px; + } + + &:has(:checked), + &:has(:checked):hover { + background: transparent; + color: var(--primary); + } + } +} diff --git a/app/assets/stylesheets/common/components/dropdown-menu.scss b/app/assets/stylesheets/common/components/dropdown-menu.scss deleted file mode 100644 index 7fda5ce97689e..0000000000000 --- a/app/assets/stylesheets/common/components/dropdown-menu.scss +++ /dev/null @@ -1,41 +0,0 @@ -.dropdown-menu { - padding: 0; - margin: 0; - - &__item { - list-style: none; - - .btn { - padding: 0.65rem 1rem; - width: 100%; - justify-content: flex-start; - text-align: left; - - &.--danger { - &:hover, - :focus-visible { - background: var(--danger-low); - } - color: var(--danger); - - .d-icon { - color: var(--danger); - } - } - } - - &.--selected .btn { - background: var(--d-selected); - - &:hover, - &:focus-visible { - background: var(--d-selected-hover); - } - } - } - - &__divider { - margin: 0; - height: 0; - } -} diff --git a/app/assets/stylesheets/common/components/empty-states.scss b/app/assets/stylesheets/common/components/empty-states.scss index 8765c56fcf5e9..69c76ea9987a4 100644 --- a/app/assets/stylesheets/common/components/empty-states.scss +++ b/app/assets/stylesheets/common/components/empty-states.scss @@ -8,7 +8,8 @@ &.--text-only { .empty-state__title { - font-weight: bold; + font-family: var(--heading-font-family); + font-weight: var(--heading-font-weight); font-size: var(--font-up-1); } } diff --git a/app/assets/stylesheets/common/components/more-topics.scss b/app/assets/stylesheets/common/components/more-topics.scss index 5034a5bce53b2..11b0cf1656b66 100644 --- a/app/assets/stylesheets/common/components/more-topics.scss +++ b/app/assets/stylesheets/common/components/more-topics.scss @@ -53,7 +53,7 @@ .more-topics__list { .topic-list-body { - border-top: none; + border-top-width: 1px; } .topic-list-header:has(.nav-pills) { @@ -65,6 +65,21 @@ } } } + + @include viewport.until(sm) { + .topic-list-header.--has-tabs { + display: flex; + + .nav-pills { + margin: 0; + border: none; + } + + th:not(.default) { + display: none; + } + } + } } // Target the .badge-category text, the bullet icon needs to maintain `display: block` diff --git a/app/assets/stylesheets/common/components/notifications-tracking.scss b/app/assets/stylesheets/common/components/notifications-tracking.scss index 5c2abfd46494b..5f2ddfb9e0a1b 100644 --- a/app/assets/stylesheets/common/components/notifications-tracking.scss +++ b/app/assets/stylesheets/common/components/notifications-tracking.scss @@ -8,7 +8,6 @@ &__icons { display: flex; align-self: flex-start; - margin-right: 0.75em; } &__texts { diff --git a/app/assets/stylesheets/common/components/post-translations.scss b/app/assets/stylesheets/common/components/post-translations.scss index abfb2771ab77c..75c20c6897066 100644 --- a/app/assets/stylesheets/common/components/post-translations.scss +++ b/app/assets/stylesheets/common/components/post-translations.scss @@ -13,6 +13,18 @@ } } +.fk-d-tooltip__content[data-identifier="post-language"] + .fk-d-tooltip__inner-content { + flex-direction: column; + align-items: flex-start; + + .post-language__disclaimer { + color: var(--primary-medium); + font-size: var(--font-down-2); + margin-top: var(--space-1); + } +} + .post-language-selector-trigger { .d-button-label { margin-left: var(--space-1); diff --git a/app/assets/stylesheets/common/components/user-card.scss b/app/assets/stylesheets/common/components/user-card.scss index e88422f584ca1..dc2f83ec21e09 100644 --- a/app/assets/stylesheets/common/components/user-card.scss +++ b/app/assets/stylesheets/common/components/user-card.scss @@ -70,6 +70,7 @@ } a.card-huge-avatar { + border-radius: 50%; display: block; } diff --git a/app/assets/stylesheets/common/components/welcome-banner.scss b/app/assets/stylesheets/common/components/welcome-banner.scss index 523d88654ee74..c6aad4a90eebf 100644 --- a/app/assets/stylesheets/common/components/welcome-banner.scss +++ b/app/assets/stylesheets/common/components/welcome-banner.scss @@ -1,6 +1,16 @@ @use "lib/viewport"; @import "common/foundation/mixins"; +:root { + --d-welcome-banner-text-alignment: center; + --d-welcome-banner-header-size: var(--font-up-6); + --d-welcome-banner-padding-top: var(--space-6); + --d-welcome-banner-padding-right: 0; + --d-welcome-banner-padding-bottom: var(--space-12); + --d-welcome-banner-padding-left: 0; + --d-welcome-banner-title-margin-bottom: var(--space-4); +} + .display-welcome-banner { #main-outlet { padding-top: 0; @@ -23,11 +33,14 @@ &__wrap { box-sizing: border-box; position: relative; - padding: var(--space-6) 0 3em; + padding: var(--d-welcome-banner-padding-top) + var(--d-welcome-banner-padding-right) + var(--d-welcome-banner-padding-bottom); .--with-bg-img & { + --d-welcome-banner-padding-right: var(--space-4); + --d-welcome-banner-padding-left: var(--space-4); border-radius: var(--d-border-radius); - padding-inline: var(--space-4); background-size: cover; background-position: center; background-repeat: no-repeat; @@ -35,13 +48,13 @@ } @include viewport.until(md) { - padding: var(--space-4) 8px var(--space-5); + --d-welcome-banner-padding-top: var(--space-4); + --d-welcome-banner-padding-right: 8px; + --d-welcome-banner-padding-bottom: var(--space-5); margin-top: var(--space-2); } @include viewport.until(sm) { - display: block; - padding: var(--space-2); margin-top: 0; } @@ -153,19 +166,28 @@ } .search-menu-panel { - // hacky but best guestimate we can do: full height of the viewport minus the header, minus the welcome banner spacing, minus font-size:6 title - max-height: calc(100vh - var(--header-offset) - -3em - 4em); + // hacky but best guestimate we can do + // 4em is roughly the input height + --d-welcome-banner-height: calc( + var(--font-up-6) + var(--d-welcome-banner-padding-top) + + var(--d-welcome-banner-padding-bottom) + + var(--d-welcome-banner-title-margin-bottom) + 4em + ); + max-height: calc( + 100vh - var(--header-offset) - var(--d-welcome-banner-height) + ); } } .welcome-banner__title { font-size: var(--font-up-6); - line-height: $line-height-medium; - font-weight: bold; - margin-bottom: var(--space-2); + line-height: var(--line-height-medium); + font-family: var(--heading-font-family); + font-weight: var(--heading-font-weight); + margin-bottom: var(--d-welcome-banner-title-margin-bottom); + text-align: var(--d-welcome-banner-text-alignment); margin-inline: auto; max-width: 70ch; - text-align: center; @include viewport.until(md) { font-size: var(--font-up-4); diff --git a/app/assets/stylesheets/common/d-editor.scss b/app/assets/stylesheets/common/d-editor.scss index 727bd325ca26e..4fd5e298e5002 100644 --- a/app/assets/stylesheets/common/d-editor.scss +++ b/app/assets/stylesheets/common/d-editor.scss @@ -312,25 +312,88 @@ } } -// d-editor bar button sizing +.d-editor-button-bar__wrap { + position: relative; + min-width: 0; + margin-left: 1px; + margin-right: 1px; + overflow: clip; + border-start-start-radius: inherit; + border-start-end-radius: inherit; +} + +.d-editor-button-bar__scroll-btn { + --fade-width: 2rem; + --fade-color: var(--secondary); + position: absolute; + top: 0; + bottom: 0; + z-index: 2; + background: var(--fade-color); + border: none; + padding: 0 var(--space-1); + margin-block: 1px; + display: flex; + align-items: center; + cursor: pointer; + color: var(--primary-high); + + .discourse-touch & { + width: 0; + padding: 0; + overflow: visible; + pointer-events: none; + color: transparent; + } + + .discourse-no-touch &:hover { + color: var(--primary); + } + + &.--left { + left: 0; + + &::after { + content: ""; + position: absolute; + left: 100%; + height: 100%; + width: var(--fade-width); + background: linear-gradient(to right, var(--fade-color), transparent); + pointer-events: none; + } + } + + &.--right { + right: 0; + + &::before { + content: ""; + position: absolute; + right: 100%; + height: 100%; + width: var(--fade-width); + background: linear-gradient(to left, var(--fade-color), transparent); + pointer-events: none; + } + } +} + .d-editor-button-bar { display: flex; flex-direction: row; - flex-wrap: wrap; + flex-wrap: nowrap; gap: var(--space-2); - margin: 0.25rem 0; - - @include viewport.until(sm) { - flex-wrap: nowrap; - padding-block: var(--space-1); - overflow-x: auto; - scrollbar-width: none; - -ms-overflow-style: none; - max-width: 100%; + margin: 0; + padding-block: var(--space-1); + overflow-x: auto; + overflow-y: hidden; + scrollbar-width: none; + -ms-overflow-style: none; + max-width: 100%; - &::-webkit-scrollbar { - display: none; - } + &::-webkit-scrollbar { + display: none; } .btn:focus-visible { @@ -366,7 +429,6 @@ &.--replaced-toolbar { animation: float-left ease 0.2s 1 forwards; - flex-wrap: nowrap; @keyframes float-left { 0% { diff --git a/app/assets/stylesheets/common/float-kit/d-menu.scss b/app/assets/stylesheets/common/float-kit/d-menu.scss index fad8fb4ce8e3d..e7fb3bfee1096 100644 --- a/app/assets/stylesheets/common/float-kit/d-menu.scss +++ b/app/assets/stylesheets/common/float-kit/d-menu.scss @@ -56,10 +56,6 @@ overflow: auto; } - .btn { - border-radius: 0; - } - .arrow { position: absolute; color: var(--secondary); @@ -96,17 +92,31 @@ // should probably be renamed fk-d-menu__list .dropdown-menu { min-width: 200px; - padding: 0; + display: flex; + flex-direction: column; + gap: var(--d-sidebar-vertical-gap); + padding: var(--space-1); margin: 0; list-style: none; &__item { .btn { - padding: 0.5em 1rem; + display: inline-flex; + gap: var(--d-sidebar-section-link-prefix-margin-right); + padding-inline: var(--d-sidebar-row-horizontal-padding); width: 100%; justify-content: flex-start; background: rgb(0, 0, 0, 0); - border-radius: 0; + border-radius: var(--d-border-radius); + + &:not( + .notifications-tracking-btn, + .--with-description, + .pinned-options-btn + ) { + height: var(--d-sidebar-row-height); + padding-block: 0; + } &.-selected { background: var(--d-hover); @@ -120,6 +130,11 @@ } } + .svg-icon { + width: var(--d-sidebar-section-link-prefix-width); + margin-right: 0; + } + &:hover, &:focus, &:focus-visible { diff --git a/app/assets/stylesheets/common/form-kit/_checkbox-group.scss b/app/assets/stylesheets/common/form-kit/_checkbox-group.scss index 75b9128fa2d77..777a1181f457e 100644 --- a/app/assets/stylesheets/common/form-kit/_checkbox-group.scss +++ b/app/assets/stylesheets/common/form-kit/_checkbox-group.scss @@ -1,4 +1,4 @@ .form-kit__checkbox-group { display: flex; - gap: 0; + gap: 0.25em; } diff --git a/app/assets/stylesheets/common/form-kit/_conditional-display.scss b/app/assets/stylesheets/common/form-kit/_conditional-display.scss index 0160c3b23d60a..f5cab6ee7b0b7 100644 --- a/app/assets/stylesheets/common/form-kit/_conditional-display.scss +++ b/app/assets/stylesheets/common/form-kit/_conditional-display.scss @@ -13,11 +13,7 @@ } .--radio-cards { - width: var(--form-kit-max-input); - - @include viewport.until(sm) { - width: 100%; - } + width: 100%; .form-kit__conditional-display, .form-kit__container-content.--large { diff --git a/app/assets/stylesheets/common/form-kit/_container.scss b/app/assets/stylesheets/common/form-kit/_container.scss index c45bd06dc9aa5..fbfd874b970ce 100644 --- a/app/assets/stylesheets/common/form-kit/_container.scss +++ b/app/assets/stylesheets/common/form-kit/_container.scss @@ -15,9 +15,8 @@ gap: 0.25em; margin: 0; font-size: var(--font-down-1-rem); - color: var(--primary-high); - font-weight: bold; - padding-bottom: 0.25em; + color: var(--primary); + font-weight: 600 !important; } &-subtitle { @@ -26,8 +25,7 @@ gap: 0.25em; margin: 0; font-size: var(--font-down-1-rem); - color: var(--primary-high); - padding-bottom: 0.25em; + color: var(--primary-medium); > * { margin: 0; diff --git a/app/assets/stylesheets/common/form-kit/_control-checkbox.scss b/app/assets/stylesheets/common/form-kit/_control-checkbox.scss index c368ead8a603e..3b32c7b2a5f26 100644 --- a/app/assets/stylesheets/common/form-kit/_control-checkbox.scss +++ b/app/assets/stylesheets/common/form-kit/_control-checkbox.scss @@ -9,9 +9,10 @@ &-label { display: flex; gap: 0.5em; - font-weight: normal !important; margin: 0; + font-weight: normal !important; color: var(--primary); + font-size: var(--font-down-1-rem); .form-kit__field[data-disabled] & { cursor: not-allowed; @@ -27,5 +28,9 @@ &__control-checkbox-description { color: var(--primary-medium); + + &:empty { + display: none; + } } } diff --git a/app/assets/stylesheets/common/form-kit/_control-code.scss b/app/assets/stylesheets/common/form-kit/_control-code.scss index 6c5bd244de7bb..94242f8ad860d 100644 --- a/app/assets/stylesheets/common/form-kit/_control-code.scss +++ b/app/assets/stylesheets/common/form-kit/_control-code.scss @@ -1,4 +1,4 @@ -.form-kit__field-code { +.form-kit__field[data-control-type="code"] { .ace-wrapper { width: 100%; diff --git a/app/assets/stylesheets/common/form-kit/_control-menu.scss b/app/assets/stylesheets/common/form-kit/_control-menu.scss index 50007c3e8289d..d9cf41454ca77 100644 --- a/app/assets/stylesheets/common/form-kit/_control-menu.scss +++ b/app/assets/stylesheets/common/form-kit/_control-menu.scss @@ -2,6 +2,7 @@ justify-content: space-between; @include default-input; + width: auto; } .form-kit__control-menu-content { diff --git a/app/assets/stylesheets/common/form-kit/_control-radio.scss b/app/assets/stylesheets/common/form-kit/_control-radio.scss index 0d00d5bf07211..ddb708fbff26b 100644 --- a/app/assets/stylesheets/common/form-kit/_control-radio.scss +++ b/app/assets/stylesheets/common/form-kit/_control-radio.scss @@ -1,9 +1,10 @@ .form-kit__control-radio-label { display: flex; gap: 0.5em; - font-weight: normal !important; + font-weight: 500 !important; margin: 0; color: var(--primary); + font-size: var(--font-down-1-rem); .form-kit__field[data-disabled] & { cursor: not-allowed; diff --git a/app/assets/stylesheets/common/form-kit/_control-textarea.scss b/app/assets/stylesheets/common/form-kit/_control-textarea.scss index 0432df5a36e13..0ac9ab7f6c15d 100644 --- a/app/assets/stylesheets/common/form-kit/_control-textarea.scss +++ b/app/assets/stylesheets/common/form-kit/_control-textarea.scss @@ -1,11 +1,12 @@ .form-kit__control-textarea { // prevents firefox/chrome to add spacing under textarea display: block; + min-height: 150px; + min-width: var(--form-kit-large-input); @include default-input { // reset textarea styles height: 150px; - min-width: auto !important; padding: 0.5em !important; } } diff --git a/app/assets/stylesheets/common/form-kit/_field.scss b/app/assets/stylesheets/common/form-kit/_field.scss index 670b6f3cc6c9d..458a81670997f 100644 --- a/app/assets/stylesheets/common/form-kit/_field.scss +++ b/app/assets/stylesheets/common/form-kit/_field.scss @@ -9,7 +9,6 @@ width: 100%; } - &-textarea, &-composer, &-code, &-image { @@ -18,6 +17,13 @@ } } + &-textarea { + .form-kit__container-content { + min-width: var(--form-kit-large-input); + width: fit-content !important; + } + } + &-toggle { flex-direction: row; align-items: center; @@ -35,17 +41,18 @@ .form-kit__container-description { margin: 0; - font-size: var(--font-down-1-rem); + font-size: var(--font-down-1); + color: var(--primary-medium); pre, code { - font-size: var(--font-down-2-rem); + font-size: var(--font-down-2); } } .form-kit__container-help-text { margin: 0; - font-size: var(--font-down-1-rem); + font-size: var(--font-down-1); color: var(--primary-high-or-secondary-low); } diff --git a/app/assets/stylesheets/common/form-kit/_fieldset.scss b/app/assets/stylesheets/common/form-kit/_fieldset.scss index 0cf0d4d204441..6e0eb80a1cd8e 100644 --- a/app/assets/stylesheets/common/form-kit/_fieldset.scss +++ b/app/assets/stylesheets/common/form-kit/_fieldset.scss @@ -10,7 +10,7 @@ align-items: center; margin: 0 0 0.25rem; font-size: var(--font-down-1-rem); - color: var(--primary-high); + color: var(--primary); } &__fieldset-description { diff --git a/app/assets/stylesheets/common/form-kit/_section.scss b/app/assets/stylesheets/common/form-kit/_section.scss index 05ef24389dba9..e8fdaef446e6d 100644 --- a/app/assets/stylesheets/common/form-kit/_section.scss +++ b/app/assets/stylesheets/common/form-kit/_section.scss @@ -13,9 +13,39 @@ .form-kit__section-title { margin: 0; - font-size: var(--font-up-1-rem); + font-size: var(--font-up-1); +} + +.form-kit__section-header { + border-bottom: 1px solid var(--content-border-color); + padding-bottom: 0.5em; } .form-kit__section-subtitle { margin-top: calc(var(--space-4) * -1); // Offset the gap of the section + color: var(--primary-medium); + font-size: var(--font-down-1); +} + +.form-kit__section.emphasis { + border: 2px solid var(--content-border-color); + border-radius: var(--d-border-radius); + padding: 1em; + box-sizing: border-box; + + &.emphasis-success { + border-color: var(--success-medium); + } + + &.emphasis-error { + border-color: var(--danger-medium); + } + + &.emphasis-warning { + border-color: var(--highlight); + } + + &.emphasis-info { + border-color: var(--tertiary-medium); + } } diff --git a/app/assets/stylesheets/common/foundation/base.scss b/app/assets/stylesheets/common/foundation/base.scss index 7cbc4857a58f6..d7dd5b29393bb 100644 --- a/app/assets/stylesheets/common/foundation/base.scss +++ b/app/assets/stylesheets/common/foundation/base.scss @@ -10,6 +10,7 @@ --d-nav-pill-border-radius: var(--d-border-radius); --d-input-border-radius: var(--d-border-radius); --d-content-background: initial; + --d-link-text-decoration: none; // used for padding & margin --space: 0.25rem; // 4px @@ -37,7 +38,6 @@ html { font-size: var(--base-font-size); line-height: var(--line-height-large); background-color: var(--secondary); - overflow-y: scroll; direction: ltr; &.text-size-smallest { @@ -64,7 +64,7 @@ a:visited, a:hover, a:active { color: var(--d-link-color); - text-decoration: none; + text-decoration: var(--d-link-text-decoration); cursor: pointer; } diff --git a/app/assets/stylesheets/common/foundation/mixins.scss b/app/assets/stylesheets/common/foundation/mixins.scss index d4ea9a71c193f..a6ef003885dab 100644 --- a/app/assets/stylesheets/common/foundation/mixins.scss +++ b/app/assets/stylesheets/common/foundation/mixins.scss @@ -41,7 +41,7 @@ $breakpoints: ( @if $sidebar { // when the sidebar is shown, we want to increase the breakpoints by the width of the sidebar /* stylelint-disable-next-line scss/no-global-function-names */ - @media #{$type} and (#{$rule}: calc(#{map-get($breakpoints, $bp)} + #{$sidebar-width})) { + @media #{$type} and (#{$rule}: calc(#{map-get($breakpoints, $bp)} + #{$d-sidebar-width})) { .has-sidebar-page { @content; } @@ -137,11 +137,6 @@ $hpad: 0.65em; } // Stuff we repeat -@mixin post-aside { - border-left: 5px solid var(--primary-300); - background-color: var(--blend-primary-secondary-5); -} - @mixin d-animation($name, $duration, $easing: ease) { animation: $name $duration $easing forwards; diff --git a/app/assets/stylesheets/common/rich-editor/rich-editor.scss b/app/assets/stylesheets/common/rich-editor/rich-editor.scss index 454229b41b00c..56eb38fdbca3b 100644 --- a/app/assets/stylesheets/common/rich-editor/rich-editor.scss +++ b/app/assets/stylesheets/common/rich-editor/rich-editor.scss @@ -184,6 +184,17 @@ padding: var(--space-half) var(--space-2) 0 var(--space-2); margin-block: var(--space-4); + > div { + display: flex; + flex-wrap: wrap; + gap: var(--space-2); + padding-block: var(--space-2); + + p { + margin: 0; + } + } + &__remove-btn { position: absolute; bottom: var(--space-2); diff --git a/app/assets/stylesheets/common/select-kit/period-chooser.scss b/app/assets/stylesheets/common/select-kit/period-chooser.scss index b0294ed514998..9c01b2264eb69 100644 --- a/app/assets/stylesheets/common/select-kit/period-chooser.scss +++ b/app/assets/stylesheets/common/select-kit/period-chooser.scss @@ -13,6 +13,7 @@ background: transparent; border-color: transparent; padding: 0; + border-radius: 0; h2.selected-name { color: var(--secondary); diff --git a/app/assets/stylesheets/common/table-builder/table-edit-decorator.scss b/app/assets/stylesheets/common/table-builder/table-edit-decorator.scss index 2b2c7e49f5137..caa7f149d9f58 100644 --- a/app/assets/stylesheets/common/table-builder/table-edit-decorator.scss +++ b/app/assets/stylesheets/common/table-builder/table-edit-decorator.scss @@ -1,3 +1,5 @@ +@use "lib/viewport"; + .btn-edit-table { -webkit-touch-callout: none; user-select: none; @@ -17,13 +19,16 @@ } .discourse-touch & { - display: flex; - flex-direction: column-reverse; - padding-bottom: 0.5em; + @include viewport.until(xl) { + display: flex; + flex-direction: column-reverse; + padding-bottom: 0.5em; - .open-popup-link { - left: 0; - margin: 0; + .open-popup-link { + opacity: 100%; + left: 0; + margin: var(--space-2) 0 0; + } } } } diff --git a/app/assets/stylesheets/common/toolbar-popup-menu-options.scss b/app/assets/stylesheets/common/toolbar-popup-menu-options.scss index e0f1cba36efb1..ea407481f2cc2 100644 --- a/app/assets/stylesheets/common/toolbar-popup-menu-options.scss +++ b/app/assets/stylesheets/common/toolbar-popup-menu-options.scss @@ -10,6 +10,41 @@ } } + .fk-d-menu__inner-content { + flex-direction: column; + + --fade-height: 2.5em; + + &::before, + &::after { + content: ""; + position: sticky; + display: block; + flex-shrink: 0; + height: var(--fade-height); + pointer-events: none; + opacity: 0; + z-index: 1; + } + + &::before { + top: 0; + margin-bottom: calc(var(--fade-height) * -1); + background: linear-gradient(to top, transparent, var(--secondary)); + } + + &::after { + bottom: 0; + margin-top: calc(var(--fade-height) * -1); + background: linear-gradient(to bottom, transparent, var(--secondary)); + } + } + + &.--scroll-top .fk-d-menu__inner-content::before, + &.--scroll-bottom .fk-d-menu__inner-content::after { + opacity: 1; + } + .fullscreen-composer & { z-index: z("header") + 1; } @@ -20,8 +55,12 @@ } .shortcut { + line-height: 1; + vertical-align: middle; + &.--apple { letter-spacing: 0.25em; + padding-right: 0.35em; } @include viewport.until(sm) { diff --git a/app/assets/stylesheets/wcag.scss b/app/assets/stylesheets/wcag.scss index ae00d8a802220..b79b764dcc531 100644 --- a/app/assets/stylesheets/wcag.scss +++ b/app/assets/stylesheets/wcag.scss @@ -12,21 +12,12 @@ html.discourse-no-touch { .btn-default { - .d-icon { - color: var(--primary-medium); - } - - &:hover, - &.btn-hover, - &:focus { - .d-icon { - color: var(--secondary); - } - } + --d-button-default-icon-color: var(--primary-medium); + --d-button-default-icon-color--hover: var(--secondary); } - .btn-primary .d-icon { - color: var(--secondary); + .btn-primary { + --d-button-primary-icon-color: var(--secondary); } .btn-icon.ok, @@ -176,13 +167,6 @@ html { color: var(--primary-medium); } - blockquote { - a, - a:visited { - color: var(--tertiary); - } - } - .meta .d-icon + .filename, .meta .informations { color: var(--secondary); @@ -201,15 +185,6 @@ html { color: var(--primary-high); } - // Post controls - .topic-admin-menu, - .timeline-controls { - .btn .d-icon { - // admin wrenches - color: var(--primary-medium); - } - } - nav.post-controls { .btn.btn-flat { --d-post-control-icon-color: var(--primary-high); diff --git a/app/controllers/admin/api_controller.rb b/app/controllers/admin/api_controller.rb index acb48730665c5..b4c3653367679 100644 --- a/app/controllers/admin/api_controller.rb +++ b/app/controllers/admin/api_controller.rb @@ -35,6 +35,7 @@ def scopes scopes = ApiKeyScope .scope_mappings + .sort_by { |resource, _| resource.to_s } .reduce({}) do |memo, (resource, actions)| memo.tap do |m| m[resource] = actions.map do |k, v| diff --git a/app/controllers/admin/email_controller.rb b/app/controllers/admin/email_controller.rb index 59d95aa1863dc..793b8c2167ff8 100644 --- a/app/controllers/admin/email_controller.rb +++ b/app/controllers/admin/email_controller.rb @@ -45,12 +45,19 @@ def send_digest params.require(:username) params.require(:email) user = User.find_by_username(params[:username]) + raise Discourse::InvalidParameters unless user message, skip_reason = - UserNotifications.public_send(:digest, user, since: params[:last_seen_at]) + UserNotifications.public_send( + :digest, + user, + since: params[:last_seen_at], + skip_unsubscribe_links: true, + ) if message message.to = params[:email] + begin Email::Sender.new(message, :digest).send render json: success_json diff --git a/app/controllers/admin/reports_controller.rb b/app/controllers/admin/reports_controller.rb index 40485efc51809..e8763ce5a1bdc 100644 --- a/app/controllers/admin/reports_controller.rb +++ b/app/controllers/admin/reports_controller.rb @@ -15,6 +15,7 @@ def bulk raise Discourse::NotFound unless report_type =~ /\A[a-z0-9\_]+\z/ args = parse_params(report_params) + args[:current_user] = current_user report = nil report = Report.find_cached(report_type, args) if (report_params[:cache]) @@ -51,6 +52,7 @@ def show raise Discourse::NotFound if Report.hidden?(report_type, admin: current_user.admin?) args = parse_params(params) + args[:current_user] = current_user report = nil report = Report.find_cached(report_type, args) if (params[:cache]) diff --git a/app/controllers/admin/screened_ip_addresses_controller.rb b/app/controllers/admin/screened_ip_addresses_controller.rb index 66f83123d47a3..f1a65b82c1942 100644 --- a/app/controllers/admin/screened_ip_addresses_controller.rb +++ b/app/controllers/admin/screened_ip_addresses_controller.rb @@ -3,6 +3,7 @@ class Admin::ScreenedIpAddressesController < Admin::StaffController before_action :can_see_ip before_action :fetch_screened_ip_address, only: %i[update destroy] + before_action :ensure_admin_for_allow_admin, only: %i[create update destroy] def index filter = params[:filter] @@ -54,6 +55,15 @@ def can_see_ip raise Discourse::InvalidAccess.new if !guardian.can_see_ip? end + def ensure_admin_for_allow_admin + return if current_user.admin? + + if params[:action_name].to_s == "allow_admin" || + @screened_ip_address&.action_type == ScreenedIpAddress.actions[:allow_admin] + raise Discourse::InvalidAccess + end + end + def allowed_params params.require(:ip_address) permitted = params.permit(:ip_address, :action_name) diff --git a/app/controllers/admin/user_fields_controller.rb b/app/controllers/admin/user_fields_controller.rb index 7b13d7216e213..2f712c884a177 100644 --- a/app/controllers/admin/user_fields_controller.rb +++ b/app/controllers/admin/user_fields_controller.rb @@ -60,7 +60,8 @@ def update def destroy field = UserField.where(id: params.require(:id)).first - field.destroy if field.present? + field.presence&.destroy + render json: success_json end diff --git a/app/controllers/admin/watched_words_controller.rb b/app/controllers/admin/watched_words_controller.rb index 797829adeb8b0..6a93e4fcdfad6 100644 --- a/app/controllers/admin/watched_words_controller.rb +++ b/app/controllers/admin/watched_words_controller.rb @@ -17,6 +17,10 @@ def create action = WatchedWord.actions[opts[:action_key].to_sym] words = opts.delete(:words) + if action == WatchedWord.actions[:tag] && watched_words_params[:replacement_tags].present? + opts = opts.merge(replacement: resolve_replacement_tags) + end + watched_word_group = WatchedWordGroup.new(action: action) watched_word_group.create_or_update_members(words, opts) @@ -54,10 +58,10 @@ def upload action_key = params[:action_key].to_sym has_replacement = WatchedWord.has_replacement?(action_key) + content = Encodings.to_utf8(File.read(file.tempfile, mode: "rb")) + Scheduler::Defer.later("Upload watched words") do begin - content = Encodings.to_utf8(File.read(file.tempfile, mode: "rb")) - words_updated = 0 CSV.parse(content) do |row| @@ -125,6 +129,32 @@ def clear_all def watched_words_params @watched_words_params ||= - params.permit(:id, :replacement, :action_key, :case_sensitive, :html, words: []) + params.permit( + :id, + :replacement, + :action_key, + :case_sensitive, + :html, + words: [], + replacement_tags: %i[id name], + ) + end + + def resolve_replacement_tags + tags_param = watched_words_params[:replacement_tags] + tags_param = tags_param.values if tags_param.is_a?(ActionController::Parameters) + return if tags_param.blank? + + tag_ids = tags_param.filter_map { |t| t[:id]&.to_i } + new_tag_names = tags_param.select { |t| t[:id].blank? }.filter_map { |t| t[:name] } + + tag_names = Tag.where(id: tag_ids).pluck(:name) + + if new_tag_names.present? + new_tags = DiscourseTagging.find_or_create_tags!(new_tag_names, guardian) + tag_names.concat(new_tags.map(&:name)) + end + + tag_names.join(",") end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7d0ee9d719cf0..66e9c992b496e 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -802,6 +802,11 @@ def redirect_to_login_if_required return render plain: I18n.t("user_api_key.invalid_public_key") end + client = UserApiKeyClient.find_by(public_key: params[:user_api_public_key]) + if client&.auth_redirect.present? && params[:auth_redirect] != client.auth_redirect + return render plain: I18n.t("user_api_key.invalid_auth_redirect") + end + if UserApiKeyClient.invalid_auth_redirect?(params[:auth_redirect]) return render plain: I18n.t("user_api_key.invalid_auth_redirect") end diff --git a/app/controllers/calendar_subscriptions_controller.rb b/app/controllers/calendar_subscriptions_controller.rb new file mode 100644 index 0000000000000..d0c7d1e725823 --- /dev/null +++ b/app/controllers/calendar_subscriptions_controller.rb @@ -0,0 +1,87 @@ +# frozen_string_literal: true + +class CalendarSubscriptionsController < ApplicationController + requires_login + + CLIENT_ID = "calendar-subscriptions" + + before_action :rate_limit_create, only: :create + + def show + render json: { has_subscription: find_calendar_api_key.present?, feeds: feed_names } + end + + def create + revoke_existing_key! + + client = + UserApiKeyClient.find_or_create_by!(client_id: CLIENT_ID) do |c| + c.application_name = I18n.t("calendar_subscriptions.application_name") + end + + scopes = build_scopes + api_key = client.keys.create!(user_id: current_user.id, scopes: scopes) + raw_key = api_key.key + + render json: { key: raw_key, urls: build_urls(raw_key) } + end + + def destroy + revoke_existing_key! + head :no_content + end + + private + + def find_calendar_api_key + UserApiKey + .active + .joins(:client) + .where(user_id: current_user.id, user_api_key_clients: { client_id: CLIENT_ID }) + .first + end + + def revoke_existing_key! + find_calendar_api_key&.update!(revoked_at: Time.zone.now) + end + + def build_scopes + scope_names = ["bookmarks_calendar"] + plugin_feeds.map { |f| f[:scope] } + all_scopes = UserApiKeyScope.all_scopes + scope_names.uniq.filter_map do |name| + if all_scopes.key?(name.to_sym) + UserApiKeyScope.new(name: name) + else + Rails.logger.warn("Calendar subscription feed references unknown scope: #{name}. Skipping.") + nil + end + end + end + + def build_urls(raw_key) + base = Discourse.base_url + username = current_user.username_lower + + urls = { bookmarks: "#{base}/u/#{username}/bookmarks.ics?user_api_key=#{raw_key}" } + + plugin_feeds.each do |feed| + urls[feed[:name].to_sym] = feed[:url].call(base, current_user, raw_key) + end + + urls + end + + def feed_names + names = ["bookmarks"] + names += plugin_feeds.map { |f| f[:name] } + names + end + + def plugin_feeds + @plugin_feeds ||= DiscoursePluginRegistry.calendar_subscription_feeds + end + + def rate_limit_create + RateLimiter.new(current_user, "calendar-subscriptions-create", 5, 1.minute).performed! + end +end diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 5b0f72859bb9d..66a5702dc0b7a 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -129,7 +129,18 @@ def reorder def types guardian.ensure_can_create_category! - render json: { types: Categories::TypeRegistry.list } + + counts_by_type = + Discourse + .cache + .fetch(Categories::TypeRegistry::COUNTS_CACHE_KEY, expires_in: 1.hour) do + Categories::TypeRegistry.counts + end + + render json: { + types: Categories::TypeRegistry.list(only_visible: true), + counts: counts_by_type, + } end def show @@ -174,7 +185,29 @@ def create if category_type.present? && UpcomingChanges.enabled_for_user?(:enable_simplified_category_creation, current_user) - Categories::Configure.call(guardian:, params: { category_id: @category.id, category_type: }) + Categories::Configure.call( + guardian:, + params: { + category_id: @category.id, + category_type:, + site_setting_configuration_values: params[:category_type_site_settings], + category_configuration_values: category_params[:custom_fields], + }, + ) do |result| + on_failed_policy(:type_is_available) do + return( + render json: { + errors: [ + I18n.t( + "category_types.not_available", + type_name: category_type.capitalize, + ), + ], + }, + status: :unprocessable_entity + ) + end + end end Scheduler::Defer.later "Log staff action create category" do @@ -197,17 +230,49 @@ def update category_params.delete(:position) old_custom_fields = cat.custom_fields.dup - if category_params[:custom_fields] - category_params[:custom_fields].each do |key, value| - if value.present? - cat.custom_fields[key] = value + category_params[:custom_fields]&.each do |key, value| + if value.nil? || value == "" + cat.custom_fields.delete(key) + else + cat.custom_fields[key] = if value.is_a?(TrueClass) || value.is_a?(FalseClass) + value.to_s else - cat.custom_fields.delete(key) + value end end end category_params.delete(:custom_fields) + if UpcomingChanges.enabled_for_user?(:enable_simplified_category_creation, current_user) && + params[:category_type_site_settings].present? + # NOTE: The code in this block is pretty similar to what we are doing in + # configure_site_settings in Categories::Types::Base, however here we + # need to be able to update site settings across all category types for + # the category and it's best to do this in one query rather than + # multiple. + # + # Maybe in future we do something different, but this is a good starting point. + category_type_settings = + params[:category_type_site_settings].permit!.to_h.map do |name, value| + { setting_name: name, value: } + end + + # We do this because we want to allow updating hidden settings for the + # category type, but not other settings. The configuration schema for a + # category type defines which settings it wants to change, so that's a + # good source to use as an allowlist here. + allowed_setting_names = cat.category_type_site_setting_names + SiteSetting::Update.call( + guardian:, + options: { + allow_changing_hidden: allowed_setting_names, + }, + params: { + settings: category_type_settings, + }, + ) + end + # properly null the value so the database constraint doesn't catch us category_params[:email_in] = nil if category_params[:email_in]&.blank? category_params[:minimum_required_tags] = 0 if category_params[:minimum_required_tags]&.blank? @@ -267,6 +332,7 @@ def set_notifications def destroy guardian.ensure_can_delete!(@category) @category.destroy + Discourse.cache.delete(Categories::TypeRegistry::COUNTS_CACHE_KEY) Scheduler::Defer.later "Log staff action delete category" do @staff_action_logger.log_category_deletion(@category) @@ -559,6 +625,7 @@ def category_params :slug, :allow_badges, :topic_template, + :topic_title_placeholder, :description, :sort_order, :sort_ascending, diff --git a/app/controllers/composer_controller.rb b/app/controllers/composer_controller.rb index 0ddffc5881264..17ded67c5840a 100644 --- a/app/controllers/composer_controller.rb +++ b/app/controllers/composer_controller.rb @@ -124,7 +124,19 @@ def group_reason(group) end def is_user_allowed?(user, user_ids, group_ids) - user_ids.include?(user.id) || user.group_ids.any? { |group_id| group_ids.include?(group_id) } + user_ids.include?(user.id) || + user.group_ids.any? do |group_id| + group_ids.include?(group_id) && visible_group_ids_for_allowed_check.include?(group_id) + end + end + + def visible_group_ids_for_allowed_check + @visible_group_ids_for_allowed_check ||= + if @allowed_names.present? + Group.members_visible_groups(current_user).where(name: @allowed_names).pluck(:id).to_set + else + topic_allowed_group_ids || Set.new + end end def users diff --git a/app/controllers/directory_items_controller.rb b/app/controllers/directory_items_controller.rb index bf22f82eeb804..f31d8d78fa294 100644 --- a/app/controllers/directory_items_controller.rb +++ b/app/controllers/directory_items_controller.rb @@ -152,7 +152,9 @@ def index def set_groups_exclusion @exclude_group_names = params[:exclude_groups].split("|") - @exclude_group_ids = Group.where(name: @exclude_group_names).pluck(:id) + groups = Group.where(name: @exclude_group_names) + groups = groups.select { |g| guardian.can_see?(g) && guardian.can_see_group_members?(g) } + @exclude_group_ids = groups.map(&:id) @users_in_exclude_groups = GroupUser.where(group_id: @exclude_group_ids).pluck(:user_id) end diff --git a/app/controllers/embed_controller.rb b/app/controllers/embed_controller.rb index d58f26160ce95..45a8d861b2be9 100644 --- a/app/controllers/embed_controller.rb +++ b/app/controllers/embed_controller.rb @@ -149,6 +149,8 @@ def count topic_embeds = TopicEmbed.where(embed_url: urls).includes(:topic).references(:topic) topic_embeds.each do |te| + next if te.topic.present? && !guardian.can_see?(te.topic) + url = te.embed_url url = "#{url}#discourse-comments" if params[:embed_url].exclude?(url) if te.topic.present? diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 918d8cbcbe3d0..e5768c7e51909 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -282,7 +282,7 @@ def members raise Discourse::InvalidParameters.new(:offset) if offset < 0 - dir = (params[:asc] && params[:asc].present?) ? "ASC" : "DESC" + dir = params[:asc].to_s == "true" ? "ASC" : "DESC" order = "NOT group_users.owner" if params[:requesters] @@ -656,10 +656,10 @@ def set_notifications user_id = current_user.id user_id = params[:user_id] || user_id if guardian.is_staff? - GroupUser - .where(group_id: group.id) - .where(user_id: user_id) - .update_all(notification_level: notification_level) + group_user = GroupUser.find_by(group_id: group.id, user_id: user_id) + raise Discourse::InvalidParameters.new(:user_id) if group_user.blank? + + group_user.update!(notification_level: notification_level) render json: success_json end diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb index e0c2c15a3e5e4..1f9337ffdf571 100644 --- a/app/controllers/invites_controller.rb +++ b/app/controllers/invites_controller.rb @@ -3,6 +3,8 @@ require "csv" class InvitesController < ApplicationController + ALLOWED_BULK_INVITE_COLUMNS = %w[email groups topic_id locale] + requires_login only: %i[ create create_multiple @@ -208,6 +210,8 @@ def update guardian.ensure_can_invite_to!(topic) end + invite.topics.each { |t| guardian.ensure_can_invite_to!(t) } if !params.has_key?(:topic_id) + if params[:group_ids].present? || params[:group_names].present? groups = Group.lookup_groups(group_ids: params[:group_ids], group_names: params[:group_names]) end @@ -430,8 +434,8 @@ def perform_accept_invitation end def destroy_all_expired - guardian.ensure_can_destroy_all_invites! user = fetch_user_from_params + guardian.ensure_can_destroy_all_invites!(user) Invite .where(invited_by: user) @@ -490,19 +494,29 @@ def upload_csv csv_header = nil invites = [] + valid_columns = nil CSV.foreach(file.tempfile, encoding: "bom|utf-8") do |row| # Try to extract a CSV header, if it exists if csv_header.nil? if row[0] == "email" csv_header = row + valid_columns = Set.new(ALLOWED_BULK_INVITE_COLUMNS + UserField.pluck(:name)) next else csv_header = %w[email groups topic_id] end end - invites.push(csv_header.zip(row).map.to_h.filter { |k, v| v.present? }) if row[0].present? + if row[0].present? + invite = + csv_header + .zip(row) + .map + .to_h + .filter { |k, v| v.present? && (!valid_columns || valid_columns.include?(k)) } + invites.push(invite) + end break if invites.count >= SiteSetting.max_bulk_invites end diff --git a/app/controllers/list_controller.rb b/app/controllers/list_controller.rb index 78148b03f0498..d4d86be87980e 100644 --- a/app/controllers/list_controller.rb +++ b/app/controllers/list_controller.rb @@ -58,7 +58,7 @@ class ListController < ApplicationController define_method(filter) do |options = nil| list_opts = build_topic_list_options list_opts.merge!(options) if options - user = list_target_user + user = current_user if params[:category].blank? && filter == :latest && !SiteSetting.show_category_definitions_in_topic_lists list_opts[:no_definitions] = true @@ -136,7 +136,7 @@ def filter end end - user = list_target_user + user = current_user list = TopicQuery.new(user, topic_query_opts).list_filter list.more_topics_url = construct_url_with(:next, topic_query_opts) list.prev_topics_url = construct_url_with(:prev, topic_query_opts) @@ -331,7 +331,7 @@ def category_none_top top_options[:per_page] = top_options[:per_page].presence || SiteSetting.topics_per_period_in_top_page - user = list_target_user + user = current_user list = TopicQuery.new(user, top_options).list_top_for(period) list.for_period = period list.more_topics_url = construct_url_with(:next, top_options) @@ -445,14 +445,6 @@ def set_category end end - def list_target_user - if params[:user_id] && guardian.is_staff? - User.find(params[:user_id].to_i) - else - current_user - end - end - def generate_list_for(action, target_user, opts) TopicQuery.new(current_user, opts).public_send("list_#{action}", target_user) end diff --git a/app/controllers/post_action_users_controller.rb b/app/controllers/post_action_users_controller.rb index a9adac60c439e..029266a11b038 100644 --- a/app/controllers/post_action_users_controller.rb +++ b/app/controllers/post_action_users_controller.rb @@ -27,7 +27,9 @@ def index post_actions = DiscoursePluginRegistry.apply_modifier(:post_action_users_list, post_actions, post) - if !guardian.can_see_post_actors?(post.topic, post_action_type_id) + can_see_actors = guardian.can_see_post_actors?(post.topic, post_action_type_id) + + if !can_see_actors raise Discourse::InvalidAccess if current_user.blank? post_actions = post_actions.where(user_id: current_user.id) end @@ -44,7 +46,7 @@ def index ), } - data[:total_rows_post_action_users] = total_count if total_count > page_size + data[:total_rows_post_action_users] = total_count if can_see_actors && total_count > page_size render_json_dump(data) end diff --git a/app/controllers/post_actions_controller.rb b/app/controllers/post_actions_controller.rb index 333f8258ea455..a8a1c27369251 100644 --- a/app/controllers/post_actions_controller.rb +++ b/app/controllers/post_actions_controller.rb @@ -14,7 +14,7 @@ def create current_user, @post, @post_action_type_id, - is_warning: params[:is_warning], + is_warning: ActiveModel::Type::Boolean.new.cast(params[:is_warning]), message: params[:message], take_action: params[:take_action] == "true", flag_topic: params[:flag_topic] == "true", diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index ed96ef7a713a9..1dfa0bdff9927 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -35,28 +35,9 @@ def markdown_id end def markdown_num - if params[:revision].present? - post_revision = find_post_revision_from_topic_id - render plain: post_revision.modifications[:raw].last - elsif params[:post_number].present? - markdown Post.find_by( - topic_id: params[:topic_id].to_i, - post_number: params[:post_number].to_i, - ) - else - opts = params.slice(:page) - opts[:limit] = MARKDOWN_TOPIC_PAGE_SIZE - topic_view = TopicView.new(params[:topic_id], current_user, opts) - content = topic_view.posts.map { |p| <<~MD } - #{p.user.username} | #{p.updated_at} | ##{p.post_number} - - #{p.raw} - - ------------------------- - - MD - render plain: content.join - end + return render plain: markdown_for_revision if params[:revision].present? + return markdown_for_post if params[:post_number].present? + render plain: markdown_for_topic end def latest @@ -82,6 +63,7 @@ def latest posts = Post .private_posts + .where(post_type: Topic.visible_post_types(current_user)) .order(id: :desc) .includes(topic: :category) .includes(user: %i[primary_group flair_group]) @@ -281,9 +263,13 @@ def update if params.key?(:bypass_bump) || params[:post]&.key?(:bypass_bump) if guardian.can_update_bumped_at? - opts[:bypass_bump] = ActiveModel::Type::Boolean.new.cast( - params[:bypass_bump].presence || params.dig(:post, :bypass_bump), - ) + bypass_bump_value = + if params.key?(:bypass_bump) + params[:bypass_bump] + else + params.dig(:post, :bypass_bump) + end + opts[:bypass_bump] = ActiveModel::Type::Boolean.new.cast(bypass_bump_value) end end @@ -738,7 +724,7 @@ def unhide def deleted_posts params.permit(:offset, :limit) - guardian.ensure_can_see_deleted_posts! + guardian.ensure_can_see_deleted_posts_for_user! user = fetch_user_from_params offset = [params[:offset].to_i, 0].max @@ -839,6 +825,33 @@ def find_post_revision_from_topic_id private + def markdown_for_revision + find_post_revision_from_topic_id.modifications[:raw].last + end + + def markdown_for_post + post = Post.find_by(topic_id: params[:topic_id].to_i, post_number: params[:post_number].to_i) + markdown(post) + end + + def markdown_for_topic + topic_view = + TopicView.new( + params[:topic_id], + current_user, + page: params[:page], + limit: MARKDOWN_TOPIC_PAGE_SIZE, + ) + topic_view.posts.select { |post| guardian.can_see?(post) }.map { |post| <<~MD }.join + #{post.user.username} | #{post.updated_at} | ##{post.post_number} + + #{post.raw} + + ------------------------- + + MD + end + def user_posts(guardian, user_id, opts) # Topic.unscoped is necessary to remove the default deleted_at: nil scope posts = @@ -1037,7 +1050,14 @@ def signature_for(args) end def display_post(post) - post.revert_to(params[:version].to_i) if params[:version].present? + if params[:version].present? + version = params[:version].to_i + post_revision = PostRevision.find_by(post_id: post.id, number: version + 1) + if post_revision + guardian.ensure_can_see!(post_revision) + post.revert_to(version) + end + end render_post_json(post) end diff --git a/app/controllers/reviewable_claimed_topics_controller.rb b/app/controllers/reviewable_claimed_topics_controller.rb index f454392374d6e..c7bec08e17a12 100644 --- a/app/controllers/reviewable_claimed_topics_controller.rb +++ b/app/controllers/reviewable_claimed_topics_controller.rb @@ -23,9 +23,9 @@ def create def destroy topic = Topic.with_deleted.find_by(id: params[:id]) automatic = params[:automatic] == "true" - raise Discourse::NotFound if topic.blank? - - guardian.ensure_can_claim_reviewable_topic!(topic, automatic) + if topic.blank? || !guardian.can_claim_reviewable_topic?(topic, automatic) + raise Discourse::NotFound + end deleted_count = ReviewableClaimedTopic.where(topic_id: topic.id).delete_all if deleted_count > 0 topic.reviewables.find_each { |reviewable| reviewable.log_history(:unclaimed, current_user) } diff --git a/app/controllers/reviewables_controller.rb b/app/controllers/reviewables_controller.rb index e6d741c939e31..bee12fde0a19a 100644 --- a/app/controllers/reviewables_controller.rb +++ b/app/controllers/reviewables_controller.rb @@ -241,6 +241,12 @@ def update begin if reviewable.update_fields(edit_params, current_user, version: params[:version].to_i) result = edit_params.merge(version: reviewable.version) + if reviewable.is_a?(ReviewableQueuedPost) && reviewable.payload.present? + result[:cooked] = PrettyText.cook(reviewable.payload["raw"]) if reviewable.payload["raw"] + if reviewable.payload["title"] + result[:fancy_title] = ERB::Util.html_escape(reviewable.payload["title"]) + end + end render json: result else render_json_error(reviewable.errors) diff --git a/app/controllers/static_controller.rb b/app/controllers/static_controller.rb index 30dd80fa227f1..12b779a264ae8 100644 --- a/app/controllers/static_controller.rb +++ b/app/controllers/static_controller.rb @@ -284,6 +284,12 @@ def serve_asset(suffix = nil) begin if GlobalSetting.fallback_assets_path.present? path = File.expand_path("#{GlobalSetting.fallback_assets_path}/#{params[:path]}#{suffix}") + + # fallback path should not escape the fallback directory with /../ + unless path.start_with?(File.expand_path(GlobalSetting.fallback_assets_path)) + raise Discourse::NotFound + end + response.headers["Last-Modified"] = File.ctime(path).httpdate else raise diff --git a/app/controllers/stylesheets_controller.rb b/app/controllers/stylesheets_controller.rb index a1a077eec0df3..a5f9740613c28 100644 --- a/app/controllers/stylesheets_controller.rb +++ b/app/controllers/stylesheets_controller.rb @@ -24,7 +24,10 @@ def color_scheme params.require("id") params.permit("theme_id") - manager = Stylesheet::Manager.new(theme_id: params[:theme_id]) + theme_id = params[:theme_id]&.to_i + theme_id = nil if theme_id && !guardian.allow_themes?([theme_id]) + + manager = Stylesheet::Manager.new(theme_id: theme_id) stylesheet = manager.color_scheme_stylesheet_details(params[:id], fallback_to_base: true) render json: stylesheet diff --git a/app/controllers/tag_groups_controller.rb b/app/controllers/tag_groups_controller.rb index 0da4fab14b653..5257f6ba512cd 100644 --- a/app/controllers/tag_groups_controller.rb +++ b/app/controllers/tag_groups_controller.rb @@ -67,9 +67,15 @@ def update guardian.ensure_can_admin_tag_groups! old_data = TagGroupSerializer.new(@tag_group).to_json(root: false) json_result(@tag_group, serializer: TagGroupSerializer) do |tag_group| - @tag_group.update(tag_groups_params) - new_data = TagGroupSerializer.new(@tag_group).to_json(root: false) - StaffActionLogger.new(current_user).log_tag_group_change(@tag_group.name, old_data, new_data) + if @tag_group.update(tag_groups_params) + new_data = TagGroupSerializer.new(@tag_group).to_json(root: false) + StaffActionLogger.new(current_user).log_tag_group_change( + @tag_group.name, + old_data, + new_data, + ) + true + end end end diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index 3c499f8a7e008..99ad6d8f98ff1 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -288,7 +288,7 @@ def update previous_tag_name = @tag.name @tag.name = DiscourseTagging.clean_tag(new_tag_name) if new_tag_name.present? - @tag.description = new_tag_description if new_tag_description.present? + @tag.description = new_tag_description if new_tag.has_key?(:description) if @tag.save if @tag.name != previous_tag_name @@ -518,7 +518,7 @@ def personal_messages end def create_synonyms - guardian.ensure_can_edit_tag! + guardian.ensure_can_edit_tag!(@tag) # frontend uses form data tags_param = params[:tags].try(:values) || params[:tags] diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb index a0c58c790307f..c9f1ac06a2847 100644 --- a/app/controllers/topics_controller.rb +++ b/app/controllers/topics_controller.rb @@ -167,7 +167,8 @@ def show discourse_expires_in 1.minute - if slugs_do_not_match || (!request.format.json? && params[:slug].nil?) + if slugs_do_not_match || + (!request.format.json? && params[:slug].nil? && @topic_view.topic.slug.present?) redirect_to_correct_topic(@topic_view.topic, opts[:post_number]) return end @@ -495,7 +496,12 @@ def update_tags topic = Topic.find_by(id: params[:topic_id]) guardian.ensure_can_edit_tags!(topic) - tags = params[:tags] || [] + tags = + if params[:tags].is_a?(ActionController::Parameters) + params[:tags].values + else + params[:tags] || [] + end if tags.present? && tags.first.is_a?(String) Discourse.deprecate( @@ -505,14 +511,14 @@ def update_tags ) end - success = - PostRevisor.new(topic.first_post, topic).revise!( - current_user, - { tags: }, - validate_post: false, - ) + revisor = PostRevisor.new(topic.first_post, topic) + revised = revisor.revise!(current_user, { tags: }, validate_post: false) - success ? render_serialized(topic, BasicTopicSerializer) : render_json_error(topic) + if revised || topic.errors.blank? + render_serialized(topic, BasicTopicSerializer) + else + render_json_error(topic) + end end def feature_stats @@ -1124,6 +1130,8 @@ def bulk result = { topic_ids: changed_topic_ids } result[:errors] = operator.errors if operator.errors.present? render_json_dump result + rescue Discourse::InvalidParameters => ex + render_json_error(ex, status: 400) end end diff --git a/app/controllers/user_actions_controller.rb b/app/controllers/user_actions_controller.rb index ebad42936c4c0..32c1245a632e3 100644 --- a/app/controllers/user_actions_controller.rb +++ b/app/controllers/user_actions_controller.rb @@ -13,8 +13,11 @@ def index action_types = (user_actions_params[:filter] || "").split(",").map(&:to_i) limit = user_actions_params.fetch(:limit, 30).to_i - raise Discourse::NotFound unless guardian.can_see_profile?(user) - raise Discourse::NotFound unless guardian.can_see_user_actions?(user, action_types) + ensure_user_actions_visible!(user, action_types) + + if action_types.empty? && !guardian.can_see_user_actions?(user, UserAction.private_types) + action_types = UserAction.types.values - UserAction.private_types + end opts = { user_id: user.id, @@ -42,11 +45,24 @@ def index def show params.require(:id) - render_serialized(UserAction.stream_item(params[:id], guardian), UserActionSerializer) + stream_item = UserAction.stream_item(params[:id], guardian) + raise Discourse::NotFound if stream_item.blank? + + user = User.find_by(id: stream_item.target_user_id) + raise Discourse::NotFound if user.blank? + + ensure_user_actions_visible!(user, [stream_item.action_type]) + + render_serialized(stream_item, UserActionSerializer) end private + def ensure_user_actions_visible!(user, action_types) + raise Discourse::NotFound unless guardian.can_see_profile?(user) + raise Discourse::NotFound unless guardian.can_see_user_actions?(user, action_types) + end + def user_actions_params @user_actions_params ||= params.permit(:username, :filter, :offset, :acting_username, :limit) end diff --git a/app/controllers/user_api_keys_controller.rb b/app/controllers/user_api_keys_controller.rb index 3761b21853352..3e1496aa61526 100644 --- a/app/controllers/user_api_keys_controller.rb +++ b/app/controllers/user_api_keys_controller.rb @@ -22,6 +22,7 @@ def new find_client require_client_params validate_params + validate_auth_redirect unless current_user cookies[:destination_url] = request.fullpath @@ -51,7 +52,7 @@ def new nil else uri = URI.parse(@auth_redirect) - if [80, 443].include?(uri.port) + if uri.port.nil? || [80, 443].include?(uri.port) uri.host else uri.host + ":" + uri.port.to_s diff --git a/app/controllers/users/omniauth_callbacks_controller.rb b/app/controllers/users/omniauth_callbacks_controller.rb index 5eed4da40b890..528d412b1f589 100644 --- a/app/controllers/users/omniauth_callbacks_controller.rb +++ b/app/controllers/users/omniauth_callbacks_controller.rb @@ -122,7 +122,7 @@ def failure error = provider.present? ? "generic_with_provider" : "generic_without_provider" end - flash[:error] = I18n.t("login.omniauth_error.#{error}", provider:).html_safe + flash[:error] = I18n.t("login.omniauth_error.#{error}", provider:) render "failure" end @@ -158,8 +158,8 @@ def invite_required? if SiteSetting.invite_only? path = Discourse.route_for(@origin) return true unless path - return true if path[:controller] != "invites" && path[:action] != "show" - !Invite.exists?(invite_key: path[:id]) + return true if path[:controller] != "invites" || path[:action] != "show" + !Invite.find_by(invite_key: path[:id])&.redeemable? end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 3fb03ec57a384..165074924656e 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -30,6 +30,7 @@ class UsersController < ApplicationController register_passkey rename_passkey delete_passkey + update_security_key feature_topic clear_featured_topic bookmarks @@ -40,6 +41,11 @@ class UsersController < ApplicationController reset_recent_searches user_menu_bookmarks user_menu_messages + update_primary_email + destroy_email + badge_title + remove_password + private_message_topic_tracking_state toggle_anon ] @@ -78,8 +84,8 @@ class UsersController < ApplicationController create_second_factor_security_key register_passkey delete_passkey + update_security_key ] - before_action :respond_to_suspicious_request, only: [:create] # we need to allow account creation with bad CSRF tokens, if people are caching, the CSRF token on the @@ -1928,10 +1934,14 @@ def bookmarks end end format.ics do + bookmark_query = Bookmark.with_reminders.where(user_id: user.id) + + after_param = params[:after].presence || 3.months.ago.iso8601 + after_date = after_param == "now" ? Time.current : after_param.to_datetime + bookmark_query = bookmark_query.where("reminder_at >= ?", after_date) + @bookmark_reminders = - Bookmark - .with_reminders - .where(user_id: user.id) + bookmark_query .order(:reminder_at) .map do |bookmark| bookmark.registered_bookmarkable.serializer.new( diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 491a51531365d..51a5150376e20 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -90,6 +90,16 @@ def is_gzip_req? request.env["HTTP_ACCEPT_ENCODING"] =~ /gzip/ end + def generate_import_map(plugin_assets) + imports = + plugin_assets + .filter { it[:importmap_name] } + .map { [it[:importmap_name], script_asset_path(it[:name])] } + .to_h + + JSON.pretty_generate({ imports: }).html_safe + end + def script_asset_path(script) path = ActionController::Base.helpers.asset_path("#{script}.js") @@ -113,16 +123,17 @@ def script_asset_path(script) path = "#{resolved_s3_asset_cdn_url}#{path}" end - # assets needed for theme testing are not compressed because they take a fair - # amount of time to compress (+30 seconds) during rebuilds/deploys when the - # vast majority of sites will never need them, so it makes more sense to serve - # them uncompressed instead of making everyone's rebuild/deploy take +30 more - # seconds. - if !script.start_with?("discourse/tests/") - if is_brotli_req? - path = path.gsub(/\.([^.]+)\z/, '.br.\1') - elsif is_gzip_req? - path = path.gsub(/\.([^.]+)\z/, '.gz.\1') + if is_brotli_req? + if path.include?("/assets/js/") + path = path.sub("/assets/js/", "/assets/br/") + else + path = path.sub(/\.([^.]+)\z/, '.br.\1') + end + elsif is_gzip_req? + if path.include?("/assets/js/") + path = path.sub("/assets/js/", "/assets/gz/") + else + path = path.sub(/\.([^.]+)\z/, '.gz.\1') end end end @@ -148,12 +159,12 @@ def preload_script(script, attrs: {}) .html_safe end - def preload_script_url(url, entrypoint: nil, type_module: false, attrs: {}) + def preload_script_url(url, entrypoint: nil, type_module: false, attrs: nil) entrypoint_attribute = entrypoint ? "data-discourse-entrypoint=\"#{entrypoint}\"" : "" nonce_attribute = "nonce=\"#{csp_nonce_placeholder}\"" extra_attrs = - attrs.map { |k, v| "#{ERB::Util.html_escape(k)}=\"#{ERB::Util.html_escape(v)}\"" }.join(" ") + attrs&.map { |k, v| "#{ERB::Util.html_escape(k)}=\"#{ERB::Util.html_escape(v)}\"" }&.join(" ") extra_attrs = " #{extra_attrs}" if extra_attrs.present? add_resource_preload_list(url, "script") diff --git a/app/helpers/embed_helper.rb b/app/helpers/embed_helper.rb index 3af784f89aa78..bcd8e8c358794 100644 --- a/app/helpers/embed_helper.rb +++ b/app/helpers/embed_helper.rb @@ -1,6 +1,10 @@ # frozen_string_literal: true module EmbedHelper + def embed_post_date_title(dt) + dt.strftime I18n.t("datetime_formats.formats.long") + end + def embed_post_date(dt) current = Time.now diff --git a/app/jobs/regular/export_csv_file.rb b/app/jobs/regular/export_csv_file.rb index 20bca4d3e23ce..739e21ed0d37c 100644 --- a/app/jobs/regular/export_csv_file.rb +++ b/app/jobs/regular/export_csv_file.rb @@ -221,10 +221,13 @@ def report_export end if report.modes == [Report::MODES[:stacked_chart]] + hidden_labels = @extra[:hidden_labels].to_s.split(",").map(&:strip) + header = [:x] data = {} - report.data.map do |series| + report.data.each do |series| + next if hidden_labels.include?(series[:req]) header << series[:label] series[:data].each do |datapoint| data[datapoint[:x]] ||= { x: datapoint[:x] } diff --git a/app/jobs/regular/export_user_archive.rb b/app/jobs/regular/export_user_archive.rb index 5508c2a10f86b..a5035f0e4b7c0 100644 --- a/app/jobs/regular/export_user_archive.rb +++ b/app/jobs/regular/export_user_archive.rb @@ -36,6 +36,7 @@ class ExportUserArchive < ::Jobs::Base like_count reply_count url + post_id created_at ], user_archive_profile: %w[location website bio views], @@ -205,7 +206,7 @@ def user_archive_export Post .includes(topic: :category) .where(user_id: @archive_for_user.id) - .select(:topic_id, :post_number, :raw, :cooked, :like_count, :reply_count, :created_at) + .select(:id, :topic_id, :post_number, :raw, :cooked, :like_count, :reply_count, :created_at) .order(:created_at) .with_deleted .each { |user_archive| yield get_user_archive_fields(user_archive) } @@ -599,6 +600,7 @@ def get_user_archive_fields(user_archive) "categories" => categories, "is_pm" => is_pm, "url" => url, + "post_id" => user_archive["id"], } user_archive.merge!(topic_hash) diff --git a/app/jobs/regular/post_update_topic_tracking_state.rb b/app/jobs/regular/post_update_topic_tracking_state.rb index da3a11268d81e..c308df571a6f3 100644 --- a/app/jobs/regular/post_update_topic_tracking_state.rb +++ b/app/jobs/regular/post_update_topic_tracking_state.rb @@ -10,8 +10,9 @@ def execute(args) if topic.private_message? PrivateMessageTopicTrackingState.publish_unread(post) if post.post_number > 1 - - TopicGroup.new_message_update(topic.last_poster, topic.id, post.post_number) + if post.post_type != Post.types[:small_action] + TopicGroup.new_message_update(topic.last_poster, topic.id, post.post_number) + end else TopicTrackingState.publish_unmuted(post.topic) if post.post_number > 1 diff --git a/app/jobs/regular/remove_banner.rb b/app/jobs/regular/remove_banner.rb index 6ef278e6d5fe0..86e241eba7327 100644 --- a/app/jobs/regular/remove_banner.rb +++ b/app/jobs/regular/remove_banner.rb @@ -8,7 +8,7 @@ def execute(args) return if topic_id.blank? topic = Topic.find_by(id: topic_id) - topic.remove_banner!(Discourse.system_user) if topic.present? + topic.presence&.remove_banner!(Discourse.system_user) end end end diff --git a/app/jobs/regular/unpin_topic.rb b/app/jobs/regular/unpin_topic.rb index ebf093e82fa3c..f2e2f7370fefd 100644 --- a/app/jobs/regular/unpin_topic.rb +++ b/app/jobs/regular/unpin_topic.rb @@ -8,7 +8,7 @@ def execute(args) return if topic_id.blank? topic = Topic.find_by(id: topic_id) - topic.update_pinned(false) if topic.present? + topic.presence&.update_pinned(false) end end end diff --git a/app/jobs/scheduled/check_upcoming_changes.rb b/app/jobs/scheduled/check_upcoming_changes.rb index 722efb169ab70..0e85d0d2ded61 100644 --- a/app/jobs/scheduled/check_upcoming_changes.rb +++ b/app/jobs/scheduled/check_upcoming_changes.rb @@ -5,8 +5,6 @@ class CheckUpcomingChanges < ::Jobs::Scheduled every 20.minutes def execute(args) - return if !SiteSetting.enable_upcoming_changes - site = RailsMultisite::ConnectionManagement.current_db verbose_log( site, diff --git a/app/mailers/user_notifications.rb b/app/mailers/user_notifications.rb index 0eae8a12717b2..633e10affed2c 100644 --- a/app/mailers/user_notifications.rb +++ b/app/mailers/user_notifications.rb @@ -251,7 +251,9 @@ def account_second_factor_disabled(user, opts = {}) def digest(user, opts = {}) build_summary_for(user) - @unsubscribe_key = UnsubscribeKey.create_key_for(@user, UnsubscribeKey::DIGEST_TYPE) + if !opts[:skip_unsubscribe_links] + @unsubscribe_key = UnsubscribeKey.create_key_for(@user, UnsubscribeKey::DIGEST_TYPE) + end @since = opts[:since].presence @since ||= [user.last_seen_at, user.user_stat&.digest_attempted_at, 1.month.ago].compact.max @@ -371,7 +373,7 @@ def digest(user, opts = {}) email_prefix: @email_prefix, date: short_date(Time.now), ), - add_unsubscribe_link: true, + add_unsubscribe_link: !opts[:skip_unsubscribe_links], unsubscribe_url: "#{Discourse.base_url}/email/unsubscribe/#{@unsubscribe_key}", topic_ids: topics_for_digest.pluck(:id), post_ids: diff --git a/app/models/about.rb b/app/models/about.rb index a6ead14dd1fb4..e4049d5b3ac02 100644 --- a/app/models/about.rb +++ b/app/models/about.rb @@ -66,21 +66,33 @@ def site_creation_date def moderators @moderators ||= - apply_excluded_groups( - User.where(moderator: true).human_users.order(last_seen_at: :desc), - ignore_groups: [Group::AUTO_GROUPS[:admins]], - ) + if guardian.public_can_see_profiles? + apply_hidden_profile( + apply_excluded_groups( + User.where(moderator: true).human_users.order(last_seen_at: :desc), + ignore_groups: [Group::AUTO_GROUPS[:admins]], + ), + ) + else + [] + end end def admins @admins ||= - DiscoursePluginRegistry.apply_modifier( - :about_admins, - apply_excluded_groups( - User.where(admin: true).human_users.order(last_seen_at: :desc), - ignore_groups: [Group::AUTO_GROUPS[:moderators]], - ), - ) + if guardian.public_can_see_profiles? + DiscoursePluginRegistry.apply_modifier( + :about_admins, + apply_hidden_profile( + apply_excluded_groups( + User.where(admin: true).human_users.order(last_seen_at: :desc), + ignore_groups: [Group::AUTO_GROUPS[:moderators]], + ), + ), + ) + else + [] + end end def stats @@ -88,7 +100,9 @@ def stats end def category_moderators - allowed_cats = Guardian.new(@user).allowed_category_ids + return [] unless guardian.public_can_see_profiles? + + allowed_cats = guardian.allowed_category_ids return [] if allowed_cats.blank? cats_with_mods = Category.joins(:category_moderation_groups).distinct.pluck(:id) @@ -99,6 +113,8 @@ def category_moderators per_cat_limit = category_mods_limit / category_ids.size per_cat_limit = 1 if per_cat_limit < 1 + filter_hidden_profiles = !guardian.is_staff? && SiteSetting.allow_users_to_hide_profile + results = DB.query(<<~SQL, category_ids:) WITH moderator_users AS ( SELECT @@ -111,7 +127,9 @@ def category_moderators ON cmg.group_id = gu.group_id INNER JOIN users u ON gu.user_id = u.id + #{"LEFT JOIN user_options uo ON uo.user_id = u.id" if filter_hidden_profiles} WHERE cmg.category_id IN (:category_ids) + #{"AND uo.hide_profile IS NOT TRUE" if filter_hidden_profiles} ) SELECT id AS category_id, user_ids FROM categories @@ -143,13 +161,24 @@ def category_mods_limit=(number) private + def guardian + @guardian ||= Guardian.new(@user) + end + + def apply_hidden_profile(query) + return query if guardian.is_staff? + return query unless SiteSetting.allow_users_to_hide_profile + + query.left_joins(:user_option).where("user_options.hide_profile IS NOT TRUE") + end + def apply_excluded_groups(query, ignore_groups: []) group_ids = SiteSetting.about_page_hidden_groups_map - ignore_groups return query if group_ids.blank? query.joins( DB.sql_fragment( - "LEFT JOIN group_users ON group_id IN (:group_ids) AND user_id = users.id", + "LEFT JOIN group_users ON group_users.group_id IN (:group_ids) AND group_users.user_id = users.id", group_ids:, ), ).where("group_users.id": nil) diff --git a/app/models/api_key_scope.rb b/app/models/api_key_scope.rb index 97af146ab83c6..adfaaf40da0ed 100644 --- a/app/models/api_key_scope.rb +++ b/app/models/api_key_scope.rb @@ -339,6 +339,8 @@ def find_urls(actions:, methods:) end def permits?(env) + return false if mapping.nil? + RouteMatcher.new(**mapping.except(:urls), allowed_param_values: allowed_parameters).match?( env: env, ) diff --git a/app/models/category.rb b/app/models/category.rb index fa84c0b239c23..bc22b0fdcd12d 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -37,6 +37,7 @@ class Category < ActiveRecord::Base has_many :category_groups, dependent: :destroy has_many :category_moderation_groups, dependent: :destroy + has_many :category_posting_review_groups, dependent: :destroy has_many :groups, through: :category_groups has_many :moderating_groups, through: :category_moderation_groups, source: :group has_many :topic_timers, dependent: :destroy @@ -312,6 +313,25 @@ def reset_topic_ids_cache Category.reset_topic_ids_cache end + def category_types + return {} if !SiteSetting.enable_simplified_category_creation + Categories::TypeRegistry + .all + .values + .each_with_object({}) do |type_klass, result| + result[type_klass.type_id] = type_klass.metadata if type_klass.category_matches?(self) + end + end + + def category_type_site_setting_names + category_types + .values + .filter_map { |type_metadata| type_metadata.dig(:configuration_schema, :site_settings) } + .flatten(1) + .map { |setting| setting[:key].to_sym } + .uniq + end + # Accepts an array of slugs with each item in the array # Returns the category ids of the last slug in the array. The slugs array has to follow the proper category # nesting hierarchy. If any of the slug in the array is invalid or if the slugs array does not follow the proper @@ -1252,64 +1272,65 @@ def on_custom_fields_change # Table name: categories # # id :integer not null, primary key -# name :string(50) not null -# color :string(6) default("0088CC"), not null -# topic_id :integer -# topic_count :integer default(0), not null -# created_at :datetime not null -# updated_at :datetime not null -# user_id :integer not null -# topics_year :integer default(0) -# topics_month :integer default(0) -# topics_week :integer default(0) -# slug :string not null -# description :text -# text_color :string(6) default("FFFFFF"), not null -# read_restricted :boolean default(FALSE), not null -# auto_close_hours :float -# post_count :integer default(0), not null -# latest_post_id :integer -# latest_topic_id :integer -# position :integer -# parent_category_id :integer -# posts_year :integer default(0) -# posts_month :integer default(0) -# posts_week :integer default(0) -# email_in :string -# email_in_allow_strangers :boolean default(FALSE) -# topics_day :integer default(0) -# posts_day :integer default(0) +# all_topics_wiki :boolean default(FALSE), not null # allow_badges :boolean default(TRUE), not null -# name_lower :string(50) not null +# allow_global_tags :boolean default(FALSE), not null +# allow_unlimited_owner_edits_on_first_post :boolean default(FALSE), not null # auto_close_based_on_last_post :boolean default(FALSE) -# topic_template :text +# auto_close_hours :float +# color :string(6) default("0088CC"), not null # contains_messages :boolean -# sort_order :string -# sort_ascending :boolean -# uploaded_logo_id :integer -# uploaded_background_id :integer -# topic_featured_link_allowed :boolean default(TRUE) -# all_topics_wiki :boolean default(FALSE), not null -# show_subcategory_list :boolean default(FALSE) -# num_featured_topics :integer default(3) -# default_view :string(50) -# subcategory_list_style :string(50) default("rows_with_featured_topics") +# default_list_filter :string(20) default("all") +# default_slow_mode_seconds :integer # default_top_period :string(20) default("all") +# default_view :string(50) +# description :text +# email_in :string +# email_in_allow_strangers :boolean default(FALSE) +# emoji :string +# icon :string +# locale :string(20) # mailinglist_mirror :boolean default(FALSE), not null # minimum_required_tags :integer default(0), not null +# name :string(50) not null +# name_lower :string(50) not null # navigate_to_first_post_after_read :boolean default(FALSE), not null -# search_priority :integer default(0) -# allow_global_tags :boolean default(FALSE), not null +# num_featured_topics :integer default(3) +# position :integer +# post_count :integer default(0), not null +# posts_day :integer default(0) +# posts_month :integer default(0) +# posts_week :integer default(0) +# posts_year :integer default(0) # read_only_banner :string -# default_list_filter :string(20) default("all") -# allow_unlimited_owner_edits_on_first_post :boolean default(FALSE), not null -# default_slow_mode_seconds :integer -# uploaded_logo_dark_id :integer -# uploaded_background_dark_id :integer +# read_restricted :boolean default(FALSE), not null +# search_priority :integer default(0) +# show_subcategory_list :boolean default(FALSE) +# slug :string not null +# sort_ascending :boolean +# sort_order :string # style_type :integer default("square"), not null -# emoji :string -# icon :string -# locale :string(20) +# subcategory_list_style :string(50) default("rows_with_featured_topics") +# text_color :string(6) default("FFFFFF"), not null +# topic_count :integer default(0), not null +# topic_featured_link_allowed :boolean default(TRUE) +# topic_template :text +# topic_title_placeholder :string +# topics_day :integer default(0) +# topics_month :integer default(0) +# topics_week :integer default(0) +# topics_year :integer default(0) +# created_at :datetime not null +# updated_at :datetime not null +# latest_post_id :integer +# latest_topic_id :integer +# parent_category_id :integer +# topic_id :integer +# uploaded_background_dark_id :integer +# uploaded_background_id :integer +# uploaded_logo_dark_id :integer +# uploaded_logo_id :integer +# user_id :integer not null # # Indexes # diff --git a/app/models/category_posting_review_group.rb b/app/models/category_posting_review_group.rb new file mode 100644 index 0000000000000..4f5a45208f661 --- /dev/null +++ b/app/models/category_posting_review_group.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +class CategoryPostingReviewGroup < ActiveRecord::Base + belongs_to :category + belongs_to :group + + validates :category, presence: true + validates :group, presence: true + validate :only_everyone_group_with_required_permission + + enum :post_type, { topic: 0, reply: 1 } + enum :permission, { exempt: 0, required: 1 } + + private + + def only_everyone_group_with_required_permission + if group_id != Group::AUTO_GROUPS[:everyone] + errors.add( + :base, + "Group-based approval permissions for specific groups are not supported yet", + ) + end + end +end + +# == Schema Information +# +# Table name: category_posting_review_groups +# +# id :bigint not null, primary key +# permission :integer not null +# post_type :integer not null +# created_at :datetime not null +# updated_at :datetime not null +# category_id :integer not null +# group_id :integer not null +# +# Indexes +# +# idx_category_posting_review_groups_unique (category_id,group_id,post_type) UNIQUE +# diff --git a/app/models/category_setting.rb b/app/models/category_setting.rb index 95eb4a215d168..e879278ffc052 100644 --- a/app/models/category_setting.rb +++ b/app/models/category_setting.rb @@ -1,8 +1,33 @@ # frozen_string_literal: true class CategorySetting < ActiveRecord::Base + # TODO: drop columns require_topic_approval, require_reply_approval in a future migration + self.ignored_columns += %i[require_topic_approval require_reply_approval] + belongs_to :category + before_save :sync_posting_review_groups + + def require_topic_approval=(value) + @require_topic_approval = value + updated_at_will_change! + end + + def require_reply_approval=(value) + @require_reply_approval = value + updated_at_will_change! + end + + def require_topic_approval + goldiload { |ids| CategorySetting.approval_required_map(ids, :topic) } + end + alias_method :require_topic_approval?, :require_topic_approval + + def require_reply_approval + goldiload { |ids| CategorySetting.approval_required_map(ids, :reply) } + end + alias_method :require_reply_approval?, :require_reply_approval + validates :num_auto_bump_daily, numericality: { only_integer: true, @@ -16,6 +41,41 @@ class CategorySetting < ActiveRecord::Base greater_than_or_equal_to: 0, allow_nil: true, } + + def self.approval_required_map(ids, post_type) + approved_ids = + where( + id: ids, + category_id: + CategoryPostingReviewGroup.where(post_type: post_type, permission: :required).select( + :category_id, + ), + ).pluck(:id).to_set + + ids.index_with { |id| approved_ids.include?(id) } + end + + private + + def sync_posting_review_groups + return if @require_topic_approval.nil? && @require_reply_approval.nil? + + everyone = Group[:everyone] + + { topic: @require_topic_approval, reply: @require_reply_approval }.each do |type, value| + next if value.nil? + + scope = category.category_posting_review_groups.where(post_type: type) + if ActiveModel::Type::Boolean.new.cast(value) + scope.create_or_find_by!(permission: :required, group: everyone) + else + scope.where(group: everyone, permission: :required).delete_all + end + end + + @require_topic_approval = nil + @require_reply_approval = nil + end end # == Schema Information @@ -23,13 +83,12 @@ class CategorySetting < ActiveRecord::Base # Table name: category_settings # # id :bigint not null, primary key -# category_id :bigint not null -# require_topic_approval :boolean default(FALSE) -# require_reply_approval :boolean default(FALSE) +# auto_bump_cooldown_days :integer default(1) # num_auto_bump_daily :integer default(0) # created_at :datetime not null # updated_at :datetime not null -# auto_bump_cooldown_days :integer default(1) +# category_id :bigint not null +# # Indexes # # index_category_settings_on_category_id (category_id) UNIQUE diff --git a/app/models/color_scheme.rb b/app/models/color_scheme.rb index 4a5c14aa55f34..983a4048f2b88 100644 --- a/app/models/color_scheme.rb +++ b/app/models/color_scheme.rb @@ -406,16 +406,17 @@ def self.base_color_schemes end def self.base - return @base_color_scheme if @base_color_scheme - @base_color_scheme = - new( - id: NAMES_TO_ID_MAP[LIGHT_PALETTE_NAME], - name: I18n.t("admin_js.admin.customize.theme.default_light_scheme"), - ) - @base_color_scheme.colors = base_colors.map { |name, hex| { name: name, hex: hex } } - @base_color_scheme.is_base = true - @base_color_scheme.is_builtin_default = true - @base_color_scheme + @base_color_scheme ||= + begin + scheme = new(id: NAMES_TO_ID_MAP[LIGHT_PALETTE_NAME], name: LIGHT_PALETTE_NAME) + scheme.colors = base_colors.map { |name, hex| { name: name, hex: hex } } + scheme.is_base = true + scheme.is_builtin_default = true + scheme.define_singleton_method(:name) do + I18n.t("admin_js.admin.customize.theme.default_light_scheme") + end + scheme + end end def self.is_base?(scheme_name) diff --git a/app/models/concerns/localizable.rb b/app/models/concerns/localizable.rb index 06039e0216d47..23cb65f34fab3 100644 --- a/app/models/concerns/localizable.rb +++ b/app/models/concerns/localizable.rb @@ -31,6 +31,10 @@ def get_localization(locale = I18n.locale) end end + def has_localization?(locale = I18n.locale) + get_localization(locale).present? + end + def in_user_locale? LocaleNormalizer.is_same?(locale, I18n.locale) end diff --git a/app/models/concerns/reports/post_edits.rb b/app/models/concerns/reports/post_edits.rb index c096e1ffa9503..560f2f346de45 100644 --- a/app/models/concerns/reports/post_edits.rb +++ b/app/models/concerns/reports/post_edits.rb @@ -81,8 +81,9 @@ def report_post_edits(report) /*limit*/ SQL + builder.join "topics t ON t.id = p.topic_id" + if category_id - builder.join "topics t ON t.id = p.topic_id" if include_subcategories builder.where("t.category_id IN (?)", Category.subcategory_ids(category_id)) else @@ -90,6 +91,12 @@ def report_post_edits(report) end end + unless report.current_user&.admin? + builder.where("t.archetype != ?", Archetype.private_message) + builder.join "categories c ON c.id = t.category_id" + builder.secure_category(Guardian.new(report.current_user).secure_category_ids) + end + if editor_username builder.where("editor.username = ?", editor_username) else diff --git a/app/models/concerns/reports/visits.rb b/app/models/concerns/reports/visits.rb index 7878d0a3b7d09..e62af80045444 100644 --- a/app/models/concerns/reports/visits.rb +++ b/app/models/concerns/reports/visits.rb @@ -10,20 +10,77 @@ def report_visits(report) report.icon = "user" - basic_report_about report, - UserVisit, - :by_day, - report.start_date, - report.end_date, - group_filter - add_counts report, UserVisit, "visited_at" - - report.prev30Days = - UserVisit.where( - "visited_at >= ? and visited_at < ?", - report.start_date - 30.days, + if SiteSetting.reporting_improvements + report_visits_stacked(report, group_filter) + else + basic_report_about report, + UserVisit, + :by_day, + report.start_date, + report.end_date, + group_filter + add_counts report, UserVisit, "visited_at" + + if report.facets.include?(:prev30Days) + report.prev30Days = + UserVisit.where( + "visited_at >= ? AND visited_at < ?", + report.start_date - 30.days, + report.start_date, + ).count + end + end + end + + private + + def report_visits_stacked(report, group_filter) + report.modes = [Report::MODES[:stacked_chart]] + report.default_group_by = "weekly" + + results = + UserVisit.counts_by_day_and_mobile( report.start_date, - ).count + report.end_date, + group_id: group_filter, + ) + + desktop_data = [] + mobile_data = [] + + results.each do |row| + if row.mobile + mobile_data << { x: row.visited_at.to_s, y: row.visit_count } + else + desktop_data << { x: row.visited_at.to_s, y: row.visit_count } + end + end + + report.data = [ + { + req: "desktop", + label: I18n.t("reports.visits.xaxis.desktop"), + color: report.colors[:turquoise], + data: desktop_data, + }, + { + req: "mobile", + label: I18n.t("reports.visits.xaxis.mobile"), + color: report.colors[:lime], + data: mobile_data, + }, + ] + + report.total = results.first&.total || 0 + + if report.facets.include?(:prev30Days) + report.prev30Days = + UserVisit.where( + "visited_at >= ? AND visited_at < ?", + report.start_date - 30.days, + report.start_date, + ).count + end end end end diff --git a/app/models/emoji.rb b/app/models/emoji.rb index d17a994ceb12f..b24ce96803685 100644 --- a/app/models/emoji.rb +++ b/app/models/emoji.rb @@ -308,7 +308,10 @@ def self.unicode_replacements replacements[code] = name if is_tonable_emojis.include?(name) fitzpatrick_scales.each_with_index do |scale, index| - toned_code = code.codepoints.insert(1, scale).pack("U*") + codepoints = code.codepoints + codepoints.delete_at(1) if codepoints[1] == 0xfe0f + + toned_code = codepoints.insert(1, scale).pack("U*") replacements[toned_code] = "#{name}:t#{index + 2}" end end @@ -348,7 +351,10 @@ def self.lookup_unicode(name) map[e["name"]] = code if is_tonable_emojis.include?(e["name"]) FITZPATRICK_SCALE.each_with_index do |scale, index| - toned_code = (code.codepoints.insert(1, scale.to_i(16))).pack("U*") + codepoints = code.codepoints + codepoints.delete_at(1) if codepoints[1] == 0xfe0f + + toned_code = (codepoints.insert(1, scale.to_i(16))).pack("U*") map["#{e["name"]}:t#{index + 2}"] = toned_code end end diff --git a/app/models/notification.rb b/app/models/notification.rb index 7d4cf76e1e437..513dfd4cffe8d 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -279,7 +279,7 @@ def data_hash end def url - topic.relative_url(post_number) if topic.present? + topic.presence&.relative_url(post_number) end def post diff --git a/app/models/post.rb b/app/models/post.rb index e64e3a8c5a5cd..a5e64d658fd85 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -399,7 +399,7 @@ def total_hosts_usage hosts = linked_hosts.clone allowlisted = allowed_spam_hosts - hosts.reject! { |h| allowlisted.any? { |w| h.end_with?(w) } } + hosts.reject! { |h| allowlisted.any? { |w| h == w || h.end_with?(".#{w}") } } return hosts if hosts.length == 0 @@ -1187,10 +1187,6 @@ def mentions PrettyText.extract_mentions(Nokogiri::HTML5.fragment(cooked)) end - def has_localization?(locale = I18n.locale) - get_localization(locale).present? - end - private def access_control_post_id_for_upload diff --git a/app/models/private_message_topic_tracking_state.rb b/app/models/private_message_topic_tracking_state.rb index 14518158fe7df..d50069b3182c8 100644 --- a/app/models/private_message_topic_tracking_state.rb +++ b/app/models/private_message_topic_tracking_state.rb @@ -92,6 +92,7 @@ def self.report_raw_sql(user, skip_unread: false, skip_new: false) topics.archetype = 'private_message' AND ((#{unread}) OR (#{new})) AND topics.deleted_at IS NULL + #{user.staff? ? "" : "AND topics.visible"} SQL end @@ -104,7 +105,7 @@ def self.publish_unread(post) allowed_group_ids = topic.allowed_groups.pluck(:id) group_ids = - if post.post_type == Post.types[:whisper] + if post.post_type == Post.types[:whisper] || post.post_type == Post.types[:small_action] [Group::AUTO_GROUPS[:staff]] else allowed_group_ids diff --git a/app/models/remote_theme.rb b/app/models/remote_theme.rb index de5c83c3dbdfd..5ed758e4eec05 100644 --- a/app/models/remote_theme.rb +++ b/app/models/remote_theme.rb @@ -84,11 +84,16 @@ def self.update_zipped_theme( ) end - def self.import_theme_from_directory(directory, theme_id: nil) + def self.import_theme_from_directory( + directory, + theme_id: nil, + allow_out_of_sequence_migration: false + ) update_theme( ThemeStore::DirectoryImporter.new(directory), update_components: "none", theme_id: theme_id, + allow_out_of_sequence_migration: allow_out_of_sequence_migration, ) end @@ -97,7 +102,8 @@ def self.update_theme( user: Discourse.system_user, theme_id: nil, update_components: nil, - run_migrations: true + run_migrations: true, + allow_out_of_sequence_migration: false ) importer.import! @@ -132,6 +138,7 @@ def self.update_theme( skip_update: true, already_in_transaction: true, run_migrations:, + allow_out_of_sequence_migration:, ) if existing && update_components.present? && update_components != "none" @@ -236,7 +243,8 @@ def update_from_remote( skip_update: false, raise_if_theme_save_fails: true, already_in_transaction: false, - run_migrations: true + run_migrations: true, + allow_out_of_sequence_migration: false ) cleanup = false @@ -390,7 +398,12 @@ def update_from_remote( create_theme_site_settings(theme, theme_info["theme_site_settings"]) - theme.migrate_settings(start_transaction: false) if run_migrations + if run_migrations + theme.migrate_settings( + start_transaction: false, + allow_out_of_sequence_migration: allow_out_of_sequence_migration, + ) + end end if already_in_transaction diff --git a/app/models/report.rb b/app/models/report.rb index 0cafd36d41493..2920e472c8971 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -14,6 +14,7 @@ class Report trust_level file_extension include_subcategories + hidden_labels ] MODES = { @@ -54,17 +55,29 @@ def self.hidden?(type, admin:) } LEGACY_REPORTS = %w[ + associated_accounts_by_provider bookmarks + consolidated_api_requests + flags + flags_status likes moderator_warning_private_messages + mobile_visits notify_moderators_private_messages notify_user_private_messages post_edits profile_views + reactions + suspicious_logins system_private_messages + top_referrers top_users_by_likes_received_from_inferior_trust_level top_users_by_likes_received_from_a_variety_of_people + trust_level_growth + user_flagging_ratio user_to_user_private_messages + web_crawlers + web_hook_events_daily_aggregate ] include Reports::AssociatedAccountsByProvider @@ -139,7 +152,9 @@ def self.hidden?(type, admin:) :filters, :available_filters, :legacy, - :y_axis_title + :default_group_by, + :y_axis_title, + :current_user def self.default_days 30 @@ -181,6 +196,7 @@ def self.cache_key(report) report.limit, report.filters.blank? ? nil : MultiJson.dump(report.filters), SCHEMA_VERSION, + report.current_user&.id, ].compact.map(&:to_s).join(":") end @@ -267,6 +283,7 @@ def as_json(options = nil) json[:prev_period] = self.prev_period if self.prev_period json[:prev30Days] = self.prev30Days if self.prev30Days json[:limit] = self.limit if self.limit + json[:default_group_by] = self.default_group_by if self.default_group_by json[:y_axis_title] = self.y_axis_title if self.y_axis_title if type == "page_view_crawler_reqs" @@ -300,6 +317,7 @@ def self._get(type, opts = nil) report.average = opts[:average] if opts[:average] report.percent = opts[:percent] if opts[:percent] report.filters = opts[:filters] if opts[:filters] + report.current_user = opts[:current_user] if opts[:current_user] report.labels = Report.default_labels report.legacy = LEGACY_REPORTS.include?(type) if SiteSetting.reporting_improvements diff --git a/app/models/tag_localization.rb b/app/models/tag_localization.rb index 324c060021605..8ee4031f97fc2 100644 --- a/app/models/tag_localization.rb +++ b/app/models/tag_localization.rb @@ -5,10 +5,18 @@ class TagLocalization < ActiveRecord::Base belongs_to :tag + before_validation :clean_name + validates :locale, presence: true, length: { maximum: 20 } validates :name, presence: true validates :tag_id, uniqueness: { scope: :locale } validates :description, length: { maximum: 1000 } + + private + + def clean_name + self.name = DiscourseTagging.clean_tag(name) if name.present? + end end # == Schema Information diff --git a/app/models/theme.rb b/app/models/theme.rb index 08617ba9b6017..8a831046ee4b3 100644 --- a/app/models/theme.rb +++ b/app/models/theme.rb @@ -6,7 +6,6 @@ class Theme < ActiveRecord::Base include GlobalPath - BASE_COMPILER_VERSION = 101 CORE_THEMES = { "foundation" => -1, "horizon" => -2 } EDITABLE_SYSTEM_ATTRIBUTES = %w[ child_theme_ids @@ -32,7 +31,7 @@ class InvalidFieldTypeError < StandardError attr_accessor :skip_child_components_update def self.cache - @cache ||= DistributedCache.new("theme:compiler:#{BASE_COMPILER_VERSION}") + @cache ||= DistributedCache.new("theme:compiler:#{AssetProcessor::BASE_COMPILER_VERSION}") end belongs_to :user @@ -243,13 +242,14 @@ def update_javascript_cache! def self.compiler_version get_set_cache "compiler_version" do dependencies = [ - BASE_COMPILER_VERSION, - AssetProcessor.new.ember_version, + AssetProcessor::BASE_COMPILER_VERSION, + AssetProcessor.ember_version, GlobalSetting.cdn_url, GlobalSetting.s3_cdn_url, GlobalSetting.s3_endpoint, GlobalSetting.s3_bucket, Discourse.current_hostname, + ENV["ROLLUP_PLUGIN_COMPILER"], ] Digest::SHA1.hexdigest(dependencies.join) end diff --git a/app/models/topic.rb b/app/models/topic.rb index 7995d3ca58de2..337824436e3ad 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -861,14 +861,18 @@ def update_status(status, enabled, user, opts = {}) def self.next_post_number(topic_id, opts = {}) highest = DB - .query_single( - "SELECT coalesce(max(post_number),0) AS max FROM posts WHERE topic_id = ?", - topic_id, - ) + .query_single("SELECT coalesce(max(post_number),0) FROM posts WHERE topic_id = ?", topic_id) .first .to_i - if opts[:whisper] + # PM small_action posts only bump highest_staff_post_number, not + # highest_post_number, matching the exclusion in reset_highest. + staff_only = opts[:post_type] == Post.types[:whisper] + staff_only ||= + opts[:post_type] == Post.types[:small_action] && + Topic.where(id: topic_id, archetype: Archetype.private_message).exists? + + if staff_only result = DB.query_single(<<~SQL, highest, topic_id) UPDATE topics SET highest_staff_post_number = ? + 1 @@ -881,7 +885,7 @@ def self.next_post_number(topic_id, opts = {}) reply_sql = opts[:reply] ? ", reply_count = reply_count + 1" : "" posts_sql = opts[:post] ? ", posts_count = posts_count + 1" : "" - result = DB.query_single(<<~SQL, highest: highest, topic_id: topic_id) + result = DB.query_single(<<~SQL, highest:, topic_id:) UPDATE topics SET highest_staff_post_number = :highest + 1, highest_post_number = :highest + 1 @@ -1110,6 +1114,12 @@ def changed_to_category(new_category, silent: nil) # category is private. this is only done if the category # has actually changed to avoid noise. DB.after_commit { Jobs.enqueue(:update_topic_upload_security, topic_id: self.id) } + + # Notify tracking state of category change so users who lost access + # have the topic removed from their tracking state + if SiteSetting.experimental_topic_category_change_notification + DB.after_commit { TopicTrackingState.publish_category_change(self, old_category) } + end end Category.where(id: new_category.id).update_all("topic_count = topic_count + 1") @@ -1195,7 +1205,7 @@ def remove_allowed_group(removed_by, name) if group_user group_user.destroy allowed_groups.reload - add_small_action(removed_by, "removed_group", group.name) + add_small_action(removed_by, "removed_group", group.name, skip_guardian: true) return true end end @@ -1409,7 +1419,7 @@ def make_banner!(user, bannered_until = nil) # only one banner at the same time previous_banner = Topic.where(archetype: Archetype.banner).first - previous_banner.remove_banner!(user) if previous_banner.present? + previous_banner.presence&.remove_banner!(user) UserProfile.where.not(dismissed_banner_key: nil).update_all(dismissed_banner_key: nil) @@ -1497,7 +1507,9 @@ def last_post_url end def self.url(id, slug, post_number = nil) - url = +"#{Discourse.base_url}/t/#{slug}/#{id}" + url = +"#{Discourse.base_url}/t/" + url << "#{slug}/" if slug.present? + url << id.to_s url << "/#{post_number}" if post_number.to_i > 1 url end @@ -2182,10 +2194,6 @@ def self.editable_custom_fields(guardian) fields end - def has_localization?(locale = I18n.locale) - localizations.exists?(locale: locale.to_s.sub("-", "_")) - end - private def invite_to_private_message(invited_by, target_user, guardian) diff --git a/app/models/topic_embed.rb b/app/models/topic_embed.rb index 7d1aa6bcde8b3..1270133ab3190 100644 --- a/app/models/topic_embed.rb +++ b/app/models/topic_embed.rb @@ -73,7 +73,7 @@ def self.import(user, url, title, contents, category_id: nil, cook_method: nil, end create_args = { - title: title, + title: title.presence || url, raw: absolutize_urls(url, contents), skip_validations: true, cook_method: cook_method, diff --git a/app/models/topic_link.rb b/app/models/topic_link.rb index 7675576d8e66e..30c9f6c7a7f80 100644 --- a/app/models/topic_link.rb +++ b/app/models/topic_link.rb @@ -183,6 +183,7 @@ def self.duplicate_lookup(topic) .joins(:post, :user) .where("posts.id IS NOT NULL AND users.id IS NOT NULL") .where(topic_id: topic.id, reflection: false) + .where(posts: { hidden: false }) .last(200) lookup = {} @@ -199,8 +200,6 @@ def self.duplicate_lookup(topic) lookup end - private - def self.apply_link_visibility_filters(builder, link:, target_topic:, target_posts:) builder.where(<<~SQL) #{target_topic}.deleted_at IS NULL @@ -208,6 +207,9 @@ def self.apply_link_visibility_filters(builder, link:, target_topic:, target_pos AND (#{link}.link_post_id IS NULL OR (#{target_posts}.id IS NOT NULL AND #{target_posts}.deleted_at IS NULL)) SQL end + private_class_method :apply_link_visibility_filters + + private # This pattern is used to create topic links very efficiently with minimal # errors under heavy concurrent use diff --git a/app/models/topic_tracking_state.rb b/app/models/topic_tracking_state.rb index d4d5b052e09c2..65a15bade3c94 100644 --- a/app/models/topic_tracking_state.rb +++ b/app/models/topic_tracking_state.rb @@ -182,6 +182,35 @@ def self.publish_recover(topic) MessageBus.publish(RECOVER_MESSAGE_BUS_CHANNEL, message.as_json, group_ids: group_ids) end + # Called when a topic's category changes. + # If moving to a more restricted category, users who lost access need to + # have the topic removed from their tracking state. + def self.publish_category_change(topic, old_category) + return if !SiteSetting.experimental_topic_category_change_notification + return unless topic.regular? + + old_restricted = old_category&.read_restricted? + new_restricted = topic.category&.read_restricted? + + if !old_restricted && new_restricted + # Moving from public to restricted category + # First, notify ALL users to remove topic (those who lost access) + message = { topic_id: topic.id, message_type: DELETE_MESSAGE_TYPE } + MessageBus.publish(DELETE_MESSAGE_BUS_CHANNEL, message.as_json, group_ids: nil) + + # Then, notify users who CAN see the new category with updated info + publish_latest(topic) + elsif old_restricted && !new_restricted + # Moving from restricted to public category + # Notify all users of the now-visible topic + publish_latest(topic) + elsif old_category&.id != topic.category_id + # Category changed but restriction level didn't change + # Just publish the updated category info + publish_latest(topic) + end + end + def self.publish_delete(topic) return unless topic.regular? diff --git a/app/models/user.rb b/app/models/user.rb index a49128ca482a8..d6e42e0f52f39 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -636,7 +636,7 @@ def email_hash User.email_hash(email) end - def reload + def reload(options = nil) @unread_notifications = nil @all_unread_notifications_count = nil @unread_total_notifications = nil @@ -1315,6 +1315,8 @@ def posted_too_much_in_topic?(topic_id) def delete_posts_in_batches(guardian, batch_size = 20) raise Discourse::InvalidAccess unless guardian.can_delete_all_posts? self + reviewable_ids = Reviewable.where(created_by_id: id).select(:id) + ReviewableNote.where(reviewable_id: reviewable_ids).delete_all Reviewable.where(created_by_id: id).delete_all posts @@ -1650,7 +1652,7 @@ def number_of_rejected_posts .where(status: "rejected", target_created_by_id: ids) .group(:target_created_by_id) .count - end + end || 0 end def number_of_flags_given @@ -1667,7 +1669,7 @@ def number_of_silencings .where(target_user_id: ids, action: UserHistory.actions[:silence_user]) .group(:target_user_id) .count - end + end || 0 end def number_of_suspensions @@ -1676,7 +1678,7 @@ def number_of_suspensions .where(target_user_id: ids, action: UserHistory.actions[:suspend_user]) .group(:target_user_id) .count - end + end || 0 end def create_user_profile diff --git a/app/models/user_visit.rb b/app/models/user_visit.rb index 57353a91a9d80..f66a975001c9c 100644 --- a/app/models/user_visit.rb +++ b/app/models/user_visit.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class UserVisit < ActiveRecord::Base + belongs_to :user + def self.counts_by_day_query(start_date, end_date, group_id = nil) result = where("visited_at >= ? and visited_at <= ?", start_date.to_date, end_date.to_date) @@ -43,6 +45,27 @@ def self.mobile_by_day(start_date, end_date, group_id = nil) counts_by_day_query(start_date, end_date, group_id).where(mobile: true).count end + def self.counts_by_day_and_mobile(start_date, end_date, group_id: nil) + sql = <<~SQL + SELECT + visited_at, + mobile, + COUNT(*) AS visit_count, + SUM(COUNT(*)) OVER () AS total + FROM user_visits + #{"INNER JOIN group_users ON group_users.user_id = user_visits.user_id" if group_id} + WHERE visited_at >= :start_date AND visited_at <= :end_date + #{"AND group_users.group_id = :group_id" if group_id} + GROUP BY visited_at, mobile + ORDER BY visited_at + SQL + + params = { start_date: start_date, end_date: end_date, prev_start: start_date - 30.days } + params[:group_id] = group_id.to_i if group_id + + DB.query(sql, **params) + end + def self.ensure_consistency! DB.exec <<~SQL UPDATE user_stats u set days_visited = diff --git a/app/models/web_hook.rb b/app/models/web_hook.rb index caa24b698ee00..f52270fc5298b 100644 --- a/app/models/web_hook.rb +++ b/app/models/web_hook.rb @@ -117,14 +117,17 @@ def self.enqueue_topic_hooks(event, topic, payload = nil) def self.enqueue_post_hooks(event, post, payload = nil) if active_web_hooks(event).exists? && post.present? + topic = post.topic || Topic.with_deleted.find_by(id: post.topic_id) + return if topic.nil? + payload ||= WebHook.generate_payload(:post, post) WebHook.enqueue_hooks( :post, event, id: post.id, - category_id: post.topic&.category_id, - tag_ids: post.topic&.tags&.pluck(:id), + category_id: topic.category_id, + tag_ids: topic.tags.pluck(:id), payload: payload, ) end diff --git a/app/models/web_hook_event_type.rb b/app/models/web_hook_event_type.rb index b52fb909a00d7..9ed9334624083 100644 --- a/app/models/web_hook_event_type.rb +++ b/app/models/web_hook_event_type.rb @@ -17,6 +17,7 @@ class WebHookEventType < ActiveRecord::Base USER_PROMOTED = 16 TOPIC_VOTING = 17 CHAT_MESSAGE = 18 + CALENDAR_EVENT = 19 enum :group, { @@ -37,6 +38,7 @@ class WebHookEventType < ActiveRecord::Base voting: 14, chat: 15, custom: 16, + calendar: 17, }, scopes: false @@ -88,6 +90,9 @@ class WebHookEventType < ActiveRecord::Base chat_message_edited: 1802, chat_message_trashed: 1803, chat_message_restored: 1804, + calendar_event_created: 1901, + calendar_event_updated: 1902, + calendar_event_destroyed: 1903, } has_and_belongs_to_many :web_hooks @@ -119,6 +124,16 @@ def self.active ], ) end + unless defined?(SiteSetting.discourse_post_event_enabled) && + SiteSetting.discourse_post_event_enabled + ids_to_exclude.concat( + [ + TYPES[:calendar_event_created], + TYPES[:calendar_event_updated], + TYPES[:calendar_event_destroyed], + ], + ) + end self.where.not(id: ids_to_exclude) end end diff --git a/app/serializers/admin_detailed_user_serializer.rb b/app/serializers/admin_detailed_user_serializer.rb index 06c24c60b67fd..a26d9e2fccb96 100644 --- a/app/serializers/admin_detailed_user_serializer.rb +++ b/app/serializers/admin_detailed_user_serializer.rb @@ -194,6 +194,6 @@ def upcoming_changes_stats end def include_upcoming_changes_stats? - SiteSetting.enable_upcoming_changes && scope.is_staff? + scope.is_staff? end end diff --git a/app/serializers/api_key_scope_serializer.rb b/app/serializers/api_key_scope_serializer.rb index 3386ab387a4e0..a677ab71125da 100644 --- a/app/serializers/api_key_scope_serializer.rb +++ b/app/serializers/api_key_scope_serializer.rb @@ -4,11 +4,11 @@ class ApiKeyScopeSerializer < ApplicationSerializer attributes :resource, :action, :parameters, :urls, :allowed_parameters, :key def parameters - ApiKeyScope.scope_mappings.dig(object.resource.to_sym, object.action.to_sym, :params).to_a + ApiKeyScope.scope_mappings.dig(object.resource.to_sym, object.action.to_sym)&.dig(:params).to_a end def urls - ApiKeyScope.scope_mappings.dig(object.resource.to_sym, object.action.to_sym, :urls).to_a + ApiKeyScope.scope_mappings.dig(object.resource.to_sym, object.action.to_sym)&.dig(:urls).to_a end def action diff --git a/app/serializers/basic_category_serializer.rb b/app/serializers/basic_category_serializer.rb index 646f36a39bff1..592953f311922 100644 --- a/app/serializers/basic_category_serializer.rb +++ b/app/serializers/basic_category_serializer.rb @@ -23,6 +23,7 @@ class BasicCategorySerializer < ApplicationSerializer :notification_level, :can_edit, :topic_template, + :topic_title_placeholder, :has_children, :subcategory_count, :sort_order, diff --git a/app/serializers/category_serializer.rb b/app/serializers/category_serializer.rb index 15c6de1d9ca79..285723b7aef3c 100644 --- a/app/serializers/category_serializer.rb +++ b/app/serializers/category_serializer.rb @@ -36,7 +36,8 @@ class CategoryLocalizationSerializer < ApplicationSerializer :default_slow_mode_seconds, :style_type, :emoji, - :icon + :icon, + :category_types has_one :category_setting, serializer: CategorySettingSerializer, embed: :objects has_many :category_localizations, serializer: CategoryLocalizationSerializer, embed: :objects @@ -148,4 +149,9 @@ def name def description category_description end + + def category_types + return {} if !SiteSetting.enable_simplified_category_creation + object.category_types + end end diff --git a/app/serializers/current_user_serializer.rb b/app/serializers/current_user_serializer.rb index 72d27d4a35fae..f6c276563776f 100644 --- a/app/serializers/current_user_serializer.rb +++ b/app/serializers/current_user_serializer.rb @@ -82,7 +82,8 @@ class CurrentUserSerializer < BasicUserSerializer :can_localize_content?, :effective_locale, :can_see_ip, - :is_impersonating + :is_impersonating, + :can_change_post_owner delegate :user_stat, to: :object, private: true delegate :any_posts, :draft_count, :pending_posts_count, :read_faq?, to: :user_stat @@ -106,6 +107,17 @@ def is_impersonating !!object.is_impersonating end + def include_can_change_post_owner? + return true if admin? + return true if SiteSetting.moderators_change_post_ownership && moderator? + return true if object.in_any_groups?(SiteSetting.change_post_ownership_allowed_groups_map) + false + end + + def can_change_post_owner + true + end + def groups owned_group_ids = GroupUser.where(user_id: id, owner: true).pluck(:group_id).to_set @@ -160,7 +172,7 @@ def has_unseen_features end def include_has_new_upcoming_changes? - SiteSetting.enable_upcoming_changes && object.staff? + object.staff? end def has_new_upcoming_changes @@ -193,7 +205,7 @@ def can_edit end def can_edit_tags - scope.can_edit_tag? + scope.can_edit_tag_names? end def can_invite_to_forum diff --git a/app/serializers/flagged_user_serializer.rb b/app/serializers/flagged_user_serializer.rb index 70f421e614b3a..74d9f02fd6a17 100644 --- a/app/serializers/flagged_user_serializer.rb +++ b/app/serializers/flagged_user_serializer.rb @@ -31,6 +31,10 @@ def ip_address object.ip_address.try(:to_s) end + def include_ip_address? + scope.can_see_ip? + end + def flags_agreed object.user_stat.flags_agreed end @@ -44,15 +48,15 @@ def flags_ignored end def silenced_count - object.number_of_silencings.to_i + object.number_of_silencings end def suspended_count - object.number_of_suspensions.to_i + object.number_of_suspensions end def rejected_posts_count - object.number_of_rejected_posts.to_i + object.number_of_rejected_posts end def custom_fields diff --git a/app/serializers/reviewable_queued_post_serializer.rb b/app/serializers/reviewable_queued_post_serializer.rb index 94a7918a238d3..8b5ba194dce6e 100644 --- a/app/serializers/reviewable_queued_post_serializer.rb +++ b/app/serializers/reviewable_queued_post_serializer.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class ReviewableQueuedPostSerializer < ReviewableSerializer - attributes :reply_to_post_number + attributes :reply_to_post_number, :fancy_title, :cooked payload_attributes( :raw, @@ -20,6 +20,14 @@ class ReviewableQueuedPostSerializer < ReviewableSerializer :raw_email, ) + def fancy_title + ERB::Util.html_escape(object.payload["title"]) if object.payload&.[]("title") + end + + def cooked + PrettyText.cook(object.payload["raw"]) if object.payload&.[]("raw") + end + def reply_to_post_number object.payload["reply_to_post_number"].to_i end diff --git a/app/serializers/site_text_serializer.rb b/app/serializers/site_text_serializer.rb index e02f1f1f16613..aee87d07d5d52 100644 --- a/app/serializers/site_text_serializer.rb +++ b/app/serializers/site_text_serializer.rb @@ -27,11 +27,11 @@ def status end def old_default - override.original_translation if override.present? + override.presence&.original_translation end def new_default - override.current_default if override.present? + override.presence&.current_default end def interpolation_keys diff --git a/app/serializers/tag_settings_serializer.rb b/app/serializers/tag_settings_serializer.rb index fe4c6aecf0ede..164c3cad1736e 100644 --- a/app/serializers/tag_settings_serializer.rb +++ b/app/serializers/tag_settings_serializer.rb @@ -19,6 +19,10 @@ def name object.name end + def slug + object.slug_for_url + end + def description object.description end diff --git a/app/serializers/topic_view_details_serializer.rb b/app/serializers/topic_view_details_serializer.rb index 22ae968e3fb25..feb31a83dba27 100644 --- a/app/serializers/topic_view_details_serializer.rb +++ b/app/serializers/topic_view_details_serializer.rb @@ -23,6 +23,7 @@ def self.can_attributes can_edit_staff_notes can_toggle_topic_visibility can_pin_unpin_topic + can_banner_topic can_moderate_category ] end @@ -159,6 +160,10 @@ def include_can_pin_unpin_topic? scope.can_pin_unpin_topic?(object.topic) end + def include_can_banner_topic? + scope.can_banner_topic?(object.topic) + end + def can_perform_action_available_to_group_moderators? @can_perform_action_available_to_group_moderators ||= scope.can_perform_action_available_to_group_moderators?(object.topic) diff --git a/app/serializers/topic_view_serializer.rb b/app/serializers/topic_view_serializer.rb index e9a593cf2e7e6..a21afc1a7cad8 100644 --- a/app/serializers/topic_view_serializer.rb +++ b/app/serializers/topic_view_serializer.rb @@ -187,7 +187,7 @@ def has_deleted end def include_has_deleted? - object.guardian.can_see_deleted_posts? + !object.skip_post_loading && object.guardian.can_see_deleted_posts? end def expandable_first_post diff --git a/app/services/badge_granter.rb b/app/services/badge_granter.rb index b82adf9ed37c6..d5f30e29ca901 100644 --- a/app/services/badge_granter.rb +++ b/app/services/badge_granter.rb @@ -199,7 +199,10 @@ def self.revoke_all(badge) User.joins(:user_badges).where(user_badges: { badge_id: badge.id }).where(title: badge.name) users = users.or( - User.joins(:user_badges).where(title: custom_badge_names), + User + .joins(:user_badges) + .where(user_badges: { badge_id: badge.id }) + .where(title: custom_badge_names), ) unless custom_badge_names.empty? users.update_all(title: nil) diff --git a/app/services/categories/configure.rb b/app/services/categories/configure.rb index 79aea64fb0533..5a792c98f03ab 100644 --- a/app/services/categories/configure.rb +++ b/app/services/categories/configure.rb @@ -7,7 +7,8 @@ class Configure params do attribute :category_id, :integer attribute :category_type, :string - attribute :configuration_values + attribute :category_configuration_values + attribute :site_setting_configuration_values validates :category_id, presence: true validates :category_type, presence: true @@ -22,8 +23,9 @@ def category_type_is_valid end model :category - model :type_class policy :can_modify_category + model :type_class + policy :type_is_available transaction do step :enable_plugin @@ -32,6 +34,7 @@ def category_type_is_valid end step :log_action + step :clear_category_type_counts_cache private @@ -47,21 +50,27 @@ def fetch_type_class(params:) Categories::TypeRegistry.get(params.category_type) end + def type_is_available(type_class:) + type_class.available? + end + def enable_plugin(type_class:) type_class.enable_plugin end - def configure_site_settings(type_class:, category:, params:) + def configure_site_settings(type_class:, category:, guardian:, params:) type_class.configure_site_settings( category, - configuration_values: params.configuration_values || {}, + guardian:, + configuration_values: params.site_setting_configuration_values || {}, ) end - def configure_category(type_class:, category:, params:) + def configure_category(type_class:, category:, guardian:, params:) type_class.configure_category( category, - configuration_values: params.configuration_values || {}, + guardian:, + configuration_values: params.category_configuration_values || {}, ) end @@ -71,5 +80,9 @@ def log_action(guardian:, category:, params:) { category_id: category.id, category_type: params.category_type }, ) end + + def clear_category_type_counts_cache + Discourse.cache.delete(Categories::TypeRegistry::COUNTS_CACHE_KEY) + end end end diff --git a/app/services/categories/type_registry.rb b/app/services/categories/type_registry.rb index 8e80a20c9a6fe..736921d1ab4f5 100644 --- a/app/services/categories/type_registry.rb +++ b/app/services/categories/type_registry.rb @@ -2,9 +2,15 @@ module Categories class TypeRegistry + COUNTS_CACHE_KEY = "category_type_counts" + class << self def register(klass, plugin_identifier: nil) id = klass.type_id + unless id.to_s.match?(/\A[a-z0-9_]+\z/) + raise ArgumentError, + "Category type_id '#{id}' must only contain lowercase letters, digits, and underscores" + end if types.key?(id) && owners[id] != plugin_identifier raise ArgumentError, "Category type '#{id}' is already registered#{owners[id] ? " by #{owners[id]}" : ""}" @@ -25,8 +31,8 @@ def all types end - def list - types.values.map(&:metadata) + def list(only_visible: false) + types.values.select { |type| only_visible ? type.visible? : true }.map(&:metadata) end def valid?(id) @@ -38,6 +44,34 @@ def reset! @owners = nil end + # Returns all the category type counts in a hash with the type + # and count like this: + # + # { + # discussion: 10, + # support: 5, + # } + # + # Relies on the find_matches method overriden by each category type + # to return an AR relation that will be used to count the categories. + def counts + type_list = types.values + return {} if type_list.empty? + + # We want to get all the counts in a single query to avoid N1 + conn = Category.connection + select_parts = + type_list.map do |type| + subquery_sql = type.find_matches.select("COUNT(*)").to_sql + alias_name = conn.quote_column_name(type.type_id.to_s) + "(#{subquery_sql}) AS #{alias_name}" + end + result = conn.select_one("SELECT #{select_parts.join(", ")}") + type_list.each_with_object({}) do |type, counts| + counts[type.type_id] = (result[type.type_id.to_s] || 0).to_i + end + end + private def types diff --git a/app/services/categories/types/base.rb b/app/services/categories/types/base.rb index adccb489cc11a..4c7f173ce866c 100644 --- a/app/services/categories/types/base.rb +++ b/app/services/categories/types/base.rb @@ -3,7 +3,67 @@ module Categories module Types class Base + CONFIGURATION_SCHEMA_DEFINITION = { + "type" => "object", + "additionalProperties" => false, + "properties" => { + "general_category_settings" => { + "type" => "object", + "additionalProperties" => { + "$ref" => "#/$defs/field_config", + }, + }, + "site_settings" => { + "type" => "object", + }, + "category_custom_fields" => { + "type" => "object", + "additionalProperties" => { + "$ref" => "#/$defs/field_config", + }, + }, + "category_settings" => { + "type" => "object", + "additionalProperties" => { + "$ref" => "#/$defs/field_config", + }, + }, + }, + "$defs" => { + "field_config" => { + "type" => "object", + "required" => %w[default type label], + "additionalProperties" => false, + "properties" => { + "default" => true, + "type" => { + "type" => "string", + "minLength" => 1, + }, + "subtype" => { + "type" => "string", + "minLength" => 1, + }, + "label" => { + "type" => "string", + "minLength" => 1, + }, + "description" => { + "type" => "string", + }, + "show_on_create" => { + "type" => "boolean", + }, + "show_on_edit" => { + "type" => "boolean", + }, + }, + }, + }, + }.freeze + class << self + # Every category type must have a unique type_id. def type_id(id = nil) if id @type_id = id.to_sym @@ -12,68 +72,272 @@ def type_id(id = nil) end end - def enable_plugin + # Returns true if the category provided is of this type, + # based on settings, category attributes, etc. + # + # This MUST be overridden by category types. + def category_matches?(category) + raise NotImplementedError end - def configure_site_settings(category, configuration_values: {}) - configuration_schema[:site_settings]&.each do |setting_name, default_value| - value = configuration_values.fetch(setting_name.to_s, default_value) - SiteSetting.public_send("#{setting_name}=", value) - end + # Returns a relation for categories that match this type (for counting, listing, etc.). + # Override in subclasses that match a subset of categories (e.g. by custom_fields). + # + # Basically the same as category_matches but for a list instead. + # + # See Categories::TypeRegistry.counts for an example of how this is used. + def find_matches + raise NotImplementedError + end + + # Use this to enable any related plugin for the category type, + # since we register category types without the plugin being enabled. + # + # This SHOULD be overridden by category types if they are related to a plugin. + def enable_plugin end - def configure_category(category, configuration_values: {}) + # Configure any category-specific settings or custom fields that are + # specific to this category type. + # + # This SHOULD be overridden by category types. + def configure_category(category, guardian:, configuration_values: {}) end + # Returns a hash describing the configuration schema for this category type. + # This schema drives both the UI (what settings are shown to admins in the + # category creator) and the site-setting update allowlist. + # + # The hash MAY include any subset of the following top-level keys. + # All top-level keys are optional; an empty hash is valid. + # + # { + # general_category_settings: { + # # Used to prefill basic category fields when creating a new category. + # # Each key is the category field name (Symbol). + # # Each value is a config Hash: + # # default: (required) Any value; the field's default when creating a new category. + # # type: (required) Symbol — e.g. :integer, :string, :boolean, matching site setting types. + # name: { + # value: "My Category", + # type: :string, + # }, + # style_type: { + # value: "emoji", + # type: :string, + # }, + # emoji: { + # value: "🔥", + # type: :string, + # }, + # }, + # + # site_settings: { + # # Each key must be a valid SiteSetting name. + # # The value is the desired default to apply when this category type is configured. + # show_filter_by_solved_status: true, + # }, + # + # category_custom_fields: { + # # Each key is the custom field name (Symbol). + # # Each value is a config Hash: + # # default: (required) Any value; the field's default. + # # type: (required) Symbol — e.g. :integer, :string, :boolean, matching site setting types. + # # label: (required) String — FormKit label shown in UI + # # description: (optional) String — FormKit description/help text shown in UI + # # show_on_create: (optional) Boolean — Whether to show the field on category creation. Defaults to true. + # # show_on_edit: (optional) Boolean — Whether to show the field on category edit. Defaults to true. + # solved_topics_auto_close_hours: { + # default: 48, + # type: :integer, + # label: "Auto-close after solved (hours)", + # description: "Close topics this many hours after being solved.", + # }, + # }, + # + # category_settings: { + # # Same structure as category_custom_fields above. + # }, + # } + # + # Use +validate_schema!+ to verify a schema conforms to this contract. def configuration_schema {} end + # Validates the hash returned by +configuration_schema+ using JSONSchemer. + # Raises +ArgumentError+ with a descriptive message if invalid. + # Also validates that any site_settings keys are real SiteSettings (a + # runtime check that cannot be expressed in JSON Schema). + def validate_schema! + # Normalize Ruby symbol keys/values to strings via JSON round-trip + schema_as_json = JSON.parse(configuration_schema.to_json) + + schemer = JSONSchemer.schema(CONFIGURATION_SCHEMA_DEFINITION) + errors = schemer.validate(schema_as_json).to_a + if errors.any? + messages = errors.map { |err| JSONSchemer::Errors.pretty(err) }.join("; ") + raise ArgumentError, "#{name}#configuration_schema is invalid: #{messages}" + end + + # Validate site_settings keys are real SiteSettings (runtime check) + schema_as_json["site_settings"]&.each_key do |setting_name| + unless SiteSetting.has_setting?(setting_name) + raise ArgumentError, + "#{name}#configuration_schema[:site_settings] references unknown SiteSetting: #{setting_name.inspect}" + end + end + end + + # Used as an extension point to limit access to a category type + # based on certain conditions, mostly for Discourse hosting. def available? true end + # One level above available? to allow for more granular control over visibility. + # For example, a category type may not be visible at all if a plugin isn't installed + # or if a certain site setting is not enabled, whereas available? is more + # for gating access on other conditions, and will still show the category type + # in the UI. + def visible? + true + end + + # Also used as an extension point to add additional keys/values to + # the metadata hash returned by +metadata+, mostly for Discourse hosting. + def additional_metadata + {} + end + def icon - "comments" + "memo" + end + + # Configure any custom fields that are specific to this category type, + # should be called from within +configure_category+ for each type. + # + # This SHOULD NOT be overridden by category types. + def configure_custom_fields(category, guardian:, configuration_values: {}) + configuration_schema[:category_custom_fields]&.each do |field_name, config| + value = configuration_values.fetch(field_name.to_s, config[:default]) + category.custom_fields[field_name.to_s] = value.to_s + end + + category.save_custom_fields + end + + # Configure any site settings that are specific to this category type. + # The configuration schema must be defined for this, as it is also used + # to show related settings in the UI for the category creator based + # on type. + # + # This SHOULD NOT be overridden by category types. + def configure_site_settings(category, guardian:, configuration_values: {}) + category_type_settings = + configuration_schema[:site_settings]&.map do |setting_name, default_value| + { + setting_name: setting_name.to_s, + value: configuration_values.fetch(setting_name.to_s, default_value), + } + end + + return if category_type_settings.blank? + + # We do this because we want to allow updating hidden settings for the + # category type, but not other settings. The configuration schema for + # a category type defines which settings it wants to change, so that's + # a good source to use as an allowlist here. + allowed_setting_names = category.category_type_site_setting_names + SiteSetting::Update.call( + guardian:, + options: { + allow_changing_hidden: allowed_setting_names, + }, + params: { + settings: category_type_settings, + }, + ) end + # Used when serializing the category configuration schema to the client. def metadata + name = I18n.t("category_types.#{type_id}.name", default: type_id.to_s.titleize) { id: type_id, - name: I18n.t("category_types.#{type_id}.name", default: type_id.to_s.titleize), + name: name, + title: I18n.t("category_types.#{type_id}.title", default: name), description: I18n.t("category_types.#{type_id}.description", default: ""), - icon: icon, + icon:, available: available?, configuration_schema: resolved_configuration_schema, - } + }.merge(additional_metadata) end private def resolved_configuration_schema schema = configuration_schema - return [] if schema.blank? + return {} if schema.blank? - entries = [] + entries = { + general_category_settings: [], + site_settings: [], + category_settings: [], + category_custom_fields: [], + } + + schema[:general_category_settings]&.each do |setting_name, config| + entries[:general_category_settings] << { + key: setting_name.to_s, + default: config[:default], + type: config[:type].to_s, + required: config[:required], + show_on_create: config[:show_on_create].nil? ? true : config[:show_on_create], + show_on_edit: config[:show_on_edit].nil? ? true : config[:show_on_edit], + } + end schema[:site_settings]&.each do |setting_name, target_value| meta = SiteSetting.setting_metadata_hash(setting_name) - entries << { + entries[:site_settings] << { key: setting_name.to_s, default: target_value, + current: SiteSetting.public_send(setting_name), type: meta[:type], label: meta[:humanized_name], description: meta[:description], + required: false, + show_on_create: true, + show_on_edit: true, } end schema[:category_settings]&.each do |field_name, config| - entries << { + entries[:category_settings] << { + key: field_name.to_s, + default: config[:default], + type: config[:type].to_s, + label: config[:label], + subtype: config[:subtype]&.to_s, + description: config[:description], + required: config[:required], + show_on_create: config[:show_on_create].nil? ? true : config[:show_on_create], + show_on_edit: config[:show_on_edit].nil? ? true : config[:show_on_edit], + } + end + + schema[:category_custom_fields]&.each do |field_name, config| + entries[:category_custom_fields] << { key: field_name.to_s, default: config[:default], type: config[:type].to_s, + subtype: config[:subtype]&.to_s, label: config[:label], description: config[:description], + required: config[:required], + show_on_create: config[:show_on_create].nil? ? true : config[:show_on_create], + show_on_edit: config[:show_on_edit].nil? ? true : config[:show_on_edit], } end diff --git a/app/services/categories/types/discussion.rb b/app/services/categories/types/discussion.rb index 9d0010ffa032b..5a19012ddcc55 100644 --- a/app/services/categories/types/discussion.rb +++ b/app/services/categories/types/discussion.rb @@ -3,6 +3,29 @@ module Categories module Types class Discussion < Base + type_id :discussion + + class << self + def find_matches + # All categories are implicitly discussion categories, so there's no + # meaningful subset to count. Returning Category.none keeps count at 0, + # which means discussion always prefills — correct since it has no + # general_category_settings to prefill anyway. + Category.none + end + + def category_matches?(category) + # NOTE (martin) For now, all categories are considered discussion categories, + # a discussion category is basically the old "vanilla" category type + # for Discourse. + # + # Discussion categories don't have a special tab to show their settings like + # e.g. Solved + # + # Maybe we will reconsider this in future iterations. + true + end + end end end end diff --git a/app/services/discourse_tools/create_topic.rb b/app/services/discourse_tools/create_topic.rb new file mode 100644 index 0000000000000..207bab6e7bb3c --- /dev/null +++ b/app/services/discourse_tools/create_topic.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +module DiscourseTools + class CreateTopic + include Service::Base + + params do + attribute :title, :string + attribute :raw, :string + attribute :category_id, :integer + validates :title, presence: true + validates :raw, presence: true + end + + options do + attribute :tags, :array, default: [] + attribute :skip_validations, :boolean, default: false + end + + policy :can_create + step :create_post + + private + + def can_create(guardian:, params:) + category = Category.find_by(id: params.category_id) if params.category_id.present? + guardian.can_create?(Topic, category) + end + + def create_post(guardian:, params:, options:) + args = { + title: params.title, + raw: params.raw, + guardian: guardian, + skip_validations: options.skip_validations, + } + args[:category] = params.category_id if params.category_id.present? + args[:tags] = options.tags if options.tags.present? + + post_creator = PostCreator.new(guardian.user, **args) + context[:post] = post_creator.create + + fail!(post_creator.errors.full_messages.join(", ")) if post_creator.errors.present? + end + end +end diff --git a/app/services/post_alerter.rb b/app/services/post_alerter.rb index d3bea02b5dc3f..cf7ffc843d0e5 100644 --- a/app/services/post_alerter.rb +++ b/app/services/post_alerter.rb @@ -891,9 +891,12 @@ def email_using_group_smtp_if_configured(post) post .topic .topic_allowed_users - .includes(:user) + .includes(user: :user_option) .order(:created_at) - .reject { |tau| not_allowed?(tau.user, post) } + .reject do |tau| + not_allowed?(tau.user, post) || + tau.user.user_option.email_messages_level == UserOption.email_level_types[:never] + end return emails_to_skip_send if topic_allowed_users_by_age.empty? # This should usually be the OP of the topic, unless they are the one diff --git a/app/services/problem_check/upcoming_change_stable_opted_out.rb b/app/services/problem_check/upcoming_change_stable_opted_out.rb index fea11c3b53be0..7212a9d7117d8 100644 --- a/app/services/problem_check/upcoming_change_stable_opted_out.rb +++ b/app/services/problem_check/upcoming_change_stable_opted_out.rb @@ -5,8 +5,6 @@ class ProblemCheck::UpcomingChangeStableOptedOut < ProblemCheck self.targets = -> { SiteSetting.upcoming_change_site_settings } def call - return no_problem if !SiteSetting.enable_upcoming_changes - # If the site setting is enabled, then the change is opted in, either # manually or automatically, so we skip it. return no_problem if SiteSetting.send(target) diff --git a/app/services/site_setting/update.rb b/app/services/site_setting/update.rb index 91a0a05697be7..636a4675d377b 100644 --- a/app/services/site_setting/update.rb +++ b/app/services/site_setting/update.rb @@ -54,6 +54,11 @@ class SiteSetting::Update raw_value end + # Make sure to get the correct value here based on type, otherwise + # we can end up inserting a staff action log when e.g. setting the value + # to "false" when the setting value is already false. + setting.value = SiteSetting.type_supervisor.to_rb_value(setting.name, setting.value) + setting end end diff --git a/app/services/topic_status_updater.rb b/app/services/topic_status_updater.rb index b75598e51f687..6a6ffecff4efe 100644 --- a/app/services/topic_status_updater.rb +++ b/app/services/topic_status_updater.rb @@ -57,6 +57,17 @@ def change(status, opts = {}) status.enabled? ? :increment! : :decrement!, topic.first_post, ) + + # Notify tracking state when topic visibility changes + # This handles the case where a topic is hidden due to flagging + # or made visible again after review + if SiteSetting.experimental_topic_category_change_notification + if status.enabled? + TopicTrackingState.publish_recover(topic) + else + TopicTrackingState.publish_delete(topic) + end + end end if status.visible? diff --git a/app/services/upcoming_changes/toggle.rb b/app/services/upcoming_changes/toggle.rb index 6796d52f927c6..bb4cffc77c866 100644 --- a/app/services/upcoming_changes/toggle.rb +++ b/app/services/upcoming_changes/toggle.rb @@ -44,15 +44,7 @@ def setting_is_available(params:) def toggle(params:, guardian:, options:) context[:previous_value] = SiteSetting.public_send(params.setting_name) - # TODO (martin) Remove this once we release upcoming changes, - # otherwise it will be confusing for people to see log messages - # about upcoming changes via "What's new?" experimental toggles - # before we update that UI. - if SiteSetting.enable_upcoming_changes - SiteSetting.send("#{params.setting_name}=", params.enabled) - else - SiteSetting.public_send("#{params.setting_name}=", params.enabled) - end + SiteSetting.send("#{params.setting_name}=", params.enabled) end def clear_groups_if_disallowed(params:) @@ -68,21 +60,15 @@ def should_log_change(options:) end def log_change(params:, guardian:, options:) - if SiteSetting.enable_upcoming_changes - StaffActionLogger.new(guardian.user).log_upcoming_change_toggle( - params.setting_name, - context[:previous_value], - params.enabled, - { context: I18n.t("staff_action_logs.upcoming_changes.log_manually_toggled") }, - ) - else - SiteSetting.log(params.setting_name, params.enabled, context[:previous_value], guardian.user) - end + StaffActionLogger.new(guardian.user).log_upcoming_change_toggle( + params.setting_name, + context[:previous_value], + params.enabled, + { context: I18n.t("staff_action_logs.upcoming_changes.log_manually_toggled") }, + ) end def log_event(params:, guardian:, options:) - return unless SiteSetting.enable_upcoming_changes - UpcomingChangeEvent.create!( event_type: params.enabled ? :manual_opt_in : :manual_opt_out, upcoming_change_name: params.setting_name, diff --git a/app/services/user/action/trigger_post_action.rb b/app/services/user/action/trigger_post_action.rb index f076e3defac43..0e4129a873e46 100644 --- a/app/services/user/action/trigger_post_action.rb +++ b/app/services/user/action/trigger_post_action.rb @@ -27,6 +27,7 @@ def delete_replies end def edit + return unless guardian.can_edit_post?(post) # Take what the moderator edited in as gospel PostRevisor.new(post).revise!( user, diff --git a/app/services/user_activator.rb b/app/services/user_activator.rb index 2e8c721cc7f71..6a43f8f1e65d6 100644 --- a/app/services/user_activator.rb +++ b/app/services/user_activator.rb @@ -67,7 +67,7 @@ class LoginActivator < UserActivator include CurrentUser def activate - log_on_user(user, { authenticated_with_oauth: session["authenticated_with_oauth"] }) + log_on_user(user, { authenticated_with_oauth: session[:authenticated_with_oauth] }) user.enqueue_welcome_message("welcome_user") success_message end diff --git a/app/services/user_destroyer.rb b/app/services/user_destroyer.rb index eab3b25b392fe..e582ad5ac8a5f 100644 --- a/app/services/user_destroyer.rb +++ b/app/services/user_destroyer.rb @@ -29,6 +29,8 @@ def destroy(user, opts = {}) UserSecurityKey.where(user_id: user.id).delete_all Bookmark.where(user_id: user.id).delete_all Draft.where(user_id: user.id).delete_all + reviewable_ids = Reviewable.where(created_by_id: user.id).select(:id) + ReviewableNote.where(reviewable_id: reviewable_ids).delete_all Reviewable.where(created_by_id: user.id).delete_all ReviewableClaimedTopic.where(user_id: user.id).delete_all diff --git a/app/views/embed/comments.html.erb b/app/views/embed/comments.html.erb index ffe98eb97a37e..fcf286db7003e 100644 --- a/app/views/embed/comments.html.erb +++ b/app/views/embed/comments.html.erb @@ -10,7 +10,7 @@ <%- if @topic_view.posts.present? %> <%- @topic_view.posts.each do |post| %>
- <%= link_to embed_post_date(post.created_at), post.full_url, title: post.created_at.strftime("%B %e, %Y %l:%M%P"), class: 'post-date', target: "_blank" %> + <%= link_to embed_post_date(post.created_at), post.full_url, title: embed_post_date_title(post.created_at), class: 'post-date', target: "_blank" %> <%- if post.reply_to_post.present? && !post.cooked.index('aside') %> <%= link_to I18n.t('embed.in_reply_to', username: post.reply_to_post.username), post.reply_to_post.full_url, 'data-link-to-post' => post.reply_to_post.id.to_s, :class => 'in-reply-to', target: "_blank" %> <%- end %> diff --git a/app/views/layouts/_plugin_js.html.erb b/app/views/layouts/_plugin_js.html.erb index f4829cce89703..301d72cc90e2b 100644 --- a/app/views/layouts/_plugin_js.html.erb +++ b/app/views/layouts/_plugin_js.html.erb @@ -1,11 +1,28 @@ <%# locals: (opts:) %> <%- Discourse.find_plugin_js_assets(opts).tap do |plugin_assets| %> + + <%- plugin_assets.each do |asset| %> - <%= preload_script asset[:name], attrs: { - "data-discourse-plugin": asset[:plugin].metadata.name, - "data-official": asset[:plugin].metadata.official?, - "data-preinstalled": asset[:plugin].preinstalled?, - } %> + <% if asset[:type_module] %> + + > + <% else %> + <%= preload_script asset[:name], attrs: asset[:plugin_attributes] %> + <% end %> + <%- end %> + + <%- plugin_assets.flat_map { it[:imports] }.compact.uniq.each do |import| %> + <%- end %> <%- end %> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 5b07af6a4ce46..78559d5d53988 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -21,6 +21,14 @@ <%- end %> + <%= render("layouts/plugin_js", opts: { + include_official: allow_plugins?, + include_unofficial: allow_third_party_plugins?, + request: request, + include_admin_asset: staff? + }) if ENV["ROLLUP_PLUGIN_COMPILER"] != "0" + %> + <%= build_plugin_html 'server:before-script-load' %> <% add_resource_preload_list(script_asset_path("start-discourse"), "script") %> @@ -47,12 +55,13 @@ <%= preload_script "vendor" %> <%= preload_script "discourse" %> - <%= render "layouts/plugin_js", opts: { + + <%= render("layouts/plugin_js", opts: { include_official: allow_plugins?, include_unofficial: allow_third_party_plugins?, request: request, include_admin_asset: staff? - } + }) if ENV["ROLLUP_PLUGIN_COMPILER"] == "0" %> <%- if staff? %> diff --git a/app/views/qunit/theme.html.erb b/app/views/qunit/theme.html.erb index 4c7e90878583b..178ea9bffd8fc 100644 --- a/app/views/qunit/theme.html.erb +++ b/app/views/qunit/theme.html.erb @@ -14,7 +14,7 @@ <%= preload_script "test-support" %> <%= preload_script "discourse" %> <%= preload_script "test" %> - <%= render "layouts/plugin_js", + <%= render "layouts/plugin_js", opts: { include_disabled: true, include_admin_asset: true, diff --git a/app/views/user_notifications/digest/_footer.html.erb b/app/views/user_notifications/digest/_footer.html.erb index 7ffc059023ee2..bdfbb7f4e00c0 100644 --- a/app/views/user_notifications/digest/_footer.html.erb +++ b/app/views/user_notifications/digest/_footer.html.erb @@ -3,10 +3,12 @@
diff --git a/app/views/user_notifications/digest/_footer.text.erb b/app/views/user_notifications/digest/_footer.text.erb index 92db8e32127d4..c9a85a90584b7 100644 --- a/app/views/user_notifications/digest/_footer.text.erb +++ b/app/views/user_notifications/digest/_footer.text.erb @@ -3,10 +3,12 @@ <%= raw(@markdown_linker.references) %> <%= digest_custom_text("above_footer") %> -<%=raw(t :'user_notifications.digest.unsubscribe', - site_link: site_link, - email_preferences_link: raw(@markdown_linker.create(t('user_notifications.digest.your_email_settings'), '/my/preferences/emails')), - unsubscribe_link: raw(@markdown_linker.create(t('user_notifications.digest.click_here'), "/email/unsubscribe/#{@unsubscribe_key}"))) %> +<%- if @unsubscribe_key %> + <%=raw(t :'user_notifications.digest.unsubscribe', + site_link: site_link, + email_preferences_link: raw(@markdown_linker.create(t('user_notifications.digest.your_email_settings'), '/my/preferences/emails')), + unsubscribe_link: raw(@markdown_linker.create(t('user_notifications.digest.click_here'), "/email/unsubscribe/#{@unsubscribe_key}"))) %> +<%- end %> <%= raw(@markdown_linker.references) %> diff --git a/app/views/users/bookmarks.ics.erb b/app/views/users/bookmarks.ics.erb index 2c80cc951b85c..b0c328e274da0 100644 --- a/app/views/users/bookmarks.ics.erb +++ b/app/views/users/bookmarks.ics.erb @@ -7,7 +7,7 @@ UID:bookmark_reminder_#<%= bookmark.id %>@<%= Discourse.current_hostname %> DTSTAMP:<%= bookmark.updated_at.strftime(I18n.t("datetime_formats.formats.calendar_ics")) %> DTSTART:<%= bookmark.reminder_at_ics_start %> DTEND:<%= bookmark.reminder_at_ics_end %> -SUMMARY:<%= bookmark.name.presence || bookmark.title %> +SUMMARY:<%= IcalEncoder.encode(bookmark.name.presence || bookmark.title) %> DESCRIPTION:<%= bookmark.bookmarkable_url %> URL:<%= bookmark.bookmarkable_url %> END:VEVENT diff --git a/bin/docker/boot_dev b/bin/docker/boot_dev index 0e9c5ce7d5d1c..bcef680d91555 100755 --- a/bin/docker/boot_dev +++ b/bin/docker/boot_dev @@ -85,7 +85,6 @@ done [[ ! -z "$mount_plugin_symlinks" ]] && echo "Mounting symlinks for plugins: ${mount_plugin_symlinks}" # 8025 mailhog -# 3000 puma... if you must (but unicorn is preferred) # 9292 unicorn # 9405 prometheus exporter diff --git a/bin/ember-cli b/bin/ember-cli index a45adc3d228cc..ce2a016b06b17 100755 --- a/bin/ember-cli +++ b/bin/ember-cli @@ -96,7 +96,6 @@ if ARGV.include?("-u") || ARGV.include?("--unicorn") server_name = ENV["RUN_PITCHFORK"] == "0" ? "unicorn" : "pitchfork" unicorn_pid = spawn(unicorn_env, "#{__dir__}/#{server_name}") ember_cli_pid = nil - tsc_pid = nil Thread.new do Open3.popen2e(pnpm_env, "pnpm", *args.to_a.flatten) do |i, oe, t| @@ -117,25 +116,6 @@ if ARGV.include?("-u") || ARGV.include?("--unicorn") end end - Thread.new do - Open3.popen2e( - pnpm_env, - "pnpm", - "ember-tsc", - "-b", - "--watch", - "--preserveWatchOutput", - ) do |i, oe, t| - tsc_pid = t.pid - puts "Ember TSC running on PID: #{tsc_pid}" - oe.each { |line| puts "[ember-tsc] #{line}" } - end - if process_running?(unicorn_pid) - puts "[bin/ember-cli] ember-tsc process stopped. Terminating unicorn." - Process.kill("TERM", unicorn_pid) - end - end - trap("SIGINT") do # we got to swallow sigint to give time for # children to handle it @@ -147,11 +127,6 @@ if ARGV.include?("-u") || ARGV.include?("--unicorn") puts "[bin/ember-cli] unicorn process stopped. Terminating ember-cli." Process.kill("TERM", ember_cli_pid) end - - if tsc_pid && process_running?(tsc_pid) - puts "[bin/ember-cli] unicorn process stopped. Terminating ember-tsc." - Process.kill("TERM", tsc_pid) - end else exec(pnpm_env, "pnpm", *args.to_a.flatten) end diff --git a/bin/lint b/bin/lint index 58790e8e3c9ac..1f2d8c5b9e15f 100755 --- a/bin/lint +++ b/bin/lint @@ -4,7 +4,6 @@ require "optparse" require "open3" require "shellwords" -require "yaml" require "pathname" class LefthookLinter @@ -49,7 +48,17 @@ class LefthookLinter end files - .map { |f| normalize_relative_path(f) } + .flat_map do |f| + path = normalize_relative_path(f) + if File.directory?(path) + expanded = + Dir.glob(File.join(path, "**", "*")).select { |g| File.file?(g) && lintable_file?(g) } + abort "Error: No lintable files found in directory: #{path}" if expanded.empty? + expanded + else + [path] + end + end .select { |f| File.file?(f) && lintable_file?(f) } .uniq end @@ -153,25 +162,12 @@ class LefthookLinter end end - GLOB_FLAGS = File::FNM_PATHNAME | File::FNM_EXTGLOB | File::FNM_CASEFOLD | File::FNM_DOTMATCH - LEFTHOOK_CONFIG_PATH = File.expand_path("../lefthook.yml", __dir__) PROJECT_ROOT = File.expand_path("..", __dir__) def run_lefthook_command(hook, files) - commands = lefthook_config.dig(hook, "commands") - - if !files.empty? && commands + if !files.empty? normalized = files.map { |f| normalize_relative_path(f) } - any = false - - commands.each do |name, config| - filtered = filter_files_for_command(normalized, config) - next if filtered.empty? - - any = true - exec_lefthook(hook, name, filtered) - end - puts "No matching linters for provided files." if !any && @verbose + exec_lefthook(hook, nil, normalized) else exec_lefthook(hook, nil, files) end @@ -187,22 +183,6 @@ class LefthookLinter exit 1 unless system({ "LEFTHOOK" => "1" }, *cmd) end - def lefthook_config - @lefthook_config ||= YAML.load_file(LEFTHOOK_CONFIG_PATH) - end - - def filter_files_for_command(files, config) - globs = Array(config["glob"]).compact - excludes = Array(config["exclude"]).compact - - files.select do |file| - matches_includes = - globs.empty? || globs.any? { |pattern| File.fnmatch?(pattern, file, GLOB_FLAGS) } - matches_excludes = excludes.any? { |pattern| File.fnmatch?(pattern, file, GLOB_FLAGS) } - matches_includes && !matches_excludes - end - end - def normalize_relative_path(file) cleaned = file.start_with?("./") ? file[2..] : file path = Pathname.new(cleaned) @@ -222,7 +202,7 @@ def parse_options OptionParser .new do |parser| - parser.banner = "Usage: bin/lint [options] [files...]" + parser.banner = "Usage: bin/lint [options] [files|directories...]" parser.on("-h", "--help", "Show this help message") do puts parser @@ -235,6 +215,7 @@ def parse_options puts " bin/lint --wip # Lint staged + unstaged + files changed since main" puts " bin/lint --fix app.rb file2.js # Fix specific file/s" puts " bin/lint app/models/*.rb # Lint multiple files" + puts " bin/lint frontend/discourse/app/ # Lint all lintable files in directory" puts puts "Note: This script now uses lefthook to run linters." puts "Check lefthook.yml for linting configuration." diff --git a/bin/qunit b/bin/qunit index f9055748623af..11f8699f3c66b 100755 --- a/bin/qunit +++ b/bin/qunit @@ -122,6 +122,7 @@ class QunitRunner opts.separator <<~NOTES \nExamples: bin/qunit frontend/discourse/tests/unit/models/user-test.js + bin/qunit frontend/discourse/tests/unit/ # Run all tests in directory bin/qunit --standalone --target plugins # Run all plugin tests bin/qunit --standalone --target chat # Run single plugin tests bin/qunit --standalone plugins/chat/test/javascripts/unit/lib/chat-audio-test.js @@ -183,14 +184,14 @@ class QunitRunner if File.directory?(path) test_files = Dir.glob(File.join(path, "**", "*-test.{js,gjs}")) if test_files.empty? - puts "Warning: No test files found in directory: #{path}" if @verbose + abort "Error: No test files found in directory: #{path}" else expanded.concat(test_files) end elsif File.file?(path) expanded << path else - puts "Warning: Path not found: #{path}" + abort "Error: Path not found: #{path}" end end @@ -475,11 +476,16 @@ class QunitRunner def run_ember_build if @dry_run - puts "[dry-run] skipping ember build for themes" + puts "[dry-run] skipping ember build" return end - system("pnpm", "ember", "build", chdir: frontend_dir, exception: true) + system( + { "LOAD_PLUGINS" => should_load_plugins? ? "1" : "0" }, + "script/assemble_ember_build.rb", + chdir: rails_root, + exception: true, + ) end def build_theme_test_pages(query) diff --git a/config/discourse.pill.sample b/config/discourse.pill.sample index fdf9c24f7d38b..ce11ef361073c 100644 --- a/config/discourse.pill.sample +++ b/config/discourse.pill.sample @@ -86,27 +86,6 @@ Bluepill.application("discourse", :base_dir => ENV["HOME"] + '/.bluepill') do |a end end - # You can use Puma as WebServer as well, please use the scripts below. - #app.process("puma") do |process| - # process.start_command = "puma -e production -C #{rails_root}/config/puma.rb" - # - # # Puma's Setting file is located in config/puma.rb, if you want to edit them, go to puma.rb. - # # the upstream section in the nginx config to match. - # # The nginx.sample.conf file assumes you're using sockets. - # - # process.pid_file = "#{rails_root}/tmp/pids/puma.pid" - # process.start_grace_time = 30.seconds - # process.stop_grace_time = 10.seconds - # process.restart_grace_time = 10.seconds - # process.group = "pumas" - # process.uid = user - # process.gid = group - # process.daemonize = false - # process.stdout = process.stderr = "#{rails_root}/log/puma.log" - # # Thanks to: http://www.garrensmith.com/2012/09/24/Staying-up-with-Unicorn-Upstart-Bluepill.html - # # If the amount of memory is exceeded 3 times out of 5, restart - # process.checks :mem_usage, :every => 1.minutes, :below => 750.megabytes, :times => [3, 5] - #end #debug instance # app.process("thin-debug") do |process| diff --git a/config/environments/development.rb b/config/environments/development.rb index e60babb8c276c..3c45fa8c05db0 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -81,7 +81,7 @@ end if ENV["DISCOURSE_SKIP_CSS_WATCHER"] != "1" && - (defined?(Rails::Server) || defined?(Puma) || defined?(Unicorn) || defined?(Pitchfork)) + (defined?(Rails::Server) || defined?(Unicorn) || defined?(Pitchfork)) require "stylesheet/watcher" STDERR.puts "Starting CSS change watcher" @watcher = Stylesheet::Watcher.watch diff --git a/config/initializers/005-site_settings.rb b/config/initializers/005-site_settings.rb index c05c4709f724b..fa530bfcae115 100644 --- a/config/initializers/005-site_settings.rb +++ b/config/initializers/005-site_settings.rb @@ -23,6 +23,9 @@ SiteSetting.push_api_secret_key.length == 32 SiteSetting.push_api_secret_key = SecureRandom.hex end + + # Check for circular dependencies in site settings. + SiteSetting.type_supervisor.dependencies.order rescue ActiveRecord::StatementInvalid # This will happen when migrating a new database end diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index bc7092c941d85..cd6b61af002e9 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -15,7 +15,7 @@ ) Rails.application.config.assets.paths.push( - *Discourse.plugins.map { |p| "#{Rails.root}/app/assets/generated/#{p.directory_name}" }, + *Discourse.plugins.map { |p| "#{Rails.root}/app/assets/generated/#{p.directory_name}/" }, ) # These paths are added automatically by propshaft, but we don't want them diff --git a/config/locales/client.ar.yml b/config/locales/client.ar.yml index 89c953162f0c1..35aaea4196d27 100644 --- a/config/locales/client.ar.yml +++ b/config/locales/client.ar.yml @@ -9,9 +9,19 @@ ar: blocks: ghost: status: "الحالة" + conditions: "الشروط" + arguments: "الوسيطات" + container_args: "وسيطات الحاوية" in_location: "في" hidden: "مخفي" + not_registered: "غير مسجل" + no_visible_children: "لا توجد تبعيات ظاهرة" failed: "فشل" + ghost_reasons: + optional_missing_hint: "لا يتم عرض هذه الكتلة الاختيارية لأنها غير مسجلة." + no_visible_children_hint: "لا يتم عرض كتلة الحاوية هذه لأنه لا توجد أي تبعيات ظاهرة." + condition_failed_hint: "لا يتم عرض هذه الكتلة نظرًا لإخفاق شروطها." + head_hidden_tail_hint: "لا يتم عرض هذه الكتلة لأنه يجري عرض كتلة أخرى أولًا في الحاوية `head`." carousel: go_to_slide: "الانتقال إلى الشريحة %{index}" previous: "الشريحة السابقة" @@ -415,10 +425,13 @@ ar: skip_to_top: "تخطي إلى الأعلى" skip_user_nav: "التخطي إلى محتوى الملف الشخصي" emails_are_disabled: "أوقف أحد المسؤولين البريد الصادر بشكلٍٍ عام. ولن يتم إرسال إشعارات عبر البريد الإلكتروني أيًا كان نوعها." + emails_are_disabled_no_smtp: "تم تعطيل جميع رسائل البريد الإلكتروني الصادرة نظرًا لعدم وجود خادم SMTP تم تكوينه. لا يمكن إرسال أي نوع من الرسائل الإلكترونية." emails_are_disabled_non_staff: "تم إيقاف البريد الإلكتروني الصادر للمستخدمين من خارج فريق العمل." software_update_prompt: message: "لقد أجرينا تحديثًا على هذا الموقع، يُرجى تحديث الصفحة للحفاظ على سير الأمور بسلاسة." dismiss: "تجاهل" + notifications_tracking: + tooltip: "مستوى الإشعارات: %{level}" back_button: "الرجوع" welcome_banner: header: @@ -438,12 +451,27 @@ ar: broken_page_change_alert: "أظهر معالج onPageChange خطأً. تحقَّق من أدوات مطوِّر المتصفح للمزيد من المعلومات." broken_plugin_alert: "بسبب المكوِّن الإضافي '%{name}'" broken_transformer_alert: "حدث خطأ. قد لا يعمل موقعك بشكلٍ صحيح." + broken_block_alert: "تم اكتشاف خطأ في تكوين الكتلة. يرجى مراجعة وحدة تحكم المتصفح للاطلاع على التفاصيل." + broken_block_factory_alert: "تعذر تحميل إحدى الكتل. قد لا تظهر بعض عناصر واجهة المستخدم بشكل صحيح." critical_deprecation: notice: "[إشعار المسؤول] إن %{source} يحتوي على رمز بحاجة إلى تحديث. (المعرّف: %{id})" learn_more_link: "(معرفة المزيد)" theme_source: "السمة '%{name}'" plugin_source: "المكوِّن الإضافي \"%{name}\"" unknown_source: "واحد من سماتك أو مكوِّناتك الإضافية" + dev_tools: + drag_to_move: "اسحب للتحريك" + toggle_plugin_outlet_debug: "تبديل وضع تصحيح أخطاء منفذ المكون الإضافي" + toggle_block_debug: "تبديل وضع تصحيح أخطاء الكتلة" + block_debug: + outlet_boundaries: "حدود المنفذ" + visual_overlay: "التراكب المرئي" + ghost_blocks: "الكتل المخفية" + condition_debugging: "تصحيح الأخطاء الشرطية" + toggle_safe_mode: "تبديل الوضع الآمن" + toggle_verbose_localization: "تبديل التوطين المطول" + toggle_mobile_view: "تبديل عرض الهاتف المحمول" + disable_dev_tools: "تعطيل أدوات المطورين" s3: regions: ap_northeast_1: "آسيا والمحيط الهادئ (طوكيو)" @@ -549,9 +577,39 @@ ar: pill: "مُقترح" pm_title: "الرسائل المقترحة" admin_onboarding_banner: + launch_in_easy_steps: "الإطلاق عبر %{step_count} خطوات سهلة" + skipped: "تم الآن تخطي قائمة مراجعة إعداد المسؤول. إذا كنت ترغب في إعادة تمكينها، ابحث عن «تفعيل ضم مالك الموقع» في إعدادات الموقع." + congrats_onboarding_complete: "تهانينا على إكمال عملية الانضمام!" + invite_collaborators: + title: "دعوة المتعاونين" + description: "يساهم الأعضاء الأوائل في إثراء مجتمعك" + action: "إنشاء دعوة" start_posting: + title: "بدء النشر" + description: "امنح الناس موضوعًا يتحدثون عنه معًا" + action: "أفكار لكسر حالة السكوت" + choose_option: "كيف تود أن تبدأ؟" + predefined_topics: "قوالب لكسر حالة السكوت" + predefined_topics_subtitle: "امنح الأعضاء الجدد موضوعًا يتحدثون عنه، واختر قالبًا لتعديله، ثم أنشئ قالبك الخاص." + predefined_topics_description: "اختر من بين مجموعة من الموضوعات لبدء المحادثات" + use_predefined: "تصفح القوالب" back: "رجوع" + icebreakers: + fun_facts: + title: "اذكر بعض الحقائق الممتعة عنك" + body: "مرحبًا بالجميع! أنا متحمسٌ جدًا للبدء في تأسيس هذا المجتمع الجديد. ولإطلاق شرارة البداية، دعونا نتشارك حقيقةً ممتعةً عن أنفسنا. سأبدأ أنا أولاً: أنا أعشق التنزه سيرًا على الأقدام واستكشاف مسارات جديدة! فما هو الشيء المثير للاهتمام بخصوصكم؟" + coolest_thing_you_have_seen_today: + title: "ما أروع شيء رأيته اليوم؟" + body: "ما أروع شيء رأيته أو عشته اليوم؟ يمكن أن يكون أي شيء، بدءًا من غروب شمس بديع، وصولًا إلى عمل إنساني عفوي. سأبدأ أنا أولًا: لقد رأيت كلبًا يساعد شخصًا مسنًا على عبور الشارع!" + introduce_yourself: + title: "عرّف بنفسك" + body: "أهلاً بكم في هذا المجتمع! دعونا نبدأ بالتعرف على بعضنا بعضًا؛ يُرجى تقديم أنفسكم ومشاركتنا نبذة يسيرة عن اهتماماتكم. سأبدأ أنا أولاً: أنا شغوفٌ جدًا بعالم التكنولوجيا وأعشق تعليم الآخرين!" + what_is_your_favorite_food: + title: "ما طعامك المفضل؟" + body: "شارك طعامك المفضل مع المجتمع! سأبدأ: أنا أحب البيتزا، وخاصة مع إضافة الجبن والبيبروني." spread_the_word: + title: "انشروا مجتمعنا!" + description: "شارك الرابط مع جميع الأشخاص في نطاقك" action: "نسخ الرابط" copied_to_clipboard: "تم نسخ الرابط إلى الحافظة!" about: @@ -800,6 +858,10 @@ ar: few: "+%{count} مسودات أخرى" many: "+%{count} مسودة أخرى" other: "+%{count} مسودة أخرى" + embed_mode: + storage_access_prompt: "هل لديك بالفعل حساب %{site_name}؟ اسمح بالوصول إلى جلستك للتعليق بنفسك." + allow_access: "السماح بالوصول" + continue_as_guest: "المتابعة كضيف" topic_count_all: zero: "عرض %{count} موضوع جديد" one: "عرض موضوع واحد (%{count}) جديد" @@ -889,13 +951,23 @@ ar: in_reply_to: "ردًا على" filtered_flagged_by: "تم الإبلاغ بواسطة" unknown: + title: + zero: "لديك عناصر قيد الانتظار في قائمة المراجعة من المكوِّن الإضافي المُعطّل:" + one: "لديك عناصر قيد الانتظار في قائمة المراجعة من المكوِّن الإضافي المُعطّل:" + two: "لديك عناصر قيد الانتظار في قائمة المراجعة من المكوِّنين الإضافيين المُعطّلين:" + few: "لديك عناصر قيد الانتظار في قائمة المراجعة من المكوِّنات الإضافية المُعطّلة:" + many: "لديك عناصر قيد الانتظار في قائمة المراجعة من المكوِّنات الإضافية المُعطّلة:" + other: "لديك عناصر قيد الانتظار في قائمة المراجعة من المكوِّنات الإضافية المُعطّلة:" instruction: "لا يمكن عرض تلك العناصر ما لم تفعّل المكوِّن الإضافي ذا الصلة. يُرجى تفعيل المكوِّن الإضافي ثم تحديث الصفحة. أو يمكنك تجاهلها. معرفة المزيد..." reviewable_unknown_source: "%{reviewableType} (مكوِّن إضافي غير معروف)" reviewable_known_source: "%{reviewableType} (من المكوِّن الإضافي \"%{pluginName}\")" ignore_all: "تجاهل الكل" enable_plugins: "تفعيل المكوِّنات الإضافية" + delete_confirm: "هل ترغب بالتأكيد في حذف كل العناصر الموجودة في قائمة انتظار المراجعة التي أُنشِئت بواسطة المكوِّنات الإضافية المعطّلة؟" + ignore_success: "حُذفت كل العناصر الموجودة في قائمة انتظار المراجعة التي أُنشِئت بواسطة المكوِّنات الإضافية المعطّلة." explain: why: "اشرح سبب دخول هذا العنصر في قائمة الانتظار" + title: "تقييم العناصر الموجودة في قائمة انتظار المراجعة" formula: "المُعادلة" subtotal: "الإجمالي الفرعي" total: "الإجمالي" @@ -909,8 +981,10 @@ ar: title: "يحصل المستخدمون الذين تم التحقُّق من صحة بلاغاتهم بشكلٍٍ متكرر على مكافأة." trust_level_bonus: name: "مستوى الثقة" + title: "تحظى البلاغات التي أنشأها مستخدمون من مستوى ثقة أعلى بتقييم أعلى." type_bonus: name: "مكافأة النوع" + title: "يمكن لفريق العمل تخصيص مكافأة لبعض أنواع البلاغات لمنحها أولوية أعلى." revise_and_reject_post: title: "مراجعة" reason: "السبب" @@ -919,6 +993,7 @@ ar: custom_reason: "قدِّم وصفًا واضحًا للسبب" other_reason: "آخر..." optional: "اختياري" + stale_help: "تم حل هذا العنصر بواسطة %{username}." claim_help: optional: "يمكنك المطالبة بهذا العنصر لمنع الآخرين من مراجعته." required: "يجب عليك المطالبة بالعناصر قبل أن تتمكن من مراجعتها." @@ -1953,6 +2028,13 @@ ar: undo_revoke_access: "التراجع عن إلغاء الوصول" api_approved: "تمت الموافقة عليها:" api_last_used_at: "آخر استخدام في:" + api_show_permissions: + zero: "الأذونات الممنوحة (%{count})" + one: "الأذونات الممنوحة (%{count})" + two: "الأذونات الممنوحة (%{count})" + few: "الأذونات الممنوحة (%{count})" + many: "الأذونات الممنوحة (%{count})" + other: "الأذونات الممنوحة (%{count})" theme: "السمة" save_to_change_theme: 'سيتم تحديث السمة بعد النقر على "%{save_text}"' home: "الصفحة الرئيسية المبدئية" @@ -1965,6 +2047,13 @@ ar: few: '%{count} بلاغات مفيدة' many: '%{count} بلاغًا مفيدًا' other: '%{count} بلاغ مفيد' + flags: + zero: 'عدد البلاغات: %{count}' + one: 'عدد البلاغات: %{count}' + two: 'عدد البلاغات: %{count}' + few: 'عدد البلاغات: %{count}' + many: 'عدد البلاغات: %{count}' + other: 'عدد البلاغات: %{count}' deleted_posts: zero: '%{count} منشور تم حذفه' one: 'منشور واحد (%{count}) تم حذفه' @@ -2124,6 +2213,10 @@ ar: apps: "التطبيقات" navigation_menu: "قائمة التنقل" upcoming_changes: "التغييرات القادمة" + calendar_subscriptions: "التقويم" + calendar_subscriptions: + copied: "تم النسخ!" + add_to_google: "تقويم Google" change_password: success: "(تم إرسال رسالة البريد الإلكتروني)" in_progress: "(جارٍ إرسال رسالة البريد الإلكتروني)" @@ -2800,6 +2893,14 @@ ar: form_kit: reset: إعادة التعيين optional: اختياري + required: مطلوب + errors_summary_title: + zero: "أصلح هذا الخطأ للمتابعة" + one: "أصلح هذا الخطأ للمتابعة" + two: "أصلح هذين الخطأين للمتابعة" + few: "أصلح هذه الأخطاء للمتابعة" + many: "أصلح هذه الأخطاء للمتابعة" + other: "أصلح هذه الأخطاء للمتابعة" dirty_form: "لم ترسل التغييرات! هل تريد بالتأكيد المغادرة؟" errors: starts_with: "يجب أن يبدأ بـ %{prefix}" @@ -2827,6 +2928,10 @@ ar: few: "يجب ألا يقل عن %{count} أحرف" many: "يجب ألا يقل عن %{count} حرفًا" other: "يجب ألا يقل عن %{count} حرف" + color: + available_presets: "الإعدادات المسبقة المتاحة" + already_used: "مستخدمة بالفعل" + edit_presets: "تعديل الإعدادات المسبقة للألوان" close: "إغلاق" assets_changed_confirm: "لقد تلقى هذا الموقع للتو تحديثًا للبرنامج. هل تريد الحصول على أحدث إصدار الآن؟" logout: "تم تسجيل خروجك." @@ -2897,6 +3002,7 @@ ar: }. learn_more: "معرفة المزيد…" learn_more_with_link: "اعرف المزيد…" + feedback_with_link: "الملاحظات…" mute: كتم unmute: إلغاء الكتم last_post: آخر منشور @@ -3442,6 +3548,7 @@ ar: upload_description: "أدخِل وصف التحميل هنا" olist_title: "قائمة مرقَّمة" ulist_title: "قائمة منقَّطة" + list_title: "القوائم" list_item: "إدراج عنصر" toggle_direction: "تبديل الاتجاه" apply_wrap_title: "تطبيق عنصر الاحتواء" @@ -3730,8 +3837,6 @@ ar: votes_released: "صدَر التصويت" new_features: "تم إطلاق ميزات جديدة في Discourse" admin_problems: "نصيحة جديدة بشأن لوحة معلومات موقعك" - upcoming_change_available: "التغيير الجديد القادم '%{changeName}' متاح الآن" - upcoming_change_automatically_promoted: "تم تفعيل التغيير القادم '%{changeName}' تلقائيًا" upload_selector: change: "تغيير" delete: "حذف" @@ -3958,6 +4063,7 @@ ar: deleted_post: "(منشور محذوف)" post_number_with_topic_title: "المنشور #%{post_number} - %{title}" new_post_in_topic: "منشور جديد في %{title}" + new_post_in_deleted_topic: "منشور جديد في موضوع محذوف" user_requires_approval: "%{username} يتطلَّب الموافقة" default_item: "العنصر القابل للمراجعة #%{reviewable_id}" topics: @@ -3967,11 +4073,8 @@ ar: confirm: "تأكيد" select_all: "تحديد الكل" clear_all: "مسح الكل" - unlist_topics: "إلغاء إدراج الموضوعات" - relist_topics: "إعادة إدراج الموضوعات" reset_bump_dates: "إعادة تعيين تواريخ الرفع" defer: "وضع علامة كغير مقروءة" - delete: "حذف الموضوعات" delete_topics_count: zero: "حذف الموضوعات" one: "حذف الموضوع" @@ -4042,21 +4145,10 @@ ar: other: "تجاهل الجديدة (%{count})" toggle: "تفعيل التحديد الجماعي للموضوعات" actions: "الإجراءات الجماعية" - change_category: "ضبط الفئة…" - close_topics: "إغلاق الموضوعات" - archive_topics: "أرشفة الموضوعات" move_messages_to_inbox: "النقل إلى صندوق الوارد" archive_messages: "النقل إلى الأرشيف" - notification_level: "الإشعارات…" change_notification_level: "تغيير مستوى الإشعارات" choose_new_category: "اختر الفئة الجديدة للموضوعات:" - selected: - zero: "لقد حدَّدت %{count} موضوع." - one: "لقد حدَّدت موضوعًا واحدًا (%{count})." - two: "لقد حدَّدت موضوعين (%{count})." - few: "لقد حدَّدت %{count} موضوعات." - many: "لقد حدَّدت %{count} موضوعًا." - other: "لقد حدَّدت %{count} موضوع." selected_sole_category: zero: "لقد حدَّدت %{count} موضوع من الفئة:" one: "لقد حدَّدت موضوعًا واحدًا (%{count}) من الفئة:" @@ -4071,12 +4163,10 @@ ar: few: "المحدَّدة: %{count}" many: "المحدَّدة: %{count}" other: "المحدَّدة: %{count}" - change_tags: "استبدال الوسوم" - append_tags: "إضافة الوسوم" + append_tags: "إضافة وسوم" choose_new_tags: "اختيار الوسوم الجديدة لهذه الموضوعات:" - choose_append_tags: "اختيار الوسوم الجديدة لإضافتها إلى هذه الموضوعات:" + choose_append_tags: "إضافة وسوم" changed_tags: "تم تغيير وسومات هذه الموضوعات." - remove_tags: "إزالة كل الوسوم" confirm_remove_tags: zero: "ستتم إزالة كل الوسوم من %{count} موضوع. هل أنت متأكد؟" one: "ستتم إزالة كل الوسوم من هذا الموضوع. هل أنت متأكد؟" @@ -4091,9 +4181,30 @@ ar: few: "التقدُّم: %{count} موضوعات" many: "التقدُّم: %{count} موضوعًا" other: "التقدُّم: %{count} موضوع" - notify: "إخطار المستخدمين بهذا التغيير." + notify: "إخطار المستخدمين بهذا التغيير" performing: "جارٍ تنفيذ عمليات جماعية، يُرجى الانتظار..." completed: "تم تنفيذ العمليات المجمعة بنجاح!" + completed_count: + zero: "تم تحديث %{count} من الموضوعات." + one: "تم تحديث موضوع واحد %{count}." + two: "تم تحديث موضوعين %{count}." + few: "تم تحديث %{count} موضوعات." + many: "تم تحديث %{count} موضوعًا." + other: "تم تحديث %{count} موضوع." + not_completed: + zero: "تعذر تحديث %{count} من الموضوعات:" + one: "تعذر تحديث موضوع واحد %{count}:" + two: "تعذر تحديث موضوعين %{count}:" + few: "تعذر تحديث %{count} موضوعات:" + many: "تعذر تحديث %{count} موضوعًا:" + other: "تعذر تحديث %{count} موضوع:" + skipped_count: + zero: "هناك %{count} من الموضوعات محدثة بالفعل." + one: "هناك موضوع واحد %{count} محدث بالفعل." + two: "هناك موضوعان %{count} محدثان بالفعل." + few: "هناك %{count} موضوعات محدثة بالفعل." + many: "هناك %{count} موضوعًا محدثًا بالفعل." + other: "هناك %{count} موضوع محدث بالفعل." error_topic_count: zero: "%{count} موضوعات" one: "موضوع واحد" @@ -4124,7 +4235,6 @@ ar: name: "تجاهل" close_topics: name: "إغلاق" - note: "ملاحظة" optional: (اختياري) archive_topics: name: "الأرشيف" @@ -4138,24 +4248,18 @@ ar: name: "إعادة الإدراج" remove_tags: name: "إزالة الوسوم" - append_tags: - name: "إضافة الوسوم" replace_tags: name: "استبدال الوسوم" delete_topics: name: "حذف" update_category: name: "تحديث الفئة" - description: "اختر الفئة الجديدة للموضوعات المحدَّدة" reset_bump_dates: name: "إعادة تعيين تواريخ الرفع" - description: "إعادة تعيين تاريخ رفع الموضوع إلى تاريخ آخر منشور تم إنشاؤه، مما يؤثر على الترتيب في قائمة الموضوعات" defer: name: "وضع علامة غير مقروءة" - description: "وضع علامة على الموضوعات كغير مقروءة" update_notifications: name: "تحديث الإشعارات" - description: "تغيير مستوى الإشعارات إلى \"مراقبة\" أو \"تتبع\" أو \"عادي\" أو \"كتم\"" topic: filter_to: zero: "%{count} منشور في الموضوع" @@ -4166,6 +4270,7 @@ ar: other: "%{count} منشور في الموضوع" create: "موضوع جديد" create_long: "إنشاء موضوع جديد" + create_group: "موضوع جديد ومسودات جديدة" open_draft: "فتح المسودة" private_message: "إنشاء رسالة" archive_message: @@ -5143,6 +5248,8 @@ ar: delete: "احذف الفئة" create: "فئة جديدة" create_long: "إنشاء فئة جديدة" + type_settings_schema: + site_settings: "إعدادات الموقع" save: "احفظ الفئة" unsaved_changes: "لديك تغييرات غير محفوظة" slug: "مسار الفئة" @@ -5153,6 +5260,7 @@ ar: errors: self_lockout: "أنت على وشك تغيير أذونات الفئة بطريقة ستؤدي إلى إزالة صلاحية وصولك. هل أنت متأكد من رغبتك في المتابعة؟" validations: + emoji_required: "اختيار رمز تعبيري." icon_required: "تحديد أيقونة." name: "اسم الفئة" untitled: "فئة بلا عنوان" @@ -5190,6 +5298,8 @@ ar: list: "إدراج الفئات" no_description: "يُرجى إضافة وصف لهذه الفئة." change_in_category_topic: "عدّل الوصف" + description_expand: "عرض المزيد" + description_collapse: "عرض أقل" already_used: "هذا اللون مستخدم بالفعل في فئة أخرى" color_palette: "لوحة الألوان" security: "الأمان" @@ -5200,9 +5310,15 @@ ar: reply: "الرد" create: "إنشاء" no_groups_selected: "لم يتم منح إذن الوصول لأي مجموعة؛ لذا فإن هذه الفئة ستكون مرئية لفريق العمل فقط." + everyone_full_access: 'هذه الفئة عامة، ويمكن للجميع رؤية المنشورات والرد عليها وإنشائها. لتقييد الأذونات، عليك إزالة واحد أو أكثر من الأذونات الممنوحة لمجموعة "%{everyone_group}".' + everyone_reply_access: 'هذه الفئة عامة، ويمكن للجميع رؤية الموضوعات والرد عليها. لتقييد الأذونات، قم بإزالة المجموعة "%{everyone_group}".' + everyone_see_access: 'هذه الفئة عامة، ويمكن للجميع رؤية المنشورات. لتقييد الأذونات، قم بإزالة المجموعة "%{everyone_group}".' specific_groups_have_access: "هذه الفئة خاصة، ويمكن للمجموعات المختارة فقط رؤية المنشورات والرد عليها وإنشائها." + all_parent_groups_used: "تمت إضافة جميع المجموعات من الفئة الرئيسية. لإضافة مجموعات أكثر، أضفها أولاً إلى الفئة الرئيسية." toggle_reply: "إذن تفعيل الرد" toggle_full: "إذن تفعيل الإنشاء" + inherited: 'هذا الإذن مكتسب من "%{everyone_group}"' + special_warning: "هذه الفئة مصنَّفة مسبقًا ولا يمكن تعديل إعدادات الأمان لها. إذا كنت لا ترغب في استخدام هذه الفئة، فعليك حذفها بدلًا من إعادة توظيفها." uncategorized_security_warning: "هذه الفئة خاصة. وتهدف إلى جمع الموضوعات التي لا تنتمي إلى أي فئة، ولا يمكنك تعيين إعدادات حماية لها." uncategorized_general_warning: 'هذه الفئة خاصة. ويتم استخدامها كفئة افتراضية للموضوعات الجديدة التي لا تنتمي إلى أي فئة. إذا أردت منع هذا السلوك وفرض تحديد الفئة، يُرجى إيقاف هذا الإعداد من هنا. إذا أردت تغيير اسم الفئة أو وصفها، فانتقل إلى التخصيص/المحتوى النصي.' pending_permission_change_alert: "لم تُضف المجموعة %{group} إلى هذه الفئة، انقر على هذا الزر لإضافتها." @@ -5245,6 +5361,9 @@ ar: group_restricted: "خاص" who_can_see: "من يمكنه رؤية هذه الفئة؟" who_can_post: "من يمكنه النشر في هذه الفئة" + which_groups_can_access: "المجموعات التي يمكن من خلالها الاطلاع على هذه الفئة والنشر فيها" + more_options_hint: "تتوفر المزيد من الأذونات في الإعدادات المتقدمة." + inherited_from_parent: "الأذونات مكتسبة من الفئة الأصلية. للتعديل عليها، يُرجى الانتقال إلى الإعدادات المتقدمة." num_auto_bump_daily: "عدد الموضوعات المفتوحة التي سيتم رفعها تلقائيًا بشكلٍ يومي:" auto_bump_cooldown_days: "الحد الأدنى لعدد الأيام قبل رفع الموضوع نفسه مرة أخرى:" navigate_to_first_post_after_read: "الانتقال إلى أول منشور بعد قراءة الموضوعات" @@ -5847,6 +5966,7 @@ ar: category_restricted: "هذا الوسم مقيَّد بالفئات التي ليس لديك إذن بالوصول إليها." synonyms: "المرادفات" synonyms_description: "عند استخدام الوسوم التالية، سيتم استبدالها بالوسم %{base_tag_name}." + synonyms_inline: "سيتم استبدال هذه المرادفات بـ %{base_tag_name}:" save: "حفظ اسم الوسم ووصفه" tag_groups_info: zero: "هذا الوسم ينتمي إلى المجموعة: %{tag_groups}." @@ -5855,6 +5975,13 @@ ar: few: "هذا الوسم ينتمي إلى المجموعات: %{tag_groups}." many: "هذا الوسم ينتمي إلى المجموعات: %{tag_groups}." other: "هذا الوسم ينتمي إلى المجموعات: %{tag_groups}." + tag_groups_info_prefix: + zero: "هذا الوسم ينتمي إلى المجموعة " + one: "هذا الوسم ينتمي إلى المجموعة " + two: "هذا الوسم ينتمي إلى المجموعتين: " + few: "هذا الوسم ينتمي إلى المجموعات: " + many: "هذا الوسم ينتمي إلى المجموعات: " + other: "هذا الوسم ينتمي إلى المجموعات: " category_restrictions: zero: "لا يمكن استخدامه إلا في هذه الفئة:" one: "لا يمكن استخدامه إلا في هذه الفئة:" @@ -5862,6 +5989,8 @@ ar: few: "لا يمكن استخدامه إلا في هذه الفئات:" many: "لا يمكن استخدامه إلا في هذه الفئات:" other: "لا يمكن استخدامه إلا في هذه الفئات:" + restricted_to: "مقيد إلى" + no_synonyms: "هذا الوسم ليست له مرادفات." edit_synonyms: "تعديل المرادفات" add_synonyms_label: "إضافة المرادفات:" add_synonyms: "إضافة" @@ -5896,17 +6025,31 @@ ar: description: "الوصف" settings: title: "الإعدادان" + edit_title: "تعديل الوسم: %{name}" + edit_tag_prefix: "تعديل الوسم:" + select_tag: "حدد وسمًا لتحريره" general: "عام" localizations: "التوطينات" back: "رجوع" name: "الاسم" slug: "المسار" name_placeholder: "اسم الوسم" + slug_placeholder: "مسار الوسم (اختياري، يُنشأ تلقائيًا من الاسم)" + saved: "حُفظت إعدادات الوسم" + no_synonyms: "لا توجد مرادفات محددة لهذا الوسم." + add_synonym_placeholder: "ابحث عن الوسوم لإضافتها كمرادفات..." synonyms_subtitle: "عند استخدام الوسوم التالية، سيتم استبدالها بالوسم %{name}" + save: "حفظ الوسم" + delete: "حذف الوسم" + synonyms_hint: "عند استخدام الوسوم السابقة، سيتم استبدالها بالوسم %{baseTagName}." + add_synonyms_confirm: "سيتحوَّل أي مكان يستخدم %{synonymNames} حاليًا إلى استخدام %{tagName} بدلًا منه. هل تريد بالتأكيد إجراء هذا التغيير؟" localization: + hint: "أضف خيارات التوطين لعرض أسماء وسوم مختلفة للمستخدمين بلغات مختلفة." locale: "اللغة" name: "الاسم" description: "الوصف" + add: "إضافة التوطين" + remove: "إزالة التوطين" sort_by: "الترتيب حسب:" sort_by_count: "العدد" sort_by_name: "الاسم" @@ -6481,6 +6624,8 @@ ar: toggle_localized: translated: "تمت ترجمة الصفحة آليًا. انقر لعرض النسخة الأصلية." not_translated: "الصفحة غير مترجمة. انقر للترجمة." + translations_enabled: "تم تفعيل الترجمات" + translations_disabled: "تم تعطيل الترجمات" language_switcher: title: "تغيير لغة الموقع" admin_js: @@ -6501,11 +6646,12 @@ ar: title: "قائمة التقارير المتاحة" sidebar_title: "التقارير" back: "العودة إلى جميع التقارير" + group_engagement: "التفاعل" group_traffic: "الزيارات" group_members: "الأعضاء" - group_moderation: "الإشراف" - group_security: "الأمان" + group_content: "المحتوى والصحة" group_other: "أخرى" + legacy_warning: "هذا تقرير قديم، وسيتم إيقافه قريبًا. يرجى الاتصال بالدعم الفني إذا كنت بحاجة إلى مساعدة في إيجاد بديل." config_sections: account: title: "الحساب" @@ -6537,17 +6683,20 @@ ar: no_changes_to_save: "لا توجد تغييرات للحفظ" select_groups: "تحديد المجموعات…" opt_in_groups: "مجموعات الانضمام الاختياري" + show_related_settings: "إظهار الإعدادات ذات الصلة..." opt_in_groups_instructions: "يمكن استخدام مجموعات الانضمام الاختياري للسماح لمجموعة معينة من المستخدمين باختبار تغييرٍ ما قبل طرحه للجميع. يرجى ملاحظة أن هذه المجموعات لن تكون ذات صلة بمجرد انتقال التغيير إلى الحالة المستقرة." enabled_for_throttle: "لقد قمت بتغيير الأشخاص المفعَّلة لديهم هذه الميزة بسرعة كبيرة. يرجى الانتظار لبضع ثوانٍ قبل المحاولة مرة أخرى." change_enabled_for_success: "لقد فعلت هذا التغيير لـ %{enabledFor}" change_disabled: "تم إلغاء اشتراكك في هذا التغيير" permanent_notice: "أصبح هذا التغيير دائمًا وسيتم إزالته قريبًا. لم يعد بإمكانك إلغاء الاشتراك." + permanent_soon_notice: "سيصبح هذا التغيير دائمًا في أقرب وقت. لن تتمكن بعد الآن من إلغاء الاشتراك." permanent_no_group_selection: "لا ينطبق؛ حيث تسري التغييرات الدائمة على كافة المجموعات" no_changes: "لا توجد تغييرات قادمة في الوقت الحالي." preview: "معاينة" enabled_for_options: no_one: "لا أحد" everyone: "الجميع" + staff: "%{staffGroupName} فقط" specific_groups: "مجموعة (مجموعات) محددة" specific_groups_with_group_names: zero: "المجموعة %{groupNames}" @@ -6572,7 +6721,10 @@ ar: search_placeholder: "تصفية حسب الاسم، أو الوصف، أو المكون الإضافي..." no_results: "لا توجد تغييرات قادمة تطابق معايير التصفية" all: "الكل" + enabled_all: "جميع الحالات المُفعّلة" enabled: "مفعَّلة" + enabled_for_staff: "مُفعّل لصالح %{staffGroupName}" + enabled_for_specific_groups: "مُفعّل لصالح مجموعات محددة" disabled: "متوقفة" impact_type_all: "كل أنواع التأثيرات" impact_type_feature: "الميزة" @@ -6622,6 +6774,7 @@ ar: keywords: "اللغة|اللغة|المنطقة الزمنية|unicode|من اليسار إلى اليمين" upcoming_changes: title: "التغييرات القادمة" + header_description: "قائمة بالتغييرات القادمة في Discourse التي قد تؤثر في موقعك، إضافةً إلى الميزات التجريبية التي يمكنك الاشتراك فيها. يمكنك التصفية حسب مستوى التأثير، والنوع، والحالة.\n\nيمكن استخدام مجموعات الانضمام الاختياري لتمكين مجموعة محددة من المستخدمين من اختبار تغييرٍ ما قبل طرحه للجميع، مع العلم أن هذه المجموعات تصبح غير ذات صلة بمجرد انتقال التغيير إلى الحالة الدائمة." login: title: "تسجيل الدخول والمصادقة" header_description: "تكوين كيفية تسجيل دخول المستخدمين ومصادقتهم، والعبارات السرية، والمفاتيح، ومقدِّمي المصادقة الثنائية، وغير ذلك" @@ -6660,6 +6813,7 @@ ar: help_text: "الحجم الموصى به هو 600 × 80 بكسل." large_icon: title: "أيقونة مربعة" + description: "يُعرض إصدار مربع من صورة الشعار في الجزء العلوي من الموقع، ويُستخدم أيضًا كشعار لتطبيق الهاتف." help_text: "الحجم الموصى به هو 512 × 512 بكسل." square_icon_dark: required: "هل تريد استخدام أيقونة مربعة مختلفة للوضع الداكن؟" @@ -6984,6 +7138,9 @@ ar: embedding: title: "التضمين" header_description: "يتمتع Discourse بالقدرة على تضمين التعليقات من أحد الموضوعات في موقع بعيد باستخدام واجهة برمجة تطبيقات Javascript التي تُنشئ IFRAME" + form_templates: + title: "قوالب النموذج" + header_description: "تتيح لك قوالب النماذج تطبيق نموذج منظم مع التحقق من صحة البيانات كجزء من عملية إنشاء الموضوع" theme_site_settings: setting: "الإعداد" overridden_by: "تم استبداله بواسطة" @@ -7030,6 +7187,7 @@ ar: new_features: title: "ما الجديد؟" subtitle: "نحن نصدر ميزات وتحسينات جديدة طوال الوقت. تغطي هذه الصفحة أبرز النقاط، ولكن يمكنك النقر على \"معرفة المزيد\" للاطلاع على ملاحظات الإصدار الشاملة." + no_new_features_found: "لا توجد عناصر في الموجز أو أن عامل التصفية الذي اخترته لم يُظهر أي نتائج. يمكنك الاطلاع على الإعلانات السابقة للميزات الجديدة على مجتمع Discourse Meta." no_new_features_error: "حدث خطأ أثناء تحميل الموجز. يمكنك الاطلاع على الإعلانات السابقة للميزات الجديدة في مجتمع Discourse Meta." learn_more: "معرفة المزيد..." last_checked: "تاريخ آخر تحقُّق" @@ -7110,7 +7268,7 @@ ar: all: "الكل" view_table: "جدول" view_graph: "رسم بياني" - refresh_report: "تحديث التقرير " + refresh_report: "تحديث" daily: يوميًا monthly: شهريًا weekly: أسبوعيًا @@ -7245,6 +7403,7 @@ ar: cancel: "إلغاء" continue: "متابعة" copy_key: "نسخ" + key_copied_to_clipboard: "تم نسخ مفتاح API إلى الحافظة" back: "العودة إلى مفاتيح API" revoke: "إلغاء" undo_revoke: "التراجع عن الإلغاء" @@ -7902,6 +8061,8 @@ ar: delete: "حذف" delete_confirm: 'هل تريد بالتأكيد حذف السمة "%{theme_name}"؟' bulk_delete: "هل أنت متأكد؟" + bulk_themes_delete_confirm: "سيؤدي هذا إلى إلغاء تثبيت السمات التالية، ولن تكون قابلة للاستخدام من قِبل أي مستخدم على موقعك بعد الآن:" + bulk_components_delete_confirm: "سيؤدي هذا إلى إلغاء تثبيت المكوِّنات التالية، ولن تكون قابلة للاستخدام من قِبل أي مستخدم على موقعك بعد الآن:" color: "اللون" opacity: "الشفافية" copy: "تكرار" @@ -9354,7 +9515,7 @@ ar: min_admin_password_length: prompt: "أنت على وشك تغيير سياسة كلمة المرور. سيؤثر هذا على جميع المسؤولين الذين سيغيرون كلمات مرورهم من الآن فصاعدًا. هل أنت متأكد أنك تريد المتابعة؟" confirm: "نعم، تحديث سياسة كلمة المرور" - password_unique_charactes: + password_unique_characters: prompt: "أنت على وشك تغيير سياسة كلمة المرور. سيؤثر هذا على جميع المستخدمين الذين سيغيرون كلمات مرورهم من الآن فصاعدًا. هل أنت متأكد أنك تريد المتابعة؟" confirm: "نعم، تحديث سياسة كلمة المرور" block_common_passwords: @@ -9399,6 +9560,8 @@ ar: no_user_badges: "لم يُمنح %{name} أيّ شارة." no_badges: لا توجد شارات يمكن منحها. none_selected: "تحديد شارة للبدء" + filter_placeholder: "تصفية الشارات..." + no_badges_found: "لم يتم العثور على شارات" sections: design: تصميم query: استعلام diff --git a/config/locales/client.be.yml b/config/locales/client.be.yml index ce05db7dff62e..428d858cae219 100644 --- a/config/locales/client.be.yml +++ b/config/locales/client.be.yml @@ -22,7 +22,7 @@ be: one: байт few: байты many: байтаў - other: байтаў + other: байта gb: ГБ kb: КБ mb: МБ @@ -856,7 +856,7 @@ be: everyone: "Усе" notifications: watching: - title: "Назіраюцца" + title: "Пад назіраннем" tracking: title: "Адсочваюцца" muted: @@ -1210,6 +1210,7 @@ be: close: "закрыць" form_kit: reset: Скінуць + required: абавязкова errors: required: "Абавязковае" close: "Закрыць" @@ -1433,7 +1434,6 @@ be: new_messages_marker: "апошняе наведванне" bulk: select_all: "Выбраць усе" - delete: "Выдаліць тэмы" delete_topics_count: one: "Выдаліць тэму" few: "Выдаліць тэмы" @@ -1443,8 +1443,6 @@ be: dismiss_new: "Адхіліць новыя" toggle: "Пераключыць групавы выбар тэм" actions: "Групавыя дзеянні" - close_topics: "Закрыць тэмы" - archive_topics: "Архіваваць тэмы" move_messages_to_inbox: "Перамясціць ва Уваходныя" error_topic_count: one: "%{count} тэма" @@ -1499,482 +1497,484 @@ be: when: "Калі:" auto_close: title: "Аўтаматычна закрываць тэму" - error: "Калі ласка, увядзіце карэктнае значэнне." - auto_close_title: "Настройка аўтаматычнага закрыцця" + error: "Увядзіце карэктнае значэнне." + auto_close_title: "Налады аўтаматычнага закрыцця" timeline: back: "Назад" progress: - title: прасоўванне па тэме + title: прагрэс у тэме jump_prompt_or: "або" notifications: reasons: - "3_6": "Вы будзеце атрымліваць апавяшчэнні, таму што вы сочыце за гэтай катэгорыяй." - "3_5": "Вы будзеце атрымліваць апавяшчэнні, таму што вы аўтаматычна пачалі сачыць за гэтай тэмай." - "3_2": "Вы будзеце атрымліваць апавяшчэнні, таму што вы сочыце за гэтай тэмай." - "3_1": "Вы будзеце атрымліваць апавяшчэнні, таму што вы стварылі гэтую тэму." - "3": "Вы будзеце атрымліваць апавяшчэнні, таму што вы сочыце за гэтай тэмай." - "0_7": "Вы ігнаруеце ўсе паведамленні ў гэтай катэгорыі." - "0_2": "Вы ігнаруеце ўсе паведамлення па гэтай тэме." - "0": "Вы ігнаруеце ўсе паведамлення па гэтай тэме." + "3_6": "Вы будзеце атрымліваць апавяшчэнні, бо назіраеце за гэтай катэгорыяй." + "3_5": "Вы будзеце атрымліваць апавяшчэнні, бо аўтаматычна пачалі назіраць за гэтай тэмай." + "3_2": "Вы будзеце атрымліваць апавяшчэнні, бо назіраеце за гэтай тэмай." + "3_1": "Вы будзеце атрымліваць апавяшчэнні, бо вы стварылі гэту тэму." + "3": "Вы будзеце атрымліваць апавяшчэнні, бо назіраеце за гэтай тэмай." + "0_7": "Вы ігнаруеце ўсе апавяшчэнні ў гэтай катэгорыі." + "0_2": "Вы ігнаруеце ўсе апавяшчэнні ў гэтай тэме." + "0": "Вы ігнаруеце ўсе апавяшчэнні ў гэтай тэме." watching_pm: - title: "сачыць" + title: "Пад назіраннем" watching: - title: "сачыць" + title: "Пад назіраннем" tracking_pm: - title: "Сачыць" + title: "Адсочваецца" tracking: - title: "Сачыць" + title: "Адсочваецца" muted_pm: - title: "ігнараваць" + title: "Адключана" muted: - title: "ігнараваць" + title: "Адключана" actions: - title: "загалоўкі....................." - recover: "Адмяніць выдаленне тэмы" + title: "Дзеянні" + recover: "Адрабіць выдаленне тэмы" delete: "Выдаліць тэму" open: "Адкрыць тэму" close: "Закрыць тэму" - multi_select: "Абраць запісы ..." - pin: "Замацаваць тэму ..." - unpin: "Адмацаваць тэму ..." + multi_select: "Выбраць допісы…" + pin: "Замацаваць тэму…" + unpin: "Адмацаваць тэму…" unarchive: "Разархіваваць тэму" - archive: "Заархіваваць тэму" - reset_read: "Скінуць дадзеныя аб прочитанисть" + archive: "Архіваваць тэму" + reset_read: "Скінуць даныя аб прачытанні" make_private: "Стварыць асабістае паведамленне" - reset_bump_date: "Скінуць Dump дату" + reset_bump_date: "Скінуць дату павышэння" feature: pin: "Замацаваць тэму" unpin: "Адмацаваць тэму" reply: title: "Адказаць" - help: "пачаць складаць адказ на гэтую тэму" + help: "пачаць складаць адказ на гэту тэму" share: - help: "Распаўсюдзіць спасылку на гэтую тэму" + help: "абагуліць спасылку на гэту тэму" print: - title: "друк" + title: "Друк" flag_topic: - title: "Пазначыць" - success_message: "privately flag this topic for attention or send a private notification about it..." + title: "Паскардзіцца" + success_message: "Вы паспяхова паскардзіліся на гэту тэму." invite_private: group_name: "назва групы" invite_reply: - username_placeholder: "username" + username_placeholder: "імя карыстальніка" email_placeholder: "name@example.com" filters: n_posts: - one: "%{count} запіс" - few: "%{count}запісаў" - many: "%{count}запісаў" - other: "%{count}запісаў" - cancel: "прыбраць фільтр" + one: "%{count} допіс" + few: "%{count} допісы" + many: "%{count} допісаў" + other: "%{count} допісу" + cancel: "Выдаліць фільтр" split_topic: - title: "Перанос новай тэмы" - action: "перанесці ў новай тэмы" - radio_label: "пачаць новую тэму" - error: "Пры пераносе паведамленняў да новай тэмы адбылася памылка." + title: "Перамясціць у новую тэму" + action: "перамясціць ў новую тэму" + radio_label: "Новая тэма" + error: "Пры перамяшчэнні допісаў у новую тэму адбылася памылка." merge_topic: - title: "Перанос наяўнай тэмы" - action: "перанесці наяўнай тэмы" - error: "Пры пераносе паведамленняў да гэтай тэмы адбылася памылка." + title: "Перамясціць у існуючую тэму" + action: "перамясціць у існуючую тэму" + error: "Пры перамяшчэнні допісаў у гэту тэму адбылася памылка." move_to_new_message: - radio_label: "новае паведамленне" + radio_label: "Новае паведамленне" publish_page: - public: "грамадскага" + public: "Публічная" change_timestamp: - action: "змяніць метку часу" + action: "змяніць пазнаку часу" post_list: title: "Апошнія паведамленні" post: quote_edit: "Рэдагаваць" - quote_share: "Падзяліцца тэмай" - edit_reason: "прычына: " + quote_share: "Абагуліць" + edit_reason: "Прычына: " localizations: table: actions: "Дзеянні" edit: "Рэдагаваць" delete: "Выдаліць" errors: - upload_not_authorized: "Sorry, the file you are trying to upload is not authorized (authorized extensions: %{authorized_extensions})." + upload_not_authorized: "Файл, які вы спрабуеце загрузіць, не аўтарызаваны (аўтарызаваныя пашырэнні: %{authorized_extensions})." controls: like_action: "Падабайка" - like: "упадабаць гэты пост" + like: "упадабаць гэты допіс" edit_action: "Рэдагаваць" - flag_action: "Пазначыць" - share_action: "Падзяліцца" - more: "Болей" - admin_action: "адміністратар" + flag_action: "Паскардзіцца" + share_action: "Абагуліць" + more: "Яшчэ" + admin_action: "Адміністратар" delete_topic: "выдаліць тэму" actions: people: like: - one: "гэта спадабалася" - few: "гэта спадабалася" - many: "гэта спадабалася" - other: "гэта спадабалася" + one: "упадабаў(-ла)" + few: "упадабалі" + many: "упадабалі" + other: "упадабалі" by_you: notify_moderators: "Вы пазначылі гэта для мадэрацыі" revisions: controls: - first: "Першая рэвізія" - previous: "Папярэдняя рэвізія" - next: "Наступная рэвізія" - last: "Апошняя рэвізія" - hide: " Схаваць рэвізію" - show: "Паказаць рэвізію" + first: "Першая версія" + previous: "Папярэдняя версія" + next: "Наступная версія" + last: "Апошняя версія" + hide: "Схаваць версію" + show: "Паказаць версію" displays: inline: - title: "Адлюстраваць паведамленне з улучанымі дадаткамі і выдаленнямі." + title: "Паказаць атрыманы вынік з дададзенымі і выдаленымі элементамі ў радку" side_by_side_markdown: - title: "Паказаць непасрэдныя адрозненні побач" + title: "Паказаць адрозненні ў крыніцах побач" bookmarks: - name: "Імя" - options: "Налады" + name: "Назва" + options: "Параметры" category: - none: "(па-за катэгорыямі)" + none: "(без катэгорыі)" all: "Усе катэгорыі" - choose: "Абраць" + choose: "катэгорыя…" edit: "Рэдагаваць" - view: "Прагляд тэм па катэгорыям" + view: "Прагляд тэм у катэгорыі" general: "Агульныя" settings: "Налады" topic_template: "Шаблон" tags: "Тэгі" localization: - name: "імя" + name: "Назва" description: "Апісанне" - remove: "выдаліць" + remove: "Выдаліць" required_tag_group: delete: "Выдаліць" - create_long: "стварыць катэгорыю" - creation_error: Пры стварэнні катэгорыі адбылася памылка. - save_error: У выпадку захавання катэгорыі адбылася памылка. - description: "апісанне" - icon: "Абразка" - emoji: "Emoji" - background_color: "колер" + create_long: "Стварыць новую катэгорыю" + creation_error: Падчас стварэння катэгорыі адбылася памылка. + save_error: Падчас захавання катэгорыі адбылася памылка. + description: "Апісанне" + icon: "Значок" + emoji: "Эмодзі" + background_color: "Колер" color_validations: cant_be_empty: "не можа быць пустым" styles: - icon: "Абразка" - emoji: "Emoji" + icon: "Значок" + emoji: "Эмодзі" options: - icon: "Абразка" - emoji: "Emoji" + icon: "Значок" + emoji: "Эмодзі" color_placeholder: "Любы вэб-колер" - delete_confirm: "Вы ўпэўненыя, што жадаеце выдаліць гэтую катэгорыю?" + delete_confirm: "Вы ўпэўнены, што хочаце выдаліць гэту катэгорыю?" delete_error: "Пры выдаленні катэгорыі адбылася памылка." - already_used: "Гэты колер ўжо выкарыстоўваецца іншы катэгорыяй" + description_expand: "Паказаць больш" + description_collapse: "Паказаць менш" + already_used: "Гэты колер ужо выкарыстоўваецца іншай катэгорыяй" security: "Бяспека" permissions: group: "Група" - see: "бачыць" - reply: "Адказаць" - create: "Стварыць" - email_in: "Custom incoming email address:" - allow_badges_label: "Дазволіць ўзнагароджваць значкамі ў гэтай катэгорыі" + see: "Праглядаць" + reply: "Адказваць" + create: "Ствараць" + email_in: "Карыстальніцкі адрас уваходнай электроннай пошты:" + allow_badges_label: "Дазволіць узнагароды значкамі ў гэтай катэгорыі" review_group_name: "назва групы" - this_year: "гэтага года" + this_year: "гэты год" none_subcategory_text: "Няма" visibility: public: "Публічная" group_restricted: "Прыватная" notifications: watching: - title: "сачыць" + title: "Пад назіраннем" tracking: - title: "Сачыць" + title: "Адсочваецца" muted: - title: "ігнаруемай" + title: "Адключана" search_priority: options: - ignore: "ігнараваць" + ignore: "Ігнараваць" sort_options: - default: "тыпова" - likes: "перавагі" - views: "прагляды" - posts: "паведамленні" - activity: "актыўнасць" - category: "катэгорыя" - created: "створаны" + default: "прадвызначана" + likes: "Падабайкі" + views: "Прагляды" + posts: "Допісы" + activity: "Актыўнасць" + category: "Катэгорыя" + created: "Створана" settings_sections: general: "Агульныя" moderation: "Мадэрацыя" email: "Электронная пошта" flagging: - action: "Пазначыць запіс" + action: "Паскардзіцца на допіс" take_action_options: default: - title: "схаваць паведамленне" + title: "Схаваць допіс" suspend: - title: "прыпыніць карыстальніка" + title: "Прыпыніць карыстальніка" silence: - title: "Silence Карыстальнік" - notify_action: "паведамленне" - delete_spammer: "выдаліць спамера" + title: "Заглушыць карыстальніка" + notify_action: "Паведамленне" + delete_spammer: "Выдаліць спамера" yes_delete_spammer: "Так, выдаліць спамера" notify_moderators_textarea_label: "Паведамленне для мадэратараў" flagging_topic: - notify_action: "паведамленне" + notify_action: "Паведамленне" topic_map: - title: "Рэзюмэ запісу" - views: "прагляды" - read: счытванне + title: "Зводка тэмы" + views: "Прагляды" + read: прачытаныя topic_statuses: pinned: - title: "замацаваныя" - posts: "паведамленні" + title: "Замацаваныя" + posts: "Допісы" pending_posts: - label: "чакаецца" - original_post: "першы паведамленне" - views: "прагляды" - replies: "адказы" - activity: "актыўнасць" - likes: "перавагі" + label: "У чаканні" + original_post: "Арыгінальны допіс" + views: "Прагляды" + replies: "Адказы" + activity: "Актыўнасць" + likes: "Падабайкі" likes_lowercase: one: "падабайка" - few: "перавагі" - many: "перавагі" - other: "перавагі" + few: "падабайкі" + many: "падабаек" + other: "падабайкі" users: "Карыстальнікі" users_lowercase: one: "карыстальнік" few: "карыстальнікі" many: "карыстальнікі" - other: "карыстальнікі" + other: "карыстальніка" category_title: "Катэгорыя" categories_list: "Спіс катэгорый" filters: filter: button: - label: "Filter" + label: "Фільтр" latest: title: "Апошнія" - help: "тэмы са свежымі паведамленнямі" + help: "тэмы са свежымі допісамі" read: - title: "прачытаныя" - help: "тэмы, якія вы прачыталі ў парадку, у якім Вы іх чыталі ў апошні раз" + title: "Прачытаныя" + help: "тэмы, якія вы прачыталі, у парадку прачытання" categories: title: "Катэгорыі" title_in: "Катэгорыя - %{categoryName}" - help: "усе тэмы згрупаваныя па катэгорыях" + help: "усе тэмы, згрупаваныя па катэгорыях" unread: title: "Непрачытаныя" new: - lower_title: "новая" - title: "Новая" - all: "Усё" - topics: "тэмы" + lower_title: "новыя" + title: "Новыя" + all: "Усе" + topics: "Тэмы" replies: "Адказы" posted: - help: "тэмы, у якія Вы дапісвалі" + help: "тэмы, у якіх ёсць вашы допісы" bookmarks: - title: "закладкі" + title: "Закладкі" category: title: "%{CategoryName}" - help: "Апошнія тэмы ў катэгорыі %{categoryName}" + help: "апошнія тэмы ў катэгорыі %{categoryName}" top: - title: "Топ тэмаў" + title: "Топ тэм" all: title: "За ўвесь час" yearly: - title: "штогод" + title: "Штогод" quarterly: - title: "штоквартальна" + title: "Штоквартальна" monthly: - title: "штомесяц" + title: "Штомесяц" weekly: - title: "штотыдзень" + title: "Штотыдзень" daily: - title: "штодня" + title: "Штодня" all_time: "За ўвесь час" - this_year: "год" - this_quarter: "квартал" - this_month: "месяц" - this_week: "тыдзень" - today: "Today" + this_year: "Год" + this_quarter: "Квартал" + this_month: "Месяц" + this_week: "Тыдзень" + today: "Сёння" permission_types: - full: "ствараць" - create_post: "адказваць" - readonly: "бачыць" - preloader_text: "загрузка" + full: "Ствараць / Адказваць /Праглядаць" + create_post: "Адказваць / Праглядаць" + readonly: "Праглядаць" + preloader_text: "Загрузка" lightbox: - download: "спампаваць" + download: "Спампаваць" keyboard_shortcuts_help: title: "Спалучэнні клавіш" jump_to: - title: "на" + title: "Перайсці да" top: "%{shortcut} Топ" navigation: - title: "рух" - open: " o <" + title: "Навігацыя" + open: "%{shortcut} Адкрыць выбраную тэму" application: - title: "дадатак" - notifications: "%{shortcut}Адкрытыя абвесткі " - log_out: "%{shortcut}Выйсці" + title: "Праграма" + notifications: "%{shortcut} Адкрыць апавяшчэнні" + log_out: "%{shortcut} Выйсці" actions: - title: "дзеянні" - share_post: " s <" - reply_post: " r <" - quote_post: " q <" - like: " l <" - flag: "! <" - bookmark: " b <" - edit: " e <" - delete: " d <" - mark_muted: "%{shortcut}Прыглушыць тэму" - mark_tracking: "%{shortcut}Сачыць за тэмай" + title: "Дзеянні" + share_post: "%{shortcut} Абагуліць допіс" + reply_post: "%{shortcut} Адказаць на допіс" + quote_post: "%{shortcut} Працытаваць допіс" + like: "%{shortcut} Упадабаць допіс" + flag: "%{shortcut} Паскардзіцца на допіс" + bookmark: "%{shortcut} Дадаць допіс у закладкі" + edit: "%{shortcut} Рэдагаваць допіс" + delete: "%{shortcut} Выдаліць допіс" + mark_muted: "%{shortcut} Адключыць апавяшчэнні тэмы" + mark_tracking: "%{shortcut} Адсочваць тэму" admin: - title: "адміністратар" + title: "Адміністратар" badges: - title: значкі - select_badge_for_title: Выберыце значок, будзе вашым званнем + title: Значкі + select_badge_for_title: Выберыце значок, які будзе вашым тытулам badge_grouping: community: - name: супольнасць + name: Супольнасць trust_level: - name: ўзровень даверу + name: Узровень даверу other: - name: іншае + name: Іншае posting: - name: апублікаванне + name: Допісы download_calendar: - download: "спампаваць" + download: "Спампаваць" tagging: selector_tags: "тэгі" - selector_remove_filter: "прыбраць фільтр" - tags: "тэгі" + selector_remove_filter: "выдаліць фільтр" + tags: "Тэгі" choose_for_topic: "дадатковыя тэгі" - add_synonyms: "дадаць" + add_synonyms: "Дадаць" description: "Апісанне" settings: title: "Налады" general: "Агульныя" back: "Назад" - name: "Імя" + name: "Назва" localization: - name: "Імя" + name: "Назва" description: "Апісанне" sort_by: "Сартаваць па:" - sort_by_count: "падлічваць" - sort_by_name: "Імя" - bulk_create_button: "стварыць" + sort_by_count: "колькасці" + sort_by_name: "назве" + bulk_create_button: "Стварыць" notifications: watching: - title: "Сачыць" + title: "Пад назіраннем" tracking: - title: "Сачыць" + title: "Адсочваюцца" muted: - title: "ігнараваць" + title: "Без апавяшчэнняў" groups: - name_placeholder: "Імя" + name_placeholder: "Назва" save: "Захаваць" - delete: "выдаліць" + delete: "Выдаліць" topics: none: unread: "У вас няма непрачытаных тэм." new: "У вас няма новых тэм." read: "Вы яшчэ не прачыталі ніводнай тэмы." posted: "Вы яшчэ не дапісвалі ў адну тэму." - bookmarks: "У вас пакуль няма тэмаў у закладках." - top: "There are no top topics." + bookmarks: "У вас пакуль няма тэм у закладках." + top: "Няма топ-тэм." footer_nav: back: "Назад" - share: "Падзяліцца" + share: "Абагуліць" trust_levels: names: newuser: "новы карыстальнік" basic: "асноўны карыстальнік" member: "член" regular: "рэгулярны" - leader: "лідэр" + leader: "лідар" sidebar: - more: "Больш" + more: "Яшчэ" all_categories: "Усе катэгорыі" edit_navigation_modal_form: filter_dropdown: all: "Усё" sections: custom: - save: "захаваць" - delete: "выдаляць" + save: "Захаваць" + delete: "Выдаліць" links: - add: "Дадаць іншую спасылку" + add: "Дадаць яшчэ адну спасылку" delete: "Выдаліць спасылку" icon: - label: "Абразка" + label: "Значок" name: - label: "імя" + label: "Назва" validation: - blank: "Імя не можа быць пустым" + blank: "Назва не можа быць пустой" value: label: "Спасылка" validation: blank: "Спасылка не можа быць пустой" title: validation: - blank: "Загаловак ня можа быць пустым" + blank: "Загаловак не можа быць пустым" about: - header_link_text: "Аб тэме" + header_link_text: "Пра сайт" messages: header_link_text: "Паведамленні" links: - inbox: "ўваходныя" - sent: "адпраўлена" - new: "Новая" + inbox: "Уваходныя" + sent: "Адпраўленыя" + new: "Новыя" unread: "Непрачытаныя" - archive: "архіў" + archive: "Архіў" tags: - header_link_text: "тэгі" + header_link_text: "Тэгі" categories: - header_link_text: "катэгорыі" + header_link_text: "Катэгорыі" community: edit_section: - header_dropdown: "Кастамізаваць" + header_dropdown: "Дапасаваць" links: about: - content: "Аб тэме" + content: "Пра сайт" admin: - content: "адміністратар" + content: "Адміністратар" badges: - content: "значкі" + content: "Значкі" filter: - content: "Filter" + content: "Фільтр" topics: - content: "тэмы" + content: "Тэмы" faq: - content: "Пытанні і адказы" + content: "Частыя пытанні" guidelines: - content: "інструкцыі" + content: "Рэкамендацыі" groups: content: "Групы" users: - content: "карыстальнікаў" + content: "Карыстальнікі" review: - content: "Патрабуе перагляду" + content: "Разгляд" search: "Пошук" footer: interface_color_selector: - light: "святло" - dark: "цёмна" + light: "Светлая" + dark: "Цёмная" form_templates: upload_field: upload: "Запампаваць" - uploading: "загрузка" + uploading: "Запампоўванне" errors: type_mismatch: - default: "Калі ласка, увядзіце карэктнае значэнне." - email: "Калі ласка, увядзіце верны email." + default: "Увядзіце правільнае значэнне." + email: "Увядзіце правільны адрас электроннай пошты." table_builder: edit: modal: - cancel: "адмена" - create: "захаваць" - reason: "чаму Вы рэдагуеце паведамленне?" + cancel: "скасаваць" + create: "Захаваць" + reason: "чаму вы рэдагуеце допіс?" spreadsheet: - about: "Аб тэме" + about: "Пра сайт" filter: description: - yesterday: "учора" + yesterday: "Учора" discovery: headings: categories: "Усе катэгорыі" @@ -1988,64 +1988,62 @@ be: never: "ніколі" reports: sidebar_title: "Справаздачы" - group_traffic: "трафік" + group_traffic: "Трафік" group_members: "Члены" - group_moderation: "Мадэрацыя" - group_security: "Бяспека" group_other: "Іншае" config_sections: account: - title: "Аккаўнт" + title: "Уліковы запіс" reports: title: "Справаздачы" community: - title: "супольнасць" + title: "Супольнасць" email: title: "Электронная пошта" security: title: "Бяспека" plugins: - title: "Плагіны" + title: "Убудовы" upcoming_changes: - name: "Імя" - preview: "Папярэдні прагляд" + name: "Назва" + preview: "Перадпрагляд" enabled_for_options: - everyone: "усе" + everyone: "Усе" impact_roles: - admins: "адміністратары" + admins: "Адміністратары" moderators: "Мадэратары" - staff: "персанал" + staff: "Персанал" filter: all: "Усе" disabled: "Адключана" impact_type_other: "Іншае" - impact_role_admins: "адміністратары" + impact_role_admins: "Адміністратары" impact_role_moderators: "Мадэратары" - impact_role_staff: "персанал" + impact_role_staff: "Персанал" config: developer: - title: "для распрацоўшчыкаў" + title: "Распрацоўшчык" emojis: - title: "Emoji" + title: "Эмодзі" flags: title: "Мадэрацыя" files: - title: "файлы" + title: "Файлы" legal: - title: "Legal" + title: "Юрыдычная інфармацыя" login: sub_pages: common_settings: title: "Налады" logo: form: - mobile: "Мабільны" + mobile: "Мабільная" email: "Электронная пошта" opengraph_image: - description: "Па змаўчанні адкрытага графіка малюнка выкарыстоўваецца, калі старонка не мае іншае падыходнае малюнка. Калі пакінуць пустым, то будзе выкарыстоўвацца вялікі значок." + description: "Прадвызначаны відарыс OpenGraph, які выкарыстоўваецца, калі на старонцы няма іншага адпаведнага відарыса. Калі пакінуць пустым, будзе выкарыстоўвацца large_icon." fonts: backfill_modal: - modal_yes: "ды" + modal_yes: "Так" welcome_banner: form: location: @@ -2053,11 +2051,11 @@ be: header_logged_in: placeholder: "З вяртаннем, %{preferred_display_name}!" header_anonymous: - placeholder: "Вітае на %{site_name}!" + placeholder: "Вітаем на %{site_name}!" navigation: - title: "рух" + title: "Навігацыя" notifications: - title: "Натыфікацыі" + title: "Апавяшчэнні" search_everything: title: "Пошук" security: @@ -2065,77 +2063,77 @@ be: spam: title: "Спам" dashboard: - title: "Галоўная панэль" + title: "Панэль кіравання" users: - title: "карыстальнікаў" + title: "Карыстальнікі" groups: - title: "групы" + title: "Групы" backups: - title: "Бэкапы" + title: "Рэзервовыя копіі" sub_pages: logs: - title: "Логі" + title: "Журналы" reports: title: "Справаздачы" sub_pages: settings: title: "Налады" badges: - title: "значкі" + title: "Значкі" permalinks: - title: "Сталыя спасылкі" + title: "Пастаянныя спасылкі" emoji: - title: "Emoji" + title: "Эмодзі" email: sub_pages: templates: - title: "шаблоны" + title: "Шаблоны" email_logs: sub_pages: sent: - title: "Sent" + title: "Адпраўлена" skipped: - title: "Skipped" + title: "Прапушчана" received: title: "Атрымана" rejected: - title: "адхілена" + title: "Адхілена" staff_action_logs: sub_pages: screened_emails: - header_description: "Калі хто-то спрабуе стварыць новы ўліковы запіс, наступныя электронныя скрыні будуць правераны і рэгістрацыю заблакаваны, ці прынятыя нейкія іншых дзеянняў" + header_description: "Калі хтосьці паспрабуе стварыць новы ўліковы запіс, будуць правераны наступныя адрасы электроннай пошты, і рэгістрацыя будзе заблакіравана, або будуць выкананы іншыя дзеянні." screened_ips: - title: "Screened IPs" + title: "Правераныя IP-адрасы" screened_urls: - title: "Screened URLs" - header_description: "Пералічаныя тут вэб-адрасы выкарыстоўваліся ў паведамленнях карыстальнікаў, якія былі ідэнтыфікаваныя як спамераў" + title: "Правераныя URL-адрасы" + header_description: "Пералічаныя тут URL-адрасы выкарыстоўваліся ў паведамленнях карыстальнікамі, якія былі вызначаны як спамеры" embedding: - title: "узаемадзеянне" + title: "Убудоўванне" theme_site_settings: - default_value: "Default" + default_value: "Прадвызначаная" search: title: "Пошук" dashboard: - title: "Галоўная панэль" - last_updated: "Адноўлена:" - version: "версія" + title: "Панэль кіравання" + last_updated: "Панэль кіравання абноўлена:" + version: "Версія" up_to_date: "У вас апошняя версія!" - critical_available: "Даступнае крытычнае абнаўленне." - updates_available: "Даступных абнаўленняў." - no_check_performed: "Не выканана праверку на наяўнасць абнаўленняў. Праверце, працуе sidekiq." - stale_data: "У апошні час не ажыццяўлялася праверак на наяўнасць абнаўленняў. Праверце, працуе sidekiq." - installed_version: "устаноўленая" - latest_version: "апошняя" + critical_available: "Даступна крытычнае абнаўленне." + updates_available: "Даступны абнаўленні." + no_check_performed: "Праверка абнаўленняў не была выканана. Пераканайцеся, што Sidekiq працуе." + stale_data: "Праверка абнаўленняў не праводзілася апошнім часам. Пераканайцеся, што Sidekiq працуе." + installed_version: "Усталяваная" + latest_version: "Апошняя" new_features: - learn_more: "Даведацца больш ..." - last_checked: "апошняя праверка" - refresh_problems: "абнавіць" - no_problems: "Не выяўлена ніякіх праблем." - moderators: "мадэратары:" - admins: "адміністратары:" - silenced: "глушыцелем:" - suspended: "прыпыненыя:" - private_messages_short: "Пвдмл" + learn_more: "Даведацца больш..." + last_checked: "Апошняя праверка" + refresh_problems: "Абнавіць" + no_problems: "Праблем не выяўлена." + moderators: "Мадэратары:" + admins: "Адміністратары:" + silenced: "Заглушаныя:" + suspended: "Прыпыненыя:" + private_messages_short: "Павед." private_messages_title: "Паведамленні" mobile_title: "Мабільны" uploads: "Загрузкі" @@ -2158,6 +2156,7 @@ be: 7_days_ago: "7 дзён таму" 30_days_ago: "30 дзён таму" all: "Усё" + refresh_report: "Абнавіць" daily: штодня monthly: штомесяц weekly: штотыдзень diff --git a/config/locales/client.bg.yml b/config/locales/client.bg.yml index 2b1aedf80aeed..2a1a86f166ddd 100644 --- a/config/locales/client.bg.yml +++ b/config/locales/client.bg.yml @@ -1274,6 +1274,8 @@ bg: tags: "Етикети" interface: "Интерфейс" apps: "Апликации" + calendar_subscriptions: + copied: "Копирано!" change_password: success: "(имейлът е изпратен)" in_progress: "(изпраща се имейл)" @@ -1768,6 +1770,7 @@ bg: form_kit: reset: Нулиране optional: по избор + required: задължително errors: required: "Задъжителни" close: "Затвори" @@ -2359,8 +2362,6 @@ bg: bulk: select_all: "Селектирай всички" clear_all: "Изчисти всички" - unlist_topics: "Непоказани теми" - delete: "Изтрий темите" delete_topics_count: one: "Изтрий темата" other: "Изтрий темите" @@ -2372,17 +2373,9 @@ bg: dismiss_new: "Премахни новите " toggle: "Включв./Изкл. избор на няколко теми" actions: "Групови действия " - close_topics: "Затвори темите" - archive_topics: "Архивирай темите" move_messages_to_inbox: "Премести във входящи" choose_new_category: "Избери нова категория за тези теми:" - selected: - one: "Вие сте избрали %{count} тема." - other: "Вие сте избрали %{count} теми." - change_tags: "Замени етикетите" - append_tags: "Добави етикетите" choose_new_tags: "Избери нови етикети за тези теми:" - choose_append_tags: "Избери нови етикети, които да се добавят към тези теми:" changed_tags: "Етикетите на тези теми бяха сменени." error_topic_count: one: "%{count} тема" @@ -2406,8 +2399,6 @@ bg: name: "Архив" move_messages_to_inbox: name: "Премести във входящи" - append_tags: - name: "Добави етикетите" replace_tags: name: "Замени етикетите" delete_topics: @@ -2939,6 +2930,8 @@ bg: delete_confirm: "Сигурни ли сте, че искате да изтриете тази категория? " delete_error: "Възникна грешка по време на изтриването на категорията. " no_description: "Моля, добавете описание за тази категория. " + description_expand: "Покажи повече" + description_collapse: "Покажи по-малко" already_used: "Този цвят вече е използван за друга категория. " security: "Сигурност" permissions: @@ -3438,7 +3431,6 @@ bg: reports: group_traffic: "Трафик" group_members: "Членове" - group_security: "Сигурност" group_other: "Други" config_sections: account: @@ -3601,7 +3593,7 @@ bg: 30_days_ago: "Преди 30 дни" all: "Всички" view_table: "таблица" - refresh_report: "Обнови доклада" + refresh_report: "Обнови" daily: Дневно monthly: Месечно weekly: Седмично diff --git a/config/locales/client.bs_BA.yml b/config/locales/client.bs_BA.yml index 7ca93b92d3b9c..afd1124cd1c8d 100644 --- a/config/locales/client.bs_BA.yml +++ b/config/locales/client.bs_BA.yml @@ -1078,6 +1078,8 @@ bs_BA: tags: "Oznake" interface: "Sučelje" apps: "Aplikacije" + calendar_subscriptions: + copied: "Kopirano!" change_password: success: "(email poslat)" in_progress: "(šaljem email)" @@ -1466,6 +1468,7 @@ bs_BA: form_kit: reset: Resetovati optional: opciono + required: required errors: required: "Required" close: "Zatvori" @@ -1950,9 +1953,6 @@ bs_BA: bulk: select_all: "Označi sve" clear_all: "Očisti sve" - unlist_topics: "Skini teme sa liste" - relist_topics: "Listaj teme" - delete: "Obriši teme" delete_topics_count: one: "Obriši temu" few: "Obriši teme" @@ -1965,18 +1965,9 @@ bs_BA: dismiss_new: "Odpusti Nove" toggle: "preklopi masovno označavanje tema" actions: "Masovno odrađene akcije" - close_topics: "Zatvori teme" - archive_topics: "Arhiviraj teme" move_messages_to_inbox: "Idi u inbox" choose_new_category: "Izaberi novu kategoriju za temu:" - selected: - one: "Označili ste %{count} temu." - few: "Označili ste %{count} teme." - other: "Označili ste %{count} teme." - change_tags: "Zamijeni oznake" - append_tags: "Pripoji oznake" choose_new_tags: "Odaberi nove tagove za ove teme:" - choose_append_tags: "Odaberi nove oznake kako bi pripojili ovim temama:" changed_tags: "Tagovi ovih tema su izmijenjeni." error_topic_count: one: "%{count} tema" @@ -2000,8 +1991,6 @@ bs_BA: name: "Arhiva" move_messages_to_inbox: name: "Premjesti u Sanduče" - append_tags: - name: "Pripoji oznake" replace_tags: name: "Zamijeni oznake" delete_topics: @@ -3161,8 +3150,6 @@ bs_BA: sidebar_title: "Izvještaji" group_traffic: "Promet" group_members: "Članovi" - group_moderation: "Moderacija" - group_security: "Security" group_other: "Other" config_sections: account: @@ -3371,7 +3358,7 @@ bs_BA: all: "All" view_table: "View as Table" view_graph: "graph" - refresh_report: "Refresh Report" + refresh_report: "Refresh" daily: Dnevno monthly: Mesečno weekly: Sedmično diff --git a/config/locales/client.ca.yml b/config/locales/client.ca.yml index 1103683f9e8a5..c2309c4290ba5 100644 --- a/config/locales/client.ca.yml +++ b/config/locales/client.ca.yml @@ -1102,6 +1102,8 @@ ca: tags: "Etiquetes" interface: "Interfície" apps: "Aplicacions" + calendar_subscriptions: + copied: "Copiat!" change_password: success: "(correu electrònic enviat)" in_progress: "(enviant correu electrònic)" @@ -1468,6 +1470,7 @@ ca: form_kit: reset: Restableix optional: opcional + required: necessari errors: required: "Necessari" close: "Tanca" @@ -1947,9 +1950,6 @@ ca: confirm: "Confirma" select_all: "Selecciona-ho tot" clear_all: "Neteja-ho tot" - unlist_topics: "Fes temes invisibles" - relist_topics: "Torna a llistar els temes" - delete: "Suprimeix temes" delete_topics_count: one: "Suprimeix tema" other: "Suprimeix temes" @@ -1961,17 +1961,9 @@ ca: dismiss_new: "Descarta'n els nous" toggle: "commuta la selecció massiva de temes" actions: "Accions massives" - close_topics: "Tanca temes" - archive_topics: "Arxiva temes" move_messages_to_inbox: "Mou a la safata d'entrada" choose_new_category: "Seleccioneu la categoria nova per als temes:" - selected: - one: "He seleccionat %{count} tema." - other: "Heu seleccionat %{count} temes." - change_tags: "Reemplaça etiquetes" - append_tags: "Annexa etiquetes" choose_new_tags: "Trieu noves etiquetes per a aquests temes:" - choose_append_tags: "Trieu noves etiquetes a afegir per a aquests temes:" changed_tags: "Les etiquetes d'aquests temes han estat canviades." error_topic_count: one: "%{count} tema" @@ -1994,8 +1986,6 @@ ca: name: "Arxiva" move_messages_to_inbox: name: "Mou a la safata d'entrada" - append_tags: - name: "Annexa etiquetes" replace_tags: name: "Reemplaça etiquetes" delete_topics: @@ -3071,8 +3061,6 @@ ca: sidebar_title: "Reports" group_traffic: "Tràfic" group_members: "Membres" - group_moderation: "Moderació" - group_security: "Seguretat" group_other: "Altres" config_sections: account: @@ -3283,7 +3271,7 @@ ca: all: "Tot" view_table: "taula" view_graph: "gràfica" - refresh_report: "Actualitza el report" + refresh_report: "Actualitza" daily: Diàriament monthly: Mensualment weekly: Setmanalment diff --git a/config/locales/client.cs.yml b/config/locales/client.cs.yml index 1e93d71559b5a..eafb8184f5c2e 100644 --- a/config/locales/client.cs.yml +++ b/config/locales/client.cs.yml @@ -1935,6 +1935,10 @@ cs: apps: "Aplikace" navigation_menu: "Navigační nabídka" upcoming_changes: "Nadcházející změny" + calendar_subscriptions: "Kalendář" + calendar_subscriptions: + copied: "Zkopírováno!" + add_to_google: "Kalendář Google" change_password: success: "(email odeslán)" in_progress: "(odesílám)" @@ -2579,6 +2583,7 @@ cs: form_kit: reset: obnovit výchozí optional: volitelné + required: required dirty_form: "Neodeslali jste změny! Opravdu chcete odejít?" errors: starts_with: "Musí začínat na %{prefix}" @@ -3445,8 +3450,6 @@ cs: votes_released: "hlas byly uvolněn" new_features: "byly vydány nové funkce Discourse" admin_problems: "na administrační nástěnce vašeho webu jsou nová doporučení" - upcoming_change_available: "nová nadcházející změna '%{changeName}' je k dispozici" - upcoming_change_automatically_promoted: "nadcházející změna '%{changeName}' byla automaticky povolena" upload_selector: change: "Změnit" delete: "Smazat" @@ -3664,11 +3667,8 @@ cs: confirm: "Potvrdit" select_all: "Vybrat vše" clear_all: "Zrušit vše" - unlist_topics: "Skrýt témata" - relist_topics: "Zrušit skrytí témat" reset_bump_dates: "Resetovat data pošťouchnutí" defer: "Označit jako nepřečtené" - delete: "Smazat témata" delete_topics_count: one: "Odstranit téma" few: "Smazat témata" @@ -3723,19 +3723,10 @@ cs: other: "Skrýt %{count} nových" toggle: "hromadný výběr témat" actions: "Hromadné akce" - change_category: "Nastavit kategorii…" - close_topics: "Zavřít téma" - archive_topics: "Archivovat témata" move_messages_to_inbox: "Přesunout do doručených" archive_messages: "Přesunout do archivu" - notification_level: "Oznámení…" change_notification_level: "Změnit úroveň upozornění" choose_new_category: "Zvolte novou kategorii pro témata:" - selected: - one: "Vybrali jste %{count} téma." - few: "Vybrali jste %{count} témata." - many: "Vybrali jste %{count} témat." - other: "Vybrali jste %{count} témat." selected_sole_category: one: "Vybrali jste %{count} téma z kategorie:" few: "Vybrali jste %{count} témata z kategorie:" @@ -3746,12 +3737,8 @@ cs: few: "%{count} vybraná" many: "%{count} vybraných" other: "%{count} vybraných" - change_tags: "Zaměnit štítky" - append_tags: "Přidat štítky" choose_new_tags: "Zvolte nové štítky pro tato témata:" - choose_append_tags: "Zvolte nové štítky, které chcete přidat k těmto tématům:" changed_tags: "Štítky těchto témat byly změněny." - remove_tags: "Odebrat všechny štítky" confirm_remove_tags: one: "Všechny štítky budou z tohoto tématu odstraněny. Jsi si jisti?" few: "Všechny štítky budou z těchto %{count} témat odstraněny. Jste si jisti?" @@ -3762,7 +3749,7 @@ cs: few: "Průběh: %{count} témata" many: "Průběh: %{count} témat" other: "Průběh: %{count} témat" - notify: "Upozornit uživatele na tuto změnu." + notify: "Upozornit uživatele na tuto změnu" performing: "Provádíme hromadné operace, vyčkejte prosím…" completed: "Hromadné operace byly úspěšně dokončeny!" error_topic_count: @@ -3793,7 +3780,6 @@ cs: name: "Označit jako přečtené" close_topics: name: "Zavřít" - note: "Poznámka" optional: (volitelné) archive_topics: name: "Archivovat" @@ -3807,24 +3793,18 @@ cs: name: "Zrušit skrytí" remove_tags: name: "Odebrat štítky" - append_tags: - name: "Přidat štítky" replace_tags: name: "Zaměnit štítky" delete_topics: name: "Smazat" update_category: name: "Aktualizovat kategorii" - description: "Zvolte novou kategorii pro vybraná témata" reset_bump_dates: name: "Resetovat data pošťouchnutí" - description: "Resetujte datum pošťouchnutí tématu na datum posledního vytvořeného příspěvku, což ovlivní řazení v seznamu témat" defer: name: "Označit jako nepřečtené" - description: "Označit témata jako nepřečtená" update_notifications: name: "Aktualizovat upozornění" - description: "Změňte úroveň oznámení na Hlídané, Sledované, Normální nebo Ztišené" topic: filter_to: one: "%{count} příspěvek v tématu" @@ -4721,6 +4701,8 @@ cs: delete: "Smazat kategorii" create: "Přidat kategorii" create_long: "Vytvořit novou kategorii" + type_settings_schema: + site_settings: "Nastavení webu" save: "Uložit kategorii" unsaved_changes: "Máte neuložené změny" slug: "URL kategorie" @@ -4768,6 +4750,8 @@ cs: list: "Přehled kategorií" no_description: "Doplňte prosím popis této kategorie." change_in_category_topic: "Úprava popisu" + description_expand: "Zobrazit více" + description_collapse: "Zobrazit méně" already_used: "Tato barva je již použita jinou kategorií" color_palette: "Barevná paleta" security: "Zabezpečení" @@ -6004,8 +5988,6 @@ cs: back: "Zpět na všechny sestavy" group_traffic: "Provoz" group_members: "Členové" - group_moderation: "Moderování" - group_security: "Zabezpečení" group_other: "Ostatní" config_sections: account: @@ -6599,7 +6581,7 @@ cs: all: "Celkem" view_table: "tabulka" view_graph: "graf" - refresh_report: "Aktualizovat data" + refresh_report: "Aktualizovat" daily: Denně monthly: Měsíčně weekly: Týdně @@ -8796,7 +8778,7 @@ cs: min_admin_password_length: prompt: "Chystáte se změnit zásady používání hesel. To se od nynějška dotkne všech správců, kteří si mění svá hesla. Jste si jisti, že chcete pokračovat?" confirm: "Ano, aktualizovat zásady hesel" - password_unique_charactes: + password_unique_characters: prompt: "Chystáte se změnit zásady používání hesel. To se od nynějška dotkne všech uživatelů, kteří si mění svá hesla. Jste si jisti, že chcete pokračovat?" confirm: "Ano, aktualizovat zásady hesel" block_common_passwords: diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml index 3706eb4ef69fe..a1fbbf2db95fd 100644 --- a/config/locales/client.da.yml +++ b/config/locales/client.da.yml @@ -1488,6 +1488,9 @@ da: tags: "Tags" interface: "Grænseflade" apps: "Apps" + calendar_subscriptions: + copied: "Kopieret!" + add_to_google: "Google Kalender" change_password: success: "(e-mail sendt)" in_progress: "(sender e-mail)" @@ -2014,6 +2017,7 @@ da: form_kit: reset: Nulstil optional: valgfri + required: krævet errors: required: "Obligatoriske" invalid_url: "Skal være en gyldig URL" @@ -2742,11 +2746,8 @@ da: confirm: "Bekræft" select_all: "Vælg alle" clear_all: "Ryd alle" - unlist_topics: "Fjern emner fra liste" - relist_topics: "Genindlæs emner" reset_bump_dates: "Nulstil bump datoer" defer: "Markér som ulæst" - delete: "Slet emner" delete_topics_count: one: "Slet emne" other: "Slet emner" @@ -2758,29 +2759,20 @@ da: dismiss_new: "Afvis nye" toggle: "vælg flere emner af gangen" actions: "Handlinger på flere indlæg" - change_category: "Indstil kategori…" - close_topics: "Luk indlæg" - archive_topics: "Arkiver Emner" move_messages_to_inbox: "Flyt til indbakke" archive_messages: "Flyt til arkiv" - notification_level: "Notifikationer…" change_notification_level: "Skift Notifikationsniveau" choose_new_category: "Vælg den nye kategori for emnerne:" - selected: - one: "Du har valgt %{count} indlæg." - other: "Du har valgt %{count} indlæg." selected_sole_category: one: "Du har valgt %{count} emne fra kategorien:" other: "Du har valgt %{count} emner fra kategorien:" selected_count: one: "%{count} valgt" other: "%{count} valgt" - change_tags: "Erstat tags" - append_tags: "Tilføj tags" + append_tags: "Tilføj mærker" choose_new_tags: "Vælg nye tags for dette emne" - choose_append_tags: "Vælg nye tags til at tilføje emnet:" + choose_append_tags: "Tilføj mærker" changed_tags: "Tags for dette emne blev ændret" - remove_tags: "Fjern alle tags" confirm_remove_tags: one: "Alle mærker fjernes fra dette emne. Er du sikker?" other: "Alle tags fjernes fra %{count} emner. Er du sikker?" @@ -2806,7 +2798,6 @@ da: name: "Ignorer Alle" close_topics: name: "Luk" - note: "Note" optional: (valgfri) archive_topics: name: "Arkiv" @@ -2816,8 +2807,6 @@ da: name: "Flyt til indbakke" remove_tags: name: "Fjern tags" - append_tags: - name: "Tilføj tags" replace_tags: name: "Erstat tags" delete_topics: @@ -3505,6 +3494,8 @@ da: delete_error: "Der opstod en fejl under sletningen af kategorien." no_description: "Der er ingen beskrivelse for denne kategori." change_in_category_topic: "Rediger beskrivelse" + description_expand: "Vis mere" + description_collapse: "Vis mindre" already_used: "Denne farve er blevet brugt af en anden kategori" security: "Sikkerhed" security_add_group: "Tilføj en gruppe" @@ -4344,8 +4335,6 @@ da: back: "Tilbage til alle rapporter" group_traffic: "Trafik" group_members: "Brugere" - group_moderation: "Moderation" - group_security: "Sikkerhed" group_other: "Andre" config_sections: account: @@ -4635,7 +4624,7 @@ da: all: "Alle" view_table: "tabel" view_graph: "graf" - refresh_report: "Genopfrisk rapporten" + refresh_report: "Genindlæs" daily: Dagligt monthly: Månedligt weekly: Ugentligt @@ -6181,7 +6170,7 @@ da: confirm: "Ja, opdater adgangskodepolitik" min_admin_password_length: confirm: "Ja, opdater adgangskodepolitik" - password_unique_charactes: + password_unique_characters: confirm: "Ja, opdater adgangskodepolitik" job_status: completed: "Opdatering fuldført" diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml index 1867172b8dd2e..b713065df0b0c 100644 --- a/config/locales/client.de.yml +++ b/config/locales/client.de.yml @@ -9,9 +9,19 @@ de: blocks: ghost: status: "Status" + conditions: "Bedingungen" + arguments: "Argumente" + container_args: "Container-Argumente" in_location: "in" - hidden: "versteckt" + hidden: "ausgeblendet" + not_registered: "nicht registriert" + no_visible_children: "keine sichtbaren untergeordneten Elemente" failed: "fehlgeschlagen" + ghost_reasons: + optional_missing_hint: "Dieser optionale Block wird nicht gerendert, da er nicht registriert ist." + no_visible_children_hint: "Dieser Containerblock wird nicht gerendert, da keines seiner untergeordneten Elemente sichtbar ist." + condition_failed_hint: "Dieser Block wird nicht gerendert, da seine Bedingungen nicht erfüllt sind." + head_hidden_tail_hint: "Dieser Block wird nicht gerendert, weil ein anderer Block im `head`-Container zuerst gerendert wurde." carousel: go_to_slide: "Gehe zu Folie %{index}" previous: "Vorherige Folie" @@ -329,6 +339,8 @@ de: broken_page_change_alert: "Ein onPageChange-Handler hat einen Fehler ausgelöst. Überprüfe die Entwicklerwerkzeuge des Browsers für weitere Informationen." broken_plugin_alert: "Verursacht durch das Plug-in „%{name}“" broken_transformer_alert: "Es ist ein Fehler aufgetreten. Deine Website funktioniert möglicherweise nicht richtig." + broken_block_alert: "Es wurde ein Fehler in der Blockkonfiguration festgestellt. Überprüfe die Browserkonsole für Details." + broken_block_factory_alert: "Ein Block konnte nicht geladen werden. Einige UI-Elemente werden möglicherweise nicht richtig angezeigt." critical_deprecation: notice: "[Admin-Hinweis] %{source} enthält Code, der aktualisiert werden muss. (ID:%{id})" learn_more_link: "(mehr erfahren)" @@ -336,6 +348,17 @@ de: plugin_source: "Plug-in '%{name}'" unknown_source: "Eines deiner Themes oder Plug-ins" dev_tools: + drag_to_move: "Ziehe zum Verschieben" + toggle_plugin_outlet_debug: "Debugging des Plug-in-Outlets umschalten" + toggle_block_debug: "Block-Debugging umschalten" + block_debug: + outlet_boundaries: "Outlet-Grenzen" + visual_overlay: "Visuelles Overlay" + ghost_blocks: "Geisterblöcke" + condition_debugging: "Debugging der Bedingungen" + toggle_safe_mode: "Abgesicherten Modus umschalten" + toggle_verbose_localization: "Erweiterte Lokalisierungshinweise umschalten" + toggle_mobile_view: "Mobile Ansicht umschalten" disable_dev_tools: "Entwicklertools deaktivieren" s3: regions: @@ -430,13 +453,18 @@ de: skipped: "Die Checkliste für das Onboarding von Administratoren wurde übersprungen. Um sie wieder zu aktivieren, suche in den Website-Einstellungen nach „enable site owner onboarding“." congrats_onboarding_complete: "Herzlichen Glückwunsch zum Abschluss des Onboarding-Prozesses!" invite_collaborators: - title: "Mitstreiter einladen" + title: "Mitwirkende einladen" description: "Die ersten Mitglieder tragen dazu bei, deine Community zum Leben zu erwecken" action: "Einladung erstellen" start_posting: title: "Beginne mit dem Erstellen von Beiträgen" description: "Gib den Leuten etwas, worüber sie gemeinsam reden können" action: "Fragen zum Einstieg" + choose_option: "Wie möchtest du anfangen?" + predefined_topics: "Vorlagen für Fragen zum Einstieg" + predefined_topics_subtitle: "Gib neuen Mitgliedern etwas, worüber sie reden können. Wähle eine Vorlage zum Bearbeiten und gestalte sie nach deinen Vorstellungen." + predefined_topics_description: "Wähle aus einer Sammlung von Gesprächsanregungen, um Diskussionen in Gang zu bringen" + use_predefined: "Vorlagen ansehen" back: "Zurück" icebreakers: fun_facts: @@ -943,7 +971,7 @@ de: approved_by: "Genehmigt von %{username} · %{relativeDate}" rejected_by: "Abgelehnt von %{username} · %{relativeDate}" ignored_by: "Ignoriert von %{username} · %{relativeDate}" - view_conversation: "PM anzeigen" + view_conversation: "PN anzeigen" note_added: "Moderator-Notiz" note_added_by: "Moderator-Notiz von %{username} · %{relativeDate}" no_events: "Keine Zeitleistenereignisse zum Anzeigen" @@ -1783,6 +1811,23 @@ de: apps: "Apps" navigation_menu: "Navigationsmenü" upcoming_changes: "Bevorstehende Änderungen" + calendar_subscriptions: "Kalender" + calendar_subscriptions: + description: "Generiere Abonnement-URLs für die Synchronisierung mit deiner bevorzugten Kalender-App (Google Calendar, Apple Calendar, Outlook, etc.). Bei diesen URLs handelt es sich um private Links zu Kalenderereignissen für dein Konto (Lesezeichen-Erinnerungen, Kalenderereignisse, etc.). Du kannst die generierten Abonnement-URLs jederzeit widerrufen oder erneuern. " + generate: "Abonnement-URLs generieren" + regenerate: "URLs neu generieren" + regenerate_confirm: "Dadurch werden deine bestehenden Kalender-Abonnement-URLs ungültig. Alle Kalender-Apps, die die alten URLs verwenden, werden keine Updates mehr erhalten. Fortfahren?" + revoke: "Abonnement widerrufen" + revoke_confirm: "Dadurch werden deine Kalender-Abonnement-URLs widerrufen. Alle Kalender-Apps, die diese URLs verwenden, erhalten keine Updates mehr. Fortfahren?" + urls_warning: "Die Abonnement-URLs sind fertig! Klicke auf die Schaltflächen unten, um sie mit deiner Kalender-App zu verknüpfen. Hinweis: Diese URLs werden nur einmal angezeigt." + bookmarks: "Lesezeichen-Erinnerungen" + bookmarks_description: "Deine Lesezeichen mit Erinnerungsterminen" + copy: "URL kopieren" + copied: "Kopiert!" + add_to_google: "Google Kalender" + add_to_outlook: "Microsoft Outlook" + add_to_apple: "Apple-Kalender" + active_subscription: "Du hast ein aktives Kalender-Abonnement." change_password: success: "(E-Mail gesendet)" in_progress: "(E-Mail wird gesendet)" @@ -2393,6 +2438,7 @@ de: form_kit: reset: Zurücksetzen optional: optional + required: erforderlich errors_summary_title: one: "Behebe diesen Fehler, um fortzufahren" other: "Behebe diese Fehler, um fortzufahren" @@ -2961,6 +3007,7 @@ de: collapse: "Editor minimieren" open: "Editor öffnen" abandon: "Editor schließen und Entwurf verwerfen" + edit_reason: "Füge den Bearbeitungsgrund hinzu" enter_fullscreen: "Vollbild-Editor öffnen" exit_fullscreen: "Vollbild-Editor verlassen" exit_fullscreen_prompt: "Drücke ESC, um den Vollbildmodus zu verlassen" @@ -3115,9 +3162,13 @@ de: available: title: "Bevorstehende Änderungen" description: "'%{changeName}' ist zur Vorschau verfügbar" + description_two: "'%{changeName1}' und '%{changeName2}' sind zur Vorschau verfügbar" + description_many: "'%{changeName}' und %{otherChangeCount} weitere Änderungen sind zur Vorschau verfügbar" automatically_promoted: title: "Bevorstehende Änderungen" description: "'%{changeName}' wurde automatisch aktiviert" + description_two: "'%{changeName1}' und '%{changeName2}' wurden automatisch aktiviert" + description_many: "'%{changeName}' und %{otherChangeCount} weitere Änderungen wurden automatisch aktiviert" dismiss_confirmation: body: default: @@ -3176,8 +3227,8 @@ de: votes_released: "Abstimmung wurde freigegeben" new_features: "neue Discourse-Funktionen wurden veröffentlicht" admin_problems: "neue Ratschläge auf deinem Website-Dashboard" - upcoming_change_available: "neue bevorstehende Änderung '%{changeName}' ist verfügbar" - upcoming_change_automatically_promoted: "bevorstehende Änderung '%{changeName}' wurde automatisch aktiviert" + upcoming_change_available: "neue bevorstehende Änderungen sind verfügbar" + upcoming_change_automatically_promoted: "bevorstehende Änderungen wurden automatisch aktiviert" upload_selector: change: "Ändern" delete: "Löschen" @@ -3378,8 +3429,8 @@ de: confirm: "Bestätigen" select_all: "Alle auswählen" clear_all: "Auswahl aufheben" - unlist_topics: "Themen unsichtbar machen" - relist_topics: "Themen neu auflisten" + unlist_topics: "Themen aus der Liste entfernen" + relist_topics: "Themen wieder auflisten" reset_bump_dates: "„Nach oben verschieben“-Zeitangaben zurücksetzen" defer: "Als ungelesen markieren" delete: "Themen löschen" @@ -3421,17 +3472,14 @@ de: other: "Neue Themen ignorieren (%{count})" toggle: "Massenauswahl von Themen umschalten" actions: "Massenoperationen" - change_category: "Kategorie festlegen …" + change_category: "Kategorie aktualisieren" close_topics: "Themen schließen" archive_topics: "Themen archivieren" move_messages_to_inbox: "In Posteingang verschieben" archive_messages: "Ins Archiv verschieben" - notification_level: "Benachrichtigungen …" + notification_level: "Benachrichtigungsstufe aktualisieren" change_notification_level: "Benachrichtigungsstufe ändern" choose_new_category: "Neue Kategorie für die gewählten Themen:" - selected: - one: "Du hast %{count} Thema ausgewählt." - other: "Du hast %{count} Themen ausgewählt." selected_sole_category: one: "Du hast %{count} Thema aus der Kategorie ausgewählt:" other: "Du hast %{count} Themen aus der Kategorie ausgewählt:" @@ -3441,16 +3489,34 @@ de: change_tags: "Schlagwörter ersetzen" append_tags: "Schlagwörter hinzufügen" choose_new_tags: "Neue Schlagwörter für diese Themen wählen:" - choose_append_tags: "Wähle neue Schlagwörter, die diesen Themen hinzugefügt werden sollen:" + choose_append_tags: "Schlagwörter hinzufügen" changed_tags: "Die Schlagwörter dieser Themen wurden geändert." - remove_tags: "Alle Schlagwörter entfernen" + remove_tags: "Schlagwörter entfernen" confirm_remove_tags: one: "Alle Schlagwörter werden aus diesem Thema entfernt. Bist du sicher?" other: "Alle Schlagwörter werden aus %{count} Themen entfernt. Bist du sicher?" + confirm_update_topics: + one: "%{count} Thema aktualisieren" + other: "%{count} Themen aktualisieren" + confirm_close_topics: + one: "%{count} Thema schließen" + other: "%{count} Themen schließen" + confirm_archive_topics: + one: "%{count} Thema archivieren" + other: "%{count} Themen archivieren" + confirm_archive_messages: + one: "%{count} Nachricht archivieren" + other: "%{count} Nachrichten archivieren" + confirm_move_to_inbox: + one: "%{count} Nachricht in den Posteingang verschieben" + other: "%{count} Nachrichten in den Posteingang verschieben" + confirm_delete_topics: + one: "%{count} Thema löschen" + other: "%{count} Themen löschen" progress: one: "Fortschritt: %{count} Thema" other: "Fortschritt: %{count} Themen" - notify: "Informiere die Benutzer über diese Änderung." + notify: "Informiere die Benutzer über diese Änderung" performing: "Massenoperationen werden durchgeführt, bitte warten …" completed: "Massenoperationen erfolgreich abgeschlossen!" completed_count: @@ -3488,7 +3554,6 @@ de: name: "Verwerfen" close_topics: name: "Schließen" - note: "Hinweis" optional: (optional) archive_topics: name: "Archivieren" @@ -3508,18 +3573,16 @@ de: name: "Schlagwörter ersetzen" delete_topics: name: "Löschen" + description: "Lösche die ausgewählten Themen endgültig. Diese Aktion kann nicht rückgängig gemacht werden." update_category: name: "Kategorie aktualisieren" - description: "Wähle die neue Kategorie für die ausgewählten Themen" + description: "Verschiebe alle ausgewählten Themen in die folgende Kategorie:" reset_bump_dates: name: "„Nach oben verschieben“-Daten zurücksetzen" - description: "Setzt das „Nach oben verschieben“-Datum auf das vom zuletzt erstellten Beitrag zurück, was die Reihenfolge in der Themenliste beeinflusst" defer: name: "Als ungelesen markieren" - description: "Themen als ungelesen markieren" update_notifications: name: "Benachrichtigungsstufe aktualisieren" - description: "Ändere die Benachrichtigungsstufe auf „Beobachten“, „Verfolgen“, „Normal“ oder „Stumm“" topic: filter_to: one: "%{count} Beitrag im Thema" @@ -4207,6 +4270,7 @@ de: one: "Möchtest du diese Beiträge wirklich zusammenführen?" other: "Möchtest du diese %{count} Beiträge wirklich zusammenführen?" revisions: + diff_too_complex: "Die Unterschiede sind zu komplex, um sie anzuzeigen. Bitte versuche einzelne, kleinere Änderungen anzusehen." locale: no_locale_set: "Keine Sprache eingestellt" locale_removed: "Sprache entfernt" @@ -4324,7 +4388,16 @@ de: topic_featured_link_allowed: "Erlaube hervorgehobene Links in dieser Kategorie" delete: "Kategorie löschen" create: "Neue Kategorie" + create_with_type: "Neue Kategorie des Typs „%{typeName}“" create_long: "Eine neue Kategorie erstellen" + settings_apply_to_all_of_type_warning: "Die nachfolgenden Änderungen gelten für alle Kategorien dieser Art" + type_settings_schema: + category_settings: "Kategorie-Einstellungen" + category_custom_fields: "Kategorie-Einstellungen" + site_settings: "Website-Einstellungen" + choose_type: + title: "Kategorietyp wählen" + requires_plugin: "Erfordert ein Plug-in" create_category: "Kategorie erstellen" save: "Kategorie speichern" unsaved_changes: "Du hast ungespeicherte Änderungen" @@ -4374,6 +4447,9 @@ de: list: "Kategorien auflisten" no_description: "Bitte füge eine Beschreibung für diese Kategorie hinzu." change_in_category_topic: "Beschreibung bearbeiten" + description_updated: "Beschreibung aktualisiert" + description_expand: "Mehr anzeigen" + description_collapse: "Weniger anzeigen" already_used: "Diese Farbe wird bereits für eine andere Kategorie verwendet." color_palette: "Farbpalette" security: "Sicherheit" @@ -4391,7 +4467,7 @@ de: all_parent_groups_used: "Alle Gruppen aus der übergeordneten Kategorie sind hinzugefügt worden. Um weitere Gruppen hinzuzufügen, füge sie zuerst der übergeordneten Kategorie hinzu." toggle_reply: "Antwortberechtigung umschalten" toggle_full: "Erstellungsberechtigung umschalten" - inherited: 'Diese Berechtigung wird von %{everyone_group} geerbt' + inherited: 'Diese Berechtigung wird von „%{everyone_group}“ geerbt' special_warning: "Diese Kategorie wurde bei der Installation angelegt. Die Sicherheitseinstellungen können daher nicht verändert werden. Wenn du diese Kategorie nicht benötigst, dann solltest du sie löschen, anstatt sie für andere Zwecke zu verwenden." uncategorized_security_warning: "Diese Kategorie ist etwas Spezielles. Sie dient als Bereich für Themen, die keine Kategorie haben und besitzt keine Sicherheitseinstellungen." uncategorized_general_warning: 'Diese Kategorie ist etwas Spezielles. Sie wird als Standard-Kategorie für neue Themen genutzt, für die keine Kategorie ausgewählt wurde. Deaktiviere diese Einstellung, wenn dieses Verhalten verhindert und eine Kategoriewahl erzwungen werden soll. Der Name und die Beschreibung können unter Anpassen/Textinhalte geändert werden.' @@ -4996,7 +5072,7 @@ de: slug_placeholder: "Sprechender Name des Schlagwortes (optional, wird automatisch aus dem Namen generiert)" saved: "Schlagwort-Einstellungen gespeichert" no_synonyms: "Für dieses Schlagwort sind keine Synonyme definiert." - add_synonym_placeholder: "Suche nach Schlagwörtern, die als Synonyme hinzugefügt werden sollen..." + add_synonym_placeholder: "Suche nach Schlagwörtern, die als Synonyme hinzugefügt werden sollen …" synonyms_subtitle: "Wenn die folgenden Schlagwörter verwendet werden, werden sie durch %{name} ersetzt" save: "Schlagwort speichern" delete: "Schlagwort löschen" @@ -5546,8 +5622,7 @@ de: group_traffic: "Traffic" group_members: "Mitglieder" group_content: "Inhalte & Community-Status" - group_moderation: "Moderation" - group_security: "Sicherheit" + group_moderation_and_security: "Moderation & Sicherheit" group_other: "Sonstiges" legacy_warning: "Dies ist ein älterer Bericht. Er wird demnächst nicht mehr verfügbar sein. Wenn du Hilfe bei der Suche nach einem Ersatz benötigst, wenden dich bitte an den Support." config_sections: @@ -5581,7 +5656,7 @@ de: no_changes_to_save: "Keine Änderungen zu speichern" select_groups: "Gruppen auswählen …" opt_in_groups: "Gruppenweise Aktivierung" - show_related_settings: "Verwandte Einstellungen anzeigen..." + show_related_settings: "Verwandte Einstellungen anzeigen …" opt_in_groups_instructions: "Die gruppenweise Aktivierung kann verwendet werden, um einer bestimmten Benutzergruppe zu ermöglichen, eine Änderung zu testen, bevor sie für alle veröffentlicht wird. Beachte, dass diese Gruppen irrelevant werden, sobald eine Änderung den Status „stabil“ erreicht." enabled_for_throttle: "Du hast zu schnell geändert, für wen diese Änderung aktiviert ist. Bitte warte ein paar Sekunden, bevor du es erneut versuchst." change_enabled_for_success: "Du hast diese Änderung für %{enabledFor} aktiviert." @@ -6138,10 +6213,11 @@ de: all: "Gesamt" view_table: "Tabelle" view_graph: "Diagramm" - refresh_report: "Bericht aktualisieren" + refresh_report: "Aktualisieren" daily: Täglich monthly: Monatlich weekly: Wöchentlich + chart_group_period: "Wähle einen Zeitraum" value_so_far: "%{value} (bis jetzt)" dates: "Datumsangaben (UTC)" groups: "Alle Gruppen" @@ -6715,7 +6791,7 @@ de: back: "Zurück zu Komponenten" install: "Installieren" name: "Name" - used_on: "Verwendet bei" + used_on: "Verwendet von" enabled: "Aktiviert?" by_author: "Von %{name}" learn_more: "Mehr erfahren" @@ -8144,6 +8220,9 @@ de: more_than_50_results: "Es gibt mehr als 50 Ergebnisse. Bitte grenze deine Suche weiter ein." no_results: "Keine passenden Website-Texte gefunden" interpolation_keys: "Verfügbare Variablennamen:" + interpolation_key_insert: "Zum Einfügen klicken" + interpolation_key_used: "Bereits verwendete Variablen" + interpolation_key_invalid: "Unbekannter Variablenname – wird nicht ersetzt" outdated: title: "Diese Übersetzung ist veraltet" description: "Die Standardübersetzung für diesen Schlüssel hat sich geändert, seit diese Überschreibung erstellt wurde. Bitte überprüfe unten, ob deine Übersetzung mit den Änderungen übereinstimmt, die an der ursprünglichen Aussage vorgenommen wurden." @@ -8262,7 +8341,7 @@ de: min_admin_password_length: prompt: "Du bist dabei, deine Passwortrichtlinie zu ändern. Dies wird von jetzt an alle Administratoren betreffen, die ihre Passwörter ändern. Bist du sicher, dass du fortfahren möchtest?" confirm: "Ja, Passwortrichtlinie aktualisieren" - password_unique_charactes: + password_unique_characters: prompt: "Du bist dabei, deine Passwortrichtlinie zu ändern. Dies wird von jetzt an alle Benutzer betreffen, die ihre Passwörter ändern. Bist du sicher, dass du fortfahren möchtest?" confirm: "Ja, Passwortrichtlinie aktualisieren" block_common_passwords: @@ -8307,7 +8386,7 @@ de: no_user_badges: "%{name} wurden keine Abzeichen verliehen." no_badges: Es gibt keine Abzeichen, die verliehen werden können. none_selected: "Wähle ein Abzeichen aus, um loszulegen" - filter_placeholder: "Abzeichen filtern..." + filter_placeholder: "Abzeichen filtern …" no_badges_found: "Keine Abzeichen gefunden" sections: design: Design diff --git a/config/locales/client.el.yml b/config/locales/client.el.yml index 2a6b556c6d2c6..722c47bd202d9 100644 --- a/config/locales/client.el.yml +++ b/config/locales/client.el.yml @@ -441,7 +441,6 @@ el: predefined_topics_subtitle: "Δώστε στα νέα μέλη κάτι για να συζητήσουν, επιλέξτε ένα πρότυπο για επεξεργασία και δημιουργήστε το δικό σας." predefined_topics_description: "Διαλέξτε από μια συλλογή από αφορμές για συζήτηση για να ξεκινήσουν οι συζητήσεις" use_predefined: "Περιήγηση προτύπων" - start_with_this: "Ξεκινήστε με αυτό" back: "Πίσω" icebreakers: fun_facts: @@ -1758,6 +1757,10 @@ el: apps: "Εφαρμογές" navigation_menu: "Μενού πλοήγησης" upcoming_changes: "Επερχόμενες αλλαγές" + calendar_subscriptions: "Ημερολόγιο" + calendar_subscriptions: + copied: "Αντιγράφηκε!" + add_to_google: "Ημερολόγιο Google" change_password: success: "(το email στάλθηκε)" in_progress: "(αποστολή email)" @@ -2346,6 +2349,7 @@ el: form_kit: reset: Επαναφορά optional: προεραιτικό + required: απαραίτητο errors_summary_title: one: "Διορθώστε αυτό το σφάλμα για να συνεχίσετε" other: "Διορθώστε αυτά τα σφάλματα για να συνεχίσετε" @@ -3106,8 +3110,6 @@ el: votes_released: "η ψηφοφορία κυκλοφόρησε" new_features: "νέες λειτουργίες του Discourse έχουν κυκλοφορήσει" admin_problems: "νέα συμβουλή στον πίνακα ελέγχου του ιστότοπού σας" - upcoming_change_available: "νέα επερχόμενη αλλαγή '%{changeName}' είναι διαθέσιμη" - upcoming_change_automatically_promoted: "επερχόμενη αλλαγή '%{changeName}' έχει ενεργοποιηθεί αυτόματα" upload_selector: change: "Αλλαγή" delete: "Σβήσιμο" @@ -3308,10 +3310,7 @@ el: confirm: "Επιβεβαίωση" select_all: "Επιλογή Όλων" clear_all: "Καθαρισμός Όλων" - unlist_topics: "Απόκρυψη Θεμάτων" - relist_topics: "Εμφάνιση Θεμάτων" defer: "Σήμανση ως αδιάβαστα" - delete: "Διαγραφή Θεμάτων" delete_topics_count: one: "Διαγραφή Θέματος" other: "Διαγραφή Θεμάτων" @@ -3350,36 +3349,27 @@ el: other: "Παράβλεψε Νέα (%{count})" toggle: "εναλλαγή μαζικής επιλογής θεμάτων" actions: "Μαζικές Ενέργειες" - change_category: "Ορισμός κατηγορίας…" - close_topics: "Κλείσιμο Θεμάτων" - archive_topics: "Αρχειοθέτηση Θεμάτων" move_messages_to_inbox: "Μετακίνηση στα Εισερχόμενα" archive_messages: "Μετακίνηση στο Αρχείο" - notification_level: "Ειδοποιήσεις…" change_notification_level: "Αλλαγή επιπέδου ειδοποίησης" choose_new_category: "Επιλέξτε τη νέα κατηγορία για τα θέματα:" - selected: - one: "Έχεις διαλέξει %{count} θέμα." - other: "Έχετε επιλέξει %{count} θέματα." selected_sole_category: one: "Έχεις επιλέξει %{count} θέμα από την κατηγορία:" other: "Έχεις επιλέξει %{count} θέματα από την κατηγορία:" selected_count: one: "%{count} επιλεγμένα" other: "%{count} επιλεγμένα" - change_tags: "Αντικατάσταση Ετικετών " - append_tags: "Προσάρτηση Ετικετών " + append_tags: "Προσθήκη ετικετών" choose_new_tags: "Επιλέξτε νέες ετικέτες για αυτά τα θέματα:" - choose_append_tags: "Επιλογή νέων ετικετών για την προσάρτηση τους σε αυτά τα θέματα:" + choose_append_tags: "Προσθήκη ετικετών" changed_tags: "Οι ετικέτες αυτών των θεμάτων έχουν αλλάξει." - remove_tags: "Αφαίρεση Όλων των Ετικετών" confirm_remove_tags: one: "Όλες οι ετικέτες θα αφαιρεθούν από αυτό το θέμα. Είσαι σίγουρος;" other: "Όλες οι ετικέτες θα αφαιρεθούν από %{count} θέματα. Είσαι σίγουρος;" progress: one: "Πρόοδος: %{count} θέμα" other: "Πρόοδος: %{count} θέματα" - notify: "Ειδοποιήστε τους χρήστες για αυτήν την αλλαγή." + notify: "Ειδοποιήστε τους χρήστες για αυτήν την αλλαγή" performing: "Εκτελούνται μαζικές λειτουργίες, παρακαλώ περιμένετε…" completed: "Οι μαζικές λειτουργίες ολοκληρώθηκαν με επιτυχία!" completed_count: @@ -3417,7 +3407,6 @@ el: name: "Παράβλεψη" close_topics: name: "Κλείσιμο" - note: "Σημείωση" optional: (προεραιτικό) archive_topics: name: "Αρχείο" @@ -3427,21 +3416,16 @@ el: name: "Μετακίνηση στα Εισερχόμενα" remove_tags: name: "Αφαίρεση ετικετών" - append_tags: - name: "Προσάρτηση Ετικετών " replace_tags: name: "Αντικατάσταση Ετικετών " delete_topics: name: "Σβήσιμο" update_category: name: "Ενημέρωση Κατηγορίας" - description: "Επιλέξτε τη νέα κατηγορία για τα επιλεγμένα θέματα" defer: name: "Σήμανση ως αδιάβαστα" - description: "Σημάνετε τα θέματα ως αδιάβαστα" update_notifications: name: "Ενημέρωση Ειδοποιήσεων" - description: "Αλλαγή επιπέδου ειδοποιήσεων σε Επιτηρείται, Παρακολουθείται, Φυσιολογικό ή Σε σίγαση" topic: filter_to: one: "%{count} ανάρτηση σε θέμα" @@ -4232,6 +4216,8 @@ el: delete: "Διαγραφή κατηγορίας" create: "Νέα κατηγορία" create_long: "Δημιουργία νέας κατηγορίας" + type_settings_schema: + site_settings: "Ρυθμίσεις ιστότοπου" save: "Αποθήκευση κατηγορίας" unsaved_changes: "Έχετε μη αποθηκευμένες αλλαγές" parent: "Γονική κατηγορία" @@ -4242,6 +4228,7 @@ el: emoji_required: "Επιλέξτε ένα emoji." icon_required: "Επιλέξτε ένα εικονίδιο." name: "Όνομα κατηγορίας" + untitled: "Κατηγορία χωρίς τίτλο" description: "Περιγραφή" logo: "Εικόνα λογότυπου κατηγορίας" logo_dark: "Εικόνα λογότυπου κατηγορίας σκοτεινής λειτουργίας" @@ -4276,6 +4263,8 @@ el: list: "Λίστα κατηγοριών" no_description: "Παρακαλώ πρόσθεσε μια περιγραφή στην κατηγορία" change_in_category_topic: "Επεξεργασία περιγραφής" + description_expand: "Δείτε περισσότερα" + description_collapse: "Δείξε λιγότερα" already_used: "Αυτό το χρώμα έχει χρησιμοποιηθεί σε άλλη κατηγορία" color_palette: "Παλέτα χρωμάτων" security: "Ασφάλεια" @@ -4479,6 +4468,8 @@ el: personal_message: title: "Αυτό το θέμα είναι ένα προσωπικό μήνυμα" help: "Αυτό το θέμα είναι ένα προσωπικό μήνυμα" + visibility_reasons: + bulk_action: "Η ορατότητα αυτού του θέματος άλλαξε λόγω μιας μαζικής ενέργειας που πραγματοποιήθηκε από έναν χρήστη" posts: "Αναρτήσεις" pending_posts: label: "Εκκρεμή" @@ -5379,8 +5370,6 @@ el: group_traffic: "Κίνηση" group_members: "Μέλη" group_content: "Περιεχόμενο & Υγεία" - group_moderation: "Συντονισμός" - group_security: "Ασφάλεια" group_other: "Άλλα" config_sections: account: @@ -5486,6 +5475,8 @@ el: title: "Ρυθμίσεις" authenticators: title: "Συνδέσεις κοινωνικών δικτύων" + discourseconnect: + title: "Discourse Connect" discourse_id: title: "Discourse ID" discourse_id: @@ -5789,6 +5780,7 @@ el: search: modal_title: "Αναζητήστε τα πάντα στη διαχείριση" title: "Αναζήτηση" + instructions: "Αναζητήστε τα πάντα στη διαχείριση..." full_page_link: "Εναλλαγή σε αναζήτηση πλήρους σελίδας" no_results: 'Δεν μπορέσαμε να βρούμε κάτι που να αντιστοιχεί με "%{filter}".' result_count: @@ -5806,8 +5798,8 @@ el: critical_available: "Μια κρίσιμη ενημέρωση είναι διαθέσιμη" updates_available: "Υπάρχουν διαθέσιμες ενημερώσεις" please_update: "Παρακαλούμε ενημερώστε!" - no_check_performed: "Δεν έγινε έλεγχος για ενημερώσεις. Βεβαιώσου πως το sidekiq τρέχει." - stale_data: "Δεν έγινε έλεγχος για ενημερώσεις εδώ και αρκετό καιρό. Βεβαιώσου πως το sidekiq τρέχει." + no_check_performed: "Δεν έγινε έλεγχος για ενημερώσεις. Βεβαιωθείτε ότι το Sidekiq εκτελείται." + stale_data: "Δεν έγινε έλεγχος για ενημερώσεις τον τελευταίο καιρό. Βεβαιωθείτε ότι το Sidekiq εκτελείται." version_check_pending: "Φαίνεται ότι ενημερώσατε πρόσφατα. Φανταστικά!" installed_version: "Εγκατεστημένα" latest_version: "Τελευταία" @@ -5878,7 +5870,7 @@ el: all: "Όλα" view_table: "πίνακας" view_graph: "γράφημα" - refresh_report: "Ανανέωση αναφοράς" + refresh_report: "Ανανέωση" daily: Ημερήσιες monthly: Μηνιαίες weekly: Εβδομαδιαίες @@ -5992,6 +5984,7 @@ el: cancel: "Ακύρωση" continue: "Συνεχίστε" copy_key: "Αντιγραφή" + key_copied_to_clipboard: "Το κλειδί API αντιγράφηκε στο πρόχειρο" back: "Επιστροφή στα κλειδιά API" revoke: "Ανακάλεσε" undo_revoke: "Αναίρεση ανάκλησης" @@ -6272,12 +6265,15 @@ el: emoji: "Emoji" navigation: "Πλοήγηση" themes_and_components: + title: "Θέματα και στοιχεία" keywords: "επέκταση" site_texts: "Κείμενα ιστότοπου" email_settings: title: "Ρυθμίσεις ηλεκτρονικού ταχυδρομείου" sidebar_link: appearance: "Εμφάνιση" + server_setup: + title: "Εγκατάσταση & αρχεία καταγραφής διακομιστή" security: title: "Ασφάλεια" sidebar_link: @@ -6918,7 +6914,7 @@ el: email_addresses: see_more: "[Δείτε περισσότερα...]" moderation_history: - performed_by: "Εκτελεσμένο από" + performed_by: "Εκτελέστηκε από" no_results: "Δεν υπάρχει διαθέσιμο ιστορικό συντονισμού." actions: delete_user: "Ο χρήστης διαγράφηκε" @@ -7061,7 +7057,7 @@ el: delete_flag: "διαγραφή αναφοράς" stop_impersonating: "σταμάτα την πλαστοπροσωπία" screened_emails: - description: "Όταν κάποιος φτιάξει έναν λογαριασμό, οι παρακάτω διευθύνσεις email θα ελεγχθούν και η εγγραφή θα αποκλειστεί ή θα συμβεί κάποια άλλη ενέργεια." + description: "Όταν κάποιος προσπαθήσει να φτιάξει έναν νέο λογαριασμό, οι παρακάτω διευθύνσεις email θα ελεγχθούν και η εγγραφή θα αποκλειστεί ή θα συμβεί κάποια άλλη ενέργεια." actions: allow: "Επίτρεψε" screened_urls: @@ -7085,13 +7081,16 @@ el: text: "Σύνοψη" title: "Δημιουργεί νέες εγγραφές για τον αποκλεισμό υποδικτύων αν υπάρχουν τουλάχιστον 'min_ban_entries_for_roll_up' εγγραφές." search_logs: + title: "Αναζήτηση καταγραφών" term: "Όρος" searches: "Αναζητήσεις" click_through_rate: "CTR" types: all_search_types: "Όλοι οι τύποι αναζήτησης" header: "Header" + full_page: "Πλήρης σελίδα" click_through_only: "Όλα (μόνο για κλικ)" + header_search_results: "Αποτελέσματα αναζήτησης κεφαλίδας" watched_words: search: "αναζήτηση" clear_filter: "Καθαρισμός" @@ -7452,6 +7451,7 @@ el: more_than_50_results: "Υπάρχουν περισσότερα από 50 αποτελέσματα. Κάντε πιο συγκεκριμένη την αναζήτησή σας." no_results: "Δεν βρέθηκαν αντίστοιχα κείμενα ιστότοπου" interpolation_keys: "Διαθέσιμα κλειδιά παρεμβολής:" + interpolation_key_used: "Χρησιμοποιείται ήδη" outdated: title: "Αυτή η μετάφραση είναι ξεπερασμένη" description: "Η προεπιλεγμένη μετάφραση για αυτό το κλειδί έχει αλλάξει από τότε που δημιουργήθηκε αυτή η παράκαμψη. Ελέγξτε παρακάτω ότι η μετάφρασή σας ταιριάζει με τυχόν αλλαγές που έχουν γίνει στην αρχική πρόθεση." diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 2a3d366b49a9a..ca88b354e2e3a 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -507,7 +507,6 @@ en: predefined_topics_subtitle: "Give new members something to talk about, pick a template to edit and make your own." predefined_topics_description: "Pick from a collection of conversation starters to get discussions going" use_predefined: "Browse templates" - start_with_this: "Start with this" back: "Back" icebreakers: fun_facts: @@ -1925,6 +1924,24 @@ en: apps: "Apps" navigation_menu: "Navigation menu" upcoming_changes: "Upcoming changes" + calendar_subscriptions: "Calendar" + + calendar_subscriptions: + description: "Generate subscription URLs to sync with your favourite calendar app (Google Calendar, Apple Calendar, Outlook, etc.). These URLs are private links to calendar events for your account (bookmark reminders, calendar events, etc). You can always revoke or renew the generated subscription URLs. " + generate: "Generate Subscription URLs" + regenerate: "Regenerate URLs" + regenerate_confirm: "This will invalidate your existing calendar subscription URLs. Any calendar apps using the old URLs will stop receiving updates. Continue?" + revoke: "Revoke Subscription" + revoke_confirm: "This will revoke your calendar subscription URLs. Any calendar apps using them will stop receiving updates. Continue?" + urls_warning: "The subscription URLs are ready! Click the buttons below to link them to your calendar app. Note: these URLs are shown only once." + bookmarks: "Bookmark Reminders" + bookmarks_description: "Your bookmarks with reminder dates" + copy: "Copy URL" + copied: "Copied!" + add_to_google: "Google Calendar" + add_to_outlook: "Microsoft Outlook" + add_to_apple: "Apple Calendar" + active_subscription: "You have an active calendar subscription." change_password: success: "(email sent)" @@ -2592,6 +2609,7 @@ en: form_kit: reset: Reset optional: optional + required: required errors_summary_title: one: "Fix this error to continue" other: "Fix these errors to continue" @@ -3213,6 +3231,7 @@ en: collapse: "Minimize the composer panel" open: "Open the composer panel" abandon: "Close composer and discard draft" + edit_reason: "Add your reason for editing" enter_fullscreen: "Enter fullscreen composer" exit_fullscreen: "Exit fullscreen composer" exit_fullscreen_prompt: "Press ESC to exit full screen" @@ -3657,11 +3676,11 @@ en: confirm: "Confirm" select_all: "Select All" clear_all: "Clear All" - unlist_topics: "Unlist Topics" - relist_topics: "Relist Topics" + unlist_topics: "Unlist topics" + relist_topics: "Relist topics" reset_bump_dates: "Reset bump dates" defer: "Mark unread" - delete: "Delete Topics" + delete: "Delete topics" delete_topics_count: one: "Delete Topic" other: "Delete Topics" @@ -3700,36 +3719,57 @@ en: other: "Dismiss New (%{count})" toggle: "toggle bulk selection of topics" actions: "Bulk Actions" - change_category: "Set Category…" - close_topics: "Close Topics" - archive_topics: "Archive Topics" + change_category: "Update category" + close_topics: "Close topics" + archive_topics: "Archive topics" move_messages_to_inbox: "Move to Inbox" archive_messages: "Move to Archive" - notification_level: "Notifications…" + notification_level: "Update notifications" change_notification_level: "Change Notification Level" choose_new_category: "Choose the new category for the topics:" - selected: - one: "You have selected %{count} topic." - other: "You have selected %{count} topics." selected_sole_category: one: "You have selected %{count} topic from category:" other: "You have selected %{count} topics from category:" selected_count: one: "%{count} selected" other: "%{count} selected" - change_tags: "Replace Tags" - append_tags: "Append Tags" + change_tags: "Replace tags" + append_tags: "Add tags" choose_new_tags: "Choose new tags for these topics:" - choose_append_tags: "Choose new tags to append for these topics:" + choose_append_tags: "Add tags" changed_tags: "The tags of those topics were changed." - remove_tags: "Remove All Tags" + remove_tags: "Remove tags" confirm_remove_tags: one: "All tags will be removed from this topic. Are you sure?" other: "All tags will be removed from %{count} topics. Are you sure?" + confirm_update_topics: + one: "Update %{count} topic" + other: "Update %{count} topics" + confirm_close_topics: + one: "Close %{count} topic" + other: "Close %{count} topics" + confirm_archive_topics: + one: "Archive %{count} topic" + other: "Archive %{count} topics" + confirm_unlist_topics: + one: "Unlist %{count} topic" + other: "Unlist %{count} topics" + confirm_relist_topics: + one: "Relist %{count} topic" + other: "Relist %{count} topics" + confirm_archive_messages: + one: "Archive %{count} message" + other: "Archive %{count} messages" + confirm_move_to_inbox: + one: "Move %{count} message to inbox" + other: "Move %{count} messages to inbox" + confirm_delete_topics: + one: "Delete %{count} topic" + other: "Delete %{count} topics" progress: one: "Progress: %{count} topic" other: "Progress: %{count} topics" - notify: "Notify users of this change." + notify: "Notify users of this change" performing: "Performing bulk operations, please wait…" completed: "Bulk operations completed successfully!" completed_count: @@ -3769,38 +3809,44 @@ en: name: "Dismiss" close_topics: name: "Close" - note: "Note" + description: "Closed topics prevent new replies. Learn more" + note: "Add a note to these topics" optional: (optional) archive_topics: name: "Archive" + description: "Archived topics are hidden from search and the latest topic list. Learn more" archive_messages: name: "Move to Archive" move_messages_to_inbox: name: "Move to Inbox" unlist_topics: name: "Unlist" + description: "Unlisted topics are hidden from the topic list but can still be accessed via a direct link. Learn more" relist_topics: name: "Relist" remove_tags: name: "Remove Tags" + description: "Remove all tags from the selected topics." append_tags: - name: "Append Tags" + name: "Add Tags" + description: "Add the following tags to the selected topics:" replace_tags: name: "Replace Tags" + description: "Replace all existing tags on the selected topics with the following:" delete_topics: name: "Delete" + description: "Permanently delete the selected topics. This action cannot be undone." update_category: name: "Update Category" - description: "Choose the new category for the selected topics" + description: "Move all selected topics to the following category:" reset_bump_dates: name: "Reset Bump Dates" - description: "Reset the topic bump date to the last created post date, which affects ordering in the topic list" + description: "Do you want to update the bump dates to the last created post date? This may impact their ordering in the topic list." defer: name: "Mark Unread" - description: "Mark topics as unread" update_notifications: name: "Update Notifications" - description: "Change notification level to Watching, Tracking, Normal, or Muted" + description: "Update your personal notification level for the selected topics to:" topic: filter_to: @@ -3988,6 +4034,9 @@ en: auto_close_immediate: one: "The last post in the topic is already %{count} hour old, so the topic will be closed immediately." other: "The last post in the topic is already %{count} hours old, so the topic will be closed immediately." + auto_delete_immediate: + one: "The last post in the topic is already %{count} hour old, so the topic will be deleted immediately." + other: "The last post in the topic is already %{count} hours old, so the topic will be deleted immediately." timeline: back: "Back" back_description: "Go back to your last unread post" @@ -4629,6 +4678,7 @@ en: original_language: "This post was originally written in %{language}" original_language_and_outdated: "This post was originally written in %{language}. Translation may be outdated" + ai_translation_disclaimer: "AI-generated translations may be inaccurate." category: none: "(no category)" @@ -4644,6 +4694,8 @@ en: advanced: "Advanced" show_advanced: "Advanced settings" topic_template: "Template" + topic_title_placeholder: "Category topic title placeholder" + topic_title_placeholder_placeholder: "[optional] custom topic title placeholder for this category" tags: "Tags" localizations: "Localizations" localization: @@ -4674,6 +4726,11 @@ en: create: "New category" create_with_type: "New %{typeName} category" create_long: "Create a new category" + settings_apply_to_all_of_type_warning: "Changes below will apply to all categories of this type" + type_settings_schema: + category_settings: "Category settings" + category_custom_fields: "Category settings" + site_settings: "Site settings" choose_type: title: "Choose category type" requires_plugin: "Requires plugin" @@ -4726,6 +4783,9 @@ en: list: "List categories" no_description: "Please add a description for this category." change_in_category_topic: "Edit description" + description_updated: "Description updated" + description_expand: "Show more" + description_collapse: "Show less" already_used: "This color has been used by another category" color_palette: "Color palette" security: "Security" @@ -5965,8 +6025,7 @@ en: group_traffic: "Traffic" group_members: "Members" group_content: "Content & Health" - group_moderation: "Moderation" - group_security: "Security" + group_moderation_and_security: "Moderation & Security" group_other: "Other" legacy_warning: "This is a legacy report. It will be retired soon. If you need help finding the replacement, contact support." @@ -6567,10 +6626,11 @@ en: all: "All" view_table: "table" view_graph: "graph" - refresh_report: "Refresh Report" + refresh_report: "Refresh" daily: Daily monthly: Monthly weekly: Weekly + chart_group_period: "Select a period" value_so_far: "%{value} (so far)" dates: "Dates (UTC)" groups: "All groups" @@ -7975,6 +8035,7 @@ en: upcoming_change_available: "upcoming change available" change_site_setting_groups: "change site setting groups" discourse_id_regenerate_credentials: "regenerate Discourse ID credentials" + configure_category_type: "configure category type" screened_emails: title: "Screened emails" description: "When someone tries to create a new account, the following email addresses will be checked and the registration will be blocked, or some other action performed." @@ -8749,7 +8810,7 @@ en: min_admin_password_length: prompt: "You're about to change your password policy. This will affect all admins changing their passwords from now on. Are you sure you want to proceed?" confirm: "Yes, update password policy" - password_unique_charactes: + password_unique_characters: prompt: "You're about to change your password policy. This will affect all users changing their passwords from now on. Are you sure you want to proceed?" confirm: "Yes, update password policy" block_common_passwords: diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml index e86f960c48e1f..864c90392b9d0 100644 --- a/config/locales/client.es.yml +++ b/config/locales/client.es.yml @@ -9,6 +9,8 @@ es: blocks: ghost: status: "Estado" + conditions: "Condiciones" + arguments: "Parámetros" in_location: "en" hidden: "oculto" failed: "falló" @@ -600,6 +602,10 @@ es: other_drafts: one: "+%{count} otro borrador" other: "+%{count} otros borradores" + embed_mode: + storage_access_prompt: "¿Ya tienes una cuenta en %{site_name}? Permite acceso a tu sesión para comentar con tu nombre." + allow_access: "Permitir acceso" + continue_as_guest: "Continuar sin iniciar sesión" topic_count_all: one: "Ver %{count} tema nuevo" other: "Ver %{count} temas nuevos" @@ -1718,6 +1724,10 @@ es: apps: "Aplicaciones" navigation_menu: "Menú de navegación" upcoming_changes: "Próximos cambios" + calendar_subscriptions: "Calendario" + calendar_subscriptions: + copied: "¡Copiado!" + add_to_google: "Calendario de Google" change_password: success: "(correo electrónico enviado)" in_progress: "(enviando correo electrónico)" @@ -2322,6 +2332,7 @@ es: form_kit: reset: Restablecer optional: opcional + required: obligatorio dirty_form: "¡No has enviado tus cambios! ¿Seguro que quieres salir?" errors: starts_with: "Debe comenzar con %{prefix}" @@ -2341,6 +2352,8 @@ es: too_short: one: "Debe tener al menos %{count} carácter" other: "Debe tener al menos %{count} caracteres" + color: + already_used: "Ya está en uso" close: "Cerrar" assets_changed_confirm: "Se ha recibido una actualización de software. ¿Obtener la última versión ahora?" logout: "Has cerrado sesión." @@ -2862,12 +2875,24 @@ es: upload_description: "introduce una descripción del archivo subido aquí" olist_title: "Lista numerada" ulist_title: "Lista con viñetas" + list_title: "Listas" list_item: "Lista de elementos" toggle_direction: "Mostrar/ocultar dirección" + apply_wrap_title: "Aplicar recubrimiento" wrap_modal: + title: "Editar recubrimiento" + name_label: "Nombre del recubrimiento" attributes_label: "Atributos" + add_attribute: "Añadir atributo" + remove_attribute: "Eliminar atributo" apply: "Aplicar" + unwrap: "Eliminar recubrimiento" + no_attributes: "Todavía no hay atributos." + wrap_text: "Recubrir contenido" help: "Ayuda de edición con Markdown" + collapse: "Minimizar el editor" + open: "Abrir el editor" + abandon: "Cerrar el editor y descartar borrador" enter_fullscreen: "Abrir editor en pantalla completa" exit_fullscreen: "Salir del editor en pantalla completa" exit_fullscreen_prompt: "Pulsa ESC para salir del modo pantalla completa" @@ -3166,6 +3191,7 @@ es: aria_label: Filtrar por etiqueta filters: label: Solo temas/publicaciones que… + all: Incluir mensajes title: Coincide solo en el título likes: me han gustado posted: he publicado en ellos @@ -3273,11 +3299,8 @@ es: confirm: "Confirmar" select_all: "Seleccionar todo" clear_all: "Limpiar todo" - unlist_topics: "Hacer invisibles" - relist_topics: "Hacer visibles de nuevo" reset_bump_dates: "Restablecer fechas de reflote" defer: "Marcar como no leído" - delete: "Eliminar temas" delete_topics_count: one: "Eliminar tema" other: "Eliminar temas" @@ -3310,36 +3333,27 @@ es: other: "Descartar nuevos (%{count})" toggle: "activar selección de temas en bloque" actions: "Acciones en bloque" - change_category: "Establecer categoría…" - close_topics: "Cerrar temas" - archive_topics: "Archivar temas" move_messages_to_inbox: "Mover a la bandeja de entrada" archive_messages: "Mover al archivo" - notification_level: "Notificaciones…" change_notification_level: "Cambiar nivel de notificación" choose_new_category: "Elige la nueva categoría de los temas:" - selected: - one: "Has seleccionado %{count} tema." - other: "Has seleccionado %{count} temas." selected_sole_category: one: "Has seleccionado %{count} tema de la categoría:" other: "Has seleccionado %{count} temas de la categoría:" selected_count: one: "%{count} seleccionado" other: "%{count} seleccionados" - change_tags: "Remplazar etiquetas" append_tags: "Añadir etiquetas" choose_new_tags: "Elige etiquetas nuevas para estos temas:" - choose_append_tags: "Elegir etiquetas nuevas para añadir a estos temas:" + choose_append_tags: "Añadir etiquetas" changed_tags: "Se han cambiado las etiquetas de esos temas." - remove_tags: "Eliminar todas las etiquetas" confirm_remove_tags: one: "Todas las etiquetas se eliminarán de este tema. ¿Estás seguro/a?" other: "Todas las etiquetas se eliminarán de %{count} temas. ¿Estás seguro/a?" progress: one: "Progreso: %{count} tema" other: "Progreso: %{count} temas" - notify: "Notificar a los usuarios afectados por el cambio." + notify: "Notificar a los usuarios afectados por el cambio" performing: "Realizando operaciones en bloque, espera…" completed: "¡Operaciones en bloque completadas con éxito!" error_topic_count: @@ -3368,7 +3382,6 @@ es: name: "Descartar" close_topics: name: "Cerrar" - note: "Nota" optional: (opcional) archive_topics: name: "Archivar" @@ -3382,24 +3395,18 @@ es: name: "Volver a publicar" remove_tags: name: "Eliminar etiquetas" - append_tags: - name: "Añadir etiquetas" replace_tags: name: "Remplazar etiquetas" delete_topics: name: "Eliminar" update_category: name: "Actualizar Categoría" - description: "Elige la nueva categoría para los temas seleccionados" reset_bump_dates: name: "Restablecer las fechas de reflote" - description: "Restablecer la fecha de reflote del tema a la fecha de la última publicación creada, lo que afecta a la ordenación en la lista de temas." defer: name: "Marcar como no leído" - description: "Marcar temas como no leídos" update_notifications: name: "Actualizar notificaciones" - description: "Cambia el nivel de notificación a Viendo, En seguimiento, Normal o Silenciado" topic: filter_to: one: "%{count} publicación en el tema" @@ -4195,11 +4202,17 @@ es: delete: "Eliminar" add: "Añadir grupo de etiquetas obligado" placeholder: "Selecciona un grupo de etiquetas…" + min_count: "Número de etiquetas" tag_group: "Grupo de etiquetas" topic_featured_link_allowed: "Permitir enlaces destacados en esta categoría" delete: "Eliminar categoría" create: "Crear categoría" create_long: "Crear una nueva categoría" + type_settings_schema: + site_settings: "Ajustes del sitio" + choose_type: + requires_plugin: "Requiere plugin" + create_category: "Crear categoría" save: "Guardar categoría" unsaved_changes: "Tienes cambios sin guardar" slug: "Identificador de URL de la categoría" @@ -4247,6 +4260,8 @@ es: list: "Lista de categorías" no_description: "Añade una descripción para esta categoría." change_in_category_topic: "Editar descripción" + description_expand: "Mostrar más" + description_collapse: "Mostrar menos" already_used: "Este color ya ha sido usado para otra categoría" color_palette: "Paleta de colores" security: "Seguridad" @@ -4845,10 +4860,13 @@ es: slug: "Slug" name_placeholder: "Nombre de la etiqueta" synonyms_subtitle: "Cuando las siguientes etiquetas sean usadas, serán reemplazadas por %{name}" + save: "Guardar etiqueta" localization: locale: "Idioma local" name: "Nombre" description: "Descripción" + add: "Añadir traducción" + remove: "Quitar traducción" sort_by: "Ordenar por:" sort_by_count: "cantidad" sort_by_name: "nombre" @@ -5352,6 +5370,7 @@ es: admin_js: type_to_filter: "Escribe para filtrar…" settings: "Ajustes" + reset_filter: "Quitar filtro" admin: title: "Administrador de Discourse" moderator: "Moderador" @@ -5366,10 +5385,9 @@ es: title: "Lista de informes disponibles" sidebar_title: "Informes" back: "Volver a todos los informes" + group_engagement: "Interacción" group_traffic: "Tráfico" group_members: "Miembros" - group_moderation: "Moderación" - group_security: "Seguridad" group_other: "Otros" config_sections: account: @@ -5811,6 +5829,9 @@ es: embedding: title: "Incrustado" header_description: "Discourse tiene la capacidad de incrustar los comentarios de un tema en un sitio remoto utilizando una API Javascript que crea un IFRAME" + form_templates: + title: "Plantillas de formulario" + header_description: "Las plantillas de formulario permiten forzar una estructura con validación de datos para los mensajes al crear nuevos temas" theme_site_settings: setting: "Ajuste" overridden_by: "Anulado por" @@ -5913,10 +5934,11 @@ es: all: "Todo" view_table: "tabla" view_graph: "gráfico" - refresh_report: "Actualizar informe" + refresh_report: "Volver a cargar" daily: Diariamente monthly: Mensualmente weekly: Semanalmente + value_so_far: "%{value} (hasta ahora)" dates: "Fechas (UTC)" groups: "Todos los grupos" disabled: "Este informe está desactivado" @@ -7416,6 +7438,7 @@ es: upload: "Subir un archivo" multiselect: "Múltiples opciones" tagchooser: "Selector de grupo de etiquetas" + composer: "Respuesta en Markdown" validations_modal: button_title: "Validaciones" modal_title: "Opciones de validación" @@ -7457,7 +7480,10 @@ es: second: "Opción 2" third: "Opción 3" edit_category: + toggle_freeform: "Plantilla de formulario desactivada" + toggle_form_template: "Plantilla de formulario habilitada" select_template: "Seleccionar plantillas de formularios" + select_template_help: "Añadir/editar plantillas de formularios" errors: multiple_tags_not_allowed: 'No puedes seleccionar más etiquetas de «%{tag_name}». Para evitar problemas, usa la plantilla de formulario.' impersonate: @@ -7465,6 +7491,7 @@ es: help: "Utiliza esta herramienta para suplantar una cuenta de usuario con fines de depuración. Tendrás que cerrar sesión al terminar." not_found: "No se pudo encontrar a ese usuario." invalid: "Lo sentimos, no puedes suplantar a ese usuario." + error: "Vaya, ha ocurrido un error inesperado." users: title: "Usuarios" description: "Ver y gestionar usuarios." @@ -7691,6 +7718,7 @@ es: cancel: "Cancelar" merging_user: "Fusionando usuario…" merge_failed: "Ha ocurrido un error al fusionar los usuarios." + delete_forbidden_because_admin: "Los administradores no pueden ser eliminados." delete_forbidden: one: "Los usuarios no se pueden borrar si han sido registrados hace más de %{count} día, o si tienen publicaciones. Borra todas publicaciones antes de tratar de borrar un usuario." other: "Los usuarios no se pueden eliminar si tienen publicaciones. Elimina todas las publicaciones antes de tratar de eliminar a un usuario. (No se pueden eliminar las publicaciones que se hayan creado hace más de %{count} días)" @@ -7837,6 +7865,10 @@ es: title: "Mostrar en las tarjetas de usuario" enabled: "Se muestra en la tarjeta de usuario" disabled: "No se muestra en la tarjeta de usuario" + show_on_signup: + title: "Mostrar en el formulario de registro" + enabled: "Se muestra en el formulario de registro" + disabled: "No se muestra en el formulario de registro" searchable: title: "Se puede buscar" enabled: "Se puede buscar" @@ -7865,6 +7897,8 @@ es: more_than_50_results: "Hay más de 50 resultados. Por favor, afina tu búsqueda." no_results: "No se han encontrado textos de sitios coincidentes" interpolation_keys: "Claves de interpolación disponibles:" + interpolation_key_insert: "Haz clic para insertar" + interpolation_key_used: "Ya está en uso" outdated: title: "Esta traducción está anticuada" description: "La traducción por defecto de esta clave ha cambiado desde que se creó esta anulación. Comprueba a continuación que tu traducción coincide con cualquier cambio que se haya hecho en la intención original." @@ -7912,6 +7946,9 @@ es: label: "Subir" title: "Subir imágenes" download_file: "Descargar" + upload_restrictions: + extensions: "Se aceptan: %{extensions}" + max_size: "Máximo: %{size}" selectable_avatars: title: "Lista de avatares que los usuarios pueden escoger" table_column_heading: @@ -7977,7 +8014,7 @@ es: confirm: "Sí, actualizar la política de contraseñas" min_admin_password_length: confirm: "Sí, actualizar la política de contraseñas" - password_unique_charactes: + password_unique_characters: confirm: "Sí, actualizar la política de contraseñas" block_common_passwords: confirm: "Sí, actualizar la política de contraseñas" @@ -8017,6 +8054,8 @@ es: no_user_badges: "%{name} no ha recibido ninguna medalla." no_badges: No hay medallas que se puedan conceder. none_selected: "Selecciona una medalla para empezar" + filter_placeholder: "Filtrar medallas..." + no_badges_found: "No se han encontrado medallas" sections: design: Diseño query: Consulta diff --git a/config/locales/client.et.yml b/config/locales/client.et.yml index a187fd0e17f7c..3b12684e49485 100644 --- a/config/locales/client.et.yml +++ b/config/locales/client.et.yml @@ -973,6 +973,8 @@ et: tags: "Sildid" interface: "Kasutajaliides" apps: "Äpid" + calendar_subscriptions: + copied: "Kopeeritud!" change_password: success: "(meil saadetud)" in_progress: "(saadan meili)" @@ -1296,6 +1298,7 @@ et: form_kit: reset: Lähtesta optional: valikuline + required: nõutud errors: required: "Nõutud" close: "Sulge" @@ -1669,8 +1672,6 @@ et: bulk: select_all: "Vali kõik" clear_all: "Puhasta kõik" - unlist_topics: "Eemalda teemad loetelust" - delete: "Kustuta teemad" delete_topics_count: one: "Kustuta teema" other: "Kustuta teemad" @@ -1682,20 +1683,11 @@ et: dismiss_new: "Ignoreeri uusi" toggle: "lülita teemade massiline äramärkimine ümber" actions: "Masstoimingud" - close_topics: "Sulge teemad" - archive_topics: "Arhiveeri teemad" move_messages_to_inbox: "Liiguta sisendkausta" change_notification_level: "Muuda teavituste taset" choose_new_category: "Vali teemadele uus kategooria:" - selected: - one: "Märkisid ära %{count} teema." - other: "Märkisid ära %{count} teemat." - change_tags: "Asenda sildid" - append_tags: "Lisa sildid" choose_new_tags: "Vali teemadele uued sildid:" - choose_append_tags: "Vali uued sildid, mida nendele teemadele lisada:" changed_tags: "Nende teemade silte on muudetud." - remove_tags: "Eemalda kõik sildid" confirm_remove_tags: one: "Sellelt teemalt eemaldatakse kõik sildid. Kas oled kindel?" other: "%{count} teemalt eemaldatakse kõik sildid. Kas oled kindel?" @@ -1724,8 +1716,6 @@ et: name: "Arhiiv" move_messages_to_inbox: name: "Liiguta postkasti" - append_tags: - name: "Lisa sildid" replace_tags: name: "Asenda sildid" delete_topics: @@ -2736,8 +2726,6 @@ et: reports: group_traffic: "Liiklus" group_members: "Liikmed" - group_moderation: "Modereerimine" - group_security: "Turve" group_other: "Muu" config_sections: account: @@ -2921,7 +2909,7 @@ et: all: "Kõik" view_table: "tabel" view_graph: "diagramm" - refresh_report: "Värskenda raportit" + refresh_report: "Värskenda" daily: Igapäevaselt monthly: Igakuiselt weekly: Iganädalaselt diff --git a/config/locales/client.fa_IR.yml b/config/locales/client.fa_IR.yml index 15fabfd0c865d..727bba9d64bd1 100644 --- a/config/locales/client.fa_IR.yml +++ b/config/locales/client.fa_IR.yml @@ -1528,6 +1528,10 @@ fa_IR: tags: "برچسب‌‌ها" interface: "رابط" apps: "برنامه‌ها" + calendar_subscriptions: "تقویم" + calendar_subscriptions: + copied: "کپی شد!" + add_to_google: "تقویم گوگل" change_password: success: "(ایمیل ارسال شد)" in_progress: "(فرستادن ایمیل)" @@ -2121,6 +2125,7 @@ fa_IR: form_kit: reset: بازنشانی optional: اختیاری + required: مورد نیاز dirty_form: "شما تغییرات خود را ارسال نکرده‌اید! آیا مطمئنید می‌خواهید بروید؟" errors: required: "مورد نیاز" @@ -2974,11 +2979,8 @@ fa_IR: confirm: "تایید" select_all: "انتخاب همه" clear_all: "پاکسازی همه" - unlist_topics: "از فهرست خارج کردن مباحث" - relist_topics: "ایجاد فهرست مجدد از موضوعات" reset_bump_dates: "بازنشانی تاریخ بالا آوردن" defer: "علامت گذاری به عنوان خوانده نشده" - delete: "حذف موضوعات" delete_topics_count: one: "پاک کردن موضوع" other: "حذف موضوعات" @@ -3011,29 +3013,18 @@ fa_IR: other: "رد کردن (%{count}) موضوع جدید" toggle: "تغییر وضعیت انتخاب گروهی موضوعات" actions: "عملیات گروهی" - change_category: "تنظیم دسته‌بندی…" - close_topics: "بستن موضوعات" - archive_topics: "بایگانی موضوعات" move_messages_to_inbox: "انتقال به صندوق دریافت" archive_messages: "انتقال به بایگانی" - notification_level: "اعلان‌ها…" change_notification_level: "تغییر سطح آگاه‌سازی" choose_new_category: "یک دسته‌بندی جدید برای موضوع انتخاب نمایید" - selected: - one: "شما %{count} موضوع را انتخاب کرده اید." - other: "شما %{count} موضوع را انتخاب کرده اید." selected_sole_category: one: "شما %{count} موضوع را از دسته انتخاب کرده اید:" other: "شما %{count} موضوع را از دسته انتخاب کرده اید:" selected_count: one: "%{count} تا انتخاب شده است" other: "%{count} تا انتخاب شده است" - change_tags: "جایگزینی برچسب‌ها" - append_tags: "افزودن برچسب‌ها" choose_new_tags: "انتخاب برچسب‌های جدید برای این موضوعات:" - choose_append_tags: "انتخاب برچسب‌های جدید برای افزودن به این موضوعات:" changed_tags: "انتخاب برچسب برای موضوعاتی که عوض شدند" - remove_tags: "حذف همه‌ی برچسب‌ها" confirm_remove_tags: one: "همه برچسب ها از این موضوع حذف خواهند شد. آیا مطمئن هستید؟" other: "همه برچسب ها از %{count} موضوع حذف خواهند شد. آیا مطمئن هستید؟" @@ -3062,7 +3053,6 @@ fa_IR: name: "رد کردن" close_topics: name: "بستن" - note: "یادداشت" optional: (اختیاری) archive_topics: name: "بایگانی" @@ -3076,24 +3066,18 @@ fa_IR: name: "فهرست مجدد" remove_tags: name: "حذف برچسب‌ها" - append_tags: - name: "افزودن برچسب‌ها" replace_tags: name: "جایگزینی برچسب‌ها" delete_topics: name: "حذف" update_category: name: "به روز رسانی دسته" - description: "دسته بندی جدید را برای موضوعات انتخاب شده انتخاب کنید" reset_bump_dates: name: "بازنشانی تاریخ‌های بالا آوردن" - description: "تاریخ بالا آوردن موضوع را به تاریخ آخرین پست ایجاد شده در آن موضوع بازنشانی کنید، که روی ترتیب در لیست موضوع تأثیر می‌گذارد" defer: name: "علامت گذاری به عنوان خوانده نشده" - description: "علامت گذاری موضوعات به عنوان خوانده نشده" update_notifications: name: "به روز رسانی اعلان‌ها" - description: "سطح اعلان را به دنبال کردن، پیگیری کردن، عادی یا بی‌صدا تغییر دهید" topic: filter_to: one: "%{count} نوشته در این موضوع وجود دارد" @@ -3838,6 +3822,8 @@ fa_IR: delete: "حذف دسته‌بندی" create: "دسته‌بندی جدید" create_long: "ایجاد یک دسته‌بندی جدید" + type_settings_schema: + site_settings: "تنظیمات سایت" save: "ذخیره دسته‌بندی" slug_placeholder: "(اختیاری) کلمه با - جدا شده برای پیوند" creation_error: خطایی در ساخت این دسته بروز کرد. @@ -3866,6 +3852,8 @@ fa_IR: list: "فهرست دسته‌بندی‌ها" no_description: "لطفا برای این دسته بندی توضیحاتی اضافه نمایید." change_in_category_topic: "ویرایش توضیحات" + description_expand: "نمایش بیشتر" + description_collapse: "نمایش کمتر" already_used: "این رنگ توسط یک دسته بندی دیگر گزیده شده است" security: "امنیت" security_add_group: "افزودن گروه" @@ -4855,8 +4843,6 @@ fa_IR: back: "بازگشت به همه گزارش‌ها" group_traffic: "ترافیک" group_members: "اعضاء" - group_moderation: "نظارت" - group_security: "امنیت" group_other: "دیگر" config_sections: account: @@ -5170,7 +5156,7 @@ fa_IR: all: "همه" view_table: "جدول" view_graph: "نمودار" - refresh_report: "تازه کردن گزارش" + refresh_report: "تازه‌سازی" daily: روزانه monthly: ماهیانه weekly: هفتگی @@ -6995,7 +6981,7 @@ fa_IR: confirm: "بله، سیاست رمز عبور را به روز کنید" min_admin_password_length: confirm: "بله، سیاست رمز عبور را به روز کنید" - password_unique_charactes: + password_unique_characters: confirm: "بله، سیاست رمز عبور را به روز کنید" block_common_passwords: confirm: "بله، سیاست رمز عبور را به روز کنید" diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml index 74faf25e7d035..415ae92269fb0 100644 --- a/config/locales/client.fi.yml +++ b/config/locales/client.fi.yml @@ -1654,6 +1654,10 @@ fi: interface: "Käyttöliittymä" apps: "Sovellukset" navigation_menu: "Navigointivalikko" + calendar_subscriptions: "Kalenteri" + calendar_subscriptions: + copied: "Kopioitiin!" + add_to_google: "Google-kalenteri" change_password: success: "(sähköposti lähetetty)" in_progress: "(sähköpostia lähetetään)" @@ -2256,6 +2260,7 @@ fi: form_kit: reset: Palauta optional: valinnainen + required: pakollinen dirty_form: "Et lähettänyt muutoksiasi! Oletko varma, että haluat poistua?" errors: starts_with: "Täytyy alkaa %{prefix}" @@ -3184,11 +3189,8 @@ fi: confirm: "Vahvista" select_all: "Valitse kaikki" clear_all: "Tyhjennä kaikki" - unlist_topics: "Poista ketjuja listauksista" - relist_topics: "Palauta ketjuja listauksiin" reset_bump_dates: "Nollaa nostopäivät" defer: "Merkitse lukemattomaksi" - delete: "Poista ketjut" delete_topics_count: one: "Poista ketju" other: "Poista ketjut" @@ -3221,29 +3223,20 @@ fi: other: "Kuittaa uudet (%{count})" toggle: "Vaihda useamman ketjun valintaa" actions: "Joukkotoiminnot" - change_category: "Määritä alue…" - close_topics: "Sulje ketjut" - archive_topics: "Arkistoi ketjut" move_messages_to_inbox: "Siirrä saapuneisiin" archive_messages: "Siirrä arkistoon" - notification_level: "Ilmoitukset…" change_notification_level: "Muuta ilmoitustasoa" choose_new_category: "Valitse uusi alue ketjuille:" - selected: - one: "Olet valinnut %{count} ketjun." - other: "Olet valinnut %{count} ketjua." selected_sole_category: one: "Olet valinnut %{count} ketjun alueelta:" other: "Olet valinnut %{count} ketjua alueelta:" selected_count: one: "%{count} valittu" other: "%{count} valittu" - change_tags: "Korvaa tunnisteet" append_tags: "Lisää tunnisteita" choose_new_tags: "Valitse tunnisteet näille ketjuille:" - choose_append_tags: "Valitse ketjuille lisättävät uudet tunnisteet:" + choose_append_tags: "Lisää tunnisteita" changed_tags: "Ketjujen tunnisteet muutettiin." - remove_tags: "Poista kaikki tunnisteet" confirm_remove_tags: one: "Kaikki tunnisteet poistetaan tästä ketjusta. Oletko varma?" other: "Kaikki tunnisteet poistetaan %{count} ketjusta. Oletko varma?" @@ -3277,7 +3270,6 @@ fi: name: "Selvä" close_topics: name: "Sulje" - note: "Huomautus" optional: (valinnainen) archive_topics: name: "Arkistoi" @@ -3291,24 +3283,18 @@ fi: name: "Lisää luetteloon uudelleen" remove_tags: name: "Poista tunnisteita" - append_tags: - name: "Lisää tunnisteita" replace_tags: name: "Korvaa tunnisteet" delete_topics: name: "Poista" update_category: name: "Päivitä alue" - description: "Valitse uusi alue valituille ketjuille" reset_bump_dates: name: "Nollaa nostopäivät" - description: "Palauta ketjun nostopäiväksi viimeksi luodun viesti julkaisupäivä, mikä vaikuttaa järjestykseen ketjuluettelossa" defer: name: "Merkitse lukemattomaksi" - description: "Merkitse ketjut lukemattomiksi" update_notifications: name: "Päivitä ilmoitukset" - description: "Vaihda ilmoitustasoksi Tarkkailussa, Seurannassa, Normaali tai Vaimennettu." topic: filter_to: one: "%{count} viesti ketjussa" @@ -4075,6 +4061,8 @@ fi: tag_group: "Tunnisteryhmä" topic_featured_link_allowed: "Salli ketjulinkit tällä alueella" create_long: "Luo uusi alue" + type_settings_schema: + site_settings: "Sivustoasetukset" unsaved_changes: "Sinulla on tallentamattomia muutoksia" slug_placeholder: "(Valinnainen) väliviivoilla erotettuja sanoja URL-osoitetta varten" creation_error: Alueen luonnissa tapahtui virhe. @@ -4107,6 +4095,8 @@ fi: list: "Listaa alueet" no_description: "Lisää alueelle kuvaus." change_in_category_topic: "Muokkaa kuvausta" + description_expand: "Näytä lisää" + description_collapse: "Näytä vähemmän" already_used: "Tämä väri on jo käytössä toisella alueella" color_palette: "Väripaletti" security: "Turvallisuus" @@ -5189,8 +5179,6 @@ fi: back: "Takaisin kaikkiin raportteihin" group_traffic: "Liikenne" group_members: "Jäsenet" - group_moderation: "Valvonta" - group_security: "Tietoturva" group_other: "Muut" config_sections: account: @@ -5673,7 +5661,7 @@ fi: all: "Kaikki" view_table: "taulukko" view_graph: "kaavio" - refresh_report: "Päivitä raportti" + refresh_report: "Päivitä" daily: Päivittäin monthly: Kuukausittain weekly: Viikoittain @@ -7727,7 +7715,7 @@ fi: confirm: "Kyllä, päivitä salasanakäytäntö" min_admin_password_length: confirm: "Kyllä, päivitä salasanakäytäntö" - password_unique_charactes: + password_unique_characters: confirm: "Kyllä, päivitä salasanakäytäntö" block_common_passwords: confirm: "Kyllä, päivitä salasanakäytäntö" diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml index 523894993678a..0b79cb96cb2cb 100644 --- a/config/locales/client.fr.yml +++ b/config/locales/client.fr.yml @@ -1665,6 +1665,10 @@ fr: interface: "Interface" apps: "Applications" navigation_menu: "Menu de navigation" + calendar_subscriptions: "Calendrier" + calendar_subscriptions: + copied: "Copié !" + add_to_google: "Calendrier Google" change_password: success: "(e-mail envoyé)" in_progress: "(e-mail en cours d'envoi)" @@ -2271,6 +2275,7 @@ fr: form_kit: reset: Réinitialiser optional: facultatif + required: obligatoire dirty_form: "Vous n'avez pas soumis vos modifications ! Voulez-vous vraiment partir ?" errors: starts_with: "Doit commencer par %{prefix}" @@ -3199,11 +3204,8 @@ fr: confirm: "Confirmer" select_all: "Tout sélectionner" clear_all: "Tout désélectionner" - unlist_topics: "Rendre les sujets invisibles" - relist_topics: "Lister les sujets" reset_bump_dates: "Réinitialiser la date d'actualisation" defer: "Marquer comme non lu" - delete: "Supprimer les sujets" delete_topics_count: one: "Supprimer le sujet" other: "Supprimer les sujets" @@ -3236,29 +3238,20 @@ fr: other: "Marquer les nouveaux sujets comme lus (%{count})" toggle: "activer/désactiver la sélection multiple de sujets" actions: "Actions sur la sélection" - change_category: "Définir la catégorie…" - close_topics: "Fermer les sujets" - archive_topics: "Archiver les sujets" move_messages_to_inbox: "Déplacer dans la boîte de réception" archive_messages: "Déplacer vers les archives" - notification_level: "Notifications…" change_notification_level: "Modifier le niveau de notification" choose_new_category: "Choisissez la nouvelle catégorie pour ces sujets :" - selected: - one: "Vous avez sélectionné %{count} sujet." - other: "Vous avez sélectionné %{count} sujets." selected_sole_category: one: "Vous avez sélectionné %{count} sujet de la catégorie :" other: "Vous avez sélectionné %{count} sujets de la catégorie :" selected_count: one: "Sélection : %{count}" other: "Sélection : %{count}" - change_tags: "Remplacer des étiquettes" append_tags: "Ajouter des étiquettes" choose_new_tags: "Choisissez de nouvelles étiquettes pour ces sujets :" - choose_append_tags: "Choisissez de nouvelles étiquettes à ajouter à ces sujets :" + choose_append_tags: "Ajouter des étiquettes" changed_tags: "Les étiquettes de ces sujets ont été modifiées." - remove_tags: "Supprimer toutes les étiquettes" confirm_remove_tags: one: "Toutes les étiquettes seront supprimées de ce sujet. Voulez-vous continuer ?" other: "Toutes les étiquettes seront supprimées des %{count} sujets. Voulez-vous continuer ?" @@ -3292,7 +3285,6 @@ fr: name: "Rejeter" close_topics: name: "Fermer" - note: "Note" optional: (facultatif) archive_topics: name: "Archive" @@ -3306,24 +3298,18 @@ fr: name: "Remettre dans la liste" remove_tags: name: "Supprimer des étiquettes" - append_tags: - name: "Ajouter des étiquettes" replace_tags: name: "Remplacer des étiquettes" delete_topics: name: "Supprimer" update_category: name: "Mettre à jour la catégorie" - description: "Choisissez la nouvelle catégorie pour les sujets sélectionnés" reset_bump_dates: name: "Réinitialiser la date d'actualisation" - description: "Réinitialisez la date d'actualisation du sujet à la date de la dernière publication créée, ce qui affecte l'ordre dans la liste des sujets" defer: name: "Marquer comme non lu" - description: "Marquer les sujets comme non lus" update_notifications: name: "Mettre à jour les notifications" - description: "Réglez le niveau de notification en mode Surveillance, Suivi, Normal ou Désactivé" topic: filter_to: one: "%{count} message dans le sujet" @@ -4101,6 +4087,8 @@ fr: tag_group: "Groupe d'étiquettes " topic_featured_link_allowed: "Autoriser les liens à la une dans cette catégorie" create_long: "Créer une nouvelle catégorie" + type_settings_schema: + site_settings: "Paramètres du site" unsaved_changes: "Vous avez des modifications non enregistrées" slug_placeholder: "(Facultatif) mots séparés par des tirets pour l'URL" creation_error: Une erreur s'est produite lors de la création de la catégorie. @@ -4133,6 +4121,8 @@ fr: list: "Répertorier les catégories" no_description: "Veuillez ajouter une description pour cette catégorie." change_in_category_topic: "Modifier la description" + description_expand: "Afficher plus" + description_collapse: "Afficher moins" already_used: "Cette couleur est déjà utilisée par une autre catégorie" color_palette: "Palette de couleurs" security: "Sécurité" @@ -5215,8 +5205,6 @@ fr: back: "Retour à tous les rapports" group_traffic: "Trafic" group_members: "Membres" - group_moderation: "Modération" - group_security: "Sécurité" group_other: "Autre" config_sections: account: @@ -5699,7 +5687,7 @@ fr: all: "Tous" view_table: "tableau" view_graph: "graphique" - refresh_report: "Actualiser le rapport" + refresh_report: "Actualiser" daily: Quotidien monthly: Mensuel weekly: Hebdomadaire @@ -6267,7 +6255,7 @@ fr: back: "Retour aux composants" install: "Installer" name: "Nom" - used_on: "Utilisé le" + used_on: "Utilisé sur" enabled: "Activé ?" by_author: "Par %{name}" learn_more: "En savoir plus" @@ -7746,7 +7734,7 @@ fr: confirm: "Oui, mettre à jour la politique relative aux mots de passe" min_admin_password_length: confirm: "Oui, mettre à jour la politique relative aux mots de passe" - password_unique_charactes: + password_unique_characters: confirm: "Oui, mettre à jour la politique relative aux mots de passe" block_common_passwords: confirm: "Oui, mettre à jour la politique relative aux mots de passe" diff --git a/config/locales/client.gl.yml b/config/locales/client.gl.yml index 210634a21466b..97a6b23a4558c 100644 --- a/config/locales/client.gl.yml +++ b/config/locales/client.gl.yml @@ -1112,6 +1112,8 @@ gl: tags: "Etiquetas" interface: "Interface" apps: "Apps" + calendar_subscriptions: + copied: "Copiado!" change_password: success: "(correo enviado)" in_progress: "(enviando o correo)" @@ -1554,6 +1556,7 @@ gl: form_kit: reset: Restabelecer optional: opcional + required: obrigatorio errors: required: "Obrigatorio" close: "Pechar" @@ -2104,9 +2107,6 @@ gl: confirm: "Confirmar" select_all: "Seleccionar todo" clear_all: "Borrar todo" - unlist_topics: "Retirar temas da listaxe" - relist_topics: "Refacer a listaxe de temas" - delete: "Eliminar temas" delete_topics_count: one: "Eliminar tema" other: "Eliminar temas" @@ -2118,20 +2118,11 @@ gl: dismiss_new: "Desbotar novas" toggle: "cambiar a selección en bloque dos temas" actions: "Accións en bloque" - close_topics: "Pechar temas" - archive_topics: "Arquivar temas" move_messages_to_inbox: "Mover á caixa de entrada" change_notification_level: "Cambiar o nivel de notificacións" choose_new_category: "Seleccionar a nova categoría dos temas:" - selected: - one: "Seleccionou %{count} tema." - other: "Seleccionou %{count} temas." - change_tags: "Substituír etiquetas" - append_tags: "Anexar etiquetas" choose_new_tags: "Seleccione novas etiquetas para estes temas:" - choose_append_tags: "Seleccione novas etiquetas para anexar a estes temas:" changed_tags: "As etiquetas deses temas cambiaron." - remove_tags: "Retirar etiquetas" confirm_remove_tags: one: "Retiraranse todas as etiquetas deste tema. Está seguro?" other: "Retiraranse todas as etiquetas destes %{count} temas. Está seguro?" @@ -2162,8 +2153,6 @@ gl: name: "Mover á caixa de entrada" remove_tags: name: "Retirar etiquetas" - append_tags: - name: "Anexar etiquetas" replace_tags: name: "Substituír etiquetas" delete_topics: @@ -3418,8 +3407,6 @@ gl: sidebar_title: "Informes" group_traffic: "Tráfico" group_members: "Membros" - group_moderation: "Moderación" - group_security: "Seguranza" group_other: "Outro" config_sections: account: @@ -3639,7 +3626,7 @@ gl: all: "Todo" view_table: "táboa" view_graph: "gráfica" - refresh_report: "Actualizar informe" + refresh_report: "Actualizar" daily: Diario monthly: Mensual weekly: Semanal diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml index abe2b8b5a9534..e30e003d5766f 100644 --- a/config/locales/client.he.yml +++ b/config/locales/client.he.yml @@ -1911,6 +1911,10 @@ he: apps: "יישומים" navigation_menu: "תפריט ניווט" upcoming_changes: "שינויים צפויים" + calendar_subscriptions: "לוח שנה" + calendar_subscriptions: + copied: "הועתק!" + add_to_google: "לוח שנה של Google" change_password: success: "(דוא״ל נשלח)" in_progress: "(דוא״ל בשליחה)" @@ -2555,6 +2559,7 @@ he: form_kit: reset: איפוס optional: רשות + required: נדרש dirty_form: "לא הגשת את השינויים שלך! לצאת?" errors: starts_with: "חייב להיפתח בקידומת %{prefix}" @@ -3615,11 +3620,8 @@ he: confirm: "אישור" select_all: "בחירה בהכול" clear_all: "לפנות הכול" - unlist_topics: "הסרת נושאים" - relist_topics: "רשימה מחדש של נושאים" reset_bump_dates: "איפוס תאריכי ההקפצות" defer: "סימון כלא נקרא" - delete: "מחיקת נושאים" delete_topics_count: one: "מחק נושא" two: "מחיקת נושאים" @@ -3674,19 +3676,10 @@ he: other: "להתעלם מחדשים (%{count})" toggle: "החלף קבוצה מסומנת של נושאים" actions: "מקבץ פעולות" - change_category: "הגדרת קטגוריה…" - close_topics: "סגירת נושאים" - archive_topics: "העברת נושאים לארכיון" move_messages_to_inbox: "העברה לדואר נכנס" archive_messages: "העברה לארכיון" - notification_level: "התראות…" change_notification_level: "שינוי רמת ההתראות" choose_new_category: "נא לבחור קטגוריה לנושאים:" - selected: - one: "בחרת בנושא." - two: "בחרת בשני נושאים." - many: "בחרת ב־%{count} נושאים." - other: "בחרת ב־%{count} נושאים." selected_sole_category: one: "בחרת נושא %{count} מהקטגוריה:" two: "בחרת %{count} נושאים מהקטגוריה:" @@ -3697,12 +3690,10 @@ he: two: "%{count} נבחרו" many: "%{count} נבחרו" other: "%{count} נבחרו" - change_tags: "החלפת תגיות" append_tags: "הוספת תגיות" choose_new_tags: "בחירה בתגיות חדשות לנושאים אלו:" - choose_append_tags: "בחירה בתגיות חדשות שיתווספו לנושאים אלו:" + choose_append_tags: "הוספת תגיות" changed_tags: "התגיות של נושאים אלו השתנו." - remove_tags: "הסרת כל התגיות" confirm_remove_tags: one: "כל התגיות יוסרו מהנושא הזה. להמשיך?" two: "כל התגיות יוסרו מ־%{count} הנושאים האלה. להמשיך?" @@ -3713,7 +3704,7 @@ he: two: "התקדמות: %{count} נושאים" many: "התקדמות: %{count} נושאים" other: "התקדמות: %{count} נושאים" - notify: "להודיע למשתמשים על השינוי הזה." + notify: "להודיע למשתמשים על השינוי הזה" performing: "מתבצעות פעולות במרוכז, נא להמתין…" completed: "הפעולות במרוכזת הושלמו בהצלחה!" error_topic_count: @@ -3743,7 +3734,6 @@ he: name: "התעלמות" close_topics: name: "סגירה" - note: "הערה" optional: (רשות) archive_topics: name: "ארכב" @@ -3757,24 +3747,18 @@ he: name: "החזרה" remove_tags: name: "הסרת תגיות" - append_tags: - name: "הוספת תגיות" replace_tags: name: "החלפת תגיות" delete_topics: name: "מחיקה" update_category: name: "עדכון קטגוריה" - description: "נא לבחור קטגוריה חדשה לנושאים הנבחרים" reset_bump_dates: name: "איפוס תאריכי הקפצה" - description: "איפוס תאריכי הקפצת הנושאים לתאריך של הפוסט האחרון שנוצר, מה שמשפיע על הסדר ברשימת הנושאים" defer: name: "סימון כלא נקרא" - description: "סימון נושאים כנקראו" update_notifications: name: "עדכון התראות" - description: "שינוי רמת ההתראה לצפייה, מעקב, רגיל או מושתק" topic: filter_to: one: "פוסט אחד בנושא" @@ -4660,6 +4644,8 @@ he: delete: "מחיקת קטגוריה" create: "קטגוריה חדשה" create_long: "יצירת קטגוריה חדשה" + type_settings_schema: + site_settings: "הגדרות האתר" save: "שמירת קטגוריה" unsaved_changes: "יש שינויים שלא נשמרו" slug: "כתובת ייצוגית לקטגוריה" @@ -4703,6 +4689,8 @@ he: list: "הצגת קטגוריות" no_description: "אנא הוסיפו תיאור לקטגוריה זו." change_in_category_topic: "עריכת תיאור" + description_expand: "להציג יותר" + description_collapse: "להציג פחות" already_used: "הצבע הזה בשימוש על ידי קטגוריה אחרת" color_palette: "ערכת צבעים" security: "אבטחה" @@ -5919,8 +5907,6 @@ he: back: "חזרה לכל הדוחות" group_traffic: "תנועה" group_members: "חברים" - group_moderation: "פיקוח" - group_security: "אבטחה" group_other: "אחר" config_sections: account: @@ -6496,7 +6482,7 @@ he: all: "הכול" view_table: "טבלה" view_graph: "גרף" - refresh_report: "ריענון דוח" + refresh_report: "רענון" daily: יומי monthly: חודשי weekly: שבועי @@ -8643,7 +8629,7 @@ he: min_admin_password_length: prompt: "הפעולה הזאת תשנה את מדיניות הסיסמאות שלך. היא תשפיע על כל המנהלים שישנו את הסיסמה שלהם מעתה ואילך. להמשיך?" confirm: "כן, לעדכן את מדיניות הסיסמאות" - password_unique_charactes: + password_unique_characters: prompt: "הפעולה הזאת תשנה את מדיניות הסיסמאות שלך. היא תשפיע על כל המשתמשים שישנו את הסיסמה שלהם מעתה ואילך. להמשיך?" confirm: "כן, לעדכן את מדיניות הסיסמאות" block_common_passwords: diff --git a/config/locales/client.hr.yml b/config/locales/client.hr.yml index 3fc6a1afb3c4a..c7428dcd1a825 100644 --- a/config/locales/client.hr.yml +++ b/config/locales/client.hr.yml @@ -1752,6 +1752,9 @@ hr: interface: "Sučelje" apps: "Aplikacije" navigation_menu: "Navigacijski izbornik" + calendar_subscriptions: + copied: "Kopirano!" + add_to_google: "Google kalendar" change_password: success: "(email je poslan)" in_progress: "(email se šalje)" @@ -2370,6 +2373,7 @@ hr: form_kit: reset: Resetirati optional: neobvezno + required: potrebno dirty_form: "Niste poslali promjene! Jeste li sigurni da želite otići?" errors: starts_with: "Mora početi sa %{prefix}" @@ -3357,11 +3361,8 @@ hr: confirm: "Potvrdi" select_all: "Odaberi sve" clear_all: "Očistiti sve" - unlist_topics: "Poništite popis tema" - relist_topics: "Poništite popis tema" reset_bump_dates: "Resetiraj datum obnove" defer: "Označi kao nepročitano" - delete: "Obriši teme" delete_topics_count: one: "Obriši temu" few: "Obriši teme" @@ -3400,18 +3401,10 @@ hr: other: "Odbaci novo (%{count})" toggle: "uključi/isključi skupni odabir tema" actions: "Grupne aktivnosti" - change_category: "Postavi kategoriju…" - close_topics: "Zatvori teme" - archive_topics: "Arhiviraj teme" move_messages_to_inbox: "Premjesti u Inbox" archive_messages: "Premjestiti u arhivu" - notification_level: "Obavijesti…" change_notification_level: "Promijenite razinu obavijesti" choose_new_category: "Odaberite novu kategoriju za teme:" - selected: - one: "Odabrali ste %{count} temu." - few: "Odabrali ste %{count} tema." - other: "Odabrali ste %{count} tema." selected_sole_category: one: "Odabrali ste %{count} temu iz kategorije:" few: "Odabrali ste %{count} teme iz kategorije:" @@ -3420,12 +3413,10 @@ hr: one: "%{count} odabrano" few: "%{count} odabrano" other: "%{count} odabrano" - change_tags: "Zamijeni oznake" - append_tags: "Dodajte oznake" + append_tags: "Dodaj oznake" choose_new_tags: "Odaberite nove oznake za ove teme:" - choose_append_tags: "Odaberite nove oznake za dodavanje ovim temama:" + choose_append_tags: "Dodaj oznake" changed_tags: "Oznake tih tema su promijenjene." - remove_tags: "Ukloni sve oznake" confirm_remove_tags: one: "Sve oznake bit će uklonjene iz ove teme. Jesi li siguran?" few: "Sve oznake %{count} bit će uklonjene iz ove teme. Jeste li sigurni?" @@ -3462,7 +3453,6 @@ hr: name: "Skloni" close_topics: name: "Zatvori" - note: "Bilješka" optional: (opcionalno) archive_topics: name: "Arhiva" @@ -3476,24 +3466,18 @@ hr: name: "Ponovno objavite" remove_tags: name: "Ukloni oznake" - append_tags: - name: "Dodajte oznake" replace_tags: name: "Zamijeni oznake" delete_topics: name: "Pobriši" update_category: name: "Ažuriraj kategoriju" - description: "Odaberi novu kategoriju za odabrane teme" reset_bump_dates: name: "Poništite datume isticanja" - description: "Vratite datum isticanja teme na datum zadnje kreirane objave, što utječe na redoslijed na popisu tema" defer: name: "Označi kao nepročitano" - description: "Označi teme kao nepročitane" update_notifications: name: "Ažurirajte obavijesti" - description: "Promijenite razinu obavijesti na Gledanje, Praćenje, Uobičajeno ili Utišano" topic: filter_to: one: "%{count} objava u temi" @@ -4305,6 +4289,8 @@ hr: tag_group: "Grupa oznaka" topic_featured_link_allowed: "Dopusti istaknute poveznice u ovoj kategoriji" create_long: "Stvorite novu kategoriju" + type_settings_schema: + site_settings: "Postavke web-mjesta" unsaved_changes: "Imate nespremljene promjene" slug_placeholder: "(Neobavezno) spojene-riječi za url" creation_error: Dogodila se greška pri stvaranju kategorije. @@ -4335,6 +4321,8 @@ hr: delete_confirm: "Jeste li sigurni da želite izbrisati ovu kategoriju?" delete_error: "Dogodila se greška pri brisanju kategrije." no_description: "Molimo dodajte opis ovoj kategoriji." + description_expand: "Prikaži više" + description_collapse: "Prikaži manje" already_used: "Ova boja se koristi u drugoj kategoriji." security: "Sigurnost" security_add_group: "Dodajte grupu" @@ -5461,8 +5449,6 @@ hr: back: "Povratak na sva izvješća" group_traffic: "Promet" group_members: "Članovi" - group_moderation: "Moderiranje" - group_security: "Sigurnost" group_other: "Ostalo" config_sections: account: @@ -5866,7 +5852,7 @@ hr: all: "Sve" view_table: "tablica" view_graph: "grafikon" - refresh_report: "Osvježi izvješće" + refresh_report: "Osvježi" daily: Dnevno monthly: Mjesečno weekly: Tjedno @@ -7427,7 +7413,7 @@ hr: requires_confirmation_messages: min_admin_password_length: confirm: "Da, ažuriraj pravila o lozinkama" - password_unique_charactes: + password_unique_characters: confirm: "Da, ažuriraj pravila o lozinkama" badges: status: Statust diff --git a/config/locales/client.hu.yml b/config/locales/client.hu.yml index 5dbfcb898ac17..2aa2f9540d16d 100644 --- a/config/locales/client.hu.yml +++ b/config/locales/client.hu.yml @@ -9,9 +9,19 @@ hu: blocks: ghost: status: "Állapot" + conditions: "Feltételek" + arguments: "Paraméterek" + container_args: "Konténer paraméterek" in_location: "ebben:" hidden: "rejtett" + not_registered: "nincs regisztrálva" + no_visible_children: "Nincsenek megjeleníthető alelemek" failed: "sikertelen" + ghost_reasons: + optional_missing_hint: "Ez az opcionális blokk nem jelenik meg, mert nincs regisztrálva." + no_visible_children_hint: "Ez a konténerblokk nem jelenik meg, mert egyetlen aleleme sem látható." + condition_failed_hint: "Ez a blokk nem jelenik meg, mert a feltételei nem teljesültek." + head_hidden_tail_hint: "Ez a blokk nem jelenik meg, mert a head konténerben már egy másik blokk korábban megjelent." carousel: go_to_slide: "%{index} elemre ugrás" previous: "Előző elem" @@ -303,10 +313,13 @@ hu: skip_to_top: "Ugrás a tetejére" skip_user_nav: "Ugrás a profil tartalmára" emails_are_disabled: "Egy adminisztrátor letiltotta a kimenő e-maileket. Semmilyen értesítő e-mail nem lesz elküldve." + emails_are_disabled_no_smtp: "Minden kimenő e-mail le van tiltva, mivel nincs beállítva SMTP-szerver. Semmiféle e-mailt nem lehet kiküldeni." emails_are_disabled_non_staff: "A kimenő e-mailek le vannak tiltva a nem stábtagok számára." software_update_prompt: message: "Frissítettük ezt az oldalt, frissítse a zökkenőmentes működésért." dismiss: "Elvetés" + notifications_tracking: + tooltip: "Értesítési szint: %{level}" back_button: "Vissza" welcome_banner: header: @@ -326,12 +339,27 @@ hu: broken_page_change_alert: "Egy onPageChange kezelő hibát jelzett. További információért nézze meg a böngésző fejlesztői eszközeit." broken_plugin_alert: "A(z) „%{name}” bővítmény okozta." broken_transformer_alert: "Hiba történt. Előfordulhat, hogy webhelye nem működik megfelelően." + broken_block_alert: "Blokkkonfigurációs hibát észleltünk. A részletekért tekintse meg a böngésző konzolját." + broken_block_factory_alert: "Egy blokk betöltése sikertelen. Előfordulhat, hogy egyes felületi elemek nem jelennek meg megfelelően." critical_deprecation: notice: "[Admin közlemény] %{source} olyan kódot tartalmaz, ami frissítésre szorul. (id:%{id})" learn_more_link: "(további információ)" theme_source: "„%{name}” téma" plugin_source: "„%{name}” bővítmény" unknown_source: "Az egyik témája vagy bővítménye" + dev_tools: + drag_to_move: "Húzza a mozgatáshoz" + toggle_plugin_outlet_debug: "Bővítménykimenet hibakeresésének be-/kikapcsolása" + toggle_block_debug: "Blokk hibakeresésének ki-/bekapcsolása" + block_debug: + outlet_boundaries: "Kimeneti határfeltételek" + visual_overlay: "Vizuális átfedés" + ghost_blocks: "Szellemblokkok" + condition_debugging: "Feltétel hibakeresése" + toggle_safe_mode: "Biztonságos mód be-/kikapcsolása" + toggle_verbose_localization: "Részletes honosítási mód be-/kikapcsolása" + toggle_mobile_view: "Mobil nézet be-/kikapcsolása" + disable_dev_tools: "Fejlesztői eszközök letiltása" s3: regions: ap_northeast_1: "Csendes-óceáni térség (Tokió)" @@ -421,9 +449,39 @@ hu: pill: "Ajánlott" pm_title: "Ajánlott üzenetek" admin_onboarding_banner: + launch_in_easy_steps: "Indítás %{step_count} egyszerű lépésben" + skipped: "Az adminisztrátori bevezetési ellenőrzőlista átugrásra került. Ha szeretné újra engedélyezni, keresse az enable site owner onboarding beállítást az oldalbeállítások között." + congrats_onboarding_complete: "Gratulálunk a bevezetési folyamat elvégzéséhez!" + invite_collaborators: + title: "Együttműködők meghívása" + description: "Az első tagok segítenek életre kelteni a közösségedet." + action: "Meghívó létrehozása" start_posting: + title: "Kezdj el posztolni!" + description: "Adj témát a közös beszélgetéshez!" + action: "Jégtörő témaötlet" + choose_option: "Hogyan szeretnél kezdeni?" + predefined_topics: "Jégtörő sablonok" + predefined_topics_subtitle: "Adj témát az új tagoknak a beszélgetéshez: válassz egy sablont, szerkeszd meg, és alakítsd a sajátodra!" + predefined_topics_description: "Válogass a beszélgetésindító ötletek közül, és indítsd be a társalgást!" + use_predefined: "Sablonok böngészése" back: "Vissza" + icebreakers: + fun_facts: + title: "Milyen érdekességeket tudsz rólad mondani?" + body: "Sziasztok! Nagyon örülök, hogy elindíthatom ezt az új közösséget. Kezdésként osszunk meg magunkról egy-egy érdekességet! Kezdem is a sort: imádok túrázni és új ösvényeket felfedezni. Rólatok mit érdemes tudni? Mi az az érdekesség, amit megosztanátok velünk?" + coolest_thing_you_have_seen_today: + title: "Mi a legmenőbb dolog, amit ma láttál?" + body: "Mi a legmenőbb dolog, amit ma láttál vagy tapasztaltál? Bármi lehet, egy gyönyörű naplementétől kezdve egy véletlenszerű kedves gesztusig. Kezdem: Láttam egy kutyát, amint segített egy idős embernek átkelni az úton!" + introduce_yourself: + title: "Mutasd be magad" + body: "Üdv a közösségben! Ismerjük meg egymást. Kérlek mutatkozz be, és mesélj egy kicsit az érdeklődési körödről. Először én kezdem: szenvedélyesen rajongok a technológiáért, és szeretek másokat tanítani!" + what_is_your_favorite_food: + title: "Mi a kedvenc ételed?" + body: "Oszd meg kedvenc ételeidet a közösséggel! Kezdjük: Imádom a pizzát, főleg extra sajttal és pepperonival." spread_the_word: + title: "Terjeszd az igét!" + description: "Ossz meg egy linket mindenkivel a hálózatodban" action: "Hivatkozás másolása" copied_to_clipboard: "Hivatkozás vágólapra másolva!" about: @@ -600,6 +658,10 @@ hu: other_drafts: one: "+%{count} egyéb piszkozat" other: "+%{count} egyéb piszkozat" + embed_mode: + storage_access_prompt: "Már van %{site_name} fiókod? Engedélyezd a hozzáférést a munkamenetedhez, hogy saját nevedben hozzászólhass." + allow_access: "Hozzáférés engedélyezése" + continue_as_guest: "Folytatás vendégként" topic_count_all: one: "%{count} új téma megtekintése" other: "%{count} új téma megtekintése" @@ -665,13 +727,19 @@ hu: in_reply_to: "válasz erre:" filtered_flagged_by: "Megjelölte" unknown: + title: + one: "Függőben lévő moderációs tételek egy letiltott bővítményből:" + other: "Függőben lévő moderációs tételek egy letiltott bővítményekből:" instruction: "Nem jeleníthetők meg megfelelően, amíg nem engedélyezi a megfelelő bővítményt. Engedélyezze a bővítményt, és frissítse az oldalt. Alternatív megoldásként figyelmen kívül hagyhatja őket. További információ…" reviewable_unknown_source: "%{reviewableType} (ismeretlen bővítmény)" reviewable_known_source: "%{reviewableType} (a(z) „%{pluginName}” bővítményből)" ignore_all: "Összes figyelmen kívül hagyása" enable_plugins: "Bővítmények engedélyezése" + delete_confirm: "Biztosan törölni szeretné a letiltott bővítmények által létrehozott összes moderációs tételt?" + ignore_success: "A letiltott bővítmények által létrehozott összes moderációs tétel törlésre került." explain: why: "magyarázza el, miért került ez a tétel a sorba" + title: "Moderációs tételek pontozása" formula: "Képlet" subtotal: "Részösszeg" total: "Összesen" @@ -685,8 +753,10 @@ hu: title: "Azok a felhasználók, akik előzőleg egyetértettek a jelzéssel, bónuszt kapnak." trust_level_bonus: name: "bizalmi szint" + title: "A magasabb bizalmi szintű felhasználók jelentései magasabb pontszámot kapnak." type_bonus: name: "típusbónusz" + title: "A személyzet bizonyos jelentéstípusokhoz bónuszpontokat rendelhet, hogy azok magasabb prioritást élvezzenek." revise_and_reject_post: title: "Felülvizsgálat" reason: "Ok" @@ -695,6 +765,7 @@ hu: custom_reason: "Adjon egyértelmű leírást az okáról" other_reason: "Egyéb…" optional: "nem kötelező" + stale_help: "Ezt a tételt %{username} megoldotta." claim_help: optional: "Zárolhatja ezt az elemet, hogy mások ne hagyhassák jóvá." required: "Zárolnia kell az elemeket, hogy jóvá tudja őket hagyni." @@ -1618,6 +1689,9 @@ hu: undo_revoke_access: "Hozzáférés visszaállítása" api_approved: "Jóváhagyva:" api_last_used_at: "Utoljára használva:" + api_show_permissions: + one: "%{count} engedély megadva" + other: "%{count} engedély megadva" theme: "Téma" save_to_change_theme: 'A téma a „%{save_text}” gombra kattintás után frissül' home: "Alapértelmezett főoldal" @@ -1626,6 +1700,9 @@ hu: flags_given: one: '%{count} hasznos jelentés' other: '%{count} hasznos jelentés' + flags: + one: '%{count} jelentés' + other: '%{count} jelentés' deleted_posts: one: '%{count} törölt bejegyzés' other: '%{count} törölt bejegyzés' @@ -1735,6 +1812,10 @@ hu: apps: "Alkalmazások" navigation_menu: "Navigációs menü" upcoming_changes: "Közelgő változások" + calendar_subscriptions: "Naptár" + calendar_subscriptions: + copied: "Másolva!" + add_to_google: "Google Naptár" change_password: success: "(az e-mail elküldve)" in_progress: "(az e-mail küldése folyamatban)" @@ -2345,6 +2426,7 @@ hu: form_kit: reset: Alaphelyzetbe állítás optional: nem kötelező + required: kötelező errors_summary_title: one: "Hiba javítása a folytatáshoz" other: "Hibák javítása a folytatáshoz" @@ -2367,6 +2449,10 @@ hu: too_short: one: "Legalább %{count} karakteresnek kell lennie" other: "Legalább %{count} karakteresnek kell lennie" + color: + available_presets: "Elérhető színösszeállítások" + already_used: "Használatban" + edit_presets: "Színösszeállítás szerkesztése" close: "Bezárás" assets_changed_confirm: "Ez az oldal most kapott egy szoftverfrissítést. Beszerzi most a legújabb verziót?" logout: "Kijelentkezett." @@ -2413,6 +2499,7 @@ hu: } korlát túllépve. learn_more: "További információ…" learn_more_with_link: "További információ…" + feedback_with_link: "Visszajelzés…" mute: Némítás unmute: Némítás feloldása last_post: Közzétett @@ -2890,6 +2977,7 @@ hu: upload_description: "adja meg itt a feltöltés leírását" olist_title: "Számozott lista" ulist_title: "Pontozott lista" + list_title: "Listák" list_item: "Listaelem" toggle_direction: "Irány be/ki" apply_wrap_title: "Körbefogás alkalmazása" @@ -3061,9 +3149,13 @@ hu: available: title: "Közelgő változások" description: "'%{changeName}' előnézete megtekinthető." + description_two: "'%{changeName1}' és '%{changeName2}' megtekinthető előnézetben." + description_many: "'%{changeName}' és további %{otherChangeCount} módosítás megtekinthető előnézetben." automatically_promoted: title: "Közelgő változások" description: "'%{changeName}' automatikusan engedélyezve lett" + description_two: "'%{changeName1}' és '%{changeName2}' automatikusan engedélyezve lett." + description_many: "'%{changeName}' és további %{otherChangeCount} módosítás automatikusan engedélyezve lett." dismiss_confirmation: body: default: @@ -3122,8 +3214,8 @@ hu: votes_released: "a szavazat feloldásra került" new_features: "új Discourse funkciók jelentek meg" admin_problems: "új tanácsok a webhely irányítópultján" - upcoming_change_available: "új, közelgő változás, '%{changeName}' elérhető" - upcoming_change_automatically_promoted: "A közelgő '%{changeName}' változás automatikusan engedélyezve lett" + upcoming_change_available: "Új közelgő változások érhetőek el" + upcoming_change_automatically_promoted: "a közelgő változások automatikusan engedélyezve lettek" upload_selector: change: "Módosítás" delete: "Törlés" @@ -3314,6 +3406,7 @@ hu: deleted_post: "(törölt bejegyzés)" post_number_with_topic_title: "%{post_number}. bejegyzés – %{title}" new_post_in_topic: "új bejegyzés itt: %{title}" + new_post_in_deleted_topic: "új bejegyzés egy törölt témában" user_requires_approval: "%{username} jóváhagyása szükséges" default_item: "felülvizsgálandó elem: #%{reviewable_id}" topics: @@ -3323,11 +3416,8 @@ hu: confirm: "Megerősítés" select_all: "Összes kiválasztása" clear_all: "Összes törlése" - unlist_topics: "Témák listázásnak megszüntetése" - relist_topics: "Újralistázott témák" reset_bump_dates: "Előrehozási dátumok alaphelyzetbe állítása" defer: "Megjelölés olvasatlanként" - delete: "Témák törlése" delete_topics_count: one: "Téma törlése" other: "Témák törlése" @@ -3366,38 +3456,38 @@ hu: other: "Újak elvetése (%{count})" toggle: "témák csoportos kiválasztása be/ki" actions: "Csoportos műveletek" - change_category: "Kategória beállítása…" - close_topics: "Témák lezárása" - archive_topics: "Témák archiválása" move_messages_to_inbox: "Áthelyezés a bejövő üzenetek közé" archive_messages: "Áthelyezés az archívumba" - notification_level: "Értesítések…" change_notification_level: "Értesítési szint módosítása" choose_new_category: "Válassza ki az új kategóriát a témákhoz:" - selected: - one: "Kiválasztott %{count} témát." - other: "Kiválasztott %{count} témát." selected_sole_category: one: "%{count} témát választott ki a következő kategóriából:" other: "%{count} témát választott ki a következő kategóriából:" selected_count: one: "%{count} kiválasztva" other: "%{count} kiválasztva" - change_tags: "Címkék cseréje" - append_tags: "Címkék hozzáfűzése" + append_tags: "Címkék hozzáadása" choose_new_tags: "Válasszon új címkéket ezekhez a témákhoz:" - choose_append_tags: "Válasszon új hozzáfűzendő címkéket ezekhez a témákhoz:" + choose_append_tags: "Címkék hozzáadása" changed_tags: "Azon témák címkéi megváltoztak." - remove_tags: "Összes címke eltávolítása" confirm_remove_tags: one: "Az összes címke eltávolításra kerül erről a témáról. Biztos benne?" other: "Az összes címke eltávolításra kerül %{count} témáról. Biztos benne?" progress: one: "Folyamat: %{count} téma" other: "Folyamat: %{count} téma" - notify: "Értesítse a felhasználókat erről a változásról." + notify: "Értesítse a felhasználókat erről a változásról" performing: "Tömeges művelet végrehajtása, kis türelmet…" completed: "A tömeges műveletek sikeresen befejeződtek!" + completed_count: + one: "%{count} téma frissítve." + other: "%{count} téma frissítve." + not_completed: + one: "%{count} A téma frissítése sikertelen:" + other: "%{count} téma frissítése sikertelen:" + skipped_count: + one: "%{count} téma már naprakész volt." + other: "%{count} A téma már naprakész volt." error_topic_count: one: "%{count} téma" other: "%{count} téma" @@ -3424,7 +3514,6 @@ hu: name: "Elvetés" close_topics: name: "Lezárás" - note: "Megjegyzés" optional: (nem kötelező) archive_topics: name: "Archiválás" @@ -3438,30 +3527,25 @@ hu: name: "Felvétel a listára" remove_tags: name: "Címkék eltávolítása" - append_tags: - name: "Címkék hozzáfűzése" replace_tags: name: "Címkék cseréje" delete_topics: name: "Törlés" update_category: name: "Kategória frissítése" - description: "Válassza ki az új kategóriát a kiválasztott témákhoz" reset_bump_dates: name: "Előrehozási dátum alaphelyzetbe állítása" - description: "A téma előrehozási dátumának visszaállítása az utolsó bejegyzés dátumára, ami befolyásolja a témalista sorrendjét" defer: name: "Megjelölés olvasatlanként" - description: "Témák megjelölése olvasatlanként" update_notifications: name: "Értesítések frissítése" - description: "Az értesítési szint módosítása Figyelés, Nyomon követés, Normál vagy Néma szintre." topic: filter_to: one: "%{count} bejegyzés a témában" other: "%{count} bejegyzés a témában" create: "Új téma" create_long: "Új téma létrehozása" + create_group: "Új téma és vázlatok" open_draft: "Vázlat megnyitása" private_message: "Üzenet indítása" archive_message: @@ -4142,6 +4226,7 @@ hu: one: "Biztos, hogy egyesíti ezeket a bejegyzéseket?" other: "Biztos, hogy egyesíti ezt a(z) %{count} bejegyzést?" revisions: + diff_too_complex: "A különbségek túl összetettek a megjelenítéshez. Kérjük, próbálja meg az egyes kisebb szerkesztéseket külön-külön megtekinteni." locale: no_locale_set: "Nincs beállítva nyelv" locale_removed: "Nyelv eltávolítva" @@ -4254,10 +4339,22 @@ hu: delete: "Törlés" add: "Szükséges címkecsoport hozzáadása" placeholder: "Címkecsoport kiválasztása…" + min_count: "Címkék száma" + tag_group: "Címkecsoport" topic_featured_link_allowed: "Kiemelt hivatkozások engedélyezése ebben a kategóriában" delete: "Kategória törlése" create: "Új kategória" + create_with_type: "Új %{typeName} kategória" create_long: "Új kategória létrehozása" + settings_apply_to_all_of_type_warning: "Az alábbi módosítások ezen típus összes kategóriájára érvényesek lesznek" + type_settings_schema: + category_settings: "Kategória beállítások" + category_custom_fields: "Kategória beállítások" + site_settings: "Webhely beállítások" + choose_type: + title: "Válasszon kategóriatípust" + requires_plugin: "Szükséges bővítmény" + create_category: "Kategória létrehozása" save: "Kategória mentése" unsaved_changes: "Nem mentett módosításai vannak" slug: "Kategória URL-végződés" @@ -4306,6 +4403,8 @@ hu: list: "Kategóriák felsorolása" no_description: "Adjon leírást ehhez a kategóriához." change_in_category_topic: "Leírás szerkesztése" + description_expand: "Több megjelenítése" + description_collapse: "Kevesebb megjelenítése" already_used: "Ezt a színt már egy másik kategória is használja." color_palette: "Színpaletta" security: "Biztonság" @@ -4316,9 +4415,15 @@ hu: reply: "Válasz" create: "Létrehozás" no_groups_selected: "Egyetlen csoport sem kapott hozzáférést; ez a kategória csak a stáb számára lesz látható." + everyone_full_access: 'Ez a kategória nyilvános: bárki láthatja, válaszolhat rá és bejegyzéseket is létrehozhat. A jogosultságok korlátozásához távolítson el egyet vagy többet a(z) „%{everyone_group}” csoportnak megadott engedélyek közül.' + everyone_reply_access: 'Ez a kategória nyilvános: mindenki láthatja a témákat és válaszolhat is rájuk. A jogosultságok korlátozásához távolítsa el a(z) „%{everyone_group}” csoportot.' + everyone_see_access: 'Ez a kategória nyilvános: mindenki láthatja a bejegyzéseket. A jogosultságok korlátozásához távolítsa el a(z) „%{everyone_group}” csoportot.' specific_groups_have_access: "Ez a kategória privát, csak a kiválasztott csoportok tagjai láthatják, válaszolhatnak rá és hozhatnak létre bejegyzéseket." + all_parent_groups_used: "A szülőkategória összes csoportja hozzáadásra került. További csoportok hozzáadásához először adja hozzá azokat a szülőkategóriához." toggle_reply: "Válasz engedély bekapcsolása" toggle_full: "Készítés engedély bekapcsolása" + inherited: 'Ez a jogosultság a(z) %{everyone_group} csoporttól öröklődik.' + special_warning: "Ez egy előre létrehozott kategória, és a biztonsági beállításai nem szerkeszthetők. Ha nem szeretné használni ezt a kategóriát, törölje ahelyett, hogy más célra használná fel." uncategorized_security_warning: "Ez a kategória különleges. Célja, hogy olyan témákat tartson meg, amelyeknek nincs kategóriája; nem rendelkezhet biztonsági beállításokkal." uncategorized_general_warning: 'Ez a kategória különleges. Alapértelmezett kategóriaként használatos az új témákhoz, amelyeknél nincs kategória kiválasztva. Ha meg akarja akadályozni ezt a viselkedést, és ki akarja kényszeríteni a kategória kiválasztását, kapcsolja ki a beállítást itt. Ha meg szeretné változtatni a nevet vagy a leírást, menjen a Testreszabás / Szövegtartalom menüpontba.' pending_permission_change_alert: "Még nem adta hozzá a %{group} címet ehhez a kategóriához; katt ide a hozzáadáshoz." @@ -4361,6 +4466,9 @@ hu: group_restricted: "Privát" who_can_see: "Ki láthatja ezt a kategóriát" who_can_post: "Kik posztolhatnak ebben a kategóriában" + which_groups_can_access: "Csoportok, amelyek láthatják ezt a kategóriát és bejegyzéseket küldhetnek bele." + more_options_hint: "További jogosultságok érhetők el a haladó beállításokban." + inherited_from_parent: "A jogosultságok a szülőkategóriától öröklődnek. A finomhangoláshoz keresse fel a haladó beállításokat." num_auto_bump_daily: "A naponta automatikusan előrehozandó nyitott témák száma:" auto_bump_cooldown_days: "Minimum napok száma, mielőtt újra feldobná ugyanazt a témát:" navigate_to_first_post_after_read: "A témák elolvasása után navigáljon az első hozzászóláshoz" @@ -4878,13 +4986,19 @@ hu: category_restricted: "Ez a címke olyan kategóriákra korlátozódik, amelyekhez nincs hozzáférési jogosultsága." synonyms: "Szinonimák" synonyms_description: "A következő címkék használatakor ezek helyére %{base_tag_name}kerül." + synonyms_inline: "Ezek a szinonimák a következőre lesznek lecserélve: %{base_tag_name}:" save: "Címke nevének és leírásának mentése" tag_groups_info: one: 'Ez a címke a "%{tag_groups}" csoportba tartozik.' other: "Ez a címke a következő csoportokhoz tartozik: %{tag_groups}." + tag_groups_info_prefix: + one: "Ez a címke a következő csoporthoz tartozik: " + other: "Ez a címke a következő csoportokhoz tartozik: " category_restrictions: one: "Csak ebben a kategóriában használható" other: "Csak ezekben a kategóriákban használható:" + restricted_to: "Korlátozva a következőre:" + no_synonyms: "Ennek a címkének nincsenek szinonimái." edit_synonyms: "Szinonimák szerkesztése" add_synonyms_label: "Szinonimák hozzáadása:" add_synonyms: "Hozzáadás" @@ -4907,17 +5021,31 @@ hu: description: "Leírás" settings: title: "Beállítások" + edit_title: "Címke szerkesztése: %{name}" + edit_tag_prefix: "Címke szerkesztése:" + select_tag: "Válasszon ki egy címkét a szerkesztéshez" general: "Általános" localizations: "Lokalizációk" back: "Vissza" name: "Név" slug: "URL slug" name_placeholder: "Címke neve" + slug_placeholder: "Címke slug (opcionális, a névből automatikusan generálódik)" + saved: "Címkebeállítások mentve" + no_synonyms: "Ehhez a címkéhez nincsenek szinonimák megadva." + add_synonym_placeholder: "Címkék keresése szinonimaként való hozzáadáshoz..." synonyms_subtitle: "A következő címkék használatakor ezek helyére %{name}kerül" + save: "Címke mentése" + delete: "Címke törlése" + synonyms_hint: "A fenti címkék használatakor le lesznek cserélve a következőre: %{baseTagName}." + add_synonyms_confirm: "Mindenhol, ahol jelenleg a(z) %{synonymNames} van használatban, a(z) %{tagName} lesz használva helyette. Biztosan végrehajtja ezt a módosítást?" localization: + hint: "Lokalizációk hozzáadása, hogy a különböző nyelvű felhasználók számára eltérő címkenevek jelenjenek meg." locale: "Nyelv" name: "Név" description: "Leírás" + add: "Lokalizáció hozzáadása" + remove: "Lokalizáció eltávolítása" sort_by: "Rendezés" sort_by_count: "besorol" sort_by_name: "név" @@ -5428,11 +5556,14 @@ hu: toggle_localized: translated: "Az oldal gépi fordítású. Kattintson az eredeti megtekintéséhez." not_translated: "Az oldal nincs lefordítva. Kattintson a fordításhoz." + translations_enabled: "Fordítások engedélyezve" + translations_disabled: "Fordítások letiltva" language_switcher: title: "Oldal nyelvének módosítása" admin_js: type_to_filter: "Írj ide a szűréshez.." settings: "Beállítások" + reset_filter: "Szűrő visszaállítása" toggle_filters: "Legördülő szűrők be- és kikapcsolása" admin: title: "Discourse Adminisztrátor" @@ -5448,11 +5579,12 @@ hu: title: "Aktív bejelentések listája" sidebar_title: "Jelentések" back: "Vissza az összes jelentéshez" + group_engagement: "Elköteleződés" group_traffic: "Forgalom" group_members: "Tagok" - group_moderation: "Moderálás" - group_security: "Biztonság" + group_content: "Tartalom és egészség" group_other: "Egyéb" + legacy_warning: "Ez egy korábbi jelentés. Hamarosan megszűnik. Ha segítségre van szüksége a helyettesítő megtalálásához, vegye fel a kapcsolatot az ügyfélszolgálattal." config_sections: account: title: "Fiók" @@ -5484,6 +5616,7 @@ hu: no_changes_to_save: "Nincsenek menthető módosítások" select_groups: "Csoportok kiválasztása…" opt_in_groups: "Feliratkozási csoportok" + show_related_settings: "Kapcsolódó beállítások megjelenítése..." opt_in_groups_instructions: "A feliratkozási csoportok segítségével lehetővé tehető, hogy egy adott felhasználói csoport tesztelje a módosítást, mielőtt az mindenki számára elérhetővé válna. Fontos megjegyezni, hogy ezek a csoportok elveszítik a relevanciájukat, miután a módosítás stabil állapotba kerül." enabled_for_throttle: "Túl gyorsan módosítottad, hogy kikre vonatkozik ez a módosítás. Kérjük, várj néhány másodpercet, mielőtt újra próbálkozol." change_enabled_for_success: "Engedélyezted ezt a módosítást a(z) %{enabledFor} számára" @@ -5496,6 +5629,7 @@ hu: enabled_for_options: no_one: "Senki" everyone: "Mindenki" + staff: "csak %{staffGroupName}" specific_groups: "Meghatározott csoport(ok)" specific_groups_with_group_names: one: "a %{groupNames} csoport" @@ -5518,6 +5652,7 @@ hu: all: "Összes" enabled_all: "Minden engedélyezett állapot" enabled: "Bekapcsolva" + enabled_for_staff: "Engedélyezve a(z) %{staffGroupName} csoportnak" enabled_for_specific_groups: "Engedélyezve bizonyos csoportok számára" disabled: "Kikapcsolva" impact_type_all: "Minden ütközési típus" @@ -5568,6 +5703,7 @@ hu: keywords: "\nhely|területi beállítás|nyelv|időzóna|unicode|ltr" upcoming_changes: title: "Közelgő változások" + header_description: "A Gemini ezt mondta:\nA Discourse közelgő változásainak listája, amelyek érinthetik az oldalát, valamint kísérleti funkciók, amelyek használatára feliratkozhat. Szűrhet hatás, típus és állapot alapján.\n\nA feliratkozási csoportok lehetővé teszik, hogy a felhasználók egy bizonyos csoportja teszteljen egy változtatást, mielőtt az mindenki számára elérhetővé válna, bár ezek a csoportok irrelevánssá válnak, amint egy változtatás Állandó állapotba lép." login: title: "Bejelentkezés és hitelesítés" header_description: "Konfigurálja a felhasználók bejelentkezési és hitelesítési módját, a titkokat és kulcsokat, az OAuth2-szolgáltatókat stb" @@ -5606,6 +5742,7 @@ hu: help_text: "Az ajánlott méret 600×80 képpont." large_icon: title: "Négyzet alakú ikon" + description: "A logókép négyzet alakú változata az oldal tetején jelenik meg, és egyben a mobilalkalmazás logója is." help_text: "Az ajánlott méret 512×512 képpont." square_icon_dark: required: "Másik négyzet ikon használata a sötét módhoz?" @@ -5926,6 +6063,9 @@ hu: embedding: title: "Beágyazás" header_description: "A Discourse képes beágyazni egy téma hozzászólásait egy távoli webhelyre egy Javascript API segítségével, amely létrehoz egy IFRAME-t." + form_templates: + title: "Űrlapsablonok" + header_description: "Az űrlapsablonok lehetővé teszik egy strukturált, adatellenőrzéssel ellátott űrlap megkövetelését a témalétrehozási folyamat részeként." theme_site_settings: setting: "Beállítás" overridden_by: "Felülírta" @@ -5957,7 +6097,7 @@ hu: up_to_date: "A rendszer naprakész!" critical_available: "Egy fontos frissítés érhető el!" updates_available: "Frissítések érhetőek el!" - please_update: "Kérünk frissíts!" + please_update: "Kérjük, frissítsd!" no_check_performed: "A frissítések ellenőrzése nem történt meg. Győződjön meg arról, hogy a Sidekiq fut." stale_data: "Rég nem volt ellenőrizve hogy van-e új frissítés. Győződjön meg arról hogy a sidekiq fut." version_check_pending: "Úgy nézik nem rég frissítettél. Fantasztikus!" @@ -5968,6 +6108,7 @@ hu: new_features: title: "Újdonságok?" subtitle: "Folyamatosan új funkciókat és fejlesztéseket adunk ki. Ez az oldal a legfontosabbakat tartalmazza, de a 'Tudjon meg többet' gombra kattintva részletes kiadási jegyzeteket is megtekinthet." + no_new_features_found: "Nincsenek elemek a hírfolyamban, vagy a választott szűrő nem hozott eredményt. A korábbi új funkciókkal kapcsolatos bejelentéseket a Discourse Meta közösségében tekintheti meg." no_new_features_error: "Hiba történt a hírfolyam betöltésekor. A korábbi új funkciókkal kapcsolatos bejelentéseket a Discourse Meta közösségoldalán tekintheti meg." learn_more: "Tudjon meg többet..." last_checked: "Utoljára ellenőrizve" @@ -6032,7 +6173,7 @@ hu: all: "Mind" view_table: "asztal" view_graph: "Grafikon" - refresh_report: "Jelentés frissítése" + refresh_report: "Újratöltés" daily: Napi monthly: Havi weekly: Heti @@ -6155,6 +6296,7 @@ hu: cancel: "Mégse" continue: "Folytatás" copy_key: "Másolás" + key_copied_to_clipboard: "API-kulcs a vágólapra másolva" back: "Vissza az API-kulcsokhoz" revoke: "Visszavonás" undo_revoke: "Visszavonás visszavonása" @@ -6796,6 +6938,8 @@ hu: delete: "Törlés" delete_confirm: 'Biztosan törli a "%{theme_name}" elemet?' bulk_delete: "Biztos benne?" + bulk_themes_delete_confirm: "Ezzel eltávolítja a következő témákat, így azokat az oldal egyetlen felhasználója sem használhatja többé:" + bulk_components_delete_confirm: "Ezzel eltávolítja a következő összetevőket, így azokat az oldal egyetlen felhasználója sem használhatja többé:" color: "Szín" opacity: "Áttetszőség" copy: "Megkettőz" @@ -7417,6 +7561,7 @@ hu: upcoming_change_available: "közelgő változás elérhető" change_site_setting_groups: "webhelybeállítási csoportok módosítása" discourse_id_regenerate_credentials: "Discourse ID hitelesítő adatok újragenerálása" + configure_category_type: "kategóriatípus konfigurálása" screened_emails: title: "Szűrt e-mailek" description: "Amikor valaki új fiókot próbál létrehozni, a következő e-mail címeket ellenőrzi, és a regisztrációt blokkolja, vagy más műveletet hajt végre." @@ -8041,6 +8186,9 @@ hu: more_than_50_results: "Több mint 50 találat van. Kérlek finomíts a keresésen." no_results: "Nem található egyező szöveg" interpolation_keys: "Elérhető interpolációs kulcsok:" + interpolation_key_insert: "Kattintson a beszúráshoz" + interpolation_key_used: "Használatban" + interpolation_key_invalid: "Ismeretlen kulcs — nem lesz interpolálva" outdated: title: "Ez a fordítás elavult" description: "A kulcs alapértelmezett fordítása megváltozott a felülbírálás létrehozása óta. Kérlek, ellenőrizd az alábbiakban, hogy a fordítás megfelel-e az eredeti szándékhoz képest végrehajtott változtatásoknak." @@ -8159,7 +8307,7 @@ hu: min_admin_password_length: prompt: "Arra készülsz, hogy módosítsd a jelszóirányelveidet. Ez mostantól minden adminisztrátort érinteni fog, aki megváltoztatja a jelszavát. Biztosan folytatod?" confirm: "Igen, frissítem a jelszószabályzatot" - password_unique_charactes: + password_unique_characters: prompt: "Arra készülsz, hogy módosítsd a jelszóirányelveidet. Ez mostantól minden olyan felhasználót érint, aki megváltoztatja a jelszavát. Biztosan folytatni szeretnéd?" confirm: "Igen, frissítem a jelszószabályzatot" block_common_passwords: @@ -8204,6 +8352,8 @@ hu: no_user_badges: "%{name} még nem kapott jelvényt." no_badges: Nincsenek adományozható jelvények. none_selected: "A kezdéshez válasszon egy jelvényt" + filter_placeholder: "Jelvények szűrése..." + no_badges_found: "Nincsenek jelvények" sections: design: Dizájn query: Lekérdezés diff --git a/config/locales/client.hy.yml b/config/locales/client.hy.yml index fd052f2173aeb..f8afc51c0015f 100644 --- a/config/locales/client.hy.yml +++ b/config/locales/client.hy.yml @@ -1442,6 +1442,8 @@ hy: tags: "Պիտակներ" interface: "Ինտերֆեյս" apps: "Հավելվածներ" + calendar_subscriptions: + copied: "Պատճենված է!" change_password: success: "(էլ. նամակն ուղարկված է)" in_progress: "(էլ. նամակն ուղարկվում է)" @@ -1971,6 +1973,7 @@ hy: form_kit: reset: Զրոյացնել optional: ընտրովի + required: պարտադիր է errors: required: "Պարտադիր" too_short: @@ -2539,9 +2542,6 @@ hy: confirm: "Հաստատել" select_all: "Ընտրել Բոլորը" clear_all: "Ջնջել Բոլորը" - unlist_topics: "Թեմաները Ցուցակից Հանել" - relist_topics: "Վերացանկավորել Թեմաները" - delete: "Ջնջել Թեմաները" delete_topics_count: one: "Ջնջել Թեման" other: "Ջնջել Թեմաները" @@ -2553,20 +2553,12 @@ hy: dismiss_new: "Չեղարկել Նորերը" toggle: "փոխանջատել թեմաների զանգվածային ընտրությունը" actions: "Զանգվածային Գործողությունները" - close_topics: "Փակել Թեմաները" - archive_topics: "Արխիվացնել Թեմաները" move_messages_to_inbox: "Տեղափոխել Մուտքային" choose_new_category: "Ընտրել նոր կատեգորիա թեմաների համար՝" - selected: - one: "Դուք ընտրել եք %{count} թեմա:" - other: "Դուք ընտրել եք %{count} թեմա:" selected_count: one: "%{count} ընտրված" other: "%{count} ընտրված" - change_tags: "Փոխարինել Պիտակները" - append_tags: "Ավելացնել Պիտակներ" choose_new_tags: "Ընտրել նոր պիտակներ այս թեմաների համար՝" - choose_append_tags: "Ընտրել նոր պիտակներ այս թեմաներին ավելացնելու համար՝" changed_tags: "Այդ թեմաների պիտակները փոփոխվել են:" error_topic_count: one: "%{count} թեմա" @@ -2593,8 +2585,6 @@ hy: name: "Տեղափոխել Մուտքային" unlist_topics: name: "Ցուցակից հանել" - append_tags: - name: "Ավելացնել Պիտակներ" replace_tags: name: "Փոխարինել Պիտակները" delete_topics: @@ -3165,6 +3155,8 @@ hy: delete_confirm: "Դուք համոզվա՞ծ եք, որ ցանկանում եք ջնջել այս կատեգորիան:" delete_error: "Այս կատեգորիան ջնջելիս սխալ է տեղի ունեցել:" no_description: "Խնդրում ենք այս կատեգորիայի համար ավելացնել նկարագրություն:" + description_expand: "Ցույց տալ ավելին" + description_collapse: "Ցույց տալ ավելի քիչ" already_used: "Այս գույնը օգտագործվել է մեկ այլ կատեգորիայի կողմից" security: "Անվտանգություն" permissions: @@ -3811,8 +3803,6 @@ hy: sidebar_title: "Հաշվետվություններ" group_traffic: "Այցելությունները" group_members: "Անդամներ" - group_moderation: "Մոդերացիա" - group_security: "Անվտանգություն" group_other: "Այլ" config_sections: account: @@ -4011,7 +4001,7 @@ hy: all: "Ամբողջը" view_table: "աղյուսակ" view_graph: "գրաֆիկ" - refresh_report: "Թարմացնել Հաշվետվությունը" + refresh_report: "Թարմացնել" daily: Օրվա Ընթացքում monthly: Ամսվա Ընթացքում weekly: Շաբաթվա Ընթացքում diff --git a/config/locales/client.id.yml b/config/locales/client.id.yml index 4c28aeb561ee5..54ec37f632657 100644 --- a/config/locales/client.id.yml +++ b/config/locales/client.id.yml @@ -1157,6 +1157,8 @@ id: tags: "Label" interface: "Antarmuka" apps: "Aplikasi" + calendar_subscriptions: + copied: "Disalin!" change_password: success: "(surel terkirim)" in_progress: "(mengirimkan surel)" @@ -1970,6 +1972,8 @@ id: description: "Deskripsi" color_validations: cant_be_empty: "tidak boleh kosong" + description_expand: "Tampilkan lebih banyak" + description_collapse: "Tampilkan lebih sedikit" permissions: reply: "Balas" create: "Buat" @@ -2420,6 +2424,7 @@ id: 7_days_ago: "7 Hari Lalu" 30_days_ago: "30 Hari Lalu" all: "Semua" + refresh_report: "Segarkan" trending_search: disabled: 'Laporan pencarian sedang tren dinonaktifkan. Aktifkan kueri penelusuran log untuk mengumpulkan data.' sort_button: "Urutkan berdasarkan %{column}" diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml index 27a00dc657214..27e2bcb46c7ce 100644 --- a/config/locales/client.it.yml +++ b/config/locales/client.it.yml @@ -1654,6 +1654,10 @@ it: interface: "Interfaccia" apps: "App" navigation_menu: "Menu di navigazione" + calendar_subscriptions: "Calendario" + calendar_subscriptions: + copied: "Copiato!" + add_to_google: "Google Calendar" change_password: success: "(email inviata)" in_progress: "(invio email in corso)" @@ -2256,6 +2260,7 @@ it: form_kit: reset: Annulla optional: facoltativo + required: obbligatorie dirty_form: "Non hai caricato le modifiche! Vuoi davvero uscire?" errors: starts_with: "Deve iniziare con %{prefix}" @@ -3181,11 +3186,8 @@ it: confirm: "Conferma" select_all: "Seleziona Tutto" clear_all: "Deseleziona Tutto" - unlist_topics: "Rendi argomenti invisibili" - relist_topics: "Ripubblica Argomenti" reset_bump_dates: "Reimposta la date di riproposizione" defer: "Contrassegna come non letto" - delete: "Elimina argomenti" delete_topics_count: one: "Cancella Argomento" other: "Elimina argomenti" @@ -3218,29 +3220,20 @@ it: other: "Ignora i nuovi (%{count})" toggle: "interruttore di selezione multipla degli argomenti" actions: "Azioni Multiple" - change_category: "Imposta categoria..." - close_topics: "Chiudi argomenti" - archive_topics: "Archivia argomenti" move_messages_to_inbox: "Sposta nella posta in arrivo" archive_messages: "Sposta in archivio" - notification_level: "Notifiche…" change_notification_level: "Modifica livello di notifica" choose_new_category: "Scegli la nuova categoria per gli argomenti:" - selected: - one: "Hai selezionato %{count} argomento." - other: "Hai selezionato %{count} argomenti." selected_sole_category: one: "Hai selezionato %{count} argomento dalla categoria:" other: "Hai selezionato %{count} argomenti dalla categoria:" selected_count: one: "%{count} selezionato" other: "%{count} selezionati" - change_tags: "Sostituisci Etichette" - append_tags: "Aggiungi Etichette" + append_tags: "Aggiungi etichette" choose_new_tags: "Scegli nuove etichette per i seguenti argomenti:" - choose_append_tags: "Scegli nuove etichette da aggiungere a questi argomenti:" + choose_append_tags: "Aggiungi etichette" changed_tags: "Le etichette per quegli argomenti sono state cambiate." - remove_tags: "Rimuovi tutte le etichette" confirm_remove_tags: one: "Tutti i tag verranno rimossi da questo argomento. Sei sicuro?" other: "Tutti i tag verranno rimossi da %{count} argomenti. Sei sicuro?" @@ -3274,7 +3267,6 @@ it: name: "Ignora" close_topics: name: "Chiudi" - note: "Nota" optional: (opzionale) archive_topics: name: "Archivia" @@ -3288,24 +3280,18 @@ it: name: "Ripubblica" remove_tags: name: "Rimuovi etichette" - append_tags: - name: "Aggiungi etichette" replace_tags: name: "Sostituisci etichette" delete_topics: name: "Elimina" update_category: name: "Aggiorna categoria" - description: "Scegli la nuova categoria per gli argomenti selezionati" reset_bump_dates: name: "Reimposta date di riproposizione" - description: "Reimposta la data di riproposizione dell'argomento alla data dell'ultimo messaggio creato. Questo modificherà l'ordine dell'elenco argomenti" defer: name: "Contrassegna come non letto" - description: "Contrassegna argomenti come non letti" update_notifications: name: "Aggiorna notifiche" - description: "Modifica livello di notifica a osservazione, seguito, normale o silenziato" topic: filter_to: one: "%{count} messaggio in questo argomento" @@ -4072,6 +4058,8 @@ it: tag_group: "Gruppo di Etichette" topic_featured_link_allowed: "Consenti collegamenti in primo piano in questa categoria" create_long: "Crea una nuova categoria" + type_settings_schema: + site_settings: "Impostazioni del sito" unsaved_changes: "Hai modifiche non salvate" slug_placeholder: "(Facoltativo) parole-sillabate per URL" creation_error: Si è verificato un errore nella creazione della categoria. @@ -4104,6 +4092,8 @@ it: list: "Elenca le categorie" no_description: "Aggiungi una descrizione alla categoria." change_in_category_topic: "Modifica descrizione" + description_expand: "Mostra altro" + description_collapse: "Mostra meno" already_used: "Questo colore è già stato usato in un'altra categoria." color_palette: "Schema di colori" security: "Sicurezza" @@ -5186,8 +5176,6 @@ it: back: "Torna a tutti i report" group_traffic: "Traffico" group_members: "Membri" - group_moderation: "Moderazione" - group_security: "Sicurezza" group_other: "Altri" config_sections: account: @@ -5670,7 +5658,7 @@ it: all: "Tutti" view_table: "tabella" view_graph: "grafico" - refresh_report: "Aggiorna Rapporto" + refresh_report: "Aggiorna" daily: Ogni giorno monthly: Mensile weekly: Settimanale @@ -7717,7 +7705,7 @@ it: confirm: "Sì, aggiorna i criteri della password" min_admin_password_length: confirm: "Sì, aggiorna i criteri della password" - password_unique_charactes: + password_unique_characters: confirm: "Sì, aggiorna i criteri della password" block_common_passwords: confirm: "Sì, aggiorna i criteri della password" diff --git a/config/locales/client.ja.yml b/config/locales/client.ja.yml index 80eb34ce1f631..e83704a8eac98 100644 --- a/config/locales/client.ja.yml +++ b/config/locales/client.ja.yml @@ -1633,6 +1633,10 @@ ja: apps: "アプリ連携" navigation_menu: "ナビゲーションメニュー" upcoming_changes: "次回の変更" + calendar_subscriptions: "カレンダー" + calendar_subscriptions: + copied: "コピーしました!" + add_to_google: "Google カレンダー" change_password: success: "(メール送信済み)" in_progress: "(メール送信中)" @@ -2226,6 +2230,7 @@ ja: form_kit: reset: リセット optional: オプション + required: 必須 dirty_form: "変更を送信しませんでした!終了してもよろしいですか?" errors: starts_with: "%{prefix} で始まる必要があります" @@ -2959,8 +2964,6 @@ ja: votes_released: "投票がリリースされました" new_features: "新しい Discourse 機能がリリースされました" admin_problems: "サイトダッシュボードに関する新しいアドバイス" - upcoming_change_available: "次回の新しい変更 '%{changeName}' を利用できます" - upcoming_change_automatically_promoted: "次回の変更 '%{changeName}' は自動的に有効になりました" upload_selector: change: "変更" delete: "削除" @@ -3151,11 +3154,8 @@ ja: confirm: "確認" select_all: "すべて選択" clear_all: "すべてクリア" - unlist_topics: "トピックを非表示" - relist_topics: "トピックを表示" reset_bump_dates: "バンプ日をリセットする" defer: "未読にする" - delete: "トピックを削除" delete_topics_count: other: "トピックを削除" delete_posts_count: @@ -3186,31 +3186,22 @@ ja: other: "新規を閉じる (%{count})" toggle: "トピックの一括選択を切り替える" actions: "一括操作" - change_category: "カテゴリを設定…" - close_topics: "トピックをクローズ" - archive_topics: "トピックをアーカイブ" move_messages_to_inbox: "受信トレイに移動" archive_messages: "アーカイブに移動" - notification_level: "通知…" change_notification_level: "通知レベルを変更" choose_new_category: "このトピックの新しいカテゴリを選択:" - selected: - other: "%{count} 件のトピックを選択しました。" selected_sole_category: other: "カテゴリから %{count} 件のトピックを選択しました:" selected_count: other: "%{count} 個選択済み" - change_tags: "タグを置換" append_tags: "タグを追加" choose_new_tags: "これらのトピックに新しいタグを選択:" - choose_append_tags: "これらのトピックに追加する新しいタグを選択:" + choose_append_tags: "タグを追加" changed_tags: "トピックのタグが変更されました。" - remove_tags: "すべてのタグを削除" confirm_remove_tags: other: "%{count} 件のトピックからすべてのタグが削除されます。よろしいですか?" progress: other: "進捗状況: %{count} 件のトピック" - notify: "この変更をユーザーに通知します。" performing: "一括操作を実行中です。お待ちください…" completed: "一括操作が完了しました!" error_topic_count: @@ -3238,7 +3229,6 @@ ja: name: "閉じる" close_topics: name: "閉じる" - note: "注意" optional: (オプション) archive_topics: name: "アーカイブ" @@ -3252,24 +3242,18 @@ ja: name: "再掲載" remove_tags: name: "タグを削除" - append_tags: - name: "タグを追加" replace_tags: name: "タグを置換" delete_topics: name: "削除" update_category: name: "カテゴリを更新" - description: "選択したトピックの新しいカテゴリを選択します" reset_bump_dates: name: "バンプ日をリセット" - description: "トピックのバンプ日を投稿の最終作成日にリセットします。これにより、トピックリストの順序が変わります。" defer: name: "未読にする" - description: "トピックを未読としてマーク" update_notifications: name: "通知を更新" - description: "通知レベルをウォッチ中、追跡中、通常、またはミュートに変更します" topic: filter_to: other: "トピックの %{count} 件の投稿" @@ -4026,6 +4010,8 @@ ja: delete: "カテゴリを削除する" create: "新しいカテゴリ" create_long: "新しいカテゴリを作成する" + type_settings_schema: + site_settings: "サイトの設定" save: "カテゴリを保存する" unsaved_changes: "保存されていない変更があります" slug: "カテゴリのスラッグ" @@ -4073,6 +4059,8 @@ ja: list: "カテゴリをリスト表示" no_description: "このカテゴリの説明を追加してください。" change_in_category_topic: "説明を編集する" + description_expand: "もっと表示" + description_collapse: "表示を減らす" already_used: "この色は他のカテゴリで使用されています。" color_palette: "色パレット" security: "セキュリティ" @@ -5166,8 +5154,6 @@ ja: back: "すべてのレポートに戻る" group_traffic: "トラフィック" group_members: "メンバー" - group_moderation: "モデレーション" - group_security: "セキュリティ" group_other: "その他" config_sections: account: @@ -5738,7 +5724,7 @@ ja: all: "すべて" view_table: "テーブル" view_graph: "グラフ" - refresh_report: "レポートを更新" + refresh_report: "更新" daily: 日間 monthly: 月間 weekly: 週間 @@ -7825,7 +7811,7 @@ ja: min_admin_password_length: prompt: "パスワードポリシーを変更しようとしています。これは、今後すべての管理者のパスワード変更に影響します。続行してもよろしいですか?" confirm: "はい。パスワードポリシーを更新します" - password_unique_charactes: + password_unique_characters: prompt: "パスワードポリシーを変更しようとしています。これは、今後すべてのユーザーのパスワード変更に影響します。続行してもよろしいですか?" confirm: "はい。パスワードポリシーを更新します" block_common_passwords: diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index 6b961d8e2aa96..cec5314e27713 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -1281,6 +1281,9 @@ ko: tags: "태그" interface: "인터페이스" apps: "앱" + calendar_subscriptions: + copied: "복사되었습니다!" + add_to_google: "구글 캘린더" change_password: success: "(이메일 전송됨)" in_progress: "(이메일 전송 중)" @@ -1772,6 +1775,7 @@ ko: form_kit: reset: 리셋 optional: 선택 사항 + required: 필수 errors: required: "필수" too_short: @@ -2401,10 +2405,7 @@ ko: confirm: "확인" select_all: "모두 선택" clear_all: "모두 지우기" - unlist_topics: "목록에서 글 숨기기" - relist_topics: "목록에서 글 다시 표시" reset_bump_dates: "끌어올림 날짜 초기화" - delete: "글 삭제" delete_topics_count: other: "글 삭제" dismiss: "무시" @@ -2421,19 +2422,13 @@ ko: other: "새글 읽음으로 표시 (%{count})" toggle: "글 일괄 선택 전환" actions: "일괄 작업" - close_topics: "글 닫기" - archive_topics: "글 보관" move_messages_to_inbox: "받은 편지함으로 이동" change_notification_level: "알림 수준 변경" choose_new_category: "글에 대한 새 카테고리 선택:" - selected: - other: "%{count}개의 글을 선택했습니다." - change_tags: "태그 대체" append_tags: "태그 추가" choose_new_tags: "다음 글에 대한 새 태그 선택:" - choose_append_tags: "다음 글에 추가할 새 태그 선택:" + choose_append_tags: "태그 추가" changed_tags: "해당 글의 태그가 변경되었습니다." - remove_tags: "모든 태그 제거" confirm_remove_tags: other: "%{count}개의 글에서 태그가 모두 제거됩니다. 계속할까요?" progress: @@ -2465,14 +2460,10 @@ ko: name: "받은 편지함으로 이동" remove_tags: name: "태그 제거" - append_tags: - name: "태그 추가" replace_tags: name: "태그 바꾸기" delete_topics: name: "삭제하기" - update_category: - description: "선택한 글에 맞는 새 카테고리를 선택하세요." update_notifications: name: "업데이트 알림" topic: @@ -3094,6 +3085,8 @@ ko: delete_error: "카테고리를 삭제하는 중에 오류가 발생했습니다." no_description: "이 카테고리에 대한 설명을 추가하세요." change_in_category_topic: "설명 수정" + description_expand: "더 보기" + description_collapse: "간략히 보기" already_used: "이 색은 다른 카테고리에서 사용 중입니다" security: "보안" security_add_group: "그룹 추가" @@ -3795,8 +3788,6 @@ ko: sidebar_title: "보고서" group_traffic: "트래픽" group_members: "회원" - group_moderation: "관리" - group_security: "보안" group_other: "기타" config_sections: account: @@ -4023,7 +4014,7 @@ ko: all: "전체" view_table: "표" view_graph: "그래프" - refresh_report: "리포트 새로고침" + refresh_report: "새로 고침" daily: 매일 monthly: 매달 weekly: 매주 diff --git a/config/locales/client.lt.yml b/config/locales/client.lt.yml index e15babdb15786..e8792bec80d44 100644 --- a/config/locales/client.lt.yml +++ b/config/locales/client.lt.yml @@ -1519,6 +1519,9 @@ lt: interface: "Sąsaja" apps: "Programėlės" upcoming_changes: "Būsimi pakeitimai" + calendar_subscriptions: + copied: "Nukopijuota!" + add_to_google: "„Google“ kalendorius" change_password: success: "(el. laiškas išsiųstas)" in_progress: "(siunčiamas el. laiškas)" @@ -2025,6 +2028,7 @@ lt: form_kit: reset: Atstatyti optional: pasirinktinai + required: privalomi errors: required: "Privalomi" date_before_or_equal: "Turi būti prieš arba lygu %{date}" @@ -2741,8 +2745,6 @@ lt: confirm: "Patvirtinti" select_all: "Pasirinkti viską" clear_all: "Išvalyti viską" - unlist_topics: "Atžymėti temas" - delete: "Ištrinti temas" delete_topics_count: one: "Ištrinti temą" few: "Ištrinti temas" @@ -2756,22 +2758,11 @@ lt: dismiss_new: "Praleisti Naujas" toggle: "perjungti temų pasirinkimus" actions: "Veiksmai" - close_topics: "Uždaryti temas" - archive_topics: "Archyvuoti temas" move_messages_to_inbox: "Perkelti į Pranešimų dėžutę" change_notification_level: "Keisti pranešimo lygį" choose_new_category: "Pasirinkti naują kategoriją temoms:" - selected: - one: "Jūs pasirinkote %{count} temą." - few: "Jūs pasirinkote %{count} temas." - many: "Jūs pasirinkote %{count} temų." - other: "Jūs pasirinkote %{count} temų." - change_tags: "Pakeisti žymas" - append_tags: "Pridėti žymas" choose_new_tags: "Pasirinkite naujas žymas šioms temoms:" - choose_append_tags: "Pasirinkite naujas žymas, kurias norite pridėti šioms temoms:" changed_tags: "Šių temų žymos buvo pakeistos." - remove_tags: "Pašalinti visas žymes" confirm_remove_tags: one: "Visos žymos bus pašalintos iš šios temos. Ar esate tikras?" few: "Visos žymės bus pašalintos iš %{count} temų. Ar esate tikras?" @@ -2801,8 +2792,6 @@ lt: name: "Archyvuoti" move_messages_to_inbox: name: "Perkelti į Pranešimų dėžutę" - append_tags: - name: "Pridėti žymas" replace_tags: name: "Pakeisti žymas" delete_topics: @@ -3430,6 +3419,8 @@ lt: delete_confirm: "Ar tikrai norite ištrinti šią kategoriją?" delete_error: "Įvyko klaida ištrinant kategoriją." no_description: "Prašome pridėti aprašymą šiai kategorijai." + description_expand: "Rodyti daugiau" + description_collapse: "Rodyti mažiau" already_used: "Ši spalva jau priskirta prie kitos kategorijos" security: "Saugumo" security_add_group: "Pridėti grupę" @@ -4140,8 +4131,6 @@ lt: sidebar_title: "Pranešimai" group_traffic: "Srautas" group_members: "Nariai" - group_moderation: "Moderavimas" - group_security: "Apsauga" group_other: "Kiti" config_sections: account: @@ -4350,7 +4339,7 @@ lt: all: "Visi" view_table: "table" view_graph: "grafikas" - refresh_report: "Refresh Report" + refresh_report: "Atnaujinti" daily: Kasdien monthly: Kas mėnesį weekly: Kas savaitę diff --git a/config/locales/client.lv.yml b/config/locales/client.lv.yml index 637883b7663a7..3e18e271e7a2d 100644 --- a/config/locales/client.lv.yml +++ b/config/locales/client.lv.yml @@ -1076,6 +1076,8 @@ lv: tags: "Tagi" interface: "Saskarne" apps: "Lietotnes" + calendar_subscriptions: + copied: "Nokopēts!" change_password: success: "(e-pasts nosūtīts)" in_progress: "(sūta e-pastu)" @@ -1466,6 +1468,7 @@ lv: form_kit: reset: Atlikt optional: pēc izvēles + required: obligāts errors: required: "Nepieciešams" close: "Aizvērt" @@ -1869,9 +1872,6 @@ lv: bulk: select_all: "Izvēlēties visu" clear_all: "Noņemt visu" - unlist_topics: "Izņemt no sarakstiem tēmas" - relist_topics: "Atkal padarīt tēmas redzamas sarakstiem" - delete: "Dzēst tēmas" delete_topics_count: zero: "Dzēst tēmas" one: "Dzēst tēmu" @@ -1884,18 +1884,9 @@ lv: dismiss_new: "Nerādīt jaunus" toggle: "darbības ar vairākām tēmām" actions: "Darbības ar vairumu" - close_topics: "Slēgt tēmas" - archive_topics: "Arhivēt tēmas" move_messages_to_inbox: "Pārvietot uz iesūtni" choose_new_category: "Izvēlēties jaunu sadaļu šīm tēmām:" - selected: - zero: "Jūs izvēlējāties 0. tēmas." - one: "Jūs izvēlējāties %{count}. tēmu." - other: "Jūs izvēlējāties %{count} tēmas." - change_tags: "Aizvietot tagus" - append_tags: "Pievienot tagus" choose_new_tags: "Izvēlēties jaunus tagus šīm tēmām:" - choose_append_tags: "Izvēlēties jaunas birkas, ko pievienot šīm tēmām:" changed_tags: "Šo tēmu tagi tika mainīti." error_topic_count: zero: "%{count} tēmas" @@ -1919,8 +1910,6 @@ lv: name: "Arhīvs" move_messages_to_inbox: name: "Pārvietot uz iesūtni" - append_tags: - name: "Pievienot tagus" replace_tags: name: "Aizvietot tagus" delete_topics: @@ -2855,7 +2844,6 @@ lv: reports: group_traffic: "Datu plūsma" group_members: "Dalībnieki" - group_security: "Drošība" group_other: "Citi" config_sections: account: @@ -3025,7 +3013,7 @@ lv: all: "Visi" view_table: "tabula" view_graph: "grafiks" - refresh_report: "Pārlādēt ziņojumu" + refresh_report: "Pārlādēt" daily: Dienas monthly: Mēneša weekly: Nedēļas diff --git a/config/locales/client.nb_NO.yml b/config/locales/client.nb_NO.yml index 854379089876b..d72f12d7f55a8 100644 --- a/config/locales/client.nb_NO.yml +++ b/config/locales/client.nb_NO.yml @@ -1429,6 +1429,8 @@ nb_NO: tags: "Stikkord" interface: "Grensesnitt" apps: "Programmer" + calendar_subscriptions: + copied: "Kopiert!" change_password: success: "(e-post sendt)" in_progress: "(sender e-post)" @@ -1980,6 +1982,7 @@ nb_NO: form_kit: reset: Tilbakestill optional: valgfritt + required: nødvendig dirty_form: "Du har ikke sendt inn endringene dine! Er du sikker på at du vil dra?" errors: required: "Påkrevd" @@ -2812,11 +2815,8 @@ nb_NO: confirm: "Bekreft" select_all: "Velg alle" clear_all: "Fjern alle" - unlist_topics: "Fjern emner fra lister" - relist_topics: "Før opp igjen emner i lister" reset_bump_dates: "Tilbakestill støtdatoer" defer: "Merk ulest" - delete: "Slett emner" delete_topics_count: one: "Slett emne" other: "Slett emner" @@ -2849,29 +2849,18 @@ nb_NO: other: "Avvis nye (%{count})" toggle: "slå på/av massevelging av emner" actions: "Massehandlinger" - change_category: "Sett kategori…" - close_topics: "Lukk emner" - archive_topics: "Arkiver emner" move_messages_to_inbox: "Flytt til innboks" archive_messages: "Flytt til arkiv" - notification_level: "Varsler…" change_notification_level: "Endre varslingsnivå" choose_new_category: "Velg den nye kategorien for emnene:" - selected: - one: "Du har valgt %{count} emne." - other: "Du har valgt %{count} emner." selected_sole_category: one: "Du har valgt %{count} emne fra kategorien:" other: "Du har valgt %{count} emner fra kategorien:" selected_count: one: "%{count} valgt" other: "%{count} valgt" - change_tags: "Erstatt stikkord" - append_tags: "Legg til stikkord" choose_new_tags: "Velg nye stikkord for følgende emner:" - choose_append_tags: "Velg nye stikkord å legge til følgende emner:" changed_tags: "Stikkordene for de valgte emnene ble endret." - remove_tags: "Fjern alle stikkord" confirm_remove_tags: one: "Alle stikkord vil bli fjernet fra dette emnet. Er du sikker?" other: "Alle stikkord vil bli fjernet fra %{count} emner. Er du sikker?" @@ -2900,7 +2889,6 @@ nb_NO: name: "Avslå" close_topics: name: "Lukk" - note: "Merk" optional: (valgfritt) archive_topics: name: "Arkiver" @@ -2914,24 +2902,18 @@ nb_NO: name: "Liste på nytt" remove_tags: name: "Fjern stikkord" - append_tags: - name: "Legg til stikkord" replace_tags: name: "Erstatt stikkord" delete_topics: name: "Slett" update_category: name: "Oppdater kategori" - description: "Velg en ny kategori for de valgte emnene" reset_bump_dates: name: "Tilbakestill støtdatoer" - description: "Tilbakestill støtdatoen til siste opprettet innleggsdatoen, noe som påvirker rekkefølgen i emnelisten" defer: name: "Merk ulest" - description: "Merk emner som ulest" update_notifications: name: "Oppdater varsler" - description: "Endre varslingsnivå til følging, overvåking, normal, eller ignorert" topic: filter_to: one: "%{count} innlegg i emnet" @@ -3663,6 +3645,8 @@ nb_NO: delete_confirm: "Er du sikker på at du vil slette denne kategorien?" delete_error: "Det oppstod en feil ved å slette denne kategorien." no_description: "Legg til en beskrivelse for denne kategorien." + description_expand: "Vis mer" + description_collapse: "Vis mindre" already_used: "Denne fargen er i bruk av en annen kategori" security: "Sikkerhet" security_add_group: "Legg til gruppe" @@ -4345,8 +4329,6 @@ nb_NO: sidebar_title: "Rapporter" group_traffic: "Trafikk" group_members: "Medlemmer" - group_moderation: "Moderering" - group_security: "Sikkerhet" group_other: "Annet" config_sections: account: @@ -4555,7 +4537,7 @@ nb_NO: all: "Alle" view_table: "tabell" view_graph: "graf" - refresh_report: "Refresh Rapport" + refresh_report: "Last inn siden på nytt" daily: Daglig monthly: Månedlig weekly: Ukentlig diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml index 7b31eb5af6e39..842321cb4b8a5 100644 --- a/config/locales/client.nl.yml +++ b/config/locales/client.nl.yml @@ -1698,6 +1698,10 @@ nl: interface: "Interface" apps: "Apps" navigation_menu: "Navigatiemenu" + calendar_subscriptions: "Kalender" + calendar_subscriptions: + copied: "Gekopieerd!" + add_to_google: "Google-agenda" change_password: success: "(e-mail verzonden)" in_progress: "(e-mail verzenden)" @@ -1785,22 +1789,22 @@ nl: edit_description: "Naam fysieke beveiligingssleutel" name_required_error: "Je moet een naam voor je beveiligingssleutel opgeven." passkeys: - rename_passkey: "Passkey hernoemen" - add_passkey: "Passkey toevoegen" - confirm_delete_passkey: "Weet je zeker dat je deze passkey wilt verwijderen?" - passkey_successfully_created: "Gelukt! Je nieuwe passkey is gemaakt." - rename_passkey_instructions: "Kies een passkeynaam die je gemakkelijk kunt herkennen, bijvoorbeeld de naam van je wachtwoordmanager." + rename_passkey: "Toegangssleutel hernoemen" + add_passkey: "Toegangssleutel toevoegen" + confirm_delete_passkey: "Weet je zeker dat je deze toegangssleutel wilt verwijderen?" + passkey_successfully_created: "Gelukt! Je nieuwe toegangssleutel is gemaakt." + rename_passkey_instructions: "Kies een toegangssleutelnaam die je gemakkelijk kunt herkennen, bijvoorbeeld de naam van je wachtwoordmanager." name: - default: "Hoofdpasskey" + default: "Hoofdtoegangssleutel" save: "Opslaan" - title: "Passkeys" - short_description: "Passkeys zijn wachtwoordvervangers die je identiteit biometrisch valideren (bijv. touch, faceID) of via een apparaatpincode/-wachtwoord." + title: "Toegangssleutels" + short_description: "Toegangssleutels zijn wachtwoordvervangers die je identiteit biometrisch valideren (bijv. touch, faceID) of via een apparaatpincode/-wachtwoord." added_date: "%{date} toegevoegd" last_used_date: "Laatst gebruikt %{date}" never_used: "Nooit gebruikt" - not_allowed_error: "Er is een time-out opgetreden in het passkeyregistratieproces, het proces is geannuleerd of het is niet toegestaan." - already_added_error: "Je hebt deze passkey al geregistreerd. Je hoeft deze niet opnieuw te registreren." - confirm_button: "of een passkey gebruiken" + not_allowed_error: "Er is een time-out opgetreden in het toegangssleutelregistratieproces, het proces is geannuleerd of het is niet toegestaan." + already_added_error: "Je hebt deze toegangssleutel al geregistreerd. Je hoeft deze niet opnieuw te registreren." + confirm_button: "of een toegangssleutel gebruiken" change_about: title: "Over mij wijzigen" error: "Er is een fout opgetreden bij het wijzigen van deze waarde." @@ -2136,7 +2140,7 @@ nl: confirm_access: title: "Toegang bevestigen" incorrect_password: "Het ingevoerde wachtwoord is onjuist." - incorrect_passkey: "Die passkey is onjuist." + incorrect_passkey: "Die toegangssleutel is onjuist." logged_in_as: "Je bent aangemeld als: " forgot_password: "Wachtwoord vergeten?" password_reset_email_sent: "E-mail voor wachtwoordherstel verzonden." @@ -2303,6 +2307,7 @@ nl: form_kit: reset: Resetten optional: optioneel + required: vereist errors_summary_title: one: "Corrigeer deze fout om door te gaan" other: "Corrigeer deze fouten om door te gaan" @@ -2575,7 +2580,7 @@ nl: title: "Aanmelden met LinkedIn" sr_title: "Aanmelden met LinkedIn" passkey: - name: "Aanmelden met een passkey" + name: "Aanmelden met een toegangssleutel" second_factor_toggle: totp: "Authenticator-app gebruiken" backup_code: "Back-upcode gebruiken" @@ -2603,7 +2608,7 @@ nl: google_classic: "Google Classic (verouderd, verplaatst naar Noto Emoji)" facebook_messenger: "Facebook Messenger (verouderd, verplaatst naar Standard)" openmoji: OpenMoji - standard: Standard + standard: Standaard fluentui: Fluent Emoji noto: Noto Emoji twemoji: Twemoji @@ -3241,11 +3246,8 @@ nl: confirm: "Bevestigen" select_all: "Alles selecteren" clear_all: "Alles wissen" - unlist_topics: "Topics onzichtbaar maken" - relist_topics: "Topics opnieuw weergeven" reset_bump_dates: "Omhoogplaatsingsdatums resetten" defer: "Markeren als ongelezen" - delete: "Topics verwijderen" delete_topics_count: one: "Topic verwijderen" other: "Topics verwijderen" @@ -3281,29 +3283,20 @@ nl: other: "Nieuwe negeren (%{count})" toggle: "bulkselectie van topics in-/uitschakelen" actions: "Bulkacties" - change_category: "Categorie instellen..." - close_topics: "Topics sluiten" - archive_topics: "Topics archiveren" move_messages_to_inbox: "Verplaatsen naar inbox" archive_messages: "Verplaatsen naar archief" - notification_level: "Meldingen…" change_notification_level: "Meldingsniveau wijzigen" choose_new_category: "Kies de nieuwe categorie voor de topics:" - selected: - one: "Je hebt %{count} topic geselecteerd." - other: "Je hebt %{count} topics geselecteerd." selected_sole_category: one: "Je hebt %{count} topic geselecteerd uit de categorie:" other: "Je hebt %{count} topics geselecteerd uit de categorie:" selected_count: one: "%{count} geselecteerd" other: "%{count} geselecteerd" - change_tags: "Tags vervangen" append_tags: "Tags toevoegen" choose_new_tags: "Kies nieuwe tags voor deze topics:" - choose_append_tags: "Kies nieuwe tags om toe te voegen voor deze topics:" + choose_append_tags: "Tags toevoegen" changed_tags: "De tags van deze topics zijn gewijzigd." - remove_tags: "Alle tags verwijderen" confirm_remove_tags: one: "Alle tags worden verwijderd van dit topic. Weet je het zeker?" other: "Alle tags worden verwijderd van %{count} topics. Weet je het zeker?" @@ -3338,7 +3331,6 @@ nl: name: "Sluiten" close_topics: name: "Sluiten" - note: "Opmerking" optional: (optioneel) archive_topics: name: "Archiveren" @@ -3352,24 +3344,18 @@ nl: name: "Opnieuw zichtbaar maken" remove_tags: name: "Tags verwijderen" - append_tags: - name: "Tags toevoegen" replace_tags: name: "Tags vervangen" delete_topics: name: "Verwijderen" update_category: name: "Categorie bijwerken" - description: "Kies de nieuwe categorie voor de geselecteerde topics" reset_bump_dates: name: "Omhoogplaatsingsdatums resetten" - description: "Reset de omhoogplaatsingsdatum van het topic naar de datum van het laatst gemaakte bericht, wat de volgorde in de topicslijst beïnvloedt" defer: name: "Markeren als ongelezen" - description: "Markeer topics als ongelezen" update_notifications: name: "Meldingen bijwerken" - description: "Wijzig het meldingsniveau naar Kijken, Volgen, Normaal of Gedempt" topic: filter_to: one: "%{count} bericht in topic" @@ -4139,6 +4125,8 @@ nl: tag_group: "Tag-groep" topic_featured_link_allowed: "Uitgelichte links toestaan in deze categorie" create_long: "Nieuwe categorie maken" + type_settings_schema: + site_settings: "Site-instellingen" unsaved_changes: "Je hebt niet-opgeslagen wijzigingen" slug_placeholder: "(Optioneel) met streepjes verbonden woorden voor URL" creation_error: Er is een fout opgetreden bij het maken van de categorie. @@ -4172,6 +4160,8 @@ nl: list: "Categorieën weergeven" no_description: "Voeg een beschrijving toe voor deze categorie." change_in_category_topic: "Beschrijving bewerken" + description_expand: "Meer weergeven" + description_collapse: "Minder weergeven" already_used: "Deze kleur is al in gebruik door een andere categorie" color_palette: "Kleurenpalet" security: "Beveiliging" @@ -5254,8 +5244,6 @@ nl: back: "Terug naar alle rapporten" group_traffic: "Verkeer" group_members: "Leden" - group_moderation: "Moderatie" - group_security: "Beveiliging" group_other: "Overig" config_sections: account: @@ -5738,7 +5726,7 @@ nl: all: "Alles" view_table: "tabel" view_graph: "grafiek" - refresh_report: "Rapport vernieuwen" + refresh_report: "Vernieuwen" daily: Dagelijks monthly: Maandelijks weekly: Wekelijks @@ -6306,7 +6294,7 @@ nl: back: "Terug naar onderdelen" install: "Installeren" name: "Naam" - used_on: "Gebruikt op" + used_on: "Gebruikt in" enabled: "Ingeschakeld?" by_author: "Van %{name}" learn_more: "Meer informatie" @@ -7267,7 +7255,7 @@ nl: edit_category: select_template: "Selecteer formuliersjablonen" errors: - multiple_tags_not_allowed: 'Je kunt geen verdere tags selecteren uit de "%{tag_name}". Gebruik een formuliersjabloon om problemen te voorkomen.' + multiple_tags_not_allowed: 'Je kunt geen verdere tags selecteren uit de "%{tag_name}". Gebruik het formuliersjabloon om problemen te voorkomen.' impersonate: title: "Imiteren" help: "Gebruik deze tool om een gebruikersaccount te imiteren voor debugdoeleinden. Je moet je afmelden wanneer je klaar bent." @@ -7673,6 +7661,7 @@ nl: more_than_50_results: "Er zijn meer dan 50 resultaten. Verfijn je zoekopdracht." no_results: "Geen overeenkomende siteteksten gevonden" interpolation_keys: "Beschikbare interpolatiesleutels:" + interpolation_key_used: "Al gebruikt" outdated: title: "Deze vertaling is verouderd" description: "De standaardvertaling voor deze sleutel is gewijzigd sinds deze overschrijving is gemaakt. Controleer hieronder of je vertaling overeenkomt met eventuele wijzigingen die zijn aangebracht in de oorspronkelijke betekenis." @@ -7785,7 +7774,7 @@ nl: confirm: "Ja, wachtwoordbeleid bijwerken" min_admin_password_length: confirm: "Ja, wachtwoordbeleid bijwerken" - password_unique_charactes: + password_unique_characters: confirm: "Ja, wachtwoordbeleid bijwerken" block_common_passwords: confirm: "Ja, wachtwoordbeleid bijwerken" diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml index 54baa0e28d091..8831f755e3f8d 100644 --- a/config/locales/client.pl_PL.yml +++ b/config/locales/client.pl_PL.yml @@ -529,7 +529,6 @@ pl_PL: predefined_topics_subtitle: "Daj nowym członkom temat do rozmów, wybierz szablon do edycji i stwórz swój własny." predefined_topics_description: "Wybierz z kolekcji tematów do rozpoczęcia rozmowy, aby rozpocząć dyskusję" use_predefined: "Przeglądaj szablony" - start_with_this: "Zacznij od tego" back: "Wstecz" icebreakers: fun_facts: @@ -2015,6 +2014,23 @@ pl_PL: apps: "Aplikacje" navigation_menu: "Menu nawigacyjne" upcoming_changes: "Nadchodzące zmiany" + calendar_subscriptions: "Kalendarz" + calendar_subscriptions: + description: "Wygeneruj adresy URL subskrypcji, aby zsynchronizować je z ulubioną aplikacją kalendarza (Kalendarz Google, Kalendarz Apple, Outlook itp.). Te adresy URL to prywatne linki do wydarzeń w kalendarzu na Twoim koncie (przypomnienia o zakładkach, wydarzenia w kalendarzu itp.). Wygenerowane adresy URL subskrypcji możesz zawsze anulować lub odnowić. " + generate: "Generuj adresy URL subskrypcji" + regenerate: "Wygeneruj ponownie adresy URL" + regenerate_confirm: "Spowoduje to unieważnienie istniejących adresów URL subskrypcji kalendarza. Wszystkie aplikacje kalendarza korzystające ze starych adresów URL przestaną otrzymywać aktualizacje. Kontynuować?" + revoke: "Cofnij subskrypcję" + revoke_confirm: "Spowoduje to anulowanie adresów URL subskrypcji kalendarza. Wszystkie aplikacje kalendarza, które z nich korzystają, przestaną otrzymywać aktualizacje. Kontynuować?" + urls_warning: "Adresy URL subskrypcji są gotowe! Kliknij poniższe przyciski, aby połączyć je z aplikacją kalendarza. Uwaga: te adresy URL są wyświetlane tylko raz." + bookmarks: "Przypomnienia zakładkowe" + bookmarks_description: "Twoje zakładki z datami przypomnień" + copy: "Kopiuj adres URL" + copied: "Skopiowane!" + add_to_google: "Kalendarz Google" + add_to_outlook: "Microsoft Outlook" + add_to_apple: "Kalendarz Apple" + active_subscription: "Masz aktywną subskrypcję kalendarza." change_password: success: "(e-mail wysłany)" in_progress: "(e-mail wysyłany)" @@ -2659,6 +2675,7 @@ pl_PL: form_kit: reset: Przywróć optional: opcjonalnie + required: wymagane errors_summary_title: one: "Napraw ten błąd, aby kontynuować" few: "Napraw te błędy, aby kontynuować" @@ -3283,6 +3300,7 @@ pl_PL: collapse: "Zminimalizuj panel kompozytora" open: "Otwórz panel kompozytora" abandon: "Zamknij kompozytor i odrzuć szkic" + edit_reason: "Dodaj powód edycji" enter_fullscreen: "Przejdź do pełnoekranowego kompozytora" exit_fullscreen: "Wyjdź z trybu pełnoekranowego kompozytora" exit_fullscreen_prompt: "Naciśnij ESC, aby wyjść z pełnego ekranu" @@ -3457,9 +3475,13 @@ pl_PL: available: title: "Nadchodzące zmiany" description: "„%{changeName}” jest dostępny do podglądu" + description_two: "„%{changeName1}” i „%{changeName2}” są dostępne do podglądu" + description_many: "'%{changeName}' i %{otherChangeCount} więcej zmian jest dostępnych do podglądu" automatically_promoted: title: "Nadchodzące zmiany" description: "Opcja „%{changeName}” została automatycznie włączona" + description_two: "„%{changeName1}” i „%{changeName2}” zostały automatycznie włączone" + description_many: "'%{changeName}' i %{otherChangeCount} więcej zmian zostało automatycznie włączonych" dismiss_confirmation: body: default: @@ -3526,8 +3548,8 @@ pl_PL: votes_released: "głos został opublikowany" new_features: "wydano nowe funkcje discourse" admin_problems: "nowe porady w panelu administratora" - upcoming_change_available: "dostępna jest nowa nadchodząca zmiana '%{changeName}'" - upcoming_change_automatically_promoted: "nadchodząca zmiana '%{changeName}' została automatycznie włączona" + upcoming_change_available: "dostępne są nowe nadchodzące zmiany" + upcoming_change_automatically_promoted: "nadchodzące zmiany zostały automatycznie włączone" upload_selector: change: "Zmień" delete: "Usuń" @@ -3746,8 +3768,8 @@ pl_PL: confirm: "Potwierdź" select_all: "Zaznacz wszystkie" clear_all: "Wyczyść wszystko" - unlist_topics: "Zastrzeż tematy" - relist_topics: "Odśwież listę tematów" + unlist_topics: "Usuń tematy z listy" + relist_topics: "Zamieść ponownie tematy" reset_bump_dates: "Zresetuj datę podbicia" defer: "Oznacz jako nieprzeczytany" delete: "Usuń tematy" @@ -3805,19 +3827,14 @@ pl_PL: other: "Oddalenie nowe (%{count})" toggle: "włącz grupowe zaznaczanie tematów" actions: "Operacje grupowe" - change_category: "Ustaw kategorię…" + change_category: "Aktualizuj kategorię" close_topics: "Zamknij tematy" archive_topics: "Zarchiwizuj tematy" move_messages_to_inbox: "Przenieś do skrzynki odbiorczej" archive_messages: "Przenieś do archiwum" - notification_level: "Powiadomienia…" + notification_level: "Aktualizuj powiadomienia" change_notification_level: "Zmień poziom powiadomień" choose_new_category: "Wybierz nową kategorię dla tematów:" - selected: - one: "Zaznaczono %{count} temat." - few: "Zaznaczono %{count} tematy." - many: "Zaznaczono %{count} tematów." - other: "Zaznaczono %{count} tematów." selected_sole_category: one: "Wybrano %{count} temat z kategorii:" few: "Wybrano %{count} tematy z kategorii:" @@ -3831,20 +3848,60 @@ pl_PL: change_tags: "Zmień tagi" append_tags: "Dodaj tagi" choose_new_tags: "Wybierz nowe tagi dla tych tematów:" - choose_append_tags: "Wybierz nowe tagi dla tych tematów:" + choose_append_tags: "Dodaj tagi" changed_tags: "Tagi tych tematów były zmieniane." - remove_tags: "Usuń wszystkie tagi" + remove_tags: "Usuń tagi" confirm_remove_tags: one: "Wszystkie tagi zostaną usunięte z tego tematu. Jesteś pewny?" few: "Wszystkie tagi zostaną usunięte z %{count} tematów. Jesteś pewny?" many: "Wszystkie tagi zostaną usunięte z %{count} tematów. Jesteś pewny?" other: "Wszystkie tagi zostaną usunięte z %{count} tematów. Jesteś pewny?" + confirm_update_topics: + one: "Zaktualizuj %{count} temat" + few: "Zaktualizuj %{count} tematy" + many: "Zaktualizuj %{count} tematów" + other: "Zaktualizuj %{count} tematów" + confirm_close_topics: + one: "Zamknij %{count} temat" + few: "Zamknij %{count} tematy" + many: "Zamknij %{count} tematów" + other: "Zamknij %{count} tematów" + confirm_archive_topics: + one: "Zarchiwizuj %{count} temat" + few: "Zarchiwizuj %{count} tematy" + many: "Zarchiwizuj %{count} tematów" + other: "Zarchiwizuj %{count} tematów" + confirm_unlist_topics: + one: "Usuń z listy %{count} temat" + few: "Usuń z listy %{count} tematy" + many: "Usuń z listy %{count} tematów" + other: "Usuń z listy %{count} tematów" + confirm_relist_topics: + one: "Zamieść ponownie %{count} temat" + few: "Zamieść ponownie %{count} tematy" + many: "Zamieść ponownie %{count} tematów" + other: "Zamieść ponownie %{count} tematów" + confirm_archive_messages: + one: "Zarchiwizuj %{count} wiadomość" + few: "Zarchiwizuj %{count} wiadomości" + many: "Zarchiwizuj %{count} wiadomości" + other: "Zarchiwizuj %{count} wiadomości" + confirm_move_to_inbox: + one: "Przenieś %{count} wiadomość do skrzynki odbiorczej" + few: "Przenieś %{count} wiadomości do skrzynki odbiorczej" + many: "Przenieś %{count} wiadomości do skrzynki odbiorczej" + other: "Przenieś %{count} wiadomości do skrzynki odbiorczej" + confirm_delete_topics: + one: "Usuń %{count} temat" + few: "Usuń %{count} tematy" + many: "Usuń %{count} tematów" + other: "Usuń %{count} tematów" progress: one: "Postęp: %{count} temat" few: "Postęp: %{count} tematy" many: "Postęp: %{count} tematów" other: "Postęp: %{count} tematów" - notify: "Powiadom użytkowników o tej zmianie." + notify: "Powiadom użytkowników o tej zmianie" performing: "Wykonywanie operacji zbiorczych, proszę czekać…" completed: "Operacje masowe zakończone pomyślnie!" completed_count: @@ -3890,38 +3947,44 @@ pl_PL: name: "Odrzuć" close_topics: name: "Zamknij" - note: "Uwaga" + description: "Zamknięte tematy uniemożliwiają nowe odpowiedzi. Dowiedz się więcej" + note: "Dodaj notatkę do tych tematów" optional: (opcjonalne) archive_topics: name: "Archiwum" + description: "Zarchiwizowane tematy są ukryte w wynikach wyszukiwania i na liście najnowszych tematów. Dowiedz się więcej" archive_messages: name: "Przenieś do archiwum" move_messages_to_inbox: name: "Przenieś do skrzynki odbiorczej" unlist_topics: name: "Zastrzeż" + description: "Tematy niewymienione na liście są ukryte, ale nadal można uzyskać do nich dostęp za pomocą bezpośredniego linku. Dowiedz się więcej" relist_topics: name: "Dodaj do listy" remove_tags: name: "Usuń tagi" + description: "Usuń wszystkie tagi z wybranych tematów." append_tags: name: "Dodaj tagi" + description: "Dodaj następujące tagi do wybranych tematów:" replace_tags: name: "Zmień tagi" + description: "Zastąp wszystkie istniejące tagi w wybranych tematach następującymi:" delete_topics: name: "Usuń" + description: "Trwale usuń wybrane tematy. Tej czynności nie można cofnąć." update_category: name: "Aktualizuj kategorię" - description: "Wybierz nową kategorię dla wybranych tematów" + description: "Przenieś wszystkie wybrane tematy do następującej kategorii:" reset_bump_dates: name: "Zresetuj datę odświeżenia" - description: "Ustaw datę odświeżenia tematu na datę utworzenia ostatniego posta. Wpływa to na kolejność tematów na liście." + description: "Czy chcesz zaktualizować daty publikacji postów do daty ostatniego utworzenia? Może to wpłynąć na ich kolejność na liście tematów." defer: name: "Oznacz jako nieprzeczytane" - description: "Oznacz tematy jako nieprzeczytane" update_notifications: name: "Aktualizuj powiadomienia" - description: "Zmień poziom powiadomień na obserwowanie, śledzone, normalne lub wyciszone" + description: "Zaktualizuj swój osobisty poziom powiadomień dla wybranych tematów, aby:" topic: filter_to: one: "%{count} post w temacie" @@ -4119,6 +4182,11 @@ pl_PL: few: "Ostatni wpis w tym temacie został zamieszczony %{count} godziny temu, więc zostanie on natychmiastowo zamknięty." many: "Ostatni wpis w tym temacie został zamieszczony %{count} godzin temu, więc zostanie on natychmiastowo zamknięty." other: "Ostatni wpis w tym temacie został zamieszczony %{count} godzin temu, więc zostanie on natychmiastowo zamknięty." + auto_delete_immediate: + one: "Ostatni wpis tematu jest już od %{count} godziny, więc temat zostanie natychmiast usunięty." + few: "Ostatni wpis tematu jest już od %{count} godzin, więc temat zostanie natychmiast usunięty." + many: "Ostatni wpis tematu jest już od %{count} godzin, więc temat zostanie natychmiast usunięty." + other: "Ostatni wpis tematu jest już od %{count} godzin, więc temat zostanie natychmiast usunięty." timeline: back: "Wstecz" back_description: "Wróć do ostatniego nieprzeczytanego wpisu" @@ -4703,6 +4771,7 @@ pl_PL: many: "Czy na pewno chcesz połączyć te %{count} postów?" other: "Czy na pewno chcesz połączyć te %{count} postów?" revisions: + diff_too_complex: "Różnica jest zbyt złożona, aby ją wyświetlić. Spróbuj wyświetlić pojedyncze, mniejsze zmiany." locale: no_locale_set: "Nie ustawiono języka" locale_removed: "Język usunięty" @@ -4778,6 +4847,7 @@ pl_PL: instructions: "Udostępnij link do tego posta:" original_language: "Ten post został pierwotnie napisany w %{language}" original_language_and_outdated: "Ten post został pierwotnie napisany w %{language}. Tłumaczenie może być nieaktualne" + ai_translation_disclaimer: "Tłumaczenia wygenerowane przez AI mogą być niedokładne." category: none: "(brak kategorii)" all: "Wszystkie kategorie" @@ -4792,6 +4862,8 @@ pl_PL: advanced: "Zaawansowane" show_advanced: "Ustawienia zaawansowane" topic_template: "Szablon" + topic_title_placeholder: "Symbol zastępczy tytułu tematu kategorii" + topic_title_placeholder_placeholder: "[opcjonalnie] niestandardowy symbol zastępczy tytułu tematu dla tej kategorii" tags: "Tagi" localizations: "Języki" localization: @@ -4820,7 +4892,16 @@ pl_PL: topic_featured_link_allowed: "Zezwól na wybrane linki w tej kategorii" delete: "Usuń kategorię" create: "Nowa kategoria" + create_with_type: "Nowa kategoria %{typeName}" create_long: "Utwórz nową kategorię" + settings_apply_to_all_of_type_warning: "Poniższe zmiany będą dotyczyć wszystkich kategorii tego typu" + type_settings_schema: + category_settings: "Ustawienia kategorii" + category_custom_fields: "Ustawienia kategorii" + site_settings: "Ustawienia witryny" + choose_type: + title: "Wybierz typ kategorii" + requires_plugin: "Wymaga wtyczki" create_category: "Utwórz kategorię" save: "Zapisz kategorię" unsaved_changes: "Masz niezapisane zmiany" @@ -4870,6 +4951,9 @@ pl_PL: list: "Wymień kategorie" no_description: "Proszę dodaj opis do tej kategorii." change_in_category_topic: "Edytuj opis" + description_updated: "Opis zaktualizowano" + description_expand: "Pokaż więcej" + description_collapse: "Pokaż mniej" already_used: "Ten kolor jest używany przez inną kategorię" color_palette: "Paleta kolorów" security: "Bezpieczeństwo" @@ -6130,8 +6214,7 @@ pl_PL: group_traffic: "Ruch" group_members: "Członkowie" group_content: "Treść i zdrowie" - group_moderation: "Moderacja" - group_security: "Bezpieczeństwo" + group_moderation_and_security: "Moderacja i bezpieczeństwo" group_other: "Inne" legacy_warning: "To jest starszy raport. Wkrótce zostanie wycofany. Jeśli potrzebujesz pomocy w znalezieniu zamiennika, skontaktuj się z pomocą techniczną." config_sections: @@ -6736,10 +6819,11 @@ pl_PL: all: "Wszystkie" view_table: "tabela" view_graph: "wykres" - refresh_report: "Odśwież raport" + refresh_report: "Odśwież" daily: Dziennie monthly: Miesięcznie weekly: Tygodniowo + chart_group_period: "Wybierz okres" value_so_far: "%{value} (jak dotąd)" dates: "Daty (UTC)" groups: "Wszystkie grupy" @@ -8152,6 +8236,7 @@ pl_PL: upcoming_change_available: "nadchodząca zmiana dostępna" change_site_setting_groups: "zmień grupy ustawień witryny" discourse_id_regenerate_credentials: "wygeneruj ponownie dane uwierzytelniające Discourse ID" + configure_category_type: "skonfiguruj typ kategorii" screened_emails: title: "Sprawdzone e-maile" description: "Kiedy ktoś próbuje założyć nowe konto, jego adres email zostaje sprawdzony i rejestracja zostaje zablokowana, lub inna akcja jest podejmowana." @@ -8798,6 +8883,9 @@ pl_PL: more_than_50_results: "Istnieje ponad 50 wyników. Zawęź wyszukiwanie." no_results: "Nie znaleziono pasujących tekstów witryny" interpolation_keys: "Dostępne klucze interpolacji:" + interpolation_key_insert: "Kliknij, aby wstawić" + interpolation_key_used: "Już używane" + interpolation_key_invalid: "Nieznany klucz — nie będzie interpolowany" outdated: title: "To tłumaczenie jest nieaktualne" description: "Domyślne tłumaczenie tego klucza zmieniło się od czasu utworzenia tego zastąpienia. Sprawdź poniżej, czy Twoje tłumaczenie odpowiada wszelkim zmianom wprowadzonym w pierwotnej intencji." @@ -8926,7 +9014,7 @@ pl_PL: min_admin_password_length: prompt: "Zamierzasz zmienić swoją politykę dotyczącą haseł. Od teraz będzie to dotyczyć wszystkich administratorów zmieniających hasła. Czy na pewno chcesz kontynuować?" confirm: "Tak, zaktualizuj politykę haseł" - password_unique_charactes: + password_unique_characters: prompt: "Zamierzasz zmienić swoją politykę dotyczącą haseł. Będzie to miało wpływ na wszystkich użytkowników, którzy od tej pory będą zmieniać swoje hasła. Czy na pewno chcesz kontynuować?" confirm: "Tak, zaktualizuj politykę haseł" block_common_passwords: diff --git a/config/locales/client.pt.yml b/config/locales/client.pt.yml index 5e98ca53fdc2e..d2b6d5b708022 100644 --- a/config/locales/client.pt.yml +++ b/config/locales/client.pt.yml @@ -1667,6 +1667,9 @@ pt: interface: "Interface" apps: "Aplicações" navigation_menu: "Menu de Navegação" + calendar_subscriptions: + copied: "Copiado!" + add_to_google: "Calendário Google" change_password: success: "(email enviado)" in_progress: "(a enviar email)" @@ -2273,6 +2276,7 @@ pt: form_kit: reset: Repor optional: opcional + required: obrigatório dirty_form: "Não submeteste as tuas alterações! Tens a certeza de que queres sair?" errors: starts_with: "Deve começar com %{prefix}" @@ -3127,9 +3131,6 @@ pt: bulk: select_all: "Selecionar Tudo" clear_all: "Remover Tudo" - unlist_topics: "Remover Tópicos da Lista" - relist_topics: "Voltar a Listar Tópicos" - delete: "Eliminar Tópicos" delete_topics_count: one: "Eliminar Tópico" other: "Eliminar Tópicos" @@ -3153,22 +3154,11 @@ pt: other: "Descartar Novos (%{count})" toggle: "ativar seleção em massa de tópicos" actions: "Ações em Massa" - change_category: "Definir Categoria..." - close_topics: "Fechar Tópicos" - archive_topics: "Arquivar tópicos" move_messages_to_inbox: "Mover para a Caixa de Entrada" - notification_level: "Notificações…" change_notification_level: "Alterar Nível de Notificação" choose_new_category: "Escolha a nova categoria para os tópicos:" - selected: - one: "Selecionou %{count} tópico." - other: "Selecionou %{count} tópicos." - change_tags: "Substituir Etiquetas" - append_tags: "Anexar Etiquetas" choose_new_tags: "Escolha novas etiquetas para estes tópicos:" - choose_append_tags: "Escolha novas etiquetas para acrescentar a estes tópicos:" changed_tags: "As etiquetas para esses tópicos foram mudadas." - remove_tags: "Remover Todas as Etiquetas" confirm_remove_tags: one: "Todas as etiquetas serão removidas deste tópico. Tem a certeza?" other: "Todas as etiquetas serão removidas de %{count} tópicos. Tem a certeza?" @@ -3198,15 +3188,12 @@ pt: name: "Arquivo" move_messages_to_inbox: name: "Mover para a Caixa de Entrada" - append_tags: - name: "Anexar Etiquetas" replace_tags: name: "Substituir Etiquetas" delete_topics: name: "Eliminar" defer: name: "Marcar como Não Lido" - description: "Marcar tópicos como não lido" update_notifications: name: "Notificações de Atualização" topic: @@ -3898,6 +3885,8 @@ pt: delete_confirm: "Tem a certeza que deseja eliminar esta categoria?" delete_error: "Ocorreu um erro ao eliminar a categoria." no_description: "Por favor adicione uma descrição para esta categoria." + description_expand: "Mostrar mais" + description_collapse: "Mostrar menos" already_used: "Esta cor já foi usada para outra categoria" security: "Segurança" security_add_group: "Adicionar um grupo" @@ -4537,8 +4526,6 @@ pt: back: "Voltar para todos os relatórios" group_traffic: "Tráfego" group_members: "Membros" - group_moderation: "Moderação" - group_security: "Segurança" group_other: "Outro" config_sections: account: @@ -4803,7 +4790,7 @@ pt: all: "Tudo" view_table: "tabela" view_graph: "grafo" - refresh_report: "Atualizar relatório" + refresh_report: "Atualizar" daily: Diário monthly: Mensal weekly: Semanal diff --git a/config/locales/client.pt_BR.yml b/config/locales/client.pt_BR.yml index 96a39fb876097..89b7e25a4045b 100644 --- a/config/locales/client.pt_BR.yml +++ b/config/locales/client.pt_BR.yml @@ -9,9 +9,23 @@ pt_BR: blocks: ghost: status: "Status" + conditions: "Condições" + arguments: "Argumentos" + container_args: "Argumentos do container" in_location: "em" hidden: "oculto" - failed: "falha" + not_registered: "não registrado" + no_visible_children: "sem filhos visíveis" + failed: "falhou" + ghost_reasons: + optional_missing_hint: "Este bloco opcional não foi renderizado porque não está registrado." + no_visible_children_hint: "Este bloco de container não foi renderizado porque nenhum de seus filhos está visível." + condition_failed_hint: "Este bloco não foi renderizado porque suas condições falharam." + head_hidden_tail_hint: "Este bloco não foi renderizado porque outro bloco foi renderizado primeiro no container `head`." + carousel: + go_to_slide: "Ir para o slide %{index}" + previous: "Slide anterior" + next: "Próximo slide" number: format: separator: "," @@ -291,13 +305,21 @@ pt_BR: forwarded: "Encaminhou o e-mail acima" topic_admin_menu: "ações de tópico" skip_to_main_content: "Ir para o conteúdo principal" - skip_to_post: "Ir para o post %{post_number}" + skip_links_label: "Ignorar links de navegação" + skip_to_post: "Ir para a postagem %{post_number}" + skip_to_where_you_left_off: "Voltar ao ponto onde parou (postagem %{post_number})" + skip_to_where_you_left_off_last: "Voltar ao ponto onde parou (última resposta, postagem %{post_number})" + skip_to_last_reply: "Ir para a última resposta" + skip_to_top: "Pular para o topo" skip_user_nav: "Pular para o conteúdo do perfil" emails_are_disabled: "Todos os envios de e-mail foram desabilitados globalmente por um administrador. Nenhuma notificação por e-mail de qualquer tipo será enviada." + emails_are_disabled_no_smtp: "O envio de e-mails está desativado porque nenhum servidor SMTP foi configurado. Não é possível enviar nenhum tipo de e-mail." emails_are_disabled_non_staff: "O e-mail de saída foi desabilitado para usuários(as) que não são da equipe." software_update_prompt: message: "Este site foi atualizado, atualize a página para manter tudo funcionando." dismiss: "Descartar" + notifications_tracking: + tooltip: "Nível de notificação: %{level}" back_button: "Voltar" welcome_banner: header: @@ -305,6 +327,9 @@ pt_BR: logged_in_members: "Boas-vindas novamente, %{preferred_display_name}!" anonymous_members: "Boas-vindas ao %{site_name}!" search_placeholder: "Pesquisar" + impersonation: + notice: "Você está personificando %{username}" + stop: "Parar de personificar" themes: default_description: "Padrão" broken_theme_alert: "Seu site pode não funcionar por causa de um tema/componente com erro. Verifique o console do seu navegador para obter mais informações." @@ -314,12 +339,27 @@ pt_BR: broken_page_change_alert: "Houve um erro no identificador onPageChange. Confira as ferramentas de desenvolvedor do navegador para obter mais informações." broken_plugin_alert: "Causado(a) pelo plugin \"%{name}\"" broken_transformer_alert: "Ocorreu um erro. Seu site pode não funcionar corretamente." + broken_block_alert: "Foi detectado um erro na configuração do bloco. Verifique o console do navegador para mais informações." + broken_block_factory_alert: "Um bloco não carregou. Alguns elementos da interface do usuário podem não ser exibidos corretamente." critical_deprecation: notice: "[Aviso da administração] %{source} contém código que precisa de atualização (id:%{id})" learn_more_link: "(saiba mais)" theme_source: "Tema \"%{name}\"" plugin_source: "Plugin \"%{name}\"" unknown_source: "Um dos seus temas ou plugins" + dev_tools: + drag_to_move: "Arraste para mover" + toggle_plugin_outlet_debug: "Alternar depuração da saída do plugin" + toggle_block_debug: "Alternar depuração de bloco" + block_debug: + outlet_boundaries: "Limites da saída" + visual_overlay: "Sobreposição visual" + ghost_blocks: "Blocos fantasmas" + condition_debugging: "Depuração de condições" + toggle_safe_mode: "Alternar modo de segurança" + toggle_verbose_localization: "Alternar localização detalhada" + toggle_mobile_view: "Alternar visualização móvel" + disable_dev_tools: "Desativar ferramentas de desenvolvimento" s3: regions: ap_northeast_1: "Ásia Pacífico (Tóquio)" @@ -409,9 +449,39 @@ pt_BR: pill: "Sugestões" pm_title: "Mensagens sugeridas" admin_onboarding_banner: + launch_in_easy_steps: "Comece em %{step_count} passos fáceis" + skipped: "A lista de verificação de integração de administradores foi ignorada. Se quiser reativá-la, procure por `enable site owner onboarding` nas configurações do site." + congrats_onboarding_complete: "Parabéns por concluir o processo de integração!" + invite_collaborators: + title: "Convidar colaboradores" + description: "Os primeiros membros ajudam a dar vida à sua comunidade." + action: "Criar convite" start_posting: + title: "Comece a postar" + description: "Dê às pessoas algo sobre o que conversar." + action: "Ideias para quebrar o gelo" + choose_option: "Como você gostaria de começar?" + predefined_topics: "Modelos para quebrar o gelo" + predefined_topics_subtitle: "Dê aos novos membros algo sobre o que conversar. Escolha um modelo para editar e crie o seu próprio." + predefined_topics_description: "Escolha dentre uma seleção de temas para iniciar conversas e dar início a um diálogo." + use_predefined: "Navegar pelos modelos" back: "Voltar" + icebreakers: + fun_facts: + title: "Quais são algumas curiosidades interessantes sobre você?" + body: "Olá a todos! Estou animada para começar esta nova comunidade. Para começar, que tal cada um de nós compartilhar uma curiosidade sobre si? Eu começo: adoro caminhar na natureza e descobrir novas trilhas! E você? Conte algo interessante sobre você!" + coolest_thing_you_have_seen_today: + title: "Qual foi a coisa mais legal que você viu hoje?" + body: "Qual foi a coisa mais legal que você viu ou vivenciou hoje? Pode ser qualquer coisa, desde um lindo pôr do sol até um ato aleatório de bondade. Eu começo: vi um cachorro ajudando uma pessoa idosa a atravessar a rua!" + introduce_yourself: + title: "Apresente-se" + body: "Bem-vindo(a) à comunidade! Vamos nos conhecer. Por favor, apresente-se e compartilhe um pouco sobre seus interesses. Eu começo: sou apaixonado(a) por tecnologia e adoro ensinar!" + what_is_your_favorite_food: + title: "Qual é a sua comida favorita?" + body: "Compartilhe sua comida favorita com a comunidade! Eu começo: adoro pizza, principalmente com bastante queijo e pepperoni." spread_the_word: + title: "Divulgue!" + description: "Compartilhe um link com todos na sua rede." action: "Copiar link" copied_to_clipboard: "Link copiado para área de transferência!" about: @@ -588,6 +658,10 @@ pt_BR: other_drafts: one: "+%{count} outro rascunho" other: "+%{count} outros rascunhos" + embed_mode: + storage_access_prompt: "Já tem uma conta %{site_name}? Permita o acesso à sua sessão para comentar como você mesmo." + allow_access: "Permitir acesso" + continue_as_guest: "Continuar como convidado" topic_count_all: one: "Veja %{count} novo tópico" other: "Veja %{count} novos tópicos" @@ -608,7 +682,7 @@ pt_BR: other: "Veja %{count} novos tópicos" preview: "pré-visualizar" cancel: "Cancelar" - done: "Concluído(a)" + done: "Feito" deleting: "Excluindo…" save: "Salvar alterações" saving: "Salvando…" @@ -646,18 +720,26 @@ pt_BR: review: show_more: "Exibir mais" show_less: "Exibir menos" + back_to_queue: "Voltar para a fila" + editing_post: "Editando postagem…" order_by: "Ordenar por" date_filter: "Postado entre" in_reply_to: "em resposta a" filtered_flagged_by: "Sinalizado(a) por" unknown: + title: + one: "Você tem itens da fila de revisão pendentes de um plugin desativado:" + other: "Você tem itens da fila de revisão pendentes de plugins desativados:" instruction: "Eles não podem ser exibidos corretamente até que você ative o plugin relevante. Ative o plugin e atualize a página. Como alternativa, você pode ignorá-los. Saiba mais..." reviewable_unknown_source: "%{reviewableType} (plugin desconhecido)" reviewable_known_source: "%{reviewableType} (do plugin '%{pluginName}')" ignore_all: "Ignorar tudo" enable_plugins: "Ativar plugins" + delete_confirm: "Tem certeza de que deseja excluir todos os itens da fila de revisão criados por plugins desativados?" + ignore_success: "Todos os itens da fila de revisão criados por plugins desativados foram excluídos." explain: why: "explique por que este item foi colocado na fila" + title: "Pontuação de itens da fila de revisão" formula: "Fórmula" subtotal: "Subtotal" total: "Total" @@ -671,8 +753,10 @@ pt_BR: title: "Os(as) usuários(as) com sinalizadores historicamente acordados recebem um bônus." trust_level_bonus: name: "nível de confiança" + title: "Sinalizações criadas por usuários(as) com nível de confiança mais alto têm uma pontuação maior." type_bonus: name: "bônus de tipo" + title: "Certos tipos de sinalizações podem receber um bônus da equipe para que tenham maior prioridade." revise_and_reject_post: title: "Revisar" reason: "Motivo" @@ -681,6 +765,7 @@ pt_BR: custom_reason: "Forneça uma descrição clara do motivo" other_reason: "Outro..." optional: "opcional" + stale_help: "Este item foi resolvido por %{username}." claim_help: optional: "Você pode reivindicar este item para impedir que outras pessoas o revisem." required: "Você precisa reivindicar itens antes de poder revisá-los." @@ -834,6 +919,9 @@ pt_BR: delimiter: "ou" something_else_wrong: "Há algo errado em %{reviewable_type}?" approve_user: "Aprovar este usuário?" + suspect_user: "Este usuário é spam?" + approve_post: "Aprovar esta postagem?" + approve_topic: "Aprovar este tópico?" types: reviewable_flagged_post: title: "Postagem sinalizada" @@ -852,13 +940,19 @@ pt_BR: title: "Postagem" noun: "postagem" reviewable_ai_chat_message: + title: "Mensagem de chat sinalizada por IA" noun: "mensagem de chat" reviewable_ai_post: + title: "Postagem sinalizada por IA" noun: "postagem" + reviewable_post_voting_comment: + title: "Comentário sinalizado" + noun: "comentário" flagged_as: "Sinalizado como" post_flagged_as: "Resposta sinalizada como" - queued_post_label: "Resposta citada" - queued_topic_label: "Tópico citado" + chat_flagged_as: "Chat sinalizado como" + queued_post_label: "Postagem na fila" + queued_topic_label: "Tópico na fila" user_label: "Usuário(a)" assigned_to: "Postagem atribuída a" moderator_actions: "Ações da moderação" @@ -867,6 +961,7 @@ pt_BR: target_created: "Postagem criada" target_created_by: "Postagem criada por %{username} · %{relativeDate}" target_deleted: "Postagem excluída" + target_deleted_by: "Postagem excluída por %{username} · %{relativeDate}" flagged: "Sinalizado(a)" flagged_as_by: "Marcado(a) como %{flagReason} por %{username} - %{relativeDate}" claimed: "Reivindicado(a)" @@ -881,6 +976,7 @@ pt_BR: note_added_by: "Observação da moderação por %{username} - %{relativeDate}" no_events: "Não há eventos da linha do tempo para exibir" notes: + add_note_description: "Adicione uma observação para fornecer contexto a outros moderadores." add_note_button: "Adicionar observação" placeholder: "Escreva sua observação aqui..." chars_remaining: "%{count} caractere(s) restante(s)" @@ -893,6 +989,7 @@ pt_BR: review_user: "Usuário(a)" need_help: "Precisa de ajuda?" copy_link: "Copiar link" + copy_permalink_title: "copiar um link deste item revisável para a área de transferência" copy_link_feedback: "Link copiado" view_source: "Visualizar origem" insights: @@ -901,8 +998,13 @@ pt_BR: flagged_by_users: one: "Marcado por %{count} usuário(a)" other: "Marcado por %{count} usuários(as)" + similar_posts: "Violações passadas" + flagged_in_timeframe: + one: "%{count} sinalização confirmada" + other: "%{count} sinalizações confirmadas" + user_activity: "Informações do usuário" activities: - joined_on: "Ingressou: %{joinDate}" + joined_on: "ingressou: %{joinDate}" trust_level: "nível de confiança: %{trustLevelName}" posts: one: "%{count} postagem" @@ -917,6 +1019,7 @@ pt_BR: visibility: "Visibilidade" topic_unlisted: "Este tópico não está listado e só poderá ser acessado por link direto" help: + community_moderation_guide: "O guia de moderação desta comunidade" moderation_guide: "Guia de moderação do Discourse" flag_priorities: "Gerenciar a reputação do(a) usuário(a) e sinalizar prioridades" spam_detection: "Detecção de spam" @@ -1197,6 +1300,8 @@ pt_BR: make_owner_description: "Tornar %{username} proprietário(a) deste grupo" remove_owner: "Remover como proprietário(a)" remove_owner_description: "Remover %{username} como proprietário(a) deste grupo" + remove_member_self_lockout: "Ao remover sua participação neste grupo, você perderá o acesso para gerenciar este grupo. Tem certeza de que deseja prosseguir?" + remove_owner_self_lockout: "Ao remover sua função como proprietário, você perderá o acesso para gerenciar este grupo. Tem certeza de que deseja prosseguir?" make_primary: "Tornar primário" make_primary_description: "Tornar este grupo primário para %{username}" remove_primary: "Remover como primário" @@ -1369,8 +1474,16 @@ pt_BR: private_message: "Mensagem" private_messages: "Mensagens" upcoming_changes: + title: "Alterações previstas" for_user: + upcoming_change: "Alteração prevista" enabled: "Ativado(a)?" + why: "Por que?" + why_reasons: + not_in_specific_groups: "O(A) usuário(a) não pertence aos grupos específicos necessários para esta alteração." + in_specific_groups: "O(A) usuário(a) pertence aos grupos específicos necessários para esta alteração." + enabled_for_everyone: "Essa alteração está ativada para todos os membros." + enabled_for_no_one: "Essa alteração está desativada para todos os membros." user_notifications: filters: filter_by: "Filtrar por" @@ -1575,6 +1688,9 @@ pt_BR: undo_revoke_access: "Desfazer revogação de acesso" api_approved: "Aprovada:" api_last_used_at: "Usada pela última vez em:" + api_show_permissions: + one: "Permissões concedidas (%{count})" + other: "Permissões concedidas (%{count})" theme: "Tema" save_to_change_theme: 'O tema será atualizado quando você clicar em "%{save_text}"' home: "Página inicial padrão" @@ -1583,6 +1699,9 @@ pt_BR: flags_given: one: '%{count} etiqueta útil' other: '%{count} etiquetas úteis' + flags: + one: '%{count} sinalização' + other: '%{count} sinalizações' deleted_posts: one: '%{count} postagem excluída' other: '%{count} postagens excluídas' @@ -1691,17 +1810,24 @@ pt_BR: interface: "Interface" apps: "Aplicativos" navigation_menu: "Menu de navegação" + upcoming_changes: "Alterações previstas" + calendar_subscriptions: "Calendário" + calendar_subscriptions: + copied: "Copiou!" + add_to_google: "Google Calendar" change_password: success: "(e-mail enviado)" in_progress: "(enviando e-mail)" error: "(erro)" action: "Enviar e-mail de redefinição de senha" + staged_user: "Usuários(as) encenados(as) não podem receber e-mails de redefinição de senha." set_password: "Definir senha" choose_new: "Escolha uma nova senha" choose: "Escolha uma senha" verify_identity: "Para continuar, verifique sua identidade." title: "Redefinição de senha" remove: "Remover senha" + remove_disabled: "A conta precisa de pelo menos um outro método de login (por exemplo, uma chave de acesso ou uma conta externa vinculada) antes de remover a senha." remove_detail: "Sua conta não poderá mais ser acessada com senha a menos que você a redefina." second_factor_backup: title: "Códigos de backup de dois fatores" @@ -2028,6 +2154,7 @@ pt_BR: redeemed_tab_with_count: "Resgatados (%{count})" invited_via: "Convite" invited_via_link: "vincular %{key} (%{count}/%{max} resgatado(s))" + generating_link: "Gerando link..." groups: "Grupos" topic: "Tópico" sent: "Criado/enviado por último" @@ -2094,7 +2221,7 @@ pt_BR: other {# dias} }. edit_link_options: "Editar opções de link ou enviar por e-mail" - edit_link_options_only: "Edite as opções do link" + edit_link_options_only: "Editar as opções do link" show_advanced: "Exibir opções avançadas" hide_advanced: "Ocultar opções avançadas" description: "Descrição" @@ -2291,9 +2418,17 @@ pt_BR: no_results: "Nenhum resultado" search: "Pesquisar…" label: "Selecione as opções" + d_otp: + screen_reader: + one: Digite um número + other: Digite %{count} números form_kit: reset: Redefinir optional: opcional + required: necessário(a) + errors_summary_title: + one: "Corrija este erro para continuar." + other: "Corrija estes erros para continuar." dirty_form: "Você não enviou as alterações! Deseja mesmo sair?" errors: starts_with: "Deve começar com %{prefix}" @@ -2313,6 +2448,10 @@ pt_BR: too_short: one: "Deve ter no mínimo %{count} caractere" other: "Deve ter no mínimo %{count} caracteres" + color: + available_presets: "Predefinições disponíveis" + already_used: "Já utilizado" + edit_presets: "Editar predefinições de cores" close: "Fechar" assets_changed_confirm: "Este site acabou de receber uma atualização de software. Obter a versão mais recente agora?" logout: "Você foi desconectado(a)." @@ -2359,6 +2498,7 @@ pt_BR: }. learn_more: "Saiba mais…" learn_more_with_link: "Saiba mais…" + feedback_with_link: "Feedback…" mute: Silenciar unmute: Remover silêncio last_post: Postado @@ -2515,6 +2655,7 @@ pt_BR: admin_not_allowed_from_ip_address: "Você não pode entrar como administrador(a) com este endereço IP." resend_activation_email: "Clique aqui para enviar o e-mail de ativação novamente." omniauth_disallow_totp: "Sua conta tem autenticação dois fatores ativada. Entre com sua senha." + works_with: "Funciona com" activate_account: "Ativar conta" resend_title: "Enviar novamente e-mail de ativação" change_email: "Alterar endereço de e-mail" @@ -2633,6 +2774,7 @@ pt_BR: one: "%{count} tópico nesta categoria" other: "%{count} tópicos nesta categoria" read_only: "somente leitura" + read_only_description: "Esta categoria é somente leitura, portanto você não pode selecioná-la para este tópico." timezone_input: ambiguous_ist: "O IST é ambíguo. Selecione um fuso horário específico (por exemplo: Ásia/Kolkata)" select_kit: @@ -2722,7 +2864,9 @@ pt_BR: translation_preview: "Prévia da tradução" original: "Original" translation: "Tradução" + no_translation_yet: "Comece a digitar para ver uma prévia da tradução..." placeholder: "Digite a tradução da postagem aqui..." + show_raw_markdown: "Mostrar texto bruto" group_mentioned_limit: one: "Aviso! Você menciou %{group}, mas este grupo tem mais membros do que o limite de menções configurado pelo(a) administrador(a) de %{count} usuário(a). Ninguém será notificado(a)." other: "Aviso! Você menciou %{group}, mas este grupo tem mais membros do que o limite de menções configurado pelo(a) administrador(a) de %{count} usuários(as). Ninguém será notificado(a)." @@ -2832,12 +2976,30 @@ pt_BR: upload_description: "digite aqui a descrição do arquivo enviado" olist_title: "Lista numerada" ulist_title: "Lista em tópicos" + list_title: "Listas" list_item: "Item da lista" toggle_direction: "Alternar direção" + apply_wrap_title: "Aplicar wrap" wrap_modal: + title: "Editar wrap" + name_label: "Aplicar wrap no nome" + attributes_label: "Atributos" + add_attribute: "Adicionar atributo" + remove_attribute: "Remover atributo" apply: "Aplicar" + unwrap: "Remover wrap" + no_attributes: "Nenhum atributo foi adicionado ainda." + wrap_text: "Aplicar wrap no conteúdo" help: "Ajuda de edição de redução" + collapse: "Minimizar o painel do compositor" + open: "Abrir o painel do compositor" + abandon: "Fechar compositor e ignorar rascunho" + enter_fullscreen: "Abrir o compositor em tela cheia" + exit_fullscreen: "Sair do compositor em tela cheia" exit_fullscreen_prompt: "Pressione ESC para sair da tela cheia" + show_toolbar: "Exibir barra de ferramentas do compositor" + hide_toolbar: "Ocultar barra de ferramentas do compositor" + peek_mode_toggle: "Ativar/desativar modo peek" modal_ok: "Ok" cant_send_pm: "Desculpe, você não pode enviar uma mensagem para %{username}." create_message_error: "Desculpe, houve um erro ao criar a mensagem. Tente outra vez." @@ -2884,6 +3046,7 @@ pt_BR: desc: "Responder sem alterar a data da última resposta" toggle_unlisted: label: Ativar como não listado + desc: "Tópicos não listados só são acessíveis por link direto" reload: "Recarregar" ignore: "Ignorar" image_alt_text: @@ -2894,7 +3057,14 @@ pt_BR: zoom_out: "Diminuir o tamanho da imagem" zoom_in: "Aumentar o tamanho da imagem" remove: "Remover imagem" + add_to_grid: "Adicionar à grade" + move_outside_grid: "Mover para fora da grade" image: "imagem" + grid_label: "Isto será exibido como uma grade." + grid_mode_grid: "Grade" + grid_mode_carousel: "Carrossel" + grid_mode_title: "Definir o estilo da galeria de imagens para %{mode}" + remove_grid: "Remover grade" image_scale_button: "Dimensionar imagem para %{percent}%" delete_image_button: Excluir Imagem toggle_image_grid: Alternar para grade de imagem @@ -2904,6 +3074,7 @@ pt_BR: remove: "Remover link" visit: "Abrir link em uma aba externa" link_copied: "Link copiado!" + unsupported_token: "O editor avançado não oferece suporte a todos os recursos usados nesta postagem; mudando para o editor de Markdown." notifications: tooltip: regular: @@ -2973,6 +3144,13 @@ pt_BR: votes_released: "%{description} - concluído(a)" new_features: "Novos recursos disponíveis!" admin_problems: "Nova recomendação no painel de controle do seu site" + upcoming_changes: + available: + title: "Alterações previstas" + description: "'%{changeName}' está disponível para prévia" + automatically_promoted: + title: "Alterações previstas" + description: "'%{changeName}' foi ativada automaticamente." dismiss_confirmation: body: default: @@ -3029,6 +3207,7 @@ pt_BR: membership_request_consolidated: "novos pedidos de associação" reaction: "nova reação" votes_released: "voto emitido" + new_features: "novos recursos do Discourse foram lançados" admin_problems: "nova recomendação no painel de controle do seu site" upload_selector: change: "Mudança" @@ -3120,6 +3299,7 @@ pt_BR: aria_label: Filtro usando etiquetas filters: label: Retornar somente tópicos/postagens… + all: Incluir mensagens title: Correspondência somente no título likes: Curti posted: Postei em @@ -3219,22 +3399,27 @@ pt_BR: deleted_post: "(postagem excluída)" post_number_with_topic_title: "postagem #%{post_number} - %{title}" new_post_in_topic: "nova postagem em %{title}" + new_post_in_deleted_topic: "nova postagem em um tópico excluído" user_requires_approval: "%{username} requer aprovação" default_item: "item revisável #%{reviewable_id}" topics: new_messages_marker: "último acesso" bulk: + select: "Seleção em massa" confirm: "Confirmar" select_all: "Selecionar tudo" clear_all: "Limpar tudo" - unlist_topics: "Remover tópicos da lista" - relist_topics: "Reinserir tópicos na lista" reset_bump_dates: "Redefinir datas de promoção" defer: "Marcar não lido" - delete: "Excluir tópicos" delete_topics_count: one: "Excluir tópico" other: "Excluir tópicos" + delete_posts_count: + one: "Excluir postagem" + other: "Excluir postagens" + delete_posts_confirmation: + one: "Tem certeza de que deseja excluir %{count} postagem?" + other: "Tem certeza de que deseja excluir %{count} postagens?" dismiss: "Descartar" dismiss_read: "Descartar todos os não lidos" dismiss_read_with_selected: @@ -3264,37 +3449,38 @@ pt_BR: other: "Descartar novos(as) (%{count})" toggle: "alternar seleção de tópicos em massa" actions: "Ações em massa" - change_category: "Definir categoria…" - close_topics: "Fechar tópicos" - archive_topics: "Arquivar tópicos" move_messages_to_inbox: "Mover para caixa de entrada" archive_messages: "Mover para o arquivo" - notification_level: "Notificações…" change_notification_level: "Alterar nível de notificação" choose_new_category: "Escolha a nova categoria para os tópicos:" - selected: - one: "Você selecionou %{count} tópico." - other: "Você selecionou %{count} tópicos." selected_sole_category: one: "Você selecionou %{count} tópico da categoria:" other: "Você selecionou %{count} tópicos da categoria:" selected_count: one: "Selecionou %{count}" other: "Selecionou %{count}" - change_tags: "Substituir etiquetas" append_tags: "Adicionar etiquetas" choose_new_tags: "Escolha novas etiquetas para estes tópicos:" - choose_append_tags: "Escolha novas etiquetas para adicionar a estes tópicos:" + choose_append_tags: "Adicionar etiquetas" changed_tags: "As etiquetas destes tópicos foram alteradas." - remove_tags: "Remover todas as etiquetas" confirm_remove_tags: one: "Todas as etiquetas serão removidas deste tópico. Deseja prosseguir?" other: "Todas as etiquetas serão removidas de %{count} tópicos. Deseja prosseguir?" progress: one: "Progresso: %{count} tópico" other: "Progresso: %{count} tópicos" + notify: "Notificar usuários sobre essa alteração" performing: "Realizando operações em massa, aguarde…" completed: "Operações em massa concluídas!" + completed_count: + one: "%{count} tópico foi atualizado." + other: "%{count} tópicos foram atualizados." + not_completed: + one: "%{count} tópico não pôde ser atualizado:" + other: "%{count} tópicos não puderam ser atualizados:" + skipped_count: + one: "%{count} tópico já estava atualizado." + other: "%{count} tópicos já estavam atualizados." error_topic_count: one: "%{count} tópico" other: "%{count} tópicos" @@ -3315,12 +3501,12 @@ pt_BR: unread: "Nada ficou sem ser lido... impressionante!" new_new: "Nada de novo no momento... volte em breve!" new: "Nada de novo no momento... volte em breve!" + generic: "Não há nada para ver aqui... volte em breve!" topic_bulk_actions: dismiss: name: "Descartar" close_topics: name: "Fechar" - note: "Observação" optional: (opcional) archive_topics: name: "Arquivo" @@ -3334,30 +3520,25 @@ pt_BR: name: "Listar novamente" remove_tags: name: "Remover tags" - append_tags: - name: "Adicionar etiquetas" replace_tags: name: "Substituir etiquetas" delete_topics: name: "Excluir" update_category: name: "Atualizar Categoria" - description: "Escolha a nova categoria para os tópicos selecionados" reset_bump_dates: name: "Redefinir datas de promoção" - description: "Redefinir data de promoção do tópico para a data de criação da postagem mais recente, o que afeta a ordem da lista de tópicos" defer: name: "Marcar não lido" - description: "Marcar tópicos como não lidos" update_notifications: name: "Atualizar notificações" - description: "Alterar nível de notificação para Acompanhando, Monitorando, Normal, Silenciado" topic: filter_to: one: "%{count} postagem no tópico" other: "%{count} postagens no tópico" create: "Novo tópico" create_long: "Criar um novo tópico" + create_group: "Novo tópico e rascunhos" open_draft: "Abrir rascunho" private_message: "Iniciar uma mensagem" archive_message: @@ -3443,12 +3624,15 @@ pt_BR: created_at: "Criação: %{date}" bumped_at: "Mais recentes: %{date}" browse_latest_topics: "Navegue pelos tópicos mais recentes" + browse_new_replies: "Ver novas respostas" + browse_new_topics: "Ver novos tópicos" suggest_create_topic: Tudo pronto para começar uma nova conversa? jump_reply: "Ir para o local da postagem original" jump_reply_aria: "Ir para a postagem de @%{username} em sua localização original" jump_reply_button: "Ir para postagem" deleted: "Este tópico foi excluído" slow_mode_update: + title: "Modo lento" select: "Os(as) usuários(as) podem postar neste tópico apenas a cada:" description: "Para promover um diálogo saudável em discussões dinâmicas e acirradas, os(as) usuários(as) devem aguardar antes de postar neste tópico outra vez." enable: "Ativar" @@ -3470,6 +3654,8 @@ pt_BR: 12_hours: "12 horas" 24_hours: "24 horas" custom: "Duração personalizada" + slow_mode_notice: + duration: "Aguarde %{duration} entre suas postagens neste tópico" topic_status_update: title: "Timer de tópico" save: "Definir timer" @@ -3499,6 +3685,8 @@ pt_BR: title: "Fechar tópico automaticamente após a última postagem" auto_delete: title: "Excluir tópico automaticamente" + auto_delete_after_last_post: + title: "Excluir tópico automaticamente após a última postagem" auto_bump: title: "Promover tópico automaticamente" reminder: @@ -3510,6 +3698,7 @@ pt_BR: auto_close: "Este tópico fechará automaticamente em %{timeLeft}." auto_publish_to_category: "Este tópico será publicado em #%{categoryName} %{timeLeft}." auto_close_after_last_post: "Este tópico fechará %{duration} após a última resposta." + auto_delete_after_last_post: "Este tópico será excluído %{duration} após a última resposta." auto_delete: "Este tópico será automaticamente excluído em %{timeLeft}." auto_bump: "Este tópico será automaticamente promovido em %{timeLeft}." auto_reminder: "Você será lembrado sobre este tópico em %{timeLeft}." @@ -3605,6 +3794,8 @@ pt_BR: reply: title: "Responder" help: "começar a escrever uma resposta para este tópico" + footer_buttons: + region_label: "Ações de tópico" share: title: "Compartilhar tópico" extended_title: "Compartilhar um link" @@ -3784,14 +3975,26 @@ pt_BR: one: %{count} resposta selecionada. other: "%{count} respostas selecionadas." deleted_by_author_simple: "(tópico excluído pelo(a) autor(a))" + localizations: + title_edit_warning: + message: "Este é um título de tópico traduzido.

Você deseja editar a categoria, as tags e o título originais em %{language} ou editar essa tradução específica?" + action_original: "Editar original" + action_translation: "Editar título do tópico traduzido" + editing_translation: "Editando a tradução em %{language}" post_list: title: "Últimas postagens" empty: "Não há postagens" aria_post_number: "%{title} - postagem #%{postNumber}" bulk: + selected: + one: "%{count} postagem selecionada" + other: "%{count} postagens selecionadas" + select_all: "Selecionar tudo" clear_all: "Limpar tudo" actions: "Ações em massa" post: + accessible_heading: "postagem por #%{username} em %{date}" + heading_anchor: "Link do cabeçalho" confirm_delete: "Tem certeza de que deseja excluir esta postagem?" quote_reply: "Citação" quote_reply_shortcut: "Citar (ou apertar e)" @@ -3815,8 +4018,13 @@ pt_BR: deleted_by_author_simple: "(postagem excluída pelo(a) autor(a))" collapse: "recolher" load_more_replies: "carregar mais respostas" + load_more_posts_above: "Carregar mais publicações acima" + load_more_posts_below: "Carregar mais publicações abaixo" sr_collapse_replies: "Recolher respostas incorporadas" sr_load_more_replies: "Carregar mais respostas incorporadas" + loading_more_posts_above: "Carregando mais postagens acima..." + loading_more_posts_below: "Carregando mais postagens abaixo..." + loading_complete: "Carregamento concluído" sr_date: "Data da postagem" sr_expand_replies: one: "Esta postagem tem %{count} resposta" @@ -3871,6 +4079,9 @@ pt_BR: edit: "Editar" delete: "Excluir" add: "Adicionar nova tradução" + manage: + one: "Gerenciar traduções (%{count} existente)" + other: "Gerenciar traduções (%{count} existentes)" view: one: "Visualizar %{count} local traduzido" other: "Visualizar %{count} locais traduzidos" @@ -3879,8 +4090,10 @@ pt_BR: confirm_delete: "Tem certeza de que deseja excluir as traduções para \"%{languageCode}\"?" success: "As traduções foram atualizadas" post_language_selector: + title: "Idioma da postagem" none: "Nenhum" edit_warning: + message: "Esta é uma postagem traduzida.

Você quer editar a postagem original em %{language} ou editar essa tradução específica?" action_original: "Editar a postagem original" action_translation: "Editar esta tradução" errors: @@ -3901,6 +4114,7 @@ pt_BR: attachment_upload_not_allowed_for_new_user: "Desculpe, usuários(as) novos(as) não podem enviar anexos." attachment_download_requires_login: "Desculpe, você precisa entrar para baixar arquivos anexos." cancel_composer: + confirm: "Você deseja excluir sua postagem?" discard: "Descartar" via_email: "postagem recebida via e-mail" via_auto_generated_email: "esta mensagem chegou por um e-mail gerado automaticamente" @@ -3973,6 +4187,7 @@ pt_BR: delete_post_notice: "Excluir aviso oficial" remove_timer: "remover timer" edit_timer: "editar timer" + remove_yourself_from_pm: "Tem certeza de que deseja remover seu nome desta mensagem? Você não poderá mais vê-la nem respondê-la." actions: people: like: @@ -4091,6 +4306,7 @@ pt_BR: general: "Geral" settings: "Configurações" advanced: "Avançado" + show_advanced: "Configurações avançadas" topic_template: "Modelo" tags: "Etiquetas" localizations: "Localizações" @@ -4117,22 +4333,41 @@ pt_BR: placeholder: "Selecionar grupo de etiquetas…" tag_group: "Grupo de etiquetas" topic_featured_link_allowed: "Permitir links em destaque nesta categoria" + delete: "Excluir categoria" + create: "Nova categoria" create_long: "Criar uma nova categoria" + type_settings_schema: + site_settings: "Configurações do site" + save: "Salvar categoria" unsaved_changes: "Você tem alterações não salvas" + slug: "Slug da categoria" + parent: "Categoria pai" slug_placeholder: "(Opcional) palavras hifenizadas para url" creation_error: Houve um erro durante a criação da categoria. save_error: Houve um erro ao salvar a categoria. + errors: + self_lockout: "Você está prestes a alterar as permissões de categoria de uma forma que removerá o seu próprio acesso. Tem certeza de que deseja continuar?" validations: + emoji_required: "Selecione um emoji." icon_required: "Selecione um ícone." + name: "Nome da categoria" + untitled: "Categoria sem título" description: "Descrição" + logo: "Imagem do logotipo da categoria" + logo_dark: "Imagem do logotipo da categoria no modo escuro" logo_description: "Proporção de tela recomendada 1:1 com tamanho mínimo de 200px. Se deixada em branco, nenhuma imagem será exibida." + background_image: "Imagem de fundo da categoria" + background_image_dark: "Imagem de fundo da categoria no modo escuro" style: "Estilo" icon: "Ícone" emoji: "Emoji" + select_emoji: "Selecionar emoji" background_color: "Cor" foreground_color: "Cor do texto" color_validations: - cant_be_empty: "não pode estar vazio(a)" + cant_be_empty: "não pode estar vazio" + incorrect_length: "deve corresponder ao formato #RRGGBB ou #RGB" + non_hexdecimal: "deve conter apenas caracteres hexadecimais (0-9, AF)" styles: type: "Estilo" icon: "Ícone" @@ -4144,12 +4379,15 @@ pt_BR: emoji: "Emoji" color_used: "Cor em uso" predefined_colors: "Opções predefinidas de cor" + name_placeholder: "Uma ou duas palavras recomendadas" color_placeholder: "Qualquer cor da web" delete_confirm: "Tem certeza que quer excluir esta categoria?" delete_error: "Houve um erro ao excluir a categoria." list: "Listar categorias" no_description: "Adicione uma descrição para esta categoria." change_in_category_topic: "Editar descrição" + description_expand: "Exibir mais" + description_collapse: "Exibir menos" already_used: "Esta cor já foi usada para outra categoria" color_palette: "Paleta de cores" security: "Segurança" @@ -4160,8 +4398,15 @@ pt_BR: reply: "Responder" create: "Criar" no_groups_selected: "Nenhum grupo recebeu acesso, esta categoria será visível apenas para a equipe." + everyone_full_access: 'Esta categoria é pública, todos(as) podem ver, responder e criar postagens. Para restringir permissões, remova uma ou mais permissões concedidas para o grupo "%{everyone_group}".' + everyone_reply_access: 'Esta categoria é pública, todos podem ver e responder aos tópicos. Para restringir permissões, remova o grupo "%{everyone_group}".' + everyone_see_access: 'Esta categoria é pública, todos podem ver as postagens. Para restringir permissões, remova o grupo "%{everyone_group}".' + specific_groups_have_access: "Esta categoria é privada; apenas os grupos selecionados podem ver, responder e criar publicações." + all_parent_groups_used: "Todos os grupos da categoria pai foram adicionados. Para adicionar mais grupos, primeiro adicione-os à categoria pai." toggle_reply: "Alternar permissão de resposta" toggle_full: "Alternar criação de permissão" + inherited: 'Esta permissão foi herdada de "%{everyone_group}"' + special_warning: "Esta é uma categoria pré-propagada, e as configurações de segurança não podem ser editadas. Se você não quer usar esta categoria, exclua em vez de reaproveitar." uncategorized_security_warning: "Esta categoria é especial. É destinada para tópicos que não têm categoria e não pode ter configurações de segurança." uncategorized_general_warning: 'Esta categoria é especial. Ela é usada como a categoria padrão para novos tópicos que não têm uma categoria selecionada. Se quiser evitar este comportamento e forçar a seleção da categoria, desative a configuração aqui. Se você quiser alterar o nome ou a descrição, vá para Personalização/Conteúdo de texto.' pending_permission_change_alert: "Você não adicionou %{group} a esta categoria. Clique neste botão para adicionar." @@ -4178,20 +4423,35 @@ pt_BR: all_topics_wiki: "Criar novos tópicos wikis por padrão" allow_unlimited_owner_edits_on_first_post: "Permitir edições ilimitadas na primeira postagem" subcategory_list_style: "Estilo da lista de subcategorias" + sort_order: "Classificar lista de tópicos por:" + default_view: "Lista de tópicos padrão:" + default_top_period: "Período superior padrão:" + default_list_filter: "Filtro de lista padrão:" allow_badges_label: "Permitir a concessão de emblemas nesta categoria" + edit_permissions: "Editar permissões" reviewable_by_group: "Além da equipe, o conteúdo desta categoria também pode ser revisado por:" review_group_name: "nome do grupo" require_topic_approval: "Requer aprovação dos moderadores(as) de todos os novos tópicos" require_reply_approval: "Requer aprovação dos moderadores(as) de todas as novas respostas" this_year: "este ano" position: "Posição na página de categorias:" + default_position: "Posição padrão" position_disabled: "As categorias serão exibidas em ordem de atividade. Para controlar a ordem das categorias nas listas, ative a configuração de \"posições de categorias fixas\"" minimum_required_tags: "Número mínimo de etiquetas exigidas em um tópico:" + default_slow_mode: 'Ative o "Modo lento" para obter novos tópicos nesta categoria.' + subcategory_of: "Subcategoria de..." none_subcategory_text: "Nenhum" + subcategory_permissions_warning: "Uma subcategoria de uma categoria privada não pode ser pública." visibility: title: "Visibilidade" - public: "Público" + public: "Pública" + all_members: "Todos os membros" group_restricted: "Privado" + who_can_see: "Quem pode ver esta categoria?" + who_can_post: "Quem pode postar nesta categoria" + which_groups_can_access: "Quais grupos podem ver e publicar nesta categoria?" + more_options_hint: "Mais permissões disponíveis em configurações avançadas." + inherited_from_parent: "As permissões são herdadas da categoria pai. Para refinar, acesse configurações avançadas." num_auto_bump_daily: "Número de tópicos em aberto para promover automaticamente:" auto_bump_cooldown_days: "Mínimo de dias antes de subir o mesmo tópico novamente:" navigate_to_first_post_after_read: "Navegue até a primeira postagem depois que os tópicos forem lidos" @@ -4213,14 +4473,18 @@ pt_BR: title: "Silenciados(as)" description: "Você nunca será notificado(a) sobre novos tópicos nesta categoria e eles não aparecerão nos mais recentes." search_priority: + label: "Prioridade de pesquisa" options: normal: "Normal" ignore: "Ignorar" + very_low: "Muito baixa" low: "Baixa" high: "Alta" + very_high: "Muito alta" sort_options: default: "padrão" likes: "Curtidas" + op_likes: "Curtidas da postagem original" views: "Visualizações" posts: "Postagens" activity: "Atividade" @@ -4241,6 +4505,7 @@ pt_BR: email: "E-mail" list_filters: all: "Todos os tópicos" + none: "Nenhuma subcategoria" colors_disabled: "Não é possível selecionar cores porque você tem um, ou não tem nenhum, estilo de categoria." anonymous_flagging: title: "Denunciar conteúdo ilegal" @@ -4499,11 +4764,16 @@ pt_BR: readonly: "Ver" preloader_text: "Carregando" lightbox: - download: "Download" + download: "Baixar" + open: "Imagem original" + image_info: "Informações sobre a imagem" + quote: "Citar imagem" previous: "Anterior (seta para a esquerda)" next: "Próximo (seta para a direita)" counter: "%curr% de %total%" close: "Fechar (Esc)" + zoom: "Zoom (tecla Z)" + error: "Não foi possível carregar a imagem" content_load_error: 'O conteúdo não pôde ser carregado.' image_load_error: 'A imagem não pôde ser carregada.' cannot_render_video: Este vídeo não pode ser renderizado porque o seu navegador não é compatível com o codec. @@ -4525,6 +4795,7 @@ pt_BR: latest: "%{shortcut} Mais recentes" new: "%{shortcut} Novos" unread: "%{shortcut} Não lidos" + unseen: "%{shortcut} Não vistos" categories: "%{shortcut} Categorias" top: "%{shortcut} Melhores" bookmarks: "%{shortcut} Favoritos" @@ -4539,10 +4810,12 @@ pt_BR: back: "%{shortcut} Voltar" up_down: "%{shortcut} Move seleção ↑ ↓" open: "%{shortcut} Abrir tópico selecionado" + open_new_window: "%{shortcut} Abrir tópico selecionado em nova aba/janela" next_prev: "%{shortcut} Pŕoxima seção/seção anterior" go_to_unread_post: "%{shortcut} Ir para a primeira postagem não lida" application: title: "Solicitação" + create: "%{shortcut} Criar um novo tópico ou mensagem pessoal" notifications: "%{shortcut} Abrir notificações" hamburger_menu: "%{shortcut} Abrir menu de navegação" user_profile_menu: "%{shortcut} Abrir menu do usuário" @@ -4669,6 +4942,7 @@ pt_BR: add_to_calendar: "Adicionar ao calendário" google: "Google Calendar" ics: "ICS" + default_title: "Evento agendado" tagging: all_tags: "Todas as etiquetas" other_tags: "Outras etiquetas" @@ -4683,18 +4957,25 @@ pt_BR: choose_for_topic_required_group: one: "selecione %{count} etiqueta de \"%{name}\"…" other: "selecione %{count} etiquetas de \"%{name}\"…" + info: "Mostrar informações da tag" default_info: "Esta etiqueta não está restrita a nenhuma categorias e não possui sinônimos." staff_info: "Para adicionar restrições, coloque esta etiqueta em um grupo de etiquetas." category_restricted: "Essa tag é restrita a categorias que você não tem permissão para acessar." synonyms: "Sinônimos" synonyms_description: "Quando as seguintes etiquetas forem usadas, serão substituídas por %{base_tag_name}." + synonyms_inline: "Estes sinônimos serão substituídos por %{base_tag_name}:" save: "Salvar nome e descrição da etiqueta" tag_groups_info: one: 'Esta etiqueta pertence ao grupo: %{tag_groups}.' other: "Esta etiqueta pertence aos grupos: %{tag_groups}." + tag_groups_info_prefix: + one: "Esta tag pertence ao grupo " + other: "Esta tag pertence a estes grupos: " category_restrictions: one: "Pode ser usada apenas nesta categoria:" other: "Pode ser usada apenas nestas categorias:" + restricted_to: "Restrito a" + no_synonyms: "Esta tag não possui sinônimos." edit_synonyms: "Editar sinônimos" add_synonyms_label: "Adicionar sinônimos:" add_synonyms: "Adicionar" @@ -4713,20 +4994,35 @@ pt_BR: one: "Seu sinônimo também será excluído." other: "Seus %{count} sinônimos também serão excluídos." edit_tag: "Edite o nome e descrição da etiqueta" + edit: "Editar esta tag" description: "Descrição" settings: title: "Definições" + edit_title: "Editar tag: %{name}" + edit_tag_prefix: "Editar tag:" + select_tag: "Selecione uma tag para editar" general: "Geral" localizations: "Localizações" back: "Voltar" name: "Nome" slug: "Slug" - name_placeholder: "Nome da etiqueta" - synonyms_subtitle: "Quando as seguintes etiquetas forem usadas, serão substituídas por %{name}" + name_placeholder: "Nome da tag" + slug_placeholder: "Slug da tag (opcional, gerado automaticamente a partir do nome)" + saved: "Configurações de tag salvas" + no_synonyms: "Não há sinônimos definidos para esta tag." + add_synonym_placeholder: "Procurar por tags para adicionar como sinônimos..." + synonyms_subtitle: "Quando as seguintes tags forem usadas, serão substituídas por %{name}" + save: "Salvar tag" + delete: "Excluir tag" + synonyms_hint: "Quando as tags acima forem usadas, elas serão substituídas por %{baseTagName}." + add_synonyms_confirm: "Locais que usam %{synonymNames} serão alterados para usar %{tagName}. Tem certeza de que deseja fazer essa alteração?" localization: - locale: "Local" + hint: "Adicione localizações para exibir nomes de tags diferentes para usuários em idiomas diferentes." + locale: "Idioma" name: "Nome" description: "Descrição" + add: "Adicionar localização" + remove: "Remover localização" sort_by: "Ordenar por" sort_by_count: "contagem" sort_by_name: "nome" @@ -4736,7 +5032,15 @@ pt_BR: upload_description: "Enviar um arquivo csv para criar etiquetas em massa" upload_instructions: "Uma por linha, opcionalmente com um grupo de etiquetas no formato \"nome_etiqueta,grupo_etiqueta\"." upload_successful: "Etiquetas enviadas com êxito" + bulk_create_inline_placeholder: "Criar tags (separadas por vírgulas)" bulk_create_button: "Criar" + bulk_create_success: + one: "%{count} tag criada:" + other: "%{count} tags criadas:" + bulk_create_already_exist: + one: "%{count} tag já existe:" + other: "%{count} tags já existem:" + bulk_create_some_failed: "Algumas tags não puderam ser criadas:" delete_unused_confirmation: one: "%{count} etiqueta será excluída: %{tags}" other: "%{count} etiquetas serão excluídas: %{tags}" @@ -4770,13 +5074,18 @@ pt_BR: description: "Você não receberá nenhuma notificação sobre novos tópicos com esta etiqueta, e eles não serão exibidos na aba de não lidos." groups: back_btn: "Voltar para todas as etiquetas" + title: "Grupos de tags" about_heading: "Selecione um grupo de etiquetas ou crie uma nova" about_heading_empty: "Crie um novo grupo de etiquetas para começar" about_description: "Grupos de etiquetas ajudam a gerenciar permissões de várias etiquetas em um lugar." + new: "Novo grupo" + new_title: "Criar novo grupo" + edit_title: "Editar grupo de tags" tags_label: "Etiquetas neste grupo" parent_tag_label: "Etiqueta pai" parent_tag_description: "As etiquetas deste grupo podem ser usadas apenas se a etiqueta pai estiver presente." one_per_topic_label: "Limite de uma etiqueta por tópico deste grupo" + new_name: "Novo grupo de tags" name_placeholder: "Nome" save: "Salvar" delete: "Excluir" @@ -4818,6 +5127,7 @@ pt_BR: safe_mode: enabled: "O modo seguro está ativado. Para sair do modo seguro, feche a janela do navegador" theme_preview_notice: "Atualmente, você está pré-visualizando um tema, feche esta aba ou janela do navegador para voltar para a configuração normal do site." + theme_preview_failed: "Não foi possível visualizar o tema porque ele não existe ou você não tem permissão para acessá-lo." image_removed: "(imagem removida)" pause_notifications: title: "Pausar notificações para…" @@ -4887,6 +5197,7 @@ pt_BR: tags_form_modal: title: "Editar navegação por etiquetas" filter_placeholder: "Filtrar etiquetas" + no_tags: "Não há tags que correspondam aos filtros fornecidos." subtitle: text: "e mostraremos automaticamente as principais etiquetas deste site" edit_navigation_modal_form: @@ -4967,6 +5278,9 @@ pt_BR: click_to_get_started: "Clique aqui para começar." header_link_text: "Categorias" header_action_title: "Editar suas categorias de barra lateral" + header_action_new: "Nova categoria" + header_action_edit_sidebar: "Editar categorias da barra lateral" + header_action_edit_header_dropdown: "Editar categorias de navegação" configure_defaults: "Configurar padrões" community: edit_section: @@ -5038,6 +5352,8 @@ pt_BR: light: "Claro" dark: "Escuro" auto: "Automático" + title: "Modo de cor" + aria_label: "Modo de cor, atualmente %{mode}" welcome_topic_banner: title: "Crie seu Tópico de Boas-Vindas" description: "Seu tópico de boas-vindas é a primeira coisa que os novos membros vão ler. Pense nisso como seu “argumento de elevador” ou “declaração de missão”. Informe a todos sobre quem é o público desta comunidade, o que eles podem esperar encontrar aqui e o que você gostaria que eles fizessem primeiro." @@ -5213,9 +5529,18 @@ pt_BR: bookmarks: "Tópicos em %{category} sem etiquetas que você adicionou aos favoritos" default: "Tópicos %{filter} em %{category} sem tags" categories: "Todas as categorias" + content_localization: + toggle_localized: + translated: "Esta página foi traduzida por máquina. Clique para ver o texto original." + not_translated: "Página não traduzida. Clique para traduzir." + translations_enabled: "Traduções ativadas" + translations_disabled: "Traduções desativadas" + language_switcher: + title: "Alterar o idioma do site" admin_js: type_to_filter: "Digite para filtrar..." settings: "Configurações" + toggle_filters: "Alternar filtros suspensos" admin: title: "Administrador(a) do Discourse" moderator: "Moderador(a)" @@ -5230,11 +5555,12 @@ pt_BR: title: "Lista de relatórios disponíveis" sidebar_title: "Relatórios" back: "Voltar para todos os relatórios" + group_engagement: "Engajamento" group_traffic: "Tráfego" group_members: "Membros" - group_moderation: "Moderação" - group_security: "Segurança" + group_content: "Conteúdo e saúde" group_other: "Outras" + legacy_warning: "Este é um relatório legado. Ele será desativado em breve. Se precisar de ajuda para encontrar o substituto, entre em contato com o suporte." config_sections: account: title: "Conta" @@ -5254,25 +5580,73 @@ pt_BR: title: "Avançado" upcoming_changes: name: "Nome" - enabled: "Ativados(as)" + plugin: "Plugin" + metadata: "Metadados" + enabled: "Ativado" + enabled_for: "Ativado para..." + show_image: "Mostrar imagem" + edit_groups: "Editar grupos de adesão" + groups_updated: "Grupos atualizados!" + save_groups: "Salvar grupos" + add_groups_to_enable: "Adicione grupos para ativar este recurso." + no_changes_to_save: "Nenhuma alteração para salvar" select_groups: "Selecionar grupos…" + opt_in_groups: "Grupos de adesão voluntária" + show_related_settings: "Mostrar configurações relacionadas..." + opt_in_groups_instructions: "Os grupos de adesão voluntária podem ser usados para permitir que um determinado grupo de usuários teste uma alteração antes que ela seja liberada para todos. Observe que esses grupos se tornarão irrelevantes assim que a alteração atingir o status Estável." + enabled_for_throttle: "Você alterou a pessoa para quem essa alteração está ativada muito rapidamente. Aguarde alguns segundos antes de tentar novamente." + change_enabled_for_success: "Você ativou essa alteração para %{enabledFor}" + change_disabled: "Você optou por não participar desta alteração." + permanent_notice: "Essa alteração agora é permanente e será removida em breve. Você não poderá mais optar por não participar." + permanent_soon_notice: "Esta mudança se tornará permanente em breve. Você não poderá mais optar por não participar." + permanent_no_group_selection: "Não aplicável, alterações permanentes se aplicam a todos os grupos." + no_changes: "Não há alterações previstas neste momento." preview: "Pré-visualizar" enabled_for_options: + no_one: "Ninguém" everyone: "Todos(as)" + staff: "Apenas %{staffGroupName}" + specific_groups: "Grupo(s) específico(s)" + specific_groups_with_group_names: + one: "o grupo %{groupNames}" + other: "os grupos %{groupNames}" statuses: experimental: "Experimental" + alpha: "Alfa" + beta: "Beta" + stable: "Estável" + permanent: "Permanente" impact_roles: + admins: "Administradores(as):" moderators: "Moderadores(as)" staff: "Equipe" + all_members: "Todos os membros" + developers: "Desenvolvedores" filter: - all: "Todos(as)" - enabled: "Ativados(as)" - disabled: "Desativados(as)" + search_placeholder: "Filtrar por nome, descrição ou plugin..." + no_results: "Nenhuma alteração prevista corresponde ao seu filtro." + all: "Todos" + enabled_all: "Todos os estados ativados" + enabled: "Ativados" + enabled_for_staff: "Ativado para %{staffGroupName}" + enabled_for_specific_groups: "Ativado para grupos específicos" + disabled: "Desativados" + impact_type_all: "Todos os tipos de impacto" impact_type_feature: "Recurso" impact_type_other: "Outras" + status_all: "Todos os status" + status_conceptual: "Conceitual" status_experimental: "Experimental" + status_alpha: "Alfa" + status_beta: "Beta" + status_stable: "Estável" + status_permanent: "Permanente" + impact_role_all: "Todas as funções de impacto" + impact_role_admins: "Administradores(as):" impact_role_moderators: "Moderadores(as)" impact_role_staff: "Equipe" + impact_role_all_members: "Todos os membros" + impact_role_developers: "Desenvolvedores" config: about: title: "Sobre seu site" @@ -5303,17 +5677,32 @@ pt_BR: title: "Localização" header_description: "Configure o idioma da interface da sua comunidade e outras opções de localização para seus membros" keywords: "local|idioma|fuso_horário|unicode|ltr" + upcoming_changes: + title: "Alterações previstas" + header_description: "Uma lista de alterações previstas para o Discourse que podem afetar seu site e recursos experimentais nos quais você pode optar por participar. Você pode filtrar por impacto, tipo e status.\n\nGrupos de participação opcional podem ser usados para permitir que um determinado grupo de usuários teste uma alteração antes que ela seja disponibilizada para todos, embora esses grupos se tornem irrelevantes assim que uma alteração se tornar permanente." login: title: "Acesso e autenticação" header_description: "Configure o acesso e autenticação de usuários(as), chaves e segredos, provedores OAuth2 e muito mais" sub_pages: common_settings: - title: "Definições" + title: "Configurações" + authenticators: + title: "Logins sociais" + discourseconnect: + title: "Discourse Connect" discourse_id: title: "Discourse ID" discourse_id: title: "Discourse ID" + stats: + total_users: "Total de usuários" + signups_30_days: "Inscrições (30 dias)" + logins_30_days: "Acessos (30 dias)" + regenerate_credentials: "Regerar credenciais" + regenerate_confirm: "Tem certeza de que deseja regerar suas credenciais do Discourse ID? Isso gerará um novo segredo do cliente. A regeração de credenciais normalmente não é necessária, mas pode ser útil para aumentar a segurança." + description: "O Discourse ID é um serviço de cadastro único que permite aos(às) usuários(as) fazer login em mais de um site do Discourse com uma única conta. As empresas mais conhecidas que permitem login com sua conta, como Google, Facebook, Apple e GitHub são suportadas sem precisar de configurações adicionais." learn_more: "Saiba mais" + regenerate_success: "Credenciais regeradas com sucesso." logo: title: "Logotipo" header_description: "Configure os ícones e logotipos usados no seu site" @@ -5329,6 +5718,7 @@ pt_BR: help_text: "O tamanho recomendado é 600 x 80 pixels." large_icon: title: "Ícone quadrado" + description: "Uma versão quadrada da imagem do logotipo aparece na parte superior do site e também é o logotipo do aplicativo no celular." help_text: "O tamanho recomendado é 512 x 512 pixels." square_icon_dark: required: "Usar um ícone quadrado diferente para o modo escuro?" @@ -5400,26 +5790,61 @@ pt_BR: modal_yes: "Sim" modal_no: "Não, apenas aplicar daqui para frente" welcome_banner: + title: "Banner de boas-vindas" + header_description: "Configure o banner contendo a barra de pesquisa que será exibido aos visitantes do seu site." + saved: "Configurações do banner de boas-vindas salvas com sucesso." form: + enabled_themes: + label: "Ativado em temas..." + description: "Selecione quais temas devem exibir o banner. Somente os temas ativos são mostrados." + select_label: "Selecionar temas" + background_image: + label: "Imagem de fundo" + description: "Esta imagem será exibida atrás do texto do banner." text_color: label: "Cor do texto" + description: "Após carregar a 'imagem de fundo' acima, use esta configuração para alterar a cor do texto do banner e garantir que ele permaneça legível. Se o campo estiver em branco ou sem uma imagem carregada, a cor será definida pelo tema ativo." page_visibility: + label: "Visibilidade da página" + description: "Escolha onde o banner deve aparecer na página." options: top_menu_pages: "Páginas do menu superior" + homepage: "Somente a página inicial" + discovery: "Páginas de descoberta" all_pages: "Todas as páginas" location: label: "Local" + description: "Escolha onde o banner deve aparecer na página." options: - above_topic_content: "Conteúdo acima do tópico" + above_topic_content: "Acima do conteúdo do tópico" below_site_header: "Abaixo do cabeçalho do site" text_section: + title: "Texto personalizável" locale_label: "Idioma" header_new_members: + label: "Cabeçalho para novos membros" + description: "Variáveis disponíveis: %{site_name}, %{preferred_display_name}" placeholder: "Bem-vindo(a), %{preferred_display_name}" header_logged_in: - placeholder: "Boas-vindas novamente, %{preferred_display_name}!" + label: "Cabeçalho para membros logados" + description: "Variáveis disponíveis: %{site_name}, %{preferred_display_name}" + placeholder: "Seja bem-vindo(a) de volta, %{preferred_display_name}!" header_anonymous: + label: "Cabeçalho para visitantes anônimos" + description: "Variável disponível: %{site_name}" placeholder: "Boas-vindas ao %{site_name}!" + subheader_logged_in: + label: "Subtítulo para membros logados" + description: "Texto secundário exibido abaixo do cabeçalho para usuários logados." + placeholder: "Confira as novidades da comunidade." + subheader_anonymous: + label: "Subtítulo para visitantes anônimos" + description: "Texto secundário exibido abaixo do cabeçalho para visitantes anônimos." + placeholder: "Junte-se à nossa comunidade para participar das discussões." + search_placeholder: + label: "Espaço reservado para pesquisa" + description: "Espaço reservado para a caixa de pesquisa no banner de boas-vindas." + placeholder: "Tópicos de pesquisa..." navigation: title: "Navegação" header_description: "Configure itens de menu e links de navegação para seu site, inclusive a localização e comportamento do menu de navegação principal, links rápidos no topo da página inicial e a barra lateral da administração" @@ -5481,7 +5906,7 @@ pt_BR: header_description: "Relatórios são uma ferramenta poderosa para ajudar a entender o que acontece no seu site. Ajudam na identificação de tendências, relatam problemas e tomam decisões com base em dados." sub_pages: settings: - title: "Definições" + title: "Configurações" badges: title: "Emblemas" header_description: "Os(as) usuários(as) recebem emblemas como recompensa por suas atividades, contribuições e realizações. Isso é uma forma de reconhecer, validar e incentivar comportamentos positivos e o envolvimento na comunidade" @@ -5614,6 +6039,9 @@ pt_BR: embedding: title: "Incorporar" header_description: "Com o Discourse, você pode incorporar os componentes de um tópico em um site remoto por meio de uma API de java que cria um IFRAME" + form_templates: + title: "Modelos de formulário" + header_description: "Modelos de formulário permitem impor um formulário estruturado com validação de dados como parte do fluxo de criação de tópicos." theme_site_settings: setting: "Configuração" overridden_by: "Substituição por" @@ -5622,6 +6050,9 @@ pt_BR: select_setting: "Selecione um site para visualizar os valores dos temas atuais" add: "Ir para as configurações do site substituídas por tema" help: "O tema que você está usando atualmente é %{currentTheme}. Vá para a página de configuração do tema para alterar as configurações do tema do site, ou clique em um tema com link na tabela abaixo para editar as configurações dele." + filter: "Filtrar as configurações do site do tema definindo nome, descrição ou nome do tema..." + filter_no_results: "Nenhuma configuração de tema do site corresponde ao seu filtro." + site_setting_warning: 'Esta configuração é gerenciada pelo tema padrão do seu site (%{defaultThemeName}). Você pode modificá-la na página de edição do tema.' search: modal_title: "Pesquise tudo na administração" title: "Pesquisar" @@ -5653,6 +6084,8 @@ pt_BR: new_features: title: "Novidades?" subtitle: "Estamos lançando recursos e melhorias inéditas o tempo todo. Esta página contém os principais. Clique em \"Saiba mais\" se quiser ver as notas da versão completas." + no_new_features_found: "Não há itens no feed ou o filtro que você selecionou não retornou nenhum resultado. Você pode ver anúncios anteriores de novos recursos na comunidade Discourse Meta." + no_new_features_error: "Houve um erro ao carregar o feed. Você pode ver os anúncios anteriores de novos recursos na comunidade Discourse Meta." learn_more: "Saiba mais..." last_checked: "Última verificação" refresh_problems: "Atualizar" @@ -5716,10 +6149,11 @@ pt_BR: all: "Tudo" view_table: "tabela" view_graph: "gráfico" - refresh_report: "Atualizar relatório" + refresh_report: "Atualizar" daily: A cada dia monthly: Todo mês weekly: A cada semana + value_so_far: "%{value} (até agora)" dates: "Datas (UTC)" groups: "Todos os grupos" disabled: "Este relatório está desativado" @@ -5730,7 +6164,9 @@ pt_BR: trending_search: more: 'Registros de pesquisa' disabled: 'O relatório de pesquisa de conteúdo em alta está desativado. Ative as consultas de pesquisa de registro para coletar dados.' + average_chart_label: Mostrando médias, não totais sort_button: "Classificar por %{column}" + sort_button_current: "Classificado por %{column}, %{direction}" sort_ascending: "ordem crescente" sort_descending: "ordem decrescente" filters: @@ -5836,6 +6272,7 @@ pt_BR: cancel: "Cancelar" continue: "Continuar" copy_key: "Copiar" + key_copied_to_clipboard: "Chave de API copiada para a área de transferência" back: "Voltar para chaves de API" revoke: "Revogar" undo_revoke: "Desfazer revogação" @@ -5903,6 +6340,7 @@ pt_BR: recover: Recupere um tópico. read_lists: Leia listas de tópico como melhores, novidades, mais recentes. RSS também é compatível. status: "Atualiza o status de um tópico. Status: fechado, arquivado, visível, fixado. Ativado: verdadeiro, falso. Especifique um category_id aqui e no conteúdo do pedido para permitir apenas mudanças de status em tópicos dessa categoria." + change_owner: Alterar a propriedade das postagens em um tópico. posts: edit: Edite qualquer postagem ou especifique uma. delete: Exclua uma postagem. @@ -5935,6 +6373,7 @@ pt_BR: suspend: Suspenda contas de usuário(a). delete: Excluir contas de usuário(as). list: Obtenha uma lista de usuários(as). + create: Criar um(a) novo(a) usuário(a). user_status: read: Ler status do usuário. update: Atualizar status do usuário. @@ -6038,6 +6477,7 @@ pt_BR: user_destroyed: "Usuário(a) excluído(a)" user_suspended: "Usuário(a) suspenso(a)" user_unsuspended: "Usuário(a) liberado(a)" + user_anonymized: "O(a) usuário(a) foi anonimizado(a)." reviewable_event: group_name: "Eventos revisáveis" reviewable_created: "Item revisável pronto" @@ -6270,8 +6710,10 @@ pt_BR: install: "Instalar" theme_site_settings: title: "Configurações do site substituídas por tema" + description: "Configurações que permitem que os temas tenham maior controle sobre a experiência geral do site, substituindo um pequeno subconjunto das configurações principais do site." themes: title: "Temas" + description: "Temas que alteram a aparência geral do seu site para todos os usuários." themes_intro: "Instale um novo tema para começar, ou crie um do zero usando estes recursos." new_theme: "Novo tema" back: "Voltar para os temas" @@ -6337,6 +6779,8 @@ pt_BR: title: "Opções de cores" toggle: "Selecionável por usuário(a)" toggle_description: "A paleta de cores pode ser selecionada pelos(as) usuários(as)" + toggle_default_light_on_theme: "A paleta de cores é a paleta clara padrão no tema padrão (%{themeName})" + toggle_default_dark_on_theme: "A paleta de cores é a paleta escura padrão no tema padrão (%{themeName})" colors: title: "Cores" save_changes: "Salvar alterações" @@ -6427,6 +6871,7 @@ pt_BR: confirm: "Tem certeza de que quer desfazer este backup?" restore: is_disabled: "Restauração desativada neste momento. Para ativar, acesse as configurações do site." + is_disabled_title: "A restauração está desativada no momento. Para ativá-la, procure por 'allow restore' nas configurações do site." label: "Restaurar" title: "Restaurar o backup" confirm: "Tem certeza de que deseja restaurar este backup?" @@ -6469,20 +6914,27 @@ pt_BR: delete: "Excluir" delete_confirm: 'Você tem certeza de que deseja excluir "%{theme_name}"?' bulk_delete: "Tem certeza?" + bulk_themes_delete_confirm: "Os temas a seguir serão desinstalados e não poderão mais ser usados pelos(as) usuários(as) no seu site:" + bulk_components_delete_confirm: "Os componentes a seguir serão desinstalados e não poderão mais ser usados pelos(as) usuários(as) no seu site:" color: "Cor" opacity: "Opacidade" copy: "Duplicado" copy_to_clipboard: "Copiar para área de transferência" copied_to_clipboard: "Copiou para área de transferência" copy_to_clipboard_error: "Erro ao copiar dados para a área de transferência" + theme_owner: "Propriedade de:" email_templates: title: "E-mail" subject: "Assunto" multiple_subjects: "Este modelo de e-mail tem vários assuntos." + multiple_bodies: "Este modelo de e-mail tem vários corpos." body: "Corpo" revert: "Reverter alterações" revert_confirm: "Tem certeza de que deseja reverter as alterações?" + search_templates: "Filtrar por nome do modelo..." + no_templates_found: "Nenhum modelo corresponde aos seus filtros." edit: "Editar" + back: "Voltar aos modelos" component: all_filter: "Tudo" used_filter: "Usado(a)" @@ -6517,6 +6969,8 @@ pt_BR: create_name: "Nome" save: "Salvar" long_title: "Alterar cores, CSS e conteúdo HTML do seu site" + dark_mode: "%{themeName} modo escuro" + light_mode: "%{themeName} modo claro" edit: "Editar" edit_confirm: "Este é um tema remoto, se você editar o CSS/HTML, suas alterações serão apagadas na próxima vez que você atualizar o tema." update_confirm: "As alterações locais serão apagadas pela atualização. Tem certeza de que quer continuar?" @@ -6544,6 +6998,7 @@ pt_BR: default_light_scheme: "Claro (padrão)" color_scheme_select: "Selecione as cores que serão usadas pelo tema." dark_color_scheme_select: "Selecionar cores a serem usadas pelo tema no modo escuro." + edit_colors: "Editar cores" custom_sections: "Seções personalizadas:" theme_components: "Componentes do tema" add_all_themes: "Adicionar todos os temas" @@ -6555,10 +7010,12 @@ pt_BR: convert_theme_alert_generic: "Tem certeza de que quer converter este tema em um componente?" convert_theme_tooltip: "Converter este tema em componente" inactive_themes: "Temas inativos:" + set_default_theme: "Definir como padrão" default_theme: "Tema padrão" set_default_success: "Tema padrão definido como %{theme}" setting_was_saved: "Configuração de tema salva" install_success: "Tema %{theme} instalado!" + delete_success: "%{theme} excluído com sucesso!" inactive_components: "Componentes não usados" selected: one: "Selecionou %{count}" @@ -6731,12 +7188,16 @@ pt_BR: select_base: title: "Selecionar paleta de cores básicas" description: "Paleta básica:" + non_default_theme_warning: "Suas preferências pessoais para o tema diferem do padrão. As alterações que você faz aqui podem não se aplicar a você, mas se aplicarão a todos que usam o padrão (%{themeName})." + custom_schemes_warning: "Suas preferências pessoais para a paleta de cores %{colorModes} são diferentes do padrão. Alterações na paleta %{colorModes} podem não se aplicar a você, mas se aplicarão a todos que usam o padrão." light: "claro" dark: "escuro" title: "Cores" edit: "Editar" + view: "Visualizar" set_default_light: "Definir paleta clara no tema padrão (%{theme})" set_default_dark: "Definir paleta escura no tema padrão (%{theme})" + set_default_success: "%{schemeName} definido como paleta ativa para %{themeName}" saved_refreshing: "Salvou! Atualizando cores..." from_theme: "Do tema: %{name}" filters: @@ -6746,7 +7207,12 @@ pt_BR: from_theme: "Do tema" no_results: "Nenhuma paleta de cores encontrada" default_light_badge: + text: "Claro padrão" + title: "Paleta de cores clara padrão" reset: "Redefinir filtros" + default_dark_badge: + text: "Escuro padrão" + title: "Paleta de cores escura padrão" system_palette: "Esta é uma paleta de cores integrada, não pode ser excluída nem editada." back_to_colors: "Voltar para paletas de cores" long_title: "Paletas de cores" @@ -7066,6 +7532,11 @@ pt_BR: tag_group_change: "alterar grupo de etiquetas" delete_associated_accounts: "excluir contas associadas" change_theme_site_setting: "Alterar configuração do site substituída por tema" + stop_impersonating: "parar de personificar" + upcoming_change_toggled: "alteração prevista alternada" + upcoming_change_available: "alteração prevista disponível" + change_site_setting_groups: "alterar grupos de configuração do site" + discourse_id_regenerate_credentials: "regerar credenciais do Discourse ID" screened_emails: title: "E-mails filtrados" description: "Quando alguém tentar criar uma conta nova, os seguintes endereços de e-mail serão verificados e o registro será bloqueado, ou outra ação será executada." @@ -7120,6 +7591,7 @@ pt_BR: clear_all: Limpar tudo clear_all_confirm: "Tem certeza de que deseja remover todas as palavras acompanhadas para a ação %{action}?" invalid_regex: 'A palavra companhada ''%{word}" é uma expressão regular inválida.' + invalid_regex_multiple: "Expressões regulares inválidas:" regex_warning: 'Palavras acompanhadas são expressões regulares e não incluem automaticamente limites de palavras. Se quiser usar expressões regulares para fazer correpondência a palavras inteiras, inclua \b no início e no fim da sua expressão regular.' actions: block: "Bloqueado(a)" @@ -7152,6 +7624,7 @@ pt_BR: success: "Sucesso" exists: "Já existe" upload: "Adicionar do arquivo" + upload_successful: "Upload concluído com sucesso. As palavras serão processadas em breve." case_sensitivity_label: "É sensível a maiúsculas" case_sensitivity_description: "Apenas palavras com maiúsculas e minúsculas de caracteres correspondentes" html_label: "HTML" @@ -7202,6 +7675,7 @@ pt_BR: upload: "Enviar um arquivo" multiselect: "Múltipla escolha" tagchooser: "Seletor de grupo de etiquetas" + composer: "Resposta em Markdown" validations_modal: button_title: "Validações" modal_title: "Opções de validação" @@ -7243,7 +7717,10 @@ pt_BR: second: "Opção 2" third: "Opção 3" edit_category: + toggle_freeform: "Modelo de formulário desativado" + toggle_form_template: "Modelo de formulário ativado" select_template: "Selecione modelos de formulário" + select_template_help: "Adicionar/Editar modelos de formulário" errors: multiple_tags_not_allowed: 'Não é possível selecionar mais etiquetas em "%{tag_name}". Para evitar problemas, use o modelo de formulários' impersonate: @@ -7251,6 +7728,7 @@ pt_BR: help: "Use esta ferramenta para representar uma conta de usuário(a) para efeitos de depuração. Você terá que sair dela assim que terminar." not_found: "Este(a) usuário(a) não pode ser encontrado." invalid: "Desculpe, não é possível representar este(a) usuário(a)." + error: "Ocorreu um erro inesperado." users: title: "Usuários(as)" description: "Visualize e gerencie usuários(as)." @@ -7359,6 +7837,17 @@ pt_BR: penalty_post_actions: "O que você gostaria de fazer com a postagem associada?" penalty_post_delete: "Excluir a postagem" penalty_post_delete_replies: "Excluir a postagem + respostas" + penalty_post_delete_all: "Excluir todos os tópicos do(a) usuário(a) + quaisquer respostas" + penalty_post_delete_all_confirmation_MF: | + Isso apagará + { TOPICS, plural, + one {# tópico} + other {# tópicos} + } e + { REPLIES, plural, + one {# resposta} + other {# respostas} + }. Esta ação não pode ser desfeita! Tem certeza de que deseja fazer isso? penalty_post_edit: "Editar a postagem" penalty_post_none: "Não fazer nada" penalty_count: "Contagem de penalidades" @@ -7416,6 +7905,11 @@ pt_BR: approve_bulk_success: "Sucesso! Todos os(as) usuários(as) selecionados(as) foram aprovados(as) e notificados(as)." time_read: "Tempo de leitura" post_edits_count: "Postar edições" + upcoming_changes: + title: "Alterações previstas do usuário" + description: "Para modificar grupos ou ativar ou desativar alterações previstas, visite a página de configuração de alterações previstas." + filter_placeholder: "Filtrar alterações previstas por nome ou descrição." + filter_no_results: "Nenhuma alteração prevista encontrada." exports: title: Exportações de usuário(a) download: @@ -7440,6 +7934,9 @@ pt_BR: button: "Excluir todas postagens" progress: title: "Progresso da exclusão de postagens" + description: + one: "Excluindo %{count} postagem de @%{username}..." + other: "Excluindo %{count} postagens de @%{username}..." confirmation: title: "Excluir todas as postagens de @%{username}" description: | @@ -7451,6 +7948,7 @@ pt_BR: text: "excluir postagens de @%{username}" delete: "Excluir postagens de @%{username}" cancel: "Cancelar" + all_enqueued: "Todas as postagens de @%{username} foram colocadas na fila para exclusão." merge: button: "Mesclar" prompt: @@ -7477,6 +7975,8 @@ pt_BR: cancel: "Cancelar" merging_user: "Mesclando usuário(a)…" merge_failed: "Ocorreu um erro ao mesclar os(as) usuários(as)." + delete_forbidden_because_admin: "Os administradores não podem ser excluídos." + delete_posts_forbidden_because_admin: "Não é possível excluir todas as postagens dos administradores." delete_forbidden: one: "Usuários(as) não podem ser excluídos(as) se tiverem postagens. Exclua todas as postagens antes de tentar excluir um(a) usuário(a). (Mensagens com mais de %{count} dia não podem ser excluídas.)" other: "Usuários(as) não podem ser excluídos(as) se tiverem postagens. Exclua todas as postagens antes de tentar excluir um(a) usuário(a). (Mensagens com mais de %{count} dias não podem ser excluídas.)" @@ -7623,6 +8123,10 @@ pt_BR: title: "Exibir no cartão de usuário(a)" enabled: "Exibir no cartão de usuário(a)" disabled: "Não exibido no cartão de usuário(a)" + show_on_signup: + title: "Mostrar no formulário de inscrição" + enabled: "Formulário de inscrição exibido" + disabled: "Não aparece no formulário de inscrição." searchable: title: "Pesquisável" enabled: "Pesquisável" @@ -7697,7 +8201,10 @@ pt_BR: upload: label: "Enviar" title: "Enviar imagens" - download_file: "Download" + download_file: "Baixar" + upload_restrictions: + extensions: "Aceito: %{extensions}" + max_size: "Máximo: %{size}" selectable_avatars: title: "Lista de avatares que os usuários podem escolher" table_column_heading: @@ -7736,6 +8243,7 @@ pt_BR: experimental: "Experimental" secret_list: invalid_input: "Os campos de entrada não podem estar vazios ou conter o caractere de barra vertical." + already_exists: "Um termo para %{key} já foi definido." default_categories: modal_description: one: "Você gostaria de aplicar esta alteração historicamente? Isso mudará as preferências de %{count} usuário(a) existente." @@ -7760,13 +8268,22 @@ pt_BR: prompt: "A alteração desta configuração pode ter consequências inesperadas em diversas áreas do seu site. Deseja mesmo prosseguir?" confirm: "Sim, claro" min_password_length: + prompt: "Você está prestes a mudar sua política de senha. Isso afetará todos(as) os(as) usuários(as) que mudarem de senha de agora em diante. Deseja mesmo prosseguir?" confirm: "Sim, atualizar política de senha" min_admin_password_length: + prompt: "Você está prestes a mudar sua política de senha. Isso afetará todos(as) os(as) administradores(as) que mudarem de senha de agora em diante. Deseja mesmo prosseguir?" confirm: "Sim, atualizar política de senha" - password_unique_charactes: + password_unique_characters: confirm: "Sim, atualizar política de senha" block_common_passwords: + prompt: "Você está prestes a mudar sua política de senha. Isso afetará todos(as) os(as) usuários(as) que mudarem de senha de agora em diante. Deseja mesmo prosseguir?" confirm: "Sim, atualizar política de senha" + clean_up_inactive_users_after_days: + prompt: "Definir este valor para qualquer número diferente de 0 fará com que os usuários que não estiverem ativos por esse número de dias sejam excluídos permanentemente. Tem certeza de que deseja prosseguir?" + confirm: "Sim, entendo que usuários inativos serão excluídos permanentemente, a menos que eu defina este valor como 0." + job_status: + completed: "Atualização concluída" + enqueued: "Atualização em andamento" badges: status: Status title: Emblemas @@ -7800,9 +8317,12 @@ pt_BR: no_user_badges: "%{name} não recebeu nenhum emblema." no_badges: Não há emblemas que possam ser concedidos. none_selected: "Selecione um emblema para começar" + filter_placeholder: "Filtrar emblemas..." + no_badges_found: "Nenhum emblema encontrado" sections: + design: Design query: Consulta - settings: Definições + settings: Configurações usage_heading: Uso allow_title: Permitir que o emblema seja usado como título multiple_grant: Pode ser concedido várias vezes @@ -7903,6 +8423,7 @@ pt_BR: category: "Postar em categoria" tags: "Etiquetas de tópico" post_author: "Autor(a) da postagem" + post_author_description: "Autor para todos os tópicos incorporados deste host, substituindo as meta tags da página do blog. Deixe em branco para ler o autor das tags ou da página." post_author_with_default: "Autor(a) da postagem (padrão para %{author})" add_host: "Adicionar host" posts_and_topics: "Configurações de tópicos e postagens" diff --git a/config/locales/client.ro.yml b/config/locales/client.ro.yml index 7d69a3a031923..cb56ca11c9b7f 100644 --- a/config/locales/client.ro.yml +++ b/config/locales/client.ro.yml @@ -1509,6 +1509,8 @@ ro: interface: "Interfață" apps: "Aplicații" navigation_menu: "Meniu de navigare" + calendar_subscriptions: + copied: "Copiat!" change_password: success: "(e-mail trimis)" in_progress: "(se trimite e-mail)" @@ -1951,6 +1953,7 @@ ro: form_kit: reset: Resetare optional: opțional + required: necesar errors: starts_with: "Trebuie să înceapă cu %{prefix}" ends_with: "Trebuie să se termine cu %{suffix}" @@ -2523,10 +2526,7 @@ ro: bulk: select_all: "Selectează tot" clear_all: "Deselectează tot" - unlist_topics: "Elimină subiecte din listă" - relist_topics: "Relistează subiecte" defer: "Marchează ca necitite" - delete: "Șterge subiecte" delete_topics_count: one: "Șterge subiect" few: "Șterge subiecte" @@ -2539,24 +2539,15 @@ ro: dismiss_new: "Anulează cele noi" toggle: "activează selecția multiplă a subiectelor" actions: "Acțiuni multiple" - close_topics: "Închide subiectele" - archive_topics: "Arhivează subiecte" move_messages_to_inbox: "Mută în „Primite”" choose_new_category: "Alege o nouă categorie pentru acest subiect" - selected: - one: "Ai selectat un subiect." - few: "Ai selectat %{count} subiecte." - other: "Ai selectat %{count} de subiecte." selected_sole_category: one: "Ai selectat %{count} subiect din categoria:" few: "Ai selectat %{count} subiecte din categoria:" other: "Ai selectat %{count} de subiecte din categoria:" - change_tags: "Înlocuiește etichete" - append_tags: "Adaugă etichete" choose_new_tags: "Alege etichete noi pentru aceste subiecte:" - choose_append_tags: "Alege etichete noi pentru aceste subiecte:" changed_tags: "Etichetele pentru aceste subiecte au fost schimbate." - notify: "Notifică utilizatorii despre această modificare." + notify: "Notifică utilizatorii despre această modificare" performing: "Se efectuează operațiuni în masă, te rugăm să aștepți…" completed: "Operațiunile în masă s-au finalizat cu succes!" error_topic_count: @@ -2581,7 +2572,6 @@ ro: name: "Respinge" close_topics: name: "Închide sondajul" - note: "Notă" optional: (opțional) archive_topics: name: "Arhivă" @@ -2589,15 +2579,12 @@ ro: name: "Mută în Primite" remove_tags: name: "Înlătură etichete" - append_tags: - name: "Adaugă etichete" replace_tags: name: "Înlocuiește etichete" delete_topics: name: "Șterge" defer: name: "Marchează ca necitite" - description: "Marchează subiecte ca necitite" update_notifications: name: "Actualizează notificări" topic: @@ -3158,6 +3145,8 @@ ro: delete: "Șterge" topic_featured_link_allowed: "Permite link-uri promovate în această categorie." create_long: "Creează o categorie nouă" + type_settings_schema: + site_settings: "Setări site" unsaved_changes: "Ai modificări nesalvate" slug_placeholder: "(Opțional) cuvinte-punctate pentru url" creation_error: A apărut o eroare în timpul creării categoriei. @@ -3187,6 +3176,8 @@ ro: delete_confirm: "Sigur dorești să ștergi această categorie?" delete_error: "A apărut o eroare la ștergerea acestei categorii." no_description: "Adaugă o descriere acestei categorii." + description_expand: "Arată mai multe" + description_collapse: "Arată mai puține" already_used: "Această culoare este folosită la o altă categorie" color_palette: "Paletă de culori" security: "Securitate" @@ -3896,8 +3887,6 @@ ro: sidebar_title: "Rapoarte" group_traffic: "Trafic" group_members: "Membri" - group_moderation: "Moderare" - group_security: "Securitate" group_other: "Altele" config_sections: account: @@ -4202,6 +4191,7 @@ ro: header_description: "Funcția de chei API îți permite să integrezi în siguranță Discourse cu sisteme externe și să automatizezi acțiunile. Administratorii pot crea chei cu scopuri specifice pentru a controla accesul la resurse și la datele sensibile. Scopurile limitează funcționalitatea, asigurând securitate sporită." webhooks: title: "Cârlige web" + keywords: "eveniment|conținut|url" embedding: title: "Înglobare" theme_site_settings: @@ -4280,7 +4270,7 @@ ro: all: "Toate" view_table: "tabel" view_graph: "grafic" - refresh_report: "Reactualizează raportul" + refresh_report: "Reîmprospătează" daily: Zilnic monthly: Lunar weekly: Săptămânal diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml index 929f33b23997d..5b17600bd9537 100644 --- a/config/locales/client.ru.yml +++ b/config/locales/client.ru.yml @@ -9,9 +9,23 @@ ru: blocks: ghost: status: "Статус" + conditions: "Условия" + arguments: "Аргументы" + container_args: "Аргументы контейнера" in_location: "в" hidden: "скрыто" + not_registered: "не зарегистрирован" + no_visible_children: "нет видимых дочерних элементов" failed: "не удалась" + ghost_reasons: + optional_missing_hint: "Этот необязательный блок не отображается, поскольку он не зарегистрирован." + no_visible_children_hint: "Этот контейнерный блок не отображается, потому что ни один из его дочерних элементов не виден." + condition_failed_hint: "Этот блок не отображается, поскольку условия его выполнения не выполнены." + head_hidden_tail_hint: "Этот блок не отображается, потому что в контейнере `head` сначала отобразился другой блок." + carousel: + go_to_slide: "Перейти к слайду %{index}" + previous: "Предыдущий слайд" + next: "Следующий слайд" number: format: separator: "," @@ -347,6 +361,7 @@ ru: forwarded: "Переадресовал(а) вышеуказанное письмо" topic_admin_menu: "действия администратора над темой" skip_to_main_content: "Перейти к основному контенту" + skip_links_label: "Пропустить навигационные ссылки" skip_to_post: "Перейти к сообщению %{post_number}" skip_to_where_you_left_off: "Перейти к тому месту, где вы остановились (сообщение %{post_number})" skip_to_where_you_left_off_last: "Перейти к тому месту, где вы остановились (последний ответ, сообщение %{post_number})" @@ -354,10 +369,13 @@ ru: skip_to_top: "Перейти к началу" skip_user_nav: "Перейти к контенту профиля" emails_are_disabled: "Все исходящие письма были глобально отключены администратором. Никакие уведомления по электронной почте отправляться не будут." + emails_are_disabled_no_smtp: "Отправка исходящих писем отключена, поскольку не настроен SMTP-сервер. Отправка любых писем невозможна." emails_are_disabled_non_staff: "Отправка писем отключена для пользователей, не являющихся сотрудниками." software_update_prompt: message: "Мы обновили этот сайт. Обновите страницу, чтобы все работало гладко." dismiss: "Закрыть" + notifications_tracking: + tooltip: "Уровень уведомлений: %{level}" back_button: "Назад" welcome_banner: header: @@ -377,12 +395,23 @@ ru: broken_page_change_alert: "В обработчике OnPageChange возникла ошибка. Дополнительные сведения см. в инструментах для разработчиков браузера." broken_plugin_alert: "Причина — плагин '%{name}'" broken_transformer_alert: "Произошла ошибка. Ваш сайт может работать некорректно." + broken_block_alert: "Обнаружена ошибка конфигурации блока. Подробности см. в консоли браузера." + broken_block_factory_alert: "Не удалось загрузить блок. Некоторые элементы пользовательского интерфейса могут отображаться некорректно." critical_deprecation: notice: "[Уведомление администратора] %{source} содержит код, который необходимо обновить. (id:%{id})" learn_more_link: "(узнать больше)" theme_source: "Тема '%{name}'" plugin_source: "Плагин '%{name}'" unknown_source: "Одна из ваших тем или один из плагинов" + dev_tools: + drag_to_move: "Перетащите для перемещения" + block_debug: + visual_overlay: "Визуальное наложение" + ghost_blocks: "Призрачные блоки" + toggle_safe_mode: "Переключить безопасный режим" + toggle_verbose_localization: "Включить/выключить подробный режим локализации" + toggle_mobile_view: "Переключить мобильный режим" + disable_dev_tools: "Отключить инструменты разработчика" s3: regions: ap_northeast_1: "Азиатско-Тихоокеанский регион (Токио)" @@ -480,8 +509,35 @@ ru: pill: "Похожие" pm_title: "Похожие сообщения" admin_onboarding_banner: + launch_in_easy_steps: "Запуск в %{step_count} простых шагах" + skipped: "Контрольный список для адаптации администратора теперь пропущен. Если вы хотите включить его снова, найдите параметр «Включить адаптацию владельца сайта» в настройках сайта." + congrats_onboarding_complete: "Поздравляем с завершением процесса адаптации!" + invite_collaborators: + title: "Пригласить соавторов" + description: "Первые участники помогают оживить ваше сообщество." + action: "Создать приглашение" start_posting: + title: "Начать публикацию" + description: "Дайте людям тему для совместного обсуждения." + action: "Идеи для начала разговора" + choose_option: "С чего бы вы хотели начать?" + predefined_topics: "Шаблоны для начала разговора" + predefined_topics_subtitle: "Дайте новым участникам повод для обсуждения: выберите шаблон для редактирования и создайте свой собственный." + predefined_topics_description: "Выберите из подборки тем для начала разговора, чтобы завязать беседу." + use_predefined: "Просмотрите шаблоны" back: "Назад" + icebreakers: + fun_facts: + title: "Какие интересные факты о вас известны?" + body: "Привет всем! Я очень рада начать создавать это новое сообщество. Для начала давайте поделимся интересным фактом о себе. Я начну первыи: я люблю походы и исследование новых маршрутов! А что интересного есть в вас?" + coolest_thing_you_have_seen_today: + title: "Что самое крутое ты сегодня видел?" + body: "Что самое крутое вы сегодня видели или пережили? Это может быть что угодно, от прекрасного заката до случайного проявления доброты. Я начну: я видел, как собака помогала пожилому человеку перейти улицу!" + introduce_yourself: + title: "Представьтесь" + body: "Добро пожаловать в сообщество! Давайте познакомимся. Пожалуйста, представьтесь и расскажите немного о своих интересах. Я начну: я увлечен технологиями и люблю обучать других!" + what_is_your_favorite_food: + title: "Какое ваше любимое блюдо?" spread_the_word: action: "Копировать ссылку" copied_to_clipboard: "Ссылка скопирована в буфер обмена!" @@ -1026,10 +1082,14 @@ ru: other: "%{count} публикации" moderation_history: label: "История модерации" + suspended: "Приостановлено: %{count}" + rejected_posts: "Сообщения отклонены: %{count}" solution_marked: "Отмечено как решение" topic_has_solution: "Тема содержит решение вопроса" visibility: "Видимость" + topic_unlisted: "Данная тема не указана в открытом доступе и доступна только по прямой ссылке." help: + community_moderation_guide: "Руководство по модерации этого сообщества" moderation_guide: "Руководство по модерации Discourse" flag_priorities: "Управление репутацией пользователей и приоритетами жалоб" spam_detection: "Обнаружение спама" @@ -1192,6 +1252,7 @@ ru: title: Взаимодействие posting: Сообщения notification: Уведомления + self_lockout: "Вы собираетесь изменить видимость группы таким образом, что это лишит вас доступа к ней. Вы уверены, что хотите продолжить?" email: title: "Эл. почта" enable_smtp: "Включить SMTP" @@ -1204,6 +1265,7 @@ ru: smtp_title: "SMTP" smtp_instructions: "Когда вы включаете SMTP для группы, все исходящие электронные письма, отправляемые из группового почтового ящика, будут отправляться согласно указанным здесь настройкам. Стандартные почтовые настройки, используемые при отправке других писем, в этом случае использоваться не будут." additional_settings: "Дополнительные настройки" + smtp_disable_confirm: "Если вы отключите SMTP, все настройки SMTP будут сброшены, и соответствующая функциональность будет отключена. Вы уверены, что хотите продолжить?" prefill: title: "Заполните предварительные настройки для:" gmail: "Gmail" @@ -1324,6 +1386,8 @@ ru: make_owner_description: "Сделать %{username} владельцем этой группы" remove_owner: "Удалить владельца" remove_owner_description: "Удалить %{username} как владельца этой группы" + remove_member_self_lockout: "Выход из этой группы лишит вас доступа к управлению ею. Вы уверены, что хотите продолжить?" + remove_owner_self_lockout: "Удаление себя из списка владельцев группы лишит вас доступа к управлению этой группой. Вы уверены, что хотите продолжить?" make_primary: "Сделать основной" make_primary_description: "Сделать основной группой для пользователя %{username}" remove_primary: "Удалить как основную" @@ -1511,8 +1575,16 @@ ru: private_message: "Сообщение" private_messages: "Сообщения" upcoming_changes: + title: "Предстоящие изменения" for_user: + upcoming_change: "Предстоящее изменение" enabled: "Включено?" + why: "Почему?" + why_reasons: + not_in_specific_groups: "Пользователь не входит в определенные группы, необходимые для этого изменения" + in_specific_groups: "Пользователь входит в определенные группы, необходимые для внесения этих изменений." + enabled_for_everyone: "Это изменение доступно для всех участников." + enabled_for_no_one: "Эта функция отключена для всех участников." user_notifications: filters: filter_by: "Фильтр" @@ -1717,6 +1789,11 @@ ru: undo_revoke_access: "Отменить лишение прав доступа" api_approved: "Подтверждено:" api_last_used_at: "Последнее использование:" + api_show_permissions: + one: "Разрешения предоставлены (%{count})" + few: "Разрешения предоставлены (%{count})" + many: "Разрешения предоставлены (%{count})" + other: "Разрешения предоставлены (%{count})" theme: "Тема" save_to_change_theme: 'Тема будет обновлена после нажатия на кнопку «%{save_text}».' home: "Домашняя страница" @@ -1865,6 +1942,24 @@ ru: interface: "Интерфейс" apps: "Приложения" navigation_menu: "Меню навигации" + upcoming_changes: "Предстоящие изменения" + calendar_subscriptions: "Календарь" + calendar_subscriptions: + description: "Сгенерируйте URL-адреса подписки для синхронизации с вашим любимым календарным приложением (Google Calendar, Apple Calendar, Outlook и т. д.). Эти URL-адреса представляют собой приватные ссылки на события календаря для вашей учетной записи (закладки-напоминания, события календаря и т. д.). Вы всегда можете отозвать или продлить сгенерированные URL-адреса подписки. " + generate: "Сгенерировать URL-адреса подписки" + regenerate: "Перегенерировать URL" + regenerate_confirm: "Это аннулирует существующие URL-адреса подписки на ваш календарь. Любые приложения календаря, использующие старые URL-адреса, перестанут получать обновления. Продолжить?" + revoke: "Отозвать подписку" + revoke_confirm: "Это аннулирует существующие URL-адреса подписки на ваш календарь. Любые приложения календаря, использующие старые URL-адреса, перестанут получать обновления. Продолжить?" + urls_warning: "Ссылки для подписки готовы! Нажмите на кнопки ниже, чтобы связать их с вашим календарным приложением. Примечание: эти ссылки отображаются только один раз." + bookmarks: "Напоминания о закладках" + bookmarks_description: "Ваши закладки с напоминаниями о датах" + copy: "Скопировать URL" + copied: "Скопировано!" + add_to_google: "Календарь Google" + add_to_outlook: "Microsoft Outlook" + add_to_apple: "Календарь Apple" + active_subscription: "У вас есть активная подписка на календарь." change_password: success: "(письмо отправлено)" in_progress: "(отправка письма)" @@ -1877,6 +1972,7 @@ ru: verify_identity: "Чтобы продолжить, подтвердите свою личность." title: "Сброс пароля" remove: "Сбросить пароль" + remove_disabled: "Для удаления пароля учетной записи необходимо использовать как минимум еще один способ входа (например, пароль или связанный внешний аккаунт)." remove_detail: "Ваш аккаунт больше не будет доступен по паролю, если вы его не сбросите." second_factor_backup: title: "Резервные коды двухфакторной аутентификации" @@ -2149,6 +2245,7 @@ ru: first_time_and_daily: "При первом лайке в сообщении, и далее не чаще раза в день" first_time: "Только при первом лайке" never: "Никогда" + notify_on_linked_posts: "Уведомлять о том, когда кто-то делится ссылкой на одну из моих публикаций." email_previous_replies: title: "Добавлять предыдущие ответы к концу электронных писем" unless_emailed: "только при первой отправке" @@ -2208,6 +2305,7 @@ ru: redeemed_tab_with_count: "Принятые (%{count})" invited_via: "Приглашение" invited_via_link: "ссылка %{key} (принято: %{count} из %{max})" + generating_link: "Создание ссылки..." groups: "Группы" topic: "Тема" sent: "Создано / последняя отправка" @@ -2280,6 +2378,7 @@ ru: other {# дня} }. edit_link_options: "Измените параметры ссылки или отправьте по электронной почте." + edit_link_options_only: "Редактировать параметры ссылки" show_advanced: "Показать дополнительные параметры" hide_advanced: "Скрыть дополнительные параметры" description: "Описание" @@ -2496,9 +2595,21 @@ ru: no_results: "Нет результатов" search: "Поиск…" label: "Выберите варианты" + d_otp: + screen_reader: + one: Введите число + few: Введите %{count} чисел + many: Введите %{count} чисел + other: Введите %{count} числа form_kit: reset: Сбросить optional: необязательно + required: Обязательное + errors_summary_title: + one: "Исправьте эту ошибку, чтобы продолжить." + few: "Исправьте эти ошибки, чтобы продолжить." + many: "Исправьте эти ошибки, чтобы продолжить." + other: "Исправьте эти ошибки, чтобы продолжить." dirty_form: "Вы не отправили изменения! Действительно выйти?" errors: starts_with: "Должно начинаться с %{prefix}" @@ -2522,6 +2633,10 @@ ru: few: "Требуется не менее %{count} символов" many: "Требуется не менее %{count} символов" other: "Требуется не менее %{count} символа" + color: + available_presets: "Доступные предустановки" + already_used: "Уже использовано" + edit_presets: "Редактировать цветовые палитры" close: "Закрыть" assets_changed_confirm: "Для этого сайта есть обновление программного обеспечения. Получить последнюю версию?" logout: "Необходимо заново войти в систему." @@ -2584,6 +2699,7 @@ ru: }. learn_more: "Подробнее…" learn_more_with_link: "Подробнее…" + feedback_with_link: "Обратная связь…" mute: Отключить unmute: Включить last_post: Последнее сообщение @@ -2746,6 +2862,7 @@ ru: admin_not_allowed_from_ip_address: "Вход с этого IP-адреса в качестве администратора запрещён." resend_activation_email: "Щёлкните здесь, чтобы повторно выслать письмо для активации." omniauth_disallow_totp: "В аккаунте включена двухфакторная аутентификация. Войдите под своим паролем." + works_with: "Работает с" activate_account: "Активировать аккаунт" resend_title: "Отправить повторно письмо для активации" change_email: "Изменить электронную почту" @@ -2960,7 +3077,11 @@ ru: title: "Перевод публикации" select: "Выбрать перевод" save: "Сохранить перевод" + original_content: "Оригинальный пост" + translation_preview: "Предварительный просмотр перевода" + original: "Оригинал" translation: "Перевод" + no_translation_yet: "Начните вводить текст, чтобы увидеть предварительный просмотр перевода..." placeholder: "Введите перевод публикации здесь..." group_mentioned_limit: one: "Внимание! Вы упомянули %{group}, в которой больше участников, чем установленный администратором лимит упоминаний на %{count} пользователя. Никто не получит уведомление." @@ -3089,14 +3210,20 @@ ru: upload_description: "впишите сюда описание файла" olist_title: "Нумерованный список" ulist_title: "Маркированный список" + list_title: "Списки" list_item: "Элемент списка" toggle_direction: "Переключить направление" wrap_modal: + attributes_label: "Атрибуты" + add_attribute: "Добавить атрибут" + remove_attribute: "Удалить атрибут" apply: "Применить" + no_attributes: "Атрибуты пока не добавлены." help: "Справка по форматированию (Markdown)" collapse: "Свернуть панель редактора" open: "Открыть панель редактора" abandon: "Закрыть редактор и удалить черновик" + edit_reason: "Укажите причину редактирования." enter_fullscreen: "Включить полноэкранный режим редактора" exit_fullscreen: "Выключить полноэкранный режима редактора" exit_fullscreen_prompt: "ESC — выход из полноэкранного режима" @@ -3159,8 +3286,12 @@ ru: zoom_out: "Уменьшить размер изображения" zoom_in: "Увеличить размер изображения" remove: "Удалить изображение" + add_to_grid: "Добавить в сетку" + move_outside_grid: "Выйти за пределы сетки" image: "изображение" grid_label: "Это будет отображаться в виде сетки." + grid_mode_grid: "Сетка" + grid_mode_carousel: "Карусель" image_scale_button: "Масштабировать изображение до %{percent}%" delete_image_button: Удалить изображение toggle_image_grid: Сетка изображений @@ -3260,6 +3391,13 @@ ru: votes_released: "%{description} — завершено" new_features: "Появились новые функции!" admin_problems: "Новый совет в панели управления сайта" + upcoming_changes: + available: + description_two: "'%{changeName1}' и '%{changeName2}' доступны для предварительного просмотра" + description_many: "'%{changeName}' и %{otherChangeCount} доступны для предварительного просмотра дополнительные изменения" + automatically_promoted: + description_two: "'%{changeName1}' и '%{changeName2}' были автоматически включены" + description_many: "'%{changeName}' и %{otherChangeCount} дополнительные изменения были автоматически включены" dismiss_confirmation: body: default: @@ -3325,6 +3463,8 @@ ru: reaction: "Новая реакция" votes_released: "голосование опубликовано" admin_problems: "новый совет в панели управления сайта" + upcoming_change_available: "Доступны новые предстоящие изменения." + upcoming_change_automatically_promoted: "Предстоящие изменения автоматически включены." upload_selector: change: "Изменить" delete: "Удалить" @@ -3540,8 +3680,6 @@ ru: confirm: "Подтвердить" select_all: "Выбрать всё" clear_all: "Отменить выбор" - unlist_topics: "Скрыть темы" - relist_topics: "Показать темы" reset_bump_dates: "Сбросить даты поднятия" defer: "Отметить как непрочитанное" delete: "Удалить темы" @@ -3589,19 +3727,14 @@ ru: other: "Отложить новые (%{count})" toggle: "выбор нескольких тем" actions: "Массовые действия" - change_category: "Задать категорию…" + change_category: "Обновить категорию" close_topics: "Закрыть темы" - archive_topics: "Архивировать темы" + archive_topics: "Архив тем" move_messages_to_inbox: "Переместить во входящие" archive_messages: "Переместить в архив" - notification_level: "Уведомления…" + notification_level: "Уведомления об обновлении" change_notification_level: "Изменить уровень уведомлений" choose_new_category: "Выберите новую категорию для этих тем:" - selected: - one: "Вы выбрали %{count} тему." - few: "Вы выбрали %{count} темы." - many: "Вы выбрали %{count} тем." - other: "Вы выбрали %{count} темы." selected_sole_category: one: "Вы выбрали %{count} тему из этой категории:" few: "Вы выбрали %{count} темы из этой категории:" @@ -3615,9 +3748,9 @@ ru: change_tags: "Заменить теги" append_tags: "Добавить теги" choose_new_tags: "Выберите новые теги для этих тем:" - choose_append_tags: "Выберите теги для добавления к этим темам:" + choose_append_tags: "Добавить теги" changed_tags: "Теги этих тем изменены." - remove_tags: "Удалить все теги" + remove_tags: "Удалить теги" confirm_remove_tags: one: "Все теги будут удалены из этой темы. Продолжить?" few: "Все теги будут удалены из этих %{count} тем. Продолжить?" @@ -3628,7 +3761,7 @@ ru: few: "Выполнено: %{count} темы" many: "Выполнено: %{count} тем" other: "Выполнено: %{count} темы" - notify: "Уведомить пользователей об этом изменении." + notify: "Уведомить пользователей об этом изменении" performing: "Выполняются массовые действия, подождите…" completed: "Массовые действия завершены!" error_topic_count: @@ -3658,38 +3791,44 @@ ru: name: "Закрыть" close_topics: name: "Завершить" - note: "Примечание" + description: "Закрытые темы не позволяют оставлять новые комментарии. Узнать больше" + note: "Добавьте примечание к этим темам." optional: (необязательно) archive_topics: name: "Архивировать" + description: "Архивированные темы скрыты из поиска и списка последних тем. Узнать больше" archive_messages: name: "Переместить в архив" move_messages_to_inbox: name: "Переместить во входящие" unlist_topics: name: "Скрыть" + description: "Темы, не указанные в списке, скрыты, но к ним по-прежнему можно получить доступ по прямой ссылке. Узнать больше" relist_topics: name: "Показать повторно" remove_tags: name: "Удалить теги" + description: "Удалите все теги из выбранных тем." append_tags: name: "Добавить теги" + description: "Добавьте следующие теги к выбранным темам:" replace_tags: name: "Заменить теги" + description: "Замените все существующие теги для выбранных тем следующими:" delete_topics: name: "Удалить" + description: "Удалить выбранные темы безвозвратно. Это действие необратимо." update_category: name: "Обновить категорию" - description: "Выбор новой категории для выбранных тем" + description: "Переместить все выбранные темы в следующую категорию:" reset_bump_dates: name: "Сбросить даты поднятия" - description: "Сбрасывает дату поднятия темы на дату последней созданной публикации, что влияет на упорядочивание в списке тем" + description: "Вы хотите обновить даты обновления до даты последнего созданного сообщения? Это может повлиять на их порядок в списке тем." defer: name: "Отметить как непрочитанное" - description: "Помечает темы как непрочитанные" update_notifications: name: "Обновить уведомления" - description: "Изменяет уровень уведомлений на «В наблюдаемых», «В отслеживаемых», «Уведомлять» или «Не уведомлять»" + description: "Измените свой персональный уровень уведомлений для выбранных тем следующим образом:" topic: filter_to: one: "%{count} сообщение в теме" @@ -4440,6 +4579,7 @@ ru: many: "Действительно объединить %{count} сообщений?" other: "Действительно объединить %{count} сообщения?" revisions: + diff_too_complex: "Различия слишком сложны для отображения. Пожалуйста, попробуйте просмотреть отдельные, более мелкие изменения." locale: no_locale_set: "Язык не установлен" locale_removed: "Язык удален" @@ -4515,6 +4655,7 @@ ru: instructions: "Поделиться ссылкой на сообщение:" original_language: "Исходный язык этой публикации — %{language}" original_language_and_outdated: "Исходный язык этой публикации — %{language}. Перевод может быть устаревшим." + ai_translation_disclaimer: "Переводы, сгенерированные искусственным интеллектом, могут быть неточными." category: none: "(разное)" all: "Все категории" @@ -4551,24 +4692,51 @@ ru: delete: "Удалить" add: "Добавить необходимую группу тегов" placeholder: "Выберите группу тегов…" + min_count: "Количество тегов" tag_group: "Группа тегов" topic_featured_link_allowed: "Разрешить избранные ссылки в этой категории" + delete: "Удаление категории" + create: "Создать категорию" + create_with_type: "Новая категория %{typeName}" create_long: "Создать новую категорию" + settings_apply_to_all_of_type_warning: "Изменения, указанные ниже, будут применяться ко всем категориям данного типа." + type_settings_schema: + category_settings: "Настройки категории" + category_custom_fields: "Настройки категории" + site_settings: "Настройки сайта" + choose_type: + title: "Выберите тип категории" + requires_plugin: "Требуется плагин" + create_category: "Создать категорию" + save: "Сохранить категорию" unsaved_changes: "У вас есть несохраненные изменения" + parent: "Родительская категория" slug_placeholder: "(Необязат.) Слова для URL, разделённые дефисами" creation_error: При создании новой категории возникла ошибка. save_error: При сохранении категории возникла ошибка. + errors: + self_lockout: "Вы собираетесь изменить права доступа к категории таким образом, что это лишит вас доступа к ней. Вы уверены, что хотите продолжить?" validations: + emoji_required: "Выберите эмодзи." icon_required: "Выбрать значок." + name: "Название категории" + untitled: "Категория без названия" description: "Описание" + logo: "Изображение логотипа категории" + logo_dark: "Изображение логотипа категории в темном режиме" logo_description: "Рекомендуемое соотношение сторон 1:1 и минимальный размер 200 пикселей. Если оставить поле пустым, изображение отображаться не будет." + background_image: "Фоновое изображение категории" + background_image_dark: "Темное фоновое изображение категории" style: "Стиль" icon: "Значок" emoji: "Эмодзи" + select_emoji: "Выберите эмодзи" background_color: "Цвет" foreground_color: "Цвет текста" color_validations: cant_be_empty: "не может быть пустым" + incorrect_length: "формат должен соответствовать #RRGGBB или #RGB" + non_hexdecimal: "должны содержать только шестнадцатеричные символы (0-9, AF)." styles: type: "Стиль" icon: "Значок" @@ -4580,12 +4748,16 @@ ru: emoji: "Эмодзи" color_used: "Используемый цвет" predefined_colors: "Предустановленные варианты цветов" + name_placeholder: "Рекомендуется одно-два слова." color_placeholder: "Любой цвет из веб-палитры" delete_confirm: "Действительно удалить категорию?" delete_error: "При удалении категории произошла ошибка." list: "Вывод списка категорий" no_description: "Добавьте описание для этой категории." change_in_category_topic: "Изменить описание" + description_updated: "Описание обновлено" + description_expand: "Развернуть" + description_collapse: "Свернуть" already_used: "Цвет уже используется другой категорией" color_palette: "Цветовая палитра" security: "Безопасность" @@ -4596,8 +4768,15 @@ ru: reply: "Ответить" create: "Создать" no_groups_selected: "Доступ не предоставлен ни одной группе; эта категория будет видна только персоналу." + everyone_full_access: 'Эта категория является общедоступной, каждый может видеть, отвечать и создавать сообщения. Чтобы ограничить права доступа, удалите одно или несколько разрешений, предоставленных группе "%{everyone_group}".' + everyone_reply_access: 'Эта категория общедоступна, каждый может видеть темы и отвечать на них. Чтобы ограничить права доступа, удалите группу "%{everyone_group}.' + everyone_see_access: 'Эта категория общедоступна, все могут видеть публикации. Чтобы ограничить доступ, удалите группу "%{everyone_group}".' + specific_groups_have_access: "Эта категория является закрытой, только выбранные группы могут просматривать, отвечать на сообщения и создавать новые публикации." + all_parent_groups_used: "Все группы из родительской категории добавлены. Чтобы добавить больше групп, сначала добавьте их в родительскую категорию." toggle_reply: "Переключить разрешение «Ответ»" toggle_full: "Переключить разрешение «Создание»" + inherited: 'Это разрешение наследуется от "%{everyone_group}"' + special_warning: "Это предварительно созданная категория, и параметры безопасности нельзя изменить. Если вы не хотите использовать эту категорию, удалите её, а не используйте для других целей." uncategorized_security_warning: "Это особенная категория. В ней содержатся темы, для которых при создании не была указана категория; у нее не может быть настроек безопасности." uncategorized_general_warning: 'Это особенная категория. Она используется как категория по умолчанию для новых тем, не отнесенных к конкретной категории. Чтобы предотвратить такое поведение и обеспечить выбор категории, отключите соответствующую настройку. Изменить название или описание категории можно в разделе Оформление / Текст.' pending_permission_change_alert: "Вы не добавили %{group} в эту категорию; нажмите эту кнопку для добавления." @@ -4614,7 +4793,11 @@ ru: all_topics_wiki: "Создавать новые темы в виде вики-сообщений" allow_unlimited_owner_edits_on_first_post: "Разрешить автору первого сообщения вносить правки без ограничений" subcategory_list_style: "Стиль списка подкатегорий:" + sort_order: "Список тем, отсортированный по:" + default_view: "Список тем по умолчанию:" + default_list_filter: "Фильтр списка по умолчанию:" allow_badges_label: "Разрешить вручение наград в этой категории" + edit_permissions: "Изменить разрешения" reviewable_by_group: "Помимо сотрудников, содержимое этой категории также могут проверять:" review_group_name: "Название группы" require_topic_approval: "Требовать одобрения модератором всех новых тем" @@ -4623,11 +4806,20 @@ ru: position: "Позиция на странице категорий:" position_disabled: "Категории будут отображаться в порядке активности. Чтобы настроить их порядок в списках, включите настройку fixed category positions." minimum_required_tags: "Минимальное количество тегов, требуемых в теме:" + default_slow_mode: 'Включите «Медленный режим» для новых тем в этой категории.' + subcategory_of: "Подкатегория..." none_subcategory_text: "Нет" + subcategory_permissions_warning: "Подкатегория частной категории не может быть публичной." visibility: title: "Видимость" public: "Публичное" + all_members: "Все участники" group_restricted: "Закрытое сообщество" + who_can_see: "Кто может видеть эту группу" + who_can_post: "Кто может размещать сообщения в этой категории?" + which_groups_can_access: "Какие группы могут видеть сообщения в этой категории и публиковать их?" + more_options_hint: "Дополнительные права доступа доступны в расширенных настройках." + inherited_from_parent: "Права доступа наследуются от родительской категории. Для уточнения перейдите в раздел Расширенные настройки." num_auto_bump_daily: "Число открытых тем для автоматического ежедневного поднятия:" auto_bump_cooldown_days: "Минимум дней до повторного поднятия темы:" navigate_to_first_post_after_read: "Перейти к первому сообщению после прочтения тем" @@ -4649,11 +4841,14 @@ ru: title: "Без уведомлений" description: "Не уведомлять о новых темах в этой категории и не отображать их в разделе «Последние»." search_priority: + label: "Приоритет поиска" options: normal: "Обычный" ignore: "Игнорировать" + very_low: "Очень низкий" low: "Низкий" high: "Высокий" + very_high: "Очень высокий" sort_options: default: "по умолчанию" likes: "Количество лайков" @@ -4677,6 +4872,7 @@ ru: email: "Эл. почта" list_filters: all: "Все темы" + none: "Нет подкатегорий" colors_disabled: "Вы не можете выбирать цвета, поскольку не указан стиль категории (category style = none)." anonymous_flagging: title: "Сообщите о незаконном контенте" @@ -4968,10 +5164,15 @@ ru: preloader_text: "Загрузка…" lightbox: download: "Скачать" + open: "Оригинальное изображение" + image_info: "Информация об изображении" + quote: "Изображение цитаты" previous: "Назад (клавиша со стрелкой влево)" next: "Далее (клавиша со стрелкой вправо)" counter: "%curr% из %total%" close: "Закрыть (Esc)" + zoom: "Масштабирование (клавиша Z)" + error: "Изображение не может быть загружено." content_load_error: 'Контент не удалось загрузить.' image_load_error: 'Изображение не удалось загрузить.' cannot_render_video: 'Это видео невозможно отобразить: видеокодек не поддерживается браузером.' @@ -5743,6 +5944,7 @@ ru: admin_js: type_to_filter: "Фильтрация настроек…" settings: "Настройки" + reset_filter: "Сбросить фильтры" admin: title: "Администратор Discourse" moderator: "Модератор" @@ -5759,8 +5961,7 @@ ru: back: "Назад ко всем отчетам" group_traffic: "Трафик" group_members: "Участники" - group_moderation: "Модерация" - group_security: "Безопасность" + group_moderation_and_security: "Модерация и безопасность" group_other: "Разное" config_sections: account: @@ -5786,26 +5987,50 @@ ru: enabled: "Включено" enabled_for: "Включено для..." show_image: "Показать изображение" + save_groups: "Сохранить группы" + add_groups_to_enable: "Добавьте группы, чтобы включить эту функцию." + no_changes_to_save: "Изменений для сохранения нет." select_groups: "Выберите группы…" + show_related_settings: "Показать соответствующие настройки..." + opt_in_groups_instructions: "Группы с возможностью добровольного участия позволяют определенной группе пользователей протестировать изменение до его общего выпуска. Обратите внимание, что эти группы станут неактуальными после того, как изменение перейдет в стабильный статус." + enabled_for_throttle: "Вы слишком быстро изменили настройки, для которых это изменение включено. Подождите несколько секунд, прежде чем повторить попытку." + change_enabled_for_success: "Вы включили это изменение для %{enabledFor}" + change_disabled: "Вы отказались от этого изменения." + permanent_notice: "Это изменение теперь является постоянным и вскоре будет отменено. Отказаться от участия больше нельзя." + permanent_soon_notice: "Это изменение скоро станет постоянным. Вы больше не сможете отказаться от участия." preview: "Предпросмотр" enabled_for_options: + no_one: "Никто" everyone: "Все" + staff: "%{staffGroupName} только" + specific_groups: "Конкретная группа (группы)" statuses: experimental: "Экспериментальная функция" + stable: "Стабильный" + permanent: "Постоянный" impact_roles: admins: "Администраторы" moderators: "Модераторы" staff: "Персонал" + all_members: "Все участники" + developers: "Разработчики" filter: + search_placeholder: "Фильтрация по названию, описанию или плагину..." all: "Все настройки" + enabled_all: "Все включенные состояния" enabled: "Включено" + enabled_for_staff: "Включено для %{staffGroupName}" disabled: "Отключен" impact_type_feature: "Функция" impact_type_other: "Разное" status_experimental: "Экспериментальная функция" + status_permanent: "Постоянный" + impact_role_all: "Все значимые роли" impact_role_admins: "Администраторы" impact_role_moderators: "Модераторы" impact_role_staff: "Персонал" + impact_role_all_members: "Все участники" + impact_role_developers: "Разработчики" config: about: title: "О вашем сайте" @@ -5836,6 +6061,9 @@ ru: title: "Локализация" header_description: "Настройте язык интерфейса вашего сообщества и другие параметры локализации для участников." keywords: "локаль|язык|часовой пояс|юникод|ltr" + upcoming_changes: + title: "Предстоящие изменения" + header_description: "Список предстоящих изменений в Discourse, которые могут повлиять на ваш сайт, а также экспериментальных функций, к которым вы можете подключиться по желанию. Вы можете фильтровать по степени влияния, типу и статусу.\n\nГруппы для участия могут использоваться для того, чтобы определенная группа пользователей могла протестировать изменение до его общего выпуска, хотя эти группы станут неактуальными после того, как изменение получит статус «Постоянное»." login: title: "Вход и аутентификация" header_description: "Настройте способ входа и аутентификации пользователей, идентификаторы ключей доступа и секретные ключи доступа, поставщиков OAuth2 и многое другое" @@ -5846,6 +6074,8 @@ ru: title: "Discourse ID" discourse_id: title: "Discourse ID" + stats: + total_users: "Всего пользователей" learn_more: "Подробнее" logo: title: "Логотип" @@ -5958,6 +6188,8 @@ ru: subheader_logged_in: label: "Подзаголовок для авторизованных пользователей" description: "Вторичный текст, показанный ниже заголовка для вошедших пользователей." + search_placeholder: + placeholder: "Поиск по темам..." navigation: title: "Навигация" header_description: "Настрой навигационные ссылки и пункты меню для своего сайта. Сюда входит расположение и поведение основного навигационного меню, быстрых ссылок в верхней части главной страницы, а также боковой панели администратора" @@ -6148,6 +6380,9 @@ ru: embedding: title: "Встраивание" header_description: "Discourse имеет возможность встраивать комментарии из темы на удаленный сайт с помощью API Javascript, который создает IFRAME" + form_templates: + title: "Шаблоны форм" + header_description: "Шаблоны форм позволяют создавать структурированные формы с проверкой данных в рамках процесса создания темы." theme_site_settings: setting: "Настройка" overridden_by: "Переопределено:" @@ -6156,6 +6391,9 @@ ru: select_setting: "Выберите настройку сайта, чтобы увидеть текущие значения темы" add: "Перейти к настройкам сайта для темы" help: "Текущая тема: %{currentTheme}. Перейдите на страницу настроек темы , чтобы изменить настройки сайта для темы, или нажмите на связанную тему в таблице ниже, чтобы изменить ее настройки." + filter: "Фильтрация настроек темы сайта по названию, описанию или названию темы..." + filter_no_results: "Нет настроек темы сайта, соответствующих вашему фильтру" + site_setting_warning: 'Этот параметр управляется стандартной темой вашего сайта (%{defaultThemeName}). Вы можете изменить его на странице редактирования темы .' search: modal_title: "Искать всё в панели администратора" title: "Поиск" @@ -6189,6 +6427,8 @@ ru: new_features: title: "Что нового?" subtitle: "Мы регулярно выпускаем обновления с новыми функциями и улучшениями. На этой странице перечислены ключевые моменты, а полный список доступен по ссылке «Подробнее»." + no_new_features_found: "В ленте нет элементов, или выбранный вами фильтр не дал результатов. Предыдущие анонсы новых функций можно посмотреть в сообществе Discourse Meta ." + no_new_features_error: "Произошла ошибка при загрузке ленты. Предыдущие объявления о новых функциях можно посмотреть в сообществе Discourse Meta ." learn_more: "Подробнее…" last_checked: "Последняя проверка" refresh_problems: "Обновить" @@ -6260,10 +6500,11 @@ ru: all: "Все" view_table: "Таблица" view_graph: "График" - refresh_report: "Обновить отчёт" + refresh_report: "Обновить" daily: За день monthly: За месяц weekly: За неделю + chart_group_period: "Выберите период" dates: "Даты (UTC)" groups: "Все группы" disabled: "Этот отчёт отключён" @@ -6274,7 +6515,9 @@ ru: trending_search: more: 'Журналы поиска' disabled: 'Отчёт о поисковых запросах отключён. Включить журнал поисковых запросов для сбора данных.' + average_chart_label: Показаны средние значения, а не итоговые суммы. sort_button: "Сортировка: %{column}" + sort_button_current: "Отсортировано по %{column}, %{direction}" sort_ascending: "по возрастанию" sort_descending: "по убыванию" filters: @@ -6386,6 +6629,7 @@ ru: cancel: "Отменить" continue: "Продолжить" copy_key: "Копировать" + key_copied_to_clipboard: "Ключ API скопирован в буфер обмена" back: "Назад к ключам API" revoke: "Отозвать" undo_revoke: "Отменить отзыв" @@ -6453,6 +6697,7 @@ ru: recover: Восстановление темы. read_lists: Чтение тем в разделах «Последние», «Новые», «Обсуждаемые» и т. д. RSS также поддерживается. status: "Обновление статуса темы. Статус: закрыта, архив, отображается, закреплена. Включено: истина, ложь. Чтобы разрешить изменение статуса только для тем в этой категории, укажите «category_id» здесь и в полезной нагрузке запроса." + change_owner: Изменить владельца сообщений в теме. posts: edit: Редактирование сообщения. delete: Удаление сообщения. @@ -6589,6 +6834,7 @@ ru: user_destroyed: "Пользователь удален" user_suspended: "Пользователь заблокирован" user_unsuspended: "Пользователь раблокирован" + user_anonymized: "Пользователь анонимизирован" reviewable_event: group_name: "Проверяемые события" reviewable_created: "Проверяемый элемент готов" @@ -6767,6 +7013,7 @@ ru: description: "Дополнительные группы, которые нужно показывать на странице «О нас»." groups: "Группы" order: "Порядок сортировки" + initial_members: "Расширенный состав участников" initial_members_description: "Количество участников группы, которое будет отображаться перед добавлением кнопки «Показать больше»." show_description: "Включить описание" optional: "(необязательно)" @@ -6800,6 +7047,8 @@ ru: post: "публикации" chat_message: "сообщения чата" enabled: "Включить пользовательскую метку после сохранения" + create_warning: "После использования пользовательского флага его можно только отключить или отредактировать, но не удалить." + edit_warning: "Изменение названия и описания флага может привести к потенциальным несоответствиям данных. После использования пользовательского флага его можно только отключить или отредактировать, но не удалить." edit_flag: "Изменение метки" non_editable: "Изменить метку нельзя: она системная или уже использовалась в системе проверки. Однако метку можно отключить." delete_flag: "Удаление метки" @@ -6824,8 +7073,10 @@ ru: install: "Установить" theme_site_settings: title: "Настройки сайта для темы" + description: "Настройки, позволяющие темам более эффективно управлять работой сайта в целом, переопределяя небольшой набор основных настроек сайта." themes: title: "Темы" + description: "Темы оформления, изменяющие общий внешний вид вашего сайта для всех пользователей." themes_intro: "Установите новую тему, чтобы начать, или создай свою с нуля, используя эти ресурсы." new_theme: "Новая тема" back: "Назад к темам" @@ -6888,6 +7139,8 @@ ru: title: "Варианты цвета" toggle: "Выбирается пользователем" toggle_description: "Пользователи могут выбирать цветовую палитру" + toggle_default_light_on_theme: "Цветовая палитра — это стандартная светлая палитра в стандартной теме (%{themeName})" + toggle_default_dark_on_theme: "Цветовая палитра — это стандартная темная палитра в теме по умолчанию (%{themeName})" colors: title: "Цвета" save_changes: "Сохранить изменения" @@ -6978,6 +7231,7 @@ ru: confirm: "Действительно удалить резервную копию?" restore: is_disabled: "Восстановление в данный момент отключено. Чтобы включить его, зайдите в настройки сайта." + is_disabled_title: "Функция восстановления в данный момент отключена. Чтобы включить её, найдите пункт «Разрешить восстановление» в настройках сайта." label: "Восстановить" title: "Восстановить резервную копию" confirm: "Действительно восстановить эту резервную копию?" @@ -7020,20 +7274,27 @@ ru: delete: "Удалить" delete_confirm: 'Действительно удалить тему «%{theme_name}»?' bulk_delete: "Точно?" + bulk_themes_delete_confirm: "В результате будут удалены следующие темы оформления, и они больше не будут доступны пользователям вашего сайта:" + bulk_components_delete_confirm: "В результате будут удалены следующие компоненты, и они больше не будут доступны пользователям вашего сайта:" color: "Цвет" opacity: "Прозрачность" copy: "Дублировать" copy_to_clipboard: "Скопировать в буфер" copied_to_clipboard: "Скопировано в буфер" copy_to_clipboard_error: "Ошибка при копировании данных в буфер обмена" + theme_owner: "Владелец:" email_templates: title: "Эл. почта" subject: "Тема" multiple_subjects: "Этот шаблон электронной почты имеет несколько тем." + multiple_bodies: "Этот шаблон электронного письма содержит несколько частей текста." body: "Текст сообщения" revert: "Отменить изменения" revert_confirm: "Действительно отменить внесённые изменения?" + search_templates: "Фильтрация по названию шаблона..." + no_templates_found: "Ни один шаблон не соответствует вашим фильтрам." edit: "Изменить" + back: "Вернуться к шаблонам" component: all_filter: "Все" used_filter: "Используется" @@ -7068,6 +7329,8 @@ ru: create_name: "Название" save: "Сохранить" long_title: "Стилизация сайта: цвета, CSS и HTML" + dark_mode: "%{themeName} темный режим" + light_mode: "%{themeName} светлый режим" edit: "Изменить" edit_confirm: "Это импортированная тема. Изменения CSS/HTML будут утеряны после очередного обновления." update_confirm: "Эти локальные изменения будут утеряны после обновления. Действительно продолжить?" @@ -7299,6 +7562,8 @@ ru: select_base: title: "Выберите базовую цветовую палитру" description: "Базовая палитра:" + non_default_theme_warning: "Ваши личные настройки для темы отличаются от стандартных. Внесенные здесь изменения могут не относиться к вам, но будут применяться ко всем, кто использует значение по умолчанию (%{themeName})." + custom_schemes_warning: "Ваши личные настройки для %{colorModes} цветовой палитры отличаются от настроек по умолчанию. Изменения в %{colorModes} палитре могут не применяться к вам, но будут применяться ко всем, кто использует настройки по умолчанию." light: "светлая" dark: "темная" title: "Цвета" @@ -7306,6 +7571,7 @@ ru: view: "Вид" set_default_light: "Установить как светлую палитру в теме по умолчанию (%{theme})" set_default_dark: "Установить как темную палитру в теме по умолчанию (%{theme})" + set_default_success: "%{schemeName} установить в качестве палитры по умолчанию для %{themeName}" saved_refreshing: "Сохранено! Обновление цветов..." from_theme: "Из темы: %{name}" filters: @@ -7638,6 +7904,10 @@ ru: delete_associated_accounts: "удалить связанные аккаунты" change_theme_site_setting: "изменить настройки сайта для темы" stop_impersonating: "перестань выдавать себя за кого-то другого" + upcoming_change_toggled: "предстоящие изменения включены" + upcoming_change_available: "предстоящие изменения доступны" + change_site_setting_groups: "изменить группы настроек сайта" + configure_category_type: "настроить тип категории" screened_emails: title: "Проверяемые адреса эл. почты" description: "Когда кто-то создает новый аккаунт, указанный пользователем почтовый адрес проверяется на соответствие с указанным ниже списком, и в случае совпадения регистрация блокируется или производятся другие дополнительные действия." @@ -7726,6 +7996,7 @@ ru: success: "Слово добавлено" exists: "Уже существует" upload: "Добавить из файла" + upload_successful: "Загрузка прошла успешно. Текст будет обработан в ближайшее время." case_sensitivity_label: "С учётом регистра" case_sensitivity_description: "Только слова с соответствующим регистром символов" html_label: "HTML" @@ -7776,6 +8047,7 @@ ru: upload: "Загрузка файла" multiselect: "Множественный выбор" tagchooser: "Выбор группы тегов" + composer: "Ответ в формате Markdown" validations_modal: button_title: "Проверки" modal_title: "Параметры проверки" @@ -7817,6 +8089,7 @@ ru: second: "Вариант 2" third: "Вариант 3" edit_category: + toggle_freeform: "Шаблон формы отключен" select_template: "Выберите шаблоны форм" errors: multiple_tags_not_allowed: 'Вы не можете выбрать больше тегов из «%{tag_name}». Чтобы избежать проблем, используйте шаблон формы.' @@ -8261,6 +8534,9 @@ ru: more_than_50_results: "Найдено более 50 результатов. Уточните параметры поиска." no_results: "Подходящие тексты на сайте не найдены" interpolation_keys: "Доступные ключи интерполяции:" + interpolation_key_insert: "Нажмите, чтобы вставить" + interpolation_key_used: "Уже используется" + interpolation_key_invalid: "Неизвестный ключ — интерполяция невозможна" outdated: title: "Этот перевод устарел" description: "С момента создания этого переопределения перевод по умолчанию для ключа изменился. Проверьте перевод ниже на соответствие изменениям, которые были внесены в исходный текст." @@ -8383,7 +8659,8 @@ ru: confirm: "Да, изменить политику паролей" min_admin_password_length: confirm: "Да, изменить политику паролей" - password_unique_charactes: + password_unique_characters: + prompt: "Вы собираетесь изменить политику паролей. Это повлияет на всех пользователей, которые будут менять свои пароли с этого момента. Вы уверены, что хотите продолжить?" confirm: "Да, изменить политику паролей" block_common_passwords: confirm: "Да, изменить политику паролей" diff --git a/config/locales/client.sk.yml b/config/locales/client.sk.yml index e636cd5091838..ae2432614f2b5 100644 --- a/config/locales/client.sk.yml +++ b/config/locales/client.sk.yml @@ -1747,6 +1747,10 @@ sk: interface: "Rozhranie" apps: "Aplikácie" navigation_menu: "Navigačné menu" + calendar_subscriptions: "Kalendár" + calendar_subscriptions: + copied: "Skopírované!" + add_to_google: "Kalendár Google" change_password: success: "(email odoslaný)" in_progress: "(email sa odosiela)" @@ -2381,6 +2385,7 @@ sk: form_kit: reset: Resetovať optional: nepovinné + required: povinné dirty_form: "Neodoslali ste svoje zmeny! Naozaj chcete odísť?" errors: starts_with: "Musí začínať s %{prefix}" @@ -3401,11 +3406,8 @@ sk: confirm: "Potvrďte" select_all: "Vyber všetko" clear_all: "Zruš všetko" - unlist_topics: "Dôverné témy" - relist_topics: "Obnoviť zoznam tém" reset_bump_dates: "Obnoviť dátumy bump" defer: "Označiť ako neprečítané" - delete: "Zmazať témy" delete_topics_count: one: "Zmazať tému" few: "Zmazať témy" @@ -3450,19 +3452,10 @@ sk: other: "Zadmietnuť nové (%{count})" toggle: "prepnuť hromadne vybrané témy" actions: "Hromadné akcie" - change_category: "Nastavenie kategórie…" - close_topics: "Uzavrieť tému" - archive_topics: "Archivuj témy" move_messages_to_inbox: "Presuň do prijatej pošty" archive_messages: "Presunúť do archívu" - notification_level: "Upozornenia…" change_notification_level: "Zmena úrovne oznámení" choose_new_category: "Vyberte pre tému novú kategóriu:" - selected: - one: "Označíli ste %{count} tému." - few: "Označíli ste %{count} tém.y" - many: "Označíli ste %{count} tém." - other: "Označíli ste %{count} tém." selected_sole_category: one: "Vybrali ste %{count} tému z kategórie:" few: "Vybrali ste %{count} tém z kategórie:" @@ -3473,12 +3466,8 @@ sk: few: "%{count} vybrané" many: "%{count} vybrané" other: "%{count} vybrané" - change_tags: "Nahradiť značky" - append_tags: "Pridať značky" choose_new_tags: "Vyberte si nové značky pre tieto témy:" - choose_append_tags: "Vyberte nové značky, ktoré chcete pridať pre tieto témy:" changed_tags: "Značky týchto tém boli zmenené." - remove_tags: "Odstrániť všetky značky" confirm_remove_tags: one: "Všetky značky budú z tejto témy odstránené. Ste si istí?" few: "Všetky značky budú odstránené z %{count} tém. Ste si istý/á?" @@ -3518,7 +3507,6 @@ sk: name: "Zahodiť" close_topics: name: "Zavrieť" - note: "Poznámka" optional: (nepovinné) archive_topics: name: "Archivovať" @@ -3532,24 +3520,18 @@ sk: name: "Opätovné zaradenie do zoznamu" remove_tags: name: "Odstrániť značky" - append_tags: - name: "Pridať značky" replace_tags: name: "Nahradiť značky" delete_topics: name: "Odstrániť" update_category: name: "Aktualizovať kategóriu" - description: "Výber novej kategórie pre vybrané témy" reset_bump_dates: name: "Obnovenie dátumov zvýraznenia" - description: "Obnovenie dátumu nárazu témy na dátum posledného vytvoreného príspevku, čo ovplyvňuje poradie v zozname tém" defer: name: "Označiť ako neprečítané" - description: "Označiť témy ako neprečítané" update_notifications: name: "Aktualizovať upozornenia" - description: "Zmena úrovne upozornenia na Sledovanie, Sledovanie, Normálne alebo Stlmené" topic: filter_to: one: "%{count} príspevok k téme" @@ -4395,6 +4377,8 @@ sk: placeholder: "Vybrať skupinu značiek…" topic_featured_link_allowed: "Povoliť odporúčané odkazy v tejto kategórii" create_long: "Vytvoriť novú kategóriu" + type_settings_schema: + site_settings: "Nastavenia stránky" unsaved_changes: "Máte neuložené zmeny" slug_placeholder: "(Voliteľné) pomlčkou-prerušované-slová pre url" creation_error: Nastala chyba počas vytvárania kategórie. @@ -4427,6 +4411,8 @@ sk: list: "Zoznam kategórií" no_description: "Prosím, pridajte popis k tejto kategórii." change_in_category_topic: "Upraviť popis" + description_expand: "Zobraziť viac" + description_collapse: "Zobraziť menej" already_used: "Táto farba je už použitá inou kategóriou" color_palette: "Paleta farieb" security: "Bezpečnosť" @@ -5596,8 +5582,6 @@ sk: back: "Späť na všetky správy" group_traffic: "Vyťaženie" group_members: "Členovia" - group_moderation: "Moderovanie" - group_security: "Bezpečnosť" group_other: "Ostatné" config_sections: account: @@ -6088,7 +6072,7 @@ sk: all: "Všetky" view_table: "tabuľka" view_graph: "graf" - refresh_report: "Obnoviť report" + refresh_report: "Obnoviť" daily: Denne monthly: Mesačne weekly: Týždenne @@ -8191,7 +8175,7 @@ sk: confirm: "Áno, aktualizujte zásady používania hesiel" min_admin_password_length: confirm: "Áno, aktualizujte zásady používania hesiel" - password_unique_charactes: + password_unique_characters: confirm: "Áno, aktualizujte zásady používania hesiel" block_common_passwords: confirm: "Áno, aktualizujte zásady používania hesiel" diff --git a/config/locales/client.sl.yml b/config/locales/client.sl.yml index f7959217541df..e8ca1a643e696 100644 --- a/config/locales/client.sl.yml +++ b/config/locales/client.sl.yml @@ -1254,6 +1254,8 @@ sl: tags: "Oznake" interface: "Uporabniški vmesnik" apps: "Aplikacije" + calendar_subscriptions: + copied: "Kopirano!" change_password: success: "(e-sporočilo poslano)" in_progress: "(pošiljanje e-sporočila)" @@ -1713,6 +1715,7 @@ sl: form_kit: reset: Ponastavi optional: neobvezno + required: zahtevano errors: required: "Zahtevano" close: "Zapri" @@ -2313,9 +2316,6 @@ sl: confirm: "Potrdi" select_all: "Izberi vse" clear_all: "Počisti vse" - unlist_topics: "Izloči temo iz seznamov" - relist_topics: "Postavi temo nazaj na seznam" - delete: "Izbriši teme" delete_topics_count: one: "Izbriši temo" two: "Izbriši teme" @@ -2329,20 +2329,10 @@ sl: dismiss_new: "Opusti nove" toggle: "preklopi množično izbiro tem" actions: "Množična dejanja" - close_topics: "Zapri teme" - archive_topics: "Arhiviraj teme" move_messages_to_inbox: "Prestavi v Prejeto" change_notification_level: "Spremeni raven obveščanja" choose_new_category: "Izberi novo kategorijo za temo:" - selected: - one: "Izbrali ste %{count} temo." - two: "Izbrali ste %{count} temi." - few: "Izbrali ste %{count} teme." - other: "Izbrali ste %{count} tem." - change_tags: "Zamenjaj oznake" - append_tags: "Dodaj oznake" choose_new_tags: "Izberite nove oznake za te teme:" - choose_append_tags: "Izberite nove oznake da se dodajo na te teme:" changed_tags: "Oznake na teh temah so bile spremenjene." progress: one: "Napredek: %{count} tema" @@ -2375,8 +2365,6 @@ sl: name: "Prestavi v Prejeto" remove_tags: name: "Odstrani oznake" - append_tags: - name: "Dodaj oznake" replace_tags: name: "Zamenjaj oznake" delete_topics: @@ -3013,6 +3001,8 @@ sl: delete_confirm: "Ste prepričani da želite izbrisati kategorijo?" delete_error: "Prišlo je do napake pri brisanju kategorije." no_description: "Dodajte opis kategorije." + description_expand: "Več" + description_collapse: "Manj" already_used: "Ta barva je že uporabljena na drugi kategoriji." security: "Varnost" security_add_group: "Dodaj skupino" @@ -3736,8 +3726,6 @@ sl: sidebar_title: "Poročila" group_traffic: "Promet" group_members: "Člani" - group_moderation: "Moderiranje" - group_security: "Varnost" group_other: "Drugo" config_sections: account: @@ -3940,7 +3928,7 @@ sl: all: "Vsi" view_table: "tabela" view_graph: "graf" - refresh_report: "Osveži poročilo" + refresh_report: "Osveži" daily: Dnevno monthly: Mesečno weekly: Tedensko diff --git a/config/locales/client.sq.yml b/config/locales/client.sq.yml index 62b22a72b7028..2ca76033ec75f 100644 --- a/config/locales/client.sq.yml +++ b/config/locales/client.sq.yml @@ -1468,6 +1468,8 @@ sq: tags: "Etiketat" interface: "Ndërfaqja" apps: "Aplikimet" + calendar_subscriptions: + copied: "Kopjuar!" change_password: success: "(emaili u dërgua)" in_progress: "(duke dërguar emailin)" @@ -2056,6 +2058,7 @@ sq: form_kit: reset: Rivendosni optional: opsionale + required: i nevojshëm dirty_form: "Nuk i keni dorëzuar ndryshimet tuaja! Jeni të sigurt që dëshironi të largoheni?" errors: required: "E nevojshme" @@ -2894,11 +2897,8 @@ sq: confirm: "Konfirmo" select_all: "Zgjidh të gjitha" clear_all: "Pastro kriteret" - unlist_topics: "Hiq temat nga lista" - relist_topics: "Relistoni temat" reset_bump_dates: "Rivendos datat e përplasjes" defer: "Shëno si të palexuar" - delete: "Fshi temat" delete_topics_count: one: "Fshi temën" other: "Fshi temat" @@ -2931,29 +2931,18 @@ sq: other: "Hiq të Ri (%{count})" toggle: "toggle bulk selection of topics" actions: "Veprime në masë" - change_category: "Cakto kategorinë…" - close_topics: "Mbyll temat" - archive_topics: "Arkivo temat" move_messages_to_inbox: "Transfero në inbox" archive_messages: "Kaloni te Arkivi" - notification_level: "Njoftimet…" change_notification_level: "Ndrysho nivelin e njoftimit" choose_new_category: "Zgjidhni kategorinë e re për temat: " - selected: - one: "Keni zgjedhur %{count} temë." - other: "Keni zgjedhur %{count} tema." selected_sole_category: one: "Keni zgjedhur %{count} temë:" other: "Keni zgjedhur %{count} tema:" selected_count: one: "%{count} zgjedhur" other: "%{count} zgjedhur" - change_tags: "Zëvendësoni etiketat" - append_tags: "Shtoj Etiketa" choose_new_tags: "Zgjidh etiketa të reja për këto tema:" - choose_append_tags: "Zgjidhni etiketat e reja për të shtuar për këto tema:" changed_tags: "Etiketat e temave u ndryshuan. " - remove_tags: "Hiqni të gjitha etiketat" confirm_remove_tags: one: "Të gjitha etiketat do të hiqen nga kjo temë. A jeni të sigurt?" other: "Të gjitha etiketat do të hiqen nga temat %{count} . A jeni të sigurt?" @@ -2982,7 +2971,6 @@ sq: name: "Hiqe" close_topics: name: "Mbyll" - note: "Shënim" optional: (opsionale) archive_topics: name: "Arkivoni" @@ -2996,24 +2984,18 @@ sq: name: "Relistoni" remove_tags: name: "Hiqni etiketat" - append_tags: - name: "Shtoni etiketat" replace_tags: name: "Zëvendësoni etiketat" delete_topics: name: "Fshij" update_category: name: "Përditëso kategorinë" - description: "Zgjidhni kategorinë e re për temat e zgjedhura" reset_bump_dates: name: "Rivendos datat e përplasjes" - description: "Rivendosni datën e ngritjes së temës në datën e fundit të postimit të krijuar, gjë që ndikon në renditjen në listën e temave" defer: name: "Shënoni të palexuar" - description: "Shënoni temat si të palexuara" update_notifications: name: "Përditëso Njoftimet" - description: "Ndrysho nivelin e njoftimit në Në Shikim, Në Ndjekje, Normal ose Në Heshtje" topic: filter_to: one: "%{count} postim në temë" @@ -3506,6 +3488,8 @@ sq: delete_confirm: "Jeni i sigurtë që dëshironi ta fshini këtë kategori?" delete_error: "Pati një gabim gjatë fshirjes së kategorisë." no_description: "Shto një përshkrim për këtë kategori." + description_expand: "Shfaq më shumë" + description_collapse: "Shfaq më pak" already_used: "Kjo ngjyrë është përdorur nga një kategori tjetër" security: "Siguria" permissions: @@ -3963,7 +3947,6 @@ sq: reports: group_traffic: "Trafik" group_members: "Anëtarë" - group_security: "Siguria" group_other: "Të tjerë" config_sections: account: @@ -4130,7 +4113,7 @@ sq: all: "Të Gjithë" view_table: "tabelë" view_graph: "grafik" - refresh_report: "Rifresko raportin" + refresh_report: "Rifresko" daily: Ditore monthly: Mujore weekly: Javore diff --git a/config/locales/client.sr.yml b/config/locales/client.sr.yml index 53cabdae1300c..7c3eddc482d24 100644 --- a/config/locales/client.sr.yml +++ b/config/locales/client.sr.yml @@ -1327,6 +1327,8 @@ sr: tracking: "Praćeno" categories: "Kategorije" users: "Korisnici" + calendar_subscriptions: + copied: "Kopirano!" change_password: success: "(email je poslat)" in_progress: "(email se šalje)" @@ -1596,6 +1598,7 @@ sr: search: "Pretraži" form_kit: optional: opciono + required: potrebno errors: required: "Potrebno" close: "Zatvori" @@ -1860,7 +1863,6 @@ sr: new_messages_marker: "poslednja poseta" bulk: select_all: "Izaberi sve" - delete: "Obriši Teme" delete_topics_count: one: "Obriši temu" few: "Obriši Teme" @@ -1869,13 +1871,7 @@ sr: dismiss_new: "Odbaci Novo" toggle: "uključi/isključi grupni odabir tema" actions: "Grupne aktivnosti" - close_topics: "Zatvori Teme" - archive_topics: "Arhiviraj teme" choose_new_category: "Izaberite novu kategoriju za vašu temu." - selected: - one: "Odabrali ste %{count} temu." - few: "Odabrali ste %{count} tema." - other: "Odabrali ste %{count} tema." error_topic_count: one: "%{count} tema" few: "%{count} tema" @@ -2188,6 +2184,8 @@ sr: delete_confirm: "Jeste li sigurni da želite izbrisati ovu kategoriju?" delete_error: "Dogodila se greška pri brisanju kategorije." no_description: "Molimo dodajte opis ovoj kategoriji." + description_expand: "Pokaži više" + description_collapse: "Pokaži manje" already_used: "Ova boja se koristi u drugoj kategoriji." security: "Sigurnost" permissions: @@ -2611,7 +2609,6 @@ sr: never: "nikada" reports: group_members: "Članovi" - group_security: "Sigurnost" group_other: "Ostalo" config_sections: community: @@ -2755,7 +2752,7 @@ sr: 30_days_ago: "Pre 30 Dana" all: "Sve" view_table: "tablica" - refresh_report: "Osveži Prijave" + refresh_report: "Osveži" daily: Top dnevne monthly: Top mesečne weekly: Top nedeljne diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml index 7c731cbfea9f1..3c65fa4f85831 100644 --- a/config/locales/client.sv.yml +++ b/config/locales/client.sv.yml @@ -1329,6 +1329,10 @@ sv: tags: "Taggar" interface: "Gränssnitt" apps: "Appar" + calendar_subscriptions: "Kalender" + calendar_subscriptions: + copied: "Kopierad!" + add_to_google: "Google -kalender" change_password: success: "(e-post skickat)" in_progress: "(skickar e-post)" @@ -1873,6 +1877,7 @@ sv: form_kit: reset: Återställ optional: valfritt + required: krävs errors: required: "Krävs" invalid_url: "Måste vara en giltig URL" @@ -2643,10 +2648,7 @@ sv: confirm: "Bekräfta" select_all: "Välj alla" clear_all: "Rensa alla" - unlist_topics: "Avlista ämnen" - relist_topics: "Lista om ämnen" reset_bump_dates: "Återställ knuffdatum" - delete: "Ta bort ämnen" delete_topics_count: one: "Radera ämne" other: "Ta bort ämnen" @@ -2679,25 +2681,16 @@ sv: other: "Avfärda nya (%{count})" toggle: "växla val av flertalet ämnen" actions: "Massändringar" - change_category: "Ange kategori…" - close_topics: "Stäng ämnen" - archive_topics: "Arkivera ämnen" move_messages_to_inbox: "Flytta till inkorgen" - notification_level: "Aviseringar…" change_notification_level: "Ändra aviseringsnivå" choose_new_category: "Välj den nya kategorin för ämnena:" - selected: - one: "Du har markerat %{count} ämne." - other: "Du har markerat %{count} ämnen." selected_count: one: "%{count} har valts" other: "%{count} har valts" - change_tags: "Ersätt taggar" append_tags: "Lägg till taggar" choose_new_tags: "Välj nya taggar för de här ämnena:" - choose_append_tags: "Välj nya taggar att lägga till för dessa ämnen:" + choose_append_tags: "Lägg till taggar" changed_tags: "Taggarna för de här ämnena ändrades." - remove_tags: "Ta bort alla taggar" confirm_remove_tags: one: "Alla taggar tas bort från det här ämnet. Är du säker?" other: "Alla taggar tas bort från %{count} ämnen. Är du säker?" @@ -2731,15 +2724,12 @@ sv: name: "Flytta till inkorgen" remove_tags: name: "Ta bort taggar" - append_tags: - name: "Lägg till taggar" replace_tags: name: "Ersätt taggar" delete_topics: name: "Radera" update_category: name: "Uppdatera kategori" - description: "Välj den nya kategorin för de valda ämnena" topic: filter_to: one: "%{count} inlägg i ämnet" @@ -3473,6 +3463,8 @@ sv: delete_confirm: "Är du säker på att du vill radera den kategorin?" delete_error: "Ett fel inträffade vid borttagning av kategorin." no_description: "Lägg till en beskrivning för den här kategorin." + description_expand: "Visa mer" + description_collapse: "Visa mindre" already_used: "Den här färgen används redan av en annan kategori" security: "Säkerhet" security_add_group: "Lägg till en grupp" @@ -4375,8 +4367,6 @@ sv: sidebar_title: "Rapporter" group_traffic: "Trafik" group_members: "Medlemmar" - group_moderation: "Moderering" - group_security: "Säkerhet" group_other: "Övrigt" config_sections: account: @@ -4602,7 +4592,7 @@ sv: all: "Alla" view_table: "tabell" view_graph: "graf" - refresh_report: "Uppdatera rapport" + refresh_report: "Uppdatera" daily: Dagligen monthly: Månadsvis weekly: Veckovis diff --git a/config/locales/client.sw.yml b/config/locales/client.sw.yml index b1e677d525219..7e27c7bad64fe 100644 --- a/config/locales/client.sw.yml +++ b/config/locales/client.sw.yml @@ -1076,6 +1076,7 @@ sw: form_kit: reset: Anza Upya optional: sio muhimu + required: muhimu errors: required: "Muhimu na Inahitajika" close: "Funga" @@ -1481,9 +1482,6 @@ sw: bulk: select_all: "Chagua Zote" clear_all: "Ondoa Zote" - unlist_topics: "Ondoa Mada kwenye listi" - relist_topics: "Orodhesha Upya Mada" - delete: "Futa Mada" delete_topics_count: one: "Futa Mada" other: "Futa Mada" @@ -1495,17 +1493,9 @@ sw: dismiss_new: "Ondosha Mpya" toggle: "Badili kwa wingi chaguo la topiki" actions: "Vitendo za Jumla" - close_topics: "Funga Mada" - archive_topics: "Hifadhi Mada kwenye nyaraka" move_messages_to_inbox: "Hamishia kwenye kisanduku-pokezi" choose_new_category: "Chagua kategoria mpya kwa ajili ya mada:" - selected: - one: "Umechagua mada %{count}." - other: "Umechagua mada %{count}." - change_tags: "Badilisha Lebo" - append_tags: "Jumlisha Lebo" choose_new_tags: "Chagua lebo mpya kwa ajili ya hizi mada:" - choose_append_tags: "Chagua lebo mpya kuweka kwenye mada hizi:" changed_tags: "lebo za hizo mada zilibadilishwa." error_topic_count: one: "%{count} topiki" @@ -1528,8 +1518,6 @@ sw: name: "Nyaraka" move_messages_to_inbox: name: "Hamisha kwenda Kisanduku pokezi" - append_tags: - name: "Jumlisha Lebo" replace_tags: name: "Badilisha Lebo" delete_topics: @@ -2412,7 +2400,6 @@ sw: title: "Orodha ya ripoti zilizopo" group_traffic: "Utembeleaji" group_members: "Wanachama" - group_security: "Ulinzi" group_other: "Nyingine" config_sections: account: @@ -2587,7 +2574,7 @@ sw: all: "Zote" view_table: "jedwali" view_graph: "grafu" - refresh_report: "Rudisha tena Ripoti" + refresh_report: "Rudisha Tena" daily: Kila siku monthly: Klla mwezi weekly: Kila wiki diff --git a/config/locales/client.te.yml b/config/locales/client.te.yml index 058597c49ee77..7f775404daf5c 100644 --- a/config/locales/client.te.yml +++ b/config/locales/client.te.yml @@ -1305,6 +1305,9 @@ te: tags: "ట్యాగులు" interface: "ప్రదర్శన" apps: "యాప్‌లు" + calendar_subscriptions: + copied: "కాపీ చేయబడింది!" + add_to_google: "గూగుల్ క్యాలెండర్" change_password: success: "(ఈమెయిల్ పంపిన)" in_progress: "(ఈమెయిల్ పంపుతోన్నాం)" @@ -1846,6 +1849,7 @@ te: form_kit: reset: రీసెట్ చేయండి optional: ఐచ్ఛికం + required: అవసరం errors: required: "అవసరం" invalid_url: "తప్పక చెల్లుబాటు అయ్యే URL అయి ఉండాలి" @@ -2611,10 +2615,7 @@ te: confirm: "నిర్ధారించండి" select_all: "అన్ని ఎంచుకోండి" clear_all: "అన్నీ క్లియర్ చేయండి" - unlist_topics: "విషయాలను జాబితా నుండి తీసివేయండి" - relist_topics: "విషయాలను మళ్లీ జాబితా చేయండి" reset_bump_dates: "బంప్ తేదీలను రీసెట్ చేయండి" - delete: "విషయాలను తొలగించండి" delete_topics_count: one: "విషయాన్ని తొలగించండి" other: "విషయాలను తొలగించండి" @@ -2647,25 +2648,14 @@ te: other: "కొత్త విషయాలను తీసివేయండి (%{count})" toggle: "విషయాల బహుళ ఎంపికలు అటుఇటుచేయి" actions: "బహుళ చర్యలు" - change_category: "వర్గాన్ని సెట్ చేయండి…" - close_topics: "విషయాలు మూయు" - archive_topics: "విషయాలు కట్టకట్టు" move_messages_to_inbox: "ఇన్‌బాక్స్‌కి తరలించండి" - notification_level: "నోటిఫికేషన్‌లు…" change_notification_level: "నోటిఫికేషన్ స్థాయిని మార్చండి" choose_new_category: "విషయం కొరకు కొత్త వర్గం ఎంచుకొండి:" - selected: - one: "మీరు %{count} విషయం ఎంచుకున్నారు." - other: " మీరు %{count} విషయాలు ఎంచుకున్నారు." selected_count: one: "%{count} ఎంచుకోబడింది" other: "%{count} ఎంచుకోబడింది" - change_tags: "ట్యాగ్‌లను భర్తీ చేయండి" - append_tags: "ట్యాగ్లను జోడించండి" choose_new_tags: "ఈ విషయాలకి కొత్త ట్యాగ్‌లను ఎంచుకోండి:" - choose_append_tags: "ఈ విషయాలకి జోడించడానికి కొత్త ట్యాగ్‌లను ఎంచుకోండి:" changed_tags: "ఆ విషయాల ట్యాగ్‌లు మార్చబడ్డాయి." - remove_tags: "అన్ని ట్యాగ్‌లను తీసివేయండి" confirm_remove_tags: one: "ఈ విషయం నుండి అన్ని ట్యాగ్‌లు తీసివేయబడతాయి. ఖచ్చితమనే?" other: "ఈ %{count} విషయాలు నుండి అన్ని ట్యాగ్‌లు తీసివేయబడతాయి. ఖచ్చితమనే?" @@ -2701,23 +2691,16 @@ te: name: "ఇన్‌బాక్స్‌కి తరలించండి" remove_tags: name: "ట్యాగ్‌లను తీసివేయండి" - append_tags: - name: "ట్యాగ్లను జోడించండి" replace_tags: name: "ట్యాగ్‌లను భర్తీ చేయండి" delete_topics: name: "తొలగించండి" update_category: name: "వర్గాన్ని నవీకరించండి" - description: "ఎంచుకున్న విషయాలకి కొత్త వర్గాన్ని ఎంచుకోండి" reset_bump_dates: name: "బంప్ తేదీలను రీసెట్ చేయండి" - description: "విషయం బంప్ తేదీని చివరిగా సృష్టించిన పోస్ట్ తేదీకి రీసెట్ చేయండి, ఇది విషయం జాబితాలో ఆర్డర్ చేయడంపై ప్రభావం చూపుతుంది" - defer: - description: "విషయాలను చదవనివిగా గుర్తించండి" update_notifications: name: "నోటిఫికేషన్‌లను నవీకరించండి" - description: "నోటిఫికేషన్ స్థాయిని అనుసరించడం, ట్రాకింగ్ చేయడం, సాధారణం లేదా మ్యూట్ చేయబడిన స్థితికి మార్చండి" topic: filter_to: one: "విషయంలో %{count} పోస్ట్" @@ -3445,6 +3428,8 @@ te: delete_confirm: "మీరు నిజంగా ఈ వర్గాన్ని తొలగించాలనుకుంటున్నారా?" delete_error: "ఈ వర్గం తొలగించేప్పుడు దొషం." no_description: "ఈ వర్గానికి వివరణ రాయండి" + description_expand: "మరిన్ని చూపించండి" + description_collapse: "తక్కువ చూపించండి" already_used: "ఈ రంగు వేరే వర్గం వాడింది" security: "సెక్యూరిటీ" security_add_group: "సమూహాన్ని జోడించండి" @@ -4351,8 +4336,6 @@ te: sidebar_title: "నివేదికలు" group_traffic: "ట్రాఫిక్" group_members: "సభ్యులు" - group_moderation: "మోడరేషన్" - group_security: "సెక్యూరిటీ" group_other: "ఇతర" config_sections: account: @@ -4568,7 +4551,7 @@ te: all: "అన్ని" view_table: "పట్టిక" view_graph: "గ్రాఫ్" - refresh_report: "రిపోర్టు తాజాపరుచండి" + refresh_report: "రిఫ్రెష్ చేయండి" daily: రోజువారీ monthly: నెలవారీ weekly: వారానికోసారి diff --git a/config/locales/client.th.yml b/config/locales/client.th.yml index 31e922b29a9ed..76eb8e02ca8cf 100644 --- a/config/locales/client.th.yml +++ b/config/locales/client.th.yml @@ -879,6 +879,8 @@ th: users: "ผู้ใช้" tags: "แท็ก" apps: "แอป" + calendar_subscriptions: + copied: "คัดลอกแล้ว!" change_password: success: "(อีเมลถูกส่งแล้ว)" in_progress: "(กำลังส่งอีเมล)" @@ -1199,6 +1201,7 @@ th: dismiss_error: "ละทิ้งข้อผิดพลาด" form_kit: optional: ทางเลือก + required: ต้องการ errors: required: "ต้องการ" close: "ปิด" @@ -1621,8 +1624,6 @@ th: bulk: select_all: "เลือกทั้งหมด" clear_all: "ล้างทั้งหมด" - unlist_topics: "กระทู้ที่ไม่ได้แสดง" - delete: "ลบกระทู้" delete_topics_count: other: "ลบกระทู้" dismiss: "ซ่อน" @@ -1633,13 +1634,8 @@ th: dismiss_new: "ซ่อนใหม่" toggle: "สลับการเลือกกระทู้จำนวนมาก" actions: "การดำเนินการจำนวนมาก" - close_topics: "ปิดกระทู้" - archive_topics: "คลังกระทู้" move_messages_to_inbox: "ย้ายไปกล่องขาเข้า" choose_new_category: "เลือกหมวดหมู่ใหม่ให้กระทู้" - selected: - other: "คุณได้เลือก %{count} กระทู้" - change_tags: "แทนที่แท็ก" choose_new_tags: "เลือกแท็กใหม่เพื่อกระทู้เหล่านี้:" changed_tags: "แท็กของกระทู้เหล่านี้ถูกเปลี่ยนแปลง" error_topic_count: @@ -2563,7 +2559,6 @@ th: reports: group_traffic: "การจราจร" group_members: "สมาชิก" - group_security: "ความปลอดภัย" group_other: "อื่นๆ" config_sections: account: @@ -2711,7 +2706,7 @@ th: all: "ทั้งหมด" view_table: "ตาราง" view_graph: "กราฟ" - refresh_report: "โหลดรายงานใหม่" + refresh_report: "รีเฟรช" daily: รายวัน monthly: รายเดือน weekly: รายสัปดาห์ diff --git a/config/locales/client.tr_TR.yml b/config/locales/client.tr_TR.yml index e288788227b48..5194638f590dd 100644 --- a/config/locales/client.tr_TR.yml +++ b/config/locales/client.tr_TR.yml @@ -9,9 +9,23 @@ tr_TR: blocks: ghost: status: "Durum" + conditions: "Koşullar" + arguments: "Tartışmalar" + container_args: "Konteyner Argümanları" in_location: "içinde" hidden: "gizli" + not_registered: "kayıtlı değil" + no_visible_children: "görünürde çocuk yok" failed: "başarısız" + ghost_reasons: + optional_missing_hint: "Bu isteğe bağlı blok, kayıtlı olmadığı için görüntülenmez." + no_visible_children_hint: "Bu konteyner bloğu, hiçbir alt öğesi görünür olmadığı için görüntülenmez." + condition_failed_hint: "Bu blok, koşulları karşılanmadığı için görüntülenmez." + head_hidden_tail_hint: "Bu blok, `head` konteynerinde başka bir blok önce işlendiği için işlenmez." + carousel: + go_to_slide: "%{index} numaralı slayta git" + previous: "Önceki slayt" + next: "Sonraki slayt" number: format: separator: "." @@ -291,18 +305,31 @@ tr_TR: forwarded: "Yukarıdaki e-postayı iletti" topic_admin_menu: "konu eylemleri" skip_to_main_content: "Ana içeriğe atla" + skip_links_label: "Navigasyon bağlantılarını atla" + skip_to_post: "%{post_number} numaralı gönderiye atla" + skip_to_where_you_left_off: "Bıraktığınız yerden devam edin (yazı %{post_number})" + skip_to_where_you_left_off_last: "Bıraktığınız yerden devam edin (son yanıt, gönderi %{post_number})" + skip_to_last_reply: "Son cevaba atla" + skip_to_top: "En üste atla" skip_user_nav: "Profil içeriğine atla" emails_are_disabled: "Giden tüm e-postalar bir yönetici tarafından devre dışı bırakıldı. Herhangi bir e-posta bildirimi gönderilmeyecek." + emails_are_disabled_no_smtp: "SMTP sunucusu yapılandırılmadığı için giden tüm e-postalar devre dışı bırakılmıştır. Hiçbir tür e-posta gönderilemez." emails_are_disabled_non_staff: "Giden e-posta, personel olmayan kullanıcılar için devre dışı bırakıldı." software_update_prompt: message: "Bu siteyi güncelledik, işlerin sorunsuz bir şekilde devam etmesi için lütfen yenileyin." dismiss: "Kapat" + notifications_tracking: + tooltip: "Bildirim seviyesi: %{level}" back_button: "Geri" welcome_banner: header: + new_members: "Hoş geldiniz, %{preferred_display_name}!" logged_in_members: "Tekrar hoş geldiniz %{preferred_display_name}!" anonymous_members: "%{site_name}'a hoş geldiniz!" search_placeholder: "Ara" + impersonation: + notice: "%{username} kimliğine bürünüyorsunuz." + stop: "Kişiyi taklit etmeyi bırak" themes: default_description: "Varsayılan" broken_theme_alert: "Bir tema/bileşende hata olması nedeniyle siteniz çalışmayabilir. Daha fazla bilgi için tarayıcı konsolunu kontrol edin." @@ -312,12 +339,27 @@ tr_TR: broken_page_change_alert: "Bir onPageChange işleyicisi hata verdi. Daha fazla bilgi için tarayıcı geliştirici araçlarını kontrol edin." broken_plugin_alert: "'%{name}' eklentisinden kaynaklanıyor" broken_transformer_alert: "Bir hata oluştu. Siteniz düzgün çalışmayabilir." + broken_block_alert: "Bir blok yapılandırma hatası algılandı. Ayrıntılar için tarayıcı konsolunu kontrol edin." + broken_block_factory_alert: "Bir blok yüklenemedi. Bazı kullanıcı arayüzü öğeleri doğru görüntülenmeyebilir." critical_deprecation: notice: "[Yönetici Duyurusu] %{source}, güncellenmesi gereken kod içeriyor. (kimlik:%{id})" learn_more_link: "(daha fazla bilgi edinin)" theme_source: "Tema '%{name}'" plugin_source: "Eklenti \"%{name}\"" unknown_source: "Tema veya eklentilerinizden biri" + dev_tools: + drag_to_move: "Sürükleyerek taşıyın" + toggle_plugin_outlet_debug: "Eklenti çıkış hata ayıklamasını aç/kapat" + toggle_block_debug: "Blok hata ayıklamayı aç/kapat" + block_debug: + outlet_boundaries: "Çıkış sınırları" + visual_overlay: "Görsel katman" + ghost_blocks: "Hayalet bloklar" + condition_debugging: "Durum hata ayıklama" + toggle_safe_mode: "Güvenli modu aç/kapat" + toggle_verbose_localization: "Ayrıntılı yerelleştirmeyi aç/kapat" + toggle_mobile_view: "Mobil görünümü aç/kapat" + disable_dev_tools: "Geliştirici araçlarını devre dışı bırak" s3: regions: ap_northeast_1: "Asya Pasifik (Tokyo)" @@ -407,9 +449,39 @@ tr_TR: pill: "Önerilen" pm_title: "Önerilen Mesajlar" admin_onboarding_banner: + launch_in_easy_steps: "%{step_count} kolay adımda başlatın" + skipped: "Yönetici oryantasyon kontrol listesi artık atlanmıştır. Yeniden etkinleştirmek isterseniz, site ayarlarında “site sahibi oryantasyonunu etkinleştir” seçeneğini arayın." + congrats_onboarding_complete: "Onboarding sürecini tamamladığınız için tebrikler!" + invite_collaborators: + title: "İş Ortaklarını Davet Et" + description: "İlk üyeler, topluluğunuzu hayata geçirmeye yardımcı olur" + action: "Davet oluştur" start_posting: + title: "Paylaşmaya Başla" + description: "İnsanlara birlikte konuşacakları bir konu verin" + action: "Buz kırıcı fikirler" + choose_option: "Nasıl başlamak istersiniz?" + predefined_topics: "Buz kırıcı şablonlar" + predefined_topics_subtitle: "Yeni üyelere konuşacak bir konu verin, düzenlemek için bir şablon seçin ve kendinize ait hale getirin." + predefined_topics_description: "Sohbet başlatıcılar koleksiyonundan seçim yapın ve tartışmaları başlatın" + use_predefined: "Şablonlara göz atın" back: "Geri" + icebreakers: + fun_facts: + title: "Hakkında ilginç bilgiler nelerdir?" + body: "Herkese merhaba! Bu yeni topluluğu başlatmaktan dolayı çok heyecanlıyım. Başlangıç olarak, kendimizle ilgili eğlenceli bir bilgi paylaşalım. Ben başlayayım: Yürüyüş yapmayı ve yeni parkurları keşfetmeyi seviyorum! Sizinle ilgili ilginç bir şey nedir?" + coolest_thing_you_have_seen_today: + title: "Bugün gördüğün en havalı şey neydi?" + body: "Bugün gördüğün veya yaşadığın en havalı şey neydi? Güzel bir gün batımı ya da rastgele bir iyilik hareketi gibi herhangi bir şey olabilir. Ben başlayayım: Bir köpeğin yaşlı bir insana karşıdan karşıya geçmesine yardım ettiğini gördüm!" + introduce_yourself: + title: "Kendinizi tanıtın" + body: "Topluluğa hoş geldiniz! Birbirimizi tanıyalım. Lütfen kendinizi tanıtın ve ilgi alanlarınız hakkında biraz bilgi paylaşın. Ben başlayayım: Teknolojiye tutkuyla bağlıyım ve başkalarına öğretmeyi çok seviyorum!" + what_is_your_favorite_food: + title: "En sevdiğin yemek nedir?" + body: "En sevdiğiniz yiyecekleri toplulukla paylaşın! Ben başlayayım: Pizza severim, özellikle ekstra peynir ve sucuklu olanı." spread_the_word: + title: "Haberi yayalım!" + description: "Ağınızdaki herkesle bir bağlantı paylaşın" action: "Bağlantıyı kopyala" copied_to_clipboard: "Bağlantı panoya kopyalandı!" about: @@ -571,6 +643,11 @@ tr_TR: resume: "Sürdür" remove: "Kaldır" remove_confirmation: "Bu taslağı silmek istediğinize emin misiniz?" + bulk_delete: "Seçilenleri sil" + bulk_delete_confirmation: "Taslakları sil" + bulk_delete_message: + one: "Bu taslağı silmek istediğinize emin misiniz?" + other: "Bu %{count} taslağı silmek istediğinizden emin misiniz?" new_topic: "Yeni konu taslağı" new_private_message: "Yeni kişisel ileti taslağı" edit_topic: "Konu taslağını düzenle" @@ -581,6 +658,10 @@ tr_TR: other_drafts: one: "+%{count} taslak daha" other: "+%{count} taslak daha" + embed_mode: + storage_access_prompt: "Zaten %{site_name} hesabınız mı var? Oturumunuza erişim izni vererek kendi adınıza yorum yapabilirsiniz." + allow_access: "Erişime İzin Ver" + continue_as_guest: "Misafir olarak devam et" topic_count_all: one: "%{count} yeni konuya bakın" other: "%{count} yeni konuya bakın" @@ -639,18 +720,26 @@ tr_TR: review: show_more: "Daha fazla göster" show_less: "Daha az göster" + back_to_queue: "Kuyruğa geri dön" + editing_post: "Gönderi düzenleniyor…" order_by: "Şuna göre sırala" date_filter: "Şu tarihler arasında gönderildi" in_reply_to: "şuna yanıt olarak" filtered_flagged_by: "Bayrak ekleyen kişi:" unknown: + title: + one: "Devre dışı bırakılmış eklentiden bekleyen inceleme kuyruğu öğeleriniz var:" + other: "Devre dışı bırakılmış eklentilerden bekleyen inceleme kuyruğu öğeleriniz var:" instruction: "İlgili eklentiyi etkinleştirmediğiniz sürece düzgün görüntülenemezler. Lütfen eklentiyi etkinleştirin ve sayfayı yenileyin. Alternatif olarak, bunları görmezden gelebilirsiniz. Daha fazlasını öğrenin..." reviewable_unknown_source: "%{reviewableType} (bilinmeyen eklenti)" reviewable_known_source: "%{reviewableType} (\"%{pluginName}\" eklentisinden)" ignore_all: "Tümünü yok say" enable_plugins: "Eklentileri etkinleştir" + delete_confirm: "Devre dışı bırakılmış eklentiler tarafından oluşturulan tüm inceleme kuyruğu öğelerini silmek istediğinizden emin misiniz?" + ignore_success: "Devre dışı bırakılmış eklentiler tarafından oluşturulan tüm inceleme kuyruğu öğeleri silinmiştir." explain: why: "bu ögenin neden kuyruğa girdiğini açıklayın" + title: "İnceleme Kuyruğu Öğesi Puanlaması" formula: "Formül" subtotal: "Ara toplam" total: "Toplam" @@ -664,8 +753,10 @@ tr_TR: title: "Bayrakları tarihsel olarak kabul edilen kullanıcılara bonus verilir." trust_level_bonus: name: "güven seviyesi" + title: "Daha yüksek güven düzeyine sahip kullanıcılar tarafından oluşturulan bayraklar daha yüksek puan alır." type_bonus: name: "tür bonusu" + title: "Belirli bayrak türlerine, personel tarafından daha yüksek öncelik verilmesi için bonus atanabilir." revise_and_reject_post: title: "Gözden geçir" reason: "Sebep" @@ -674,12 +765,17 @@ tr_TR: custom_reason: "Sebebi net bir şekilde açıklayın" other_reason: "Diğer..." optional: "i̇steğe bağlı" + stale_help: "Bu sorun %{username} tarafından çözülmüştür." claim_help: optional: "Başkalarının incelemesini engellemek için bu ögeyi talep edebilirsiniz." required: "Ögeleri inceleyebilmek için önce talepte bulunmalısınız." claimed_by_you: "Bu ögeyi talep ettiniz ve inceleyebilirsiniz." claimed_by_other: "Bu öge yalnızca %{username} adlı kullanıcı tarafından incelenebilir." automatically_claimed_by: "Bu ürün şu anda %{username} tarafından inceleniyor." + claim: + title: "Bu konuyu talep et" + unclaim: + help: "Bu talebi kaldır" awaiting_approval: "Onay Bekleniyor" delete: "Sil" settings: @@ -701,6 +797,7 @@ tr_TR: filtered_topic: "Tek bir konu içerisinde incelenebilir içerikleri filtrelediniz." filtered_user: "Bayrak eklenen kullanıcı" filtered_reviewed_by: "İnceleyen:" + filtered_claimed_by: "Bayrak, tarafından sahiplenildi" show_all_topics: "bütün konuları göster" deleted_post: "(gönderi silindi)" deleted_user: "(kullanıcı silindi)" @@ -772,10 +869,13 @@ tr_TR: created_at: "Oluşturulma:" created_at_asc: "Oluşturulma (ters):" priority: + title: "Minimum öncelik" any: "(hiç)" low: "Düşük" medium: "Orta" high: "Yüksek" + active_filters: "Aktif filtreler:" + clear_filter: "%{filter} öğesini kaldır" conversation: view_full: "konuşmanın tamamını görüntüle" scores: @@ -818,6 +918,10 @@ tr_TR: is_this_post: "Bu %{reviewable_type} %{reviewable_human_score_types} özelliği taşıyor mu?" delimiter: "veya" something_else_wrong: "Bu %{reviewable_type} ile ilgili bir sorun mu var?" + approve_user: "Bu kullanıcıyı onaylıyor musunuz?" + suspect_user: "Bu kullanıcı spam mı?" + approve_post: "Bu gönderiyi onaylıyor musunuz?" + approve_topic: "Bu konuyu onaylıyor musunuz?" types: reviewable_flagged_post: title: "Bayrak Eklenen Gönderi" @@ -836,27 +940,43 @@ tr_TR: title: "Gönderi" noun: "gönderi" reviewable_ai_chat_message: + title: "AI tarafından işaretlenmiş sohbet mesajı" noun: "sohbet mesajı" reviewable_ai_post: + title: "AI tarafından işaretlenen gönderi" noun: "gönderi" + reviewable_post_voting_comment: + title: "Bildirilen yorum" + noun: "yorum" flagged_as: "Bayrak ekleme nedeni:" + post_flagged_as: "Şu şekilde işaretlenmiş gönderi:" + chat_flagged_as: "Sohbet şu şekilde işaretlendi:" + queued_post_label: "Sıraya alınmış gönderi" + queued_topic_label: "Sıraya alınmış konu" user_label: "Kullanıcı" + assigned_to: "Atanan gönderi" moderator_actions: "Moderatör eylemleri" timeline_and_notes: "Zaman çizelgesi ve notlar" timeline: target_created: "Gönderi oluşturuldu" target_created_by: "Gönderi %{username} tarafından oluşturuldu · %{relativeDate}" target_deleted: "Gönderi silindi" + target_deleted_by: "%{username} tarafından silinen gönderi · %{relativeDate}" flagged: "Bayrak eklendi" flagged_as_by: "%{username} tarafından %{flagReason} nedeniyle bayrak eklendi · %{relativeDate}" claimed: "Alındı" claimed_by: "%{username} tarafından alındı · %{relativeDate}" + unclaimed_by: "%{username} tarafından sahiplenilmemiştir · %{relativeDate}" reviewed: "İncelendi" + approved_by: "Onaylayan: %{username} · %{relativeDate}" + rejected_by: "%{username} tarafından reddedildi · %{relativeDate}" + ignored_by: "%{username} tarafından yok sayıldı · %{relativeDate}" view_conversation: "kişisel mesajı görüntüle" note_added: "Moderatör notu" note_added_by: "%{username} tarafından moderatör notu · %{relativeDate}" no_events: "Gösterilecek zaman çizelgesi etkinliği yok" notes: + add_note_description: "Diğer moderatörlere bağlam sağlamak için bir not ekleyin." add_note_button: "Not ekle" placeholder: "Notunuzu buraya yazın..." chars_remaining: "%{count} karakter kaldı" @@ -869,6 +989,7 @@ tr_TR: review_user: "Kullanıcı" need_help: "Yardıma mı ihtiyacınız var?" copy_link: "Bağlantıyı kopyala" + copy_permalink_title: "bu incelenebilir öğenin bağlantısını panoya kopyala" copy_link_feedback: "Bağlantı kopyalandı" view_source: "Kaynağı görüntüle" insights: @@ -877,15 +998,28 @@ tr_TR: flagged_by_users: one: "%{count} benzersiz kullanıcı tarafından bayrak eklendi" other: "%{count} benzersiz kullanıcı tarafından bayrak eklendi" + similar_posts: "Geçmişteki ihlaller" + flagged_in_timeframe: + one: "%{count} onaylanmış bayrak" + other: "%{count} onaylanmış bayrak" + user_activity: "Kullanıcı bilgileri" activities: + joined_on: "katılım tarihi: %{joinDate}" trust_level: "güven seviyesi: %{trustLevelName}" posts: one: "%{count} gönderi" other: "%{count} gönderi" + moderation_history: + label: "Moderasyon geçmişi" + silenced: "Susturuldu: %{count}" + suspended: "Askıya alındı: %{count}" + rejected_posts: "Reddedilen gönderiler: %{count}" solution_marked: "Çözüm işaretlendi" topic_has_solution: "Bu konunun bir çözümü var" visibility: "Görünürlük" + topic_unlisted: "Bu konu listelenmemiştir ve yalnızca doğrudan bağlantı yoluyla erişilebilir." help: + community_moderation_guide: "Bu topluluğun moderasyon kılavuzu" moderation_guide: "Discourse moderasyon kılavuzu" flag_priorities: "Kullanıcı itibarını ve bayrak önceliklerini yönetme" spam_detection: "İstenmeyen içerik tespiti" @@ -1034,6 +1168,7 @@ tr_TR: title: Etkileşim posting: Gönderiliyor notification: Bildirim + self_lockout: "Kendi erişiminizi kaldıracak şekilde grup görünürlüğünü değiştirmek üzeresiniz. Devam etmek istediğinizden emin misiniz?" email: title: "E-posta" enable_smtp: "SMTP'yi etkinleştir" @@ -1046,6 +1181,7 @@ tr_TR: smtp_title: "SMTP" smtp_instructions: "Grup için SMTP'yi etkinleştirdiğinizde, grubun gelen kutusundan gönderilen tüm e-postalar, forumunuz tarafından gönderilen diğer e-postalar için yapılandırılmış posta sunucusu yerine burada belirtilen SMTP ayarları gözetilerek gönderilir." additional_settings: "Ek Ayarlar" + smtp_disable_confirm: "SMTP'yi devre dışı bırakırsanız, tüm SMTP ayarları sıfırlanacak ve ilgili işlevler devre dışı bırakılacaktır. Devam etmek istediğinizden emin misiniz?" prefill: title: "Şu ayarlarla önceden doldurun:" gmail: "Gmail" @@ -1164,6 +1300,8 @@ tr_TR: make_owner_description: "%{username} adlı kullanıcıyı bu grubun sahibi yap" remove_owner: "Sahiplikten çıkar" remove_owner_description: "%{username} adlı kullanıcıyı grup sahipliğinden çıkar" + remove_member_self_lockout: "Bu gruptan ayrıldığınızda, grubu yönetme erişiminiz iptal edilecektir. Devam etmek istediğinizden emin misiniz?" + remove_owner_self_lockout: "Sahip olarak kendinizi kaldırmak, bu grubu yönetme erişiminizi iptal edecektir. Devam etmek istediğinizden emin misiniz?" make_primary: "Birincil yap" make_primary_description: "Bunu %{username} için birincil grup yap" remove_primary: "Birincillikten çıkar" @@ -1291,12 +1429,16 @@ tr_TR: one: "Kategoriler (%{count} tane daha)…" other: "Kategoriler (%{count} tane daha)…" ip_lookup: + title: IP adresi hostname: Sunucu Adı location: Konum location_not_found: (bilinmeyen) organisation: Organizasyon phone: Telefon other_accounts: "Bu IP adresine sahip diğer hesaplar:" + other_accounts_with_ip: + one: "Bu IP adresine sahip %{count} diğer hesap" + other: "Bu IP adresine sahip diğer %{count} hesap" delete_other_accounts: one: "%{count} tanesini sil" other: "%{count} tanesini sil" @@ -1332,8 +1474,16 @@ tr_TR: private_message: "Mesaj" private_messages: "Mesajlar" upcoming_changes: + title: "Yaklaşan değişiklikler" for_user: + upcoming_change: "Yaklaşan değişiklik" enabled: "Etkin mi?" + why: "Neden?" + why_reasons: + not_in_specific_groups: "Kullanıcı, bu değişiklik için gerekli olan belirli gruplarda yer almıyor." + in_specific_groups: "Kullanıcı, bu değişiklik için gerekli olan belirli gruplarda yer almaktadır." + enabled_for_everyone: "Bu değişiklik tüm üyeler için etkinleştirilmiştir." + enabled_for_no_one: "Bu değişiklik tüm üyeler için devre dışıdır." user_notifications: filters: filter_by: "Şuna göre filtrele" @@ -1538,6 +1688,9 @@ tr_TR: undo_revoke_access: "Erişim İptalini Geri Al" api_approved: "Onaylandı:" api_last_used_at: "Son kullanım zamanı:" + api_show_permissions: + one: "Verilen izinler (%{count})" + other: "Verilen izinler (%{count})" theme: "Tema" save_to_change_theme: 'Tema "%{save_text}" düğmesine tıklandıktan sonra güncellenir' home: "Varsayılan Ana Sayfa" @@ -1546,6 +1699,9 @@ tr_TR: flags_given: one: '%{count} faydalı bayrak' other: '%{count} faydalı bayrak' + flags: + one: '%{count} bayrak' + other: '%{count} bayrak' deleted_posts: one: '%{count} silinmiş gönderi' other: '%{count} silinmiş gönderi' @@ -1654,17 +1810,37 @@ tr_TR: interface: "Arayüz" apps: "Uygulamalar" navigation_menu: "Navigasyon menüsü" + upcoming_changes: "Yaklaşan değişiklikler" + calendar_subscriptions: "Takvim" + calendar_subscriptions: + description: "Favori takvim uygulamanızla (Google Takvim, Apple Takvim, Outlook vb.) senkronize etmek için abonelik URL'leri oluşturun. Bu URL'ler, hesabınızdaki takvim etkinliklerine (hatırlatıcılar, takvim etkinlikleri vb.) yönlendiren özel bağlantılardır. Oluşturulan abonelik URL'lerini istediğiniz zaman iptal edebilir veya yenileyebilirsiniz. " + generate: "Abonelik URL'leri Oluştur" + regenerate: "URL'leri Yeniden Oluştur" + regenerate_confirm: "Bu işlem, mevcut takvim abonelik URL'lerinizi geçersiz kılacaktır. Eski URL'leri kullanan tüm takvim uygulamaları güncellemeleri almayı durduracaktır. Devam etmek istiyor musunuz?" + revoke: "Aboneliği İptal Et" + revoke_confirm: "Bu işlem, takvim abonelik URL'lerinizi iptal edecektir. Bu URL'leri kullanan tüm takvim uygulamaları güncellemeleri almayı durduracaktır. Devam etmek istiyor musunuz?" + urls_warning: "Abonelik URL'leri hazır! Takvim uygulamanıza eklemek için aşağıdaki düğmelere tıklayın. Not: Bu URL'ler yalnızca bir kez görüntülenir." + bookmarks: "Yer imi hatırlatıcıları" + bookmarks_description: "Hatırlatma tarihli yer imleriniz" + copy: "URL'yi kopyala" + copied: "Kopyalandı!" + add_to_google: "Google Takvim" + add_to_outlook: "Microsoft Outlook" + add_to_apple: "Apple Takvimi" + active_subscription: "Etkin bir takvim aboneliğiniz var." change_password: success: "(e-posta gönderildi)" in_progress: "(e-posta gönderiliyor)" error: "(hata)" action: "Şifre Sıfırlama E-postası Gönder" + staged_user: "Aşamalı kullanıcılar şifre sıfırlama e-postalarını alamazlar." set_password: "Şifre Belirle" choose_new: "Yeni bir şifre seç" choose: "Şifre seç" verify_identity: "Devam etmek için lütfen kimliğinizi doğrulayın." title: "Şifre Sıfırlama" remove: "Şifreyi Kaldır" + remove_disabled: "Şifreyi kaldırmadan önce, hesapta en az bir başka oturum açma yöntemi (örneğin, bir anahtar veya bağlantılı bir harici hesap) bulunmalıdır." remove_detail: "Hesap şifrenizi sıfırlamadığınız sürece artık hesabınıza erişilemeyecektir." second_factor_backup: title: "İki Adımlı Yedek Kodları" @@ -1931,6 +2107,7 @@ tr_TR: first_time_and_daily: "Bir gönderi ilk kez beğenildiğinde ve günlük" first_time: "Gönderi ilk kez beğenildiğinde" never: "Asla" + notify_on_linked_posts: "Birisi benim gönderilerimden birinin bağlantısını paylaştığında bildirim gönder" email_previous_replies: title: "Önceki yanıtları e-postaların sonuna ekle" unless_emailed: "daha önce gönderilmediyse" @@ -1990,6 +2167,7 @@ tr_TR: redeemed_tab_with_count: "Kullanıldı (%{count})" invited_via: "Davet" invited_via_link: "bağlantı %{key} (%{count} / %{max} kullanıldı)" + generating_link: "Bağlantı oluşturuluyor..." groups: "Gruplar" topic: "Konu" sent: "Oluşturulma/Son Gönderilme" @@ -2253,9 +2431,17 @@ tr_TR: no_results: "Sonuç yok" search: "Ara…" label: "Seçenekleri belirleyin" + d_otp: + screen_reader: + one: Bir sayı girin + other: '%{count} sayı girin' form_kit: reset: Sıfırla optional: i̇steğe bağlı + required: zorunlu + errors_summary_title: + one: "Devam etmek için bu hatayı düzeltin" + other: "Devam etmek için bu hataları düzeltin" dirty_form: "Değişikliklerinizi göndermediniz! Ayrılmak istediğinizden emin misiniz?" errors: starts_with: "%{prefix} ile başlamalı" @@ -2275,6 +2461,10 @@ tr_TR: too_short: one: "En az %{count} karakter olmalı" other: "En az %{count} karakter olmalı" + color: + available_presets: "Mevcut ön ayarlar" + already_used: "Zaten kullanılmış" + edit_presets: "Renk ön ayarlarını düzenle" close: "Kapat" assets_changed_confirm: "Bu site yakın zamanda bir yazılım güncellemesi aldı. Şimdi en son sürümünü edinmek ister misiniz?" logout: "Çıkış yaptınız." @@ -2321,6 +2511,7 @@ tr_TR: } site ayar limitini aştı. learn_more: "Daha fazla bilgi…" learn_more_with_link: "Daha fazla bilgi edinin…" + feedback_with_link: "Geri bildirim…" mute: Sessize al unmute: Sesi aç last_post: Gönderildi @@ -2477,6 +2668,7 @@ tr_TR: admin_not_allowed_from_ip_address: "Bu IP adresinden yönetici olarak giriş yapamazsınız." resend_activation_email: "Etkinleştirme e-postasını yeniden göndermek için buraya tıklayın." omniauth_disallow_totp: "Hesabınızda iki adımlı kimlik doğrulama etkin. Lütfen şifrenizle giriş yapın." + works_with: "Şunlarla çalışır" activate_account: "Hesabı aktive et" resend_title: "Etkinleştirme e-postasını yeniden gönder" change_email: "E-posta adresini değiştir" @@ -2547,7 +2739,7 @@ tr_TR: google_classic: "Google Klasik (Noto Emoji'ye geçildi)" facebook_messenger: "Facebook Messenger (Standard'a geçildi)" openmoji: OpenMoji - standard: Standard + standard: Standart fluentui: Fluent Emoji noto: Noto Emoji twemoji: Twemoji @@ -2595,6 +2787,7 @@ tr_TR: one: "bu kategorideki %{count} konu" other: "bu kategorideki %{count} konu" read_only: "salt okunur" + read_only_description: "Bu kategori salt okunur olduğundan, bu konu için seçemezsiniz." timezone_input: ambiguous_ist: "IST belirsiz, lütfen belirli bir saat dilimi seçin (ör.: Asya/Kalküta)" select_kit: @@ -2680,8 +2873,13 @@ tr_TR: title: "Gönderi çevriliyor" select: "Çeviri seç" save: "Çeviriyi kaydet" + original_content: "Orijinal gönderi" + translation_preview: "Çeviri önizlemesi" + original: "Orijinal" translation: "Çeviri" + no_translation_yet: "Çevirinin önizlemesini görmek için yazmaya başlayın..." placeholder: "Gönderinin çevirisini buraya girin..." + show_raw_markdown: "Ham verileri göster" group_mentioned_limit: one: "Uyarı! %{group} grubundan bahsettiniz; ancak bu grubun yönetici tarafından yapılandırılan %{count} kullanıcılık bahsetme sınırından daha fazla üyesi var. Kimseye bildirim gönderilmeyecek." other: "Uyarı! %{group} grubundan bahsettiniz; ancak bu grubun yönetici tarafından yapılandırılan %{count} kullanıcılık bahsetme sınırından daha fazla üyesi var. Kimseye bildirim gönderilmeyecek." @@ -2736,7 +2934,9 @@ tr_TR: create_shared_draft: "Paylaşılmış Taslak oluştur" edit_shared_draft: "Paylaşılmış Taslağı Düzenle" title: "Veya %{modifier}Enter tuşuna basın" + save_and_close: "Kaydet ve kapat" discard: "Kapat" + draft_saved: "Taslak kaydedildi!" users_placeholder: "Kullanıcı veya grup ekleyin" title_placeholder: "Tek cümleyle açıklamak gerekirse bu tartışmanın konusu nedir?" title_or_link_placeholder: "Buraya başlık yazın veya bir bağlantı yapıştırın" @@ -2789,12 +2989,31 @@ tr_TR: upload_description: "yükleme açıklamasını buraya girin" olist_title: "Numaralandırılmış liste" ulist_title: "Madde işaretli liste" + list_title: "Listeler" list_item: "Liste ögesi" toggle_direction: "Yönü aç/kapat" + apply_wrap_title: "Sargı uygulayın" wrap_modal: + title: "Sargıyı Düzenle" + name_label: "Sargı Adı" + attributes_label: "Özellikler" + add_attribute: "Öznitelik ekle" + remove_attribute: "Özniteliği kaldır" apply: "Uygula" + unwrap: "Paketi aç" + no_attributes: "Henüz hiçbir öznitelik eklenmedi." + wrap_text: "İçeriği sarın" help: "Markdown Düzenleme Yardımı" + collapse: "Besteci panelini küçült" + open: "Besteci panelini aç" + abandon: "Besteciyi kapat ve taslağı sil" + edit_reason: "Düzenleme nedeninizi girin" + enter_fullscreen: "Tam ekran besteci moduna gir" + exit_fullscreen: "Tam ekran besteci modundan çık" exit_fullscreen_prompt: "Tam ekrandan çıkmak için ESC tuşuna basın" + show_toolbar: "Besteci araç çubuğunu göster" + hide_toolbar: "Besteci araç çubuğunu gizle" + peek_mode_toggle: "Göz atma modunu aç/kapat" modal_ok: "Tamam" cant_send_pm: "Üzgünüz, %{username} adlı kullanıcıya mesaj gönderemezsiniz." create_message_error: "Üzgünüz, bu mesaj oluşturulurken bir hata oluştu. Lütfen tekrar deneyin." @@ -2841,6 +3060,7 @@ tr_TR: desc: "En son yanıt tarihini değiştirmeden yanıtla" toggle_unlisted: label: Listeden kaldırılanı aç/kapat + desc: "Listelenmemiş konulara yalnızca doğrudan bağlantı ile erişilebilir." reload: "Yeniden Yükle" ignore: "Yok say" image_alt_text: @@ -2851,7 +3071,14 @@ tr_TR: zoom_out: "Görüntü boyutunu küçült" zoom_in: "Görüntü boyutunu artır" remove: "Görüntüyü kaldır" + add_to_grid: "Izgaraya ekle" + move_outside_grid: "Izgara dışına taşı" image: "resim" + grid_label: "Bu, bir grid olarak görüntülenecektir." + grid_mode_grid: "Izgara" + grid_mode_carousel: "Atlıkarınca" + grid_mode_title: "Resim galerisi stilini %{mode} olarak ayarla" + remove_grid: "Izgarayı kaldır" image_scale_button: "Görüntüyü %%{percent} oranına ölçeklendir" delete_image_button: Görüntüyü Sil toggle_image_grid: Resim ızgarasını aç/kapat @@ -2861,6 +3088,7 @@ tr_TR: remove: "Bağlantıyı kaldır" visit: "Bağlantıyı harici sekmede aç" link_copied: "Bağlantı kopyalandı!" + unsupported_token: "Zengin metin düzenleyici bu yazıda kullanılan tüm özellikleri desteklemiyor; sizi Markdown düzenleyicisine yönlendiriyor." notifications: tooltip: regular: @@ -2930,6 +3158,17 @@ tr_TR: votes_released: "%{description} - tamamlandı" new_features: "Yeni özellikler mevcut!" admin_problems: "Sitenizin kontrol panelinde yeni öneriler mevcut" + upcoming_changes: + available: + title: "Yaklaşan değişiklikler" + description: "'%{changeName}' önizleme için kullanılabilir" + description_two: "'%{changeName1}‘ ve ’%{changeName2}' önizleme için kullanılabilir." + description_many: "'%{changeName}' ve %{otherChangeCount} daha fazla değişiklik önizleme için mevcuttur." + automatically_promoted: + title: "Yaklaşan değişiklikler" + description: "'%{changeName}' otomatik olarak etkinleştirildi" + description_two: "'%{changeName1}‘ ve ’%{changeName2}' otomatik olarak etkinleştirildi" + description_many: "'%{changeName}' ve %{otherChangeCount} daha fazla değişiklik otomatik olarak etkinleştirildi" dismiss_confirmation: body: default: @@ -2986,7 +3225,10 @@ tr_TR: membership_request_consolidated: "yeni üyelik talepleri" reaction: "yeni tepki" votes_released: "oy verildi" + new_features: "yeni Discourse özellikleri yayınlandı" admin_problems: "sitenizin panonuzda yeni öneriler mevcut" + upcoming_change_available: "yeni değişiklikler yakında kullanıma sunulacak" + upcoming_change_automatically_promoted: "yaklaşan değişiklikler otomatik olarak etkinleştirildi" upload_selector: change: "Değiştir" delete: "Sil" @@ -3077,6 +3319,7 @@ tr_TR: aria_label: Etiketleri kullanarak filtrele filters: label: Yalnızca şu konulara/gönderilere dön… + all: Mesajları dahil et title: Yalnızca başlıkta eşleşen likes: Beğendiğim posted: Gönderi yaptığım @@ -3176,15 +3419,17 @@ tr_TR: deleted_post: "(silinmiş gönderi)" post_number_with_topic_title: "gönderi #%{post_number} - %{title}" new_post_in_topic: "%{title} başlığında yeni gönderi" + new_post_in_deleted_topic: "silinmiş bir konuda yeni gönderi" user_requires_approval: "%{username} onay bekliyor" default_item: "incelenebilir öge #%{reviewable_id}" topics: new_messages_marker: "son ziyaret" bulk: + select: "Toplu seçim" confirm: "Onayla" select_all: "Tümünü Seç" clear_all: "Tümünü Temizle" - unlist_topics: "Konuları listeden kaldır" + unlist_topics: "Konuları gizle" relist_topics: "Konuları yeniden listele" reset_bump_dates: "Üste sıçratma tarihlerini sıfırla" defer: "Okunmamış olarak işaretle" @@ -3192,6 +3437,12 @@ tr_TR: delete_topics_count: one: "Konuyu Sil" other: "Konuları sil" + delete_posts_count: + one: "Gönderiyi Sil" + other: "Gönderileri Sil" + delete_posts_confirmation: + one: "%{count} gönderiyi silmek istediğinizden emin misiniz?" + other: "%{count} gönderiyi silmek istediğinizden emin misiniz?" dismiss: "Kapat" dismiss_read: "Tüm okunmamışları kapat" dismiss_read_with_selected: @@ -3221,37 +3472,68 @@ tr_TR: other: "Yenileri (%{count}) kapat" toggle: "konuların toplu seçimini aç/kapat" actions: "Toplu Eylemler" - change_category: "Kategori belirle…" - close_topics: "Konuları Kapat" - archive_topics: "Konuları Arşivle" + change_category: "Kategoriyi güncelle" + close_topics: "Konuları kapat" + archive_topics: "Konuları arşivle" move_messages_to_inbox: "Gelen kutusuna taşı" archive_messages: "Arşive taşı" - notification_level: "Bildirimler…" + notification_level: "Bildirimleri güncelle" change_notification_level: "Bildirim Seviyesini Değiştir" choose_new_category: "Konular için yeni kategoriyi seç:" - selected: - one: "%{count} konu seçtiniz." - other: "%{count} konu seçtiniz." selected_sole_category: one: "Kategoriden %{count} konu seçtiniz:" other: "Kategoriden %{count} konu seçtiniz:" selected_count: one: "%{count} tane seçildi" other: "%{count} tane seçildi" - change_tags: "Etiketleri Değiştir" - append_tags: "Etiketleri Sonuna Ekle" + change_tags: "Etiketleri değiştir" + append_tags: "Etiket ekle" choose_new_tags: "Bu konular için yeni etiketler seçin:" - choose_append_tags: "Bu konular için sona eklenecek yeni etiketleri seçin:" + choose_append_tags: "Etiket ekle" changed_tags: "Bu konuların etiketleri değiştirildi." - remove_tags: "Tüm Etiketleri Kaldır" + remove_tags: "Etiketleri kaldır" confirm_remove_tags: one: "Bu konudan tüm etiketler kaldırılacak. Emin misiniz?" other: "%{count} konudan tüm etiketler kaldırılacak. Emin misiniz?" + confirm_update_topics: + one: "%{count} konuyu güncelle" + other: "%{count} konuyu güncelle" + confirm_close_topics: + one: "%{count} konuyu kapat" + other: "%{count} konuyu kapat" + confirm_archive_topics: + one: "%{count} konuyu arşivle" + other: "%{count} konuyu arşivle" + confirm_unlist_topics: + one: "%{count} konuyu listeden kaldır" + other: "%{count} konuyu listeden kaldır" + confirm_relist_topics: + one: "%{count} konuyu yeniden listele" + other: "%{count} konuyu yeniden listele" + confirm_archive_messages: + one: "%{count} mesajı arşivle" + other: "%{count} mesajı arşivle" + confirm_move_to_inbox: + one: "%{count} mesajı gelen kutusuna taşı" + other: "%{count} mesajı gelen kutusuna taşı" + confirm_delete_topics: + one: "%{count} konuyu sil" + other: "%{count} konuyu sil" progress: one: "İlerleme: %{count} konu" other: "İlerleme: %{count} konu" + notify: "Kullanıcılara bu değişikliği bildir" performing: "Toplu işlemler gerçekleştiriliyor, lütfen bekleyin…" completed: "Toplu işlemler başarıyla tamamlandı!" + completed_count: + one: "%{count} konu güncellendi." + other: "%{count} konu güncellendi." + not_completed: + one: "%{count} konu güncellenemedi:" + other: "%{count} konu güncellenemedi:" + skipped_count: + one: "%{count} konu zaten günceldi." + other: "%{count} konu zaten günceldi." error_topic_count: one: "%{count} konu" other: "%{count} konu" @@ -3272,49 +3554,57 @@ tr_TR: unread: "Okunmamış bir şey kalmadı... Etkileyici!" new_new: "Şu anda yeni bir şey yok... Kısa süre sonra tekrar kontrol edin!" new: "Şu anda yeni bir şey yok... Kısa süre sonra tekrar kontrol edin!" + generic: "Burada görecek bir şey yok... yakında tekrar kontrol edin!" topic_bulk_actions: dismiss: name: "Kapat" close_topics: name: "Kapat" - note: "Not" + description: "Kapatılan konular yeni yanıtların eklenmesini engeller. Daha fazla bilgi edinin" + note: "Bu konulara bir not ekleyin" optional: (isteğe bağlı) archive_topics: name: "Arşiv" + description: "Arşivlenen konular, arama sonuçlarında ve en son konular listesinde görünmez. Daha fazla bilgi edinin" archive_messages: name: "Arşive taşı" move_messages_to_inbox: name: "Gelen Kutusuna taşı" unlist_topics: name: "Listeden kaldır" + description: "Listelenmemiş konular konu listesinde görünmez, ancak doğrudan bağlantı yoluyla erişilebilir. Daha fazla bilgi edinin" relist_topics: name: "Yeniden listele" remove_tags: name: "Etiketleri kaldır" + description: "Seçili konulardaki tüm etiketleri kaldır." append_tags: - name: "Etiketleri sona ekle" + name: "Etiket ekle" + description: "Seçilen konulara aşağıdaki etiketleri ekleyin:" replace_tags: name: "Etiketleri Değiştir" + description: "Seçilen konulardaki mevcut tüm etiketleri aşağıdakilerle değiştirin:" delete_topics: name: "Sil" + description: "Seçilen konuları kalıcı olarak sil. Bu işlem geri alınamaz." update_category: name: "Kategoriyi Güncelle" - description: "Seçilen konular için yeni kategoriyi seçin" + description: "Seçili tüm konuları aşağıdaki kategoriye taşı:" reset_bump_dates: name: "Üste Sıçratma Tarihlerini sıfırla" - description: "Konunun öne çıkma tarihini son oluşturulan gönderi tarihine sıfırlayın; bu, konu listesindeki sıralamayı etkiler" + description: "Gönderilerin öne çıkarılma tarihlerini en son oluşturulma tarihine göre güncellemek ister misiniz? Bu, konu listesindeki sıralamalarını etkileyebilir." defer: name: "Okunmamış olarak işaretle" - description: "Konuları okunmamış olarak işaretle" update_notifications: name: "Bildirimleri güncelle" - description: "Bildirim seviyesini İzleniyor, Takip Ediliyor, Normal veya Ses Kapatıldı olarak değiştirin" + description: "Seçilen konular için kişisel bildirim düzeyinizi şu şekilde güncelleyin:" topic: filter_to: one: "Konuda %{count} gönderi" other: "Konuda %{count} gönderi" create: "Yeni Konu" create_long: "Yeni bir konu oluşturun" + create_group: "Yeni konu ve taslaklar" open_draft: "Taslağı aç" private_message: "Mesaj başlat" archive_message: @@ -3400,12 +3690,15 @@ tr_TR: created_at: "Oluşturulma: %{date}" bumped_at: "En Son: %{date}" browse_latest_topics: "En son konulara göz atın" + browse_new_replies: "Yeni yanıtları göz at" + browse_new_topics: "Yeni konular arasında gezinin" suggest_create_topic: Yeni bir konuşma başlatmaya hazır mısınız? jump_reply: "Gönderinin orijinal konumuna atla" jump_reply_aria: "@%{username} adlı kullanıcının gönderisine orijinal konumunda atla" jump_reply_button: "Gönderiye atla" deleted: "Konu silindi" slow_mode_update: + title: "Yavaş mod" select: "Kullanıcılar bu konuda yalnızca şu sıklıkta gönderi yapabilir:" description: "Hızlı hareket eden veya ateşli tartışmalarda, düşünceli tartışmayı teşvik etmek için kullanıcıların bu konuda tekrar gönderi yapmadan önce beklemesi gerekir." enable: "Etkinleştir" @@ -3427,6 +3720,8 @@ tr_TR: 12_hours: "12 Saat" 24_hours: "24 saat" custom: "Özel Süre" + slow_mode_notice: + duration: "Bu konuda gönderileriniz arasında %{duration} bekleyin lütfen." topic_status_update: title: "Konu Zamanlayıcısı" save: "Zamanlayıcıyı Ayarla" @@ -3456,6 +3751,8 @@ tr_TR: title: "Son Gönderiden Sonra Konuyu Otomatik Kapat" auto_delete: title: "Konuyu Otomatik Sil" + auto_delete_after_last_post: + title: "Son Gönderiden Sonra Konuyu Otomatik Olarak Sil" auto_bump: title: "Konuyu Otomatik Üste Sıçrat" reminder: @@ -3467,6 +3764,7 @@ tr_TR: auto_close: "Bu konu %{timeLeft} içinde otomatik olarak kapanacak." auto_publish_to_category: "Bu konu %{timeLeft} içinde #%{categoryName} kategorisinde yayınlanacak." auto_close_after_last_post: "Bu konu son yanıttan sonra %{duration} içinde kapanacak." + auto_delete_after_last_post: "Bu konu, son yanıtın ardından %{duration} sonra silinecektir." auto_delete: "Bu konu %{timeLeft} içinde otomatik olarak silinecek." auto_bump: "Bu konu %{timeLeft} içinde otomatik olarak üste sıçratılacak." auto_reminder: "%{timeLeft} içinde bu konu hakkında anımsatıcı alacaksınız." @@ -3475,6 +3773,9 @@ tr_TR: auto_close_immediate: one: "Konudaki son gönderi zaten %{count} saat öncesine ait, bu yüzden konu hemen kapatılacak." other: "Konudaki son gönderi zaten %{count} saat öncesine ait, bu yüzden konu hemen kapatılacak." + auto_delete_immediate: + one: "Konudaki son mesajın üzerinden %{count} saat geçti, bu nedenle konu hemen silinecek." + other: "Konudaki son mesajın üzerinden %{count} saat geçti, bu nedenle konu hemen silinecek." timeline: back: "Geri" back_description: "Son okunmamış gönderinize geri dönün" @@ -3562,6 +3863,8 @@ tr_TR: reply: title: "Yanıtla" help: "bu konuya bir yanıt oluşturmaya başlayın" + footer_buttons: + region_label: "Konu eylemleri" share: title: "Konuyu paylaş" extended_title: "Bağlantı paylaş" @@ -3741,14 +4044,26 @@ tr_TR: one: %{count} gönderi seçtiniz. other: "%{count} gönderi seçtiniz." deleted_by_author_simple: "(konu, yazar tarafından silindi)" + localizations: + title_edit_warning: + message: "Bu, çevrilmiş bir konu başlığıdır.

%{language} dilinde orijinal kategoriyi, etiketleri ve başlığı mı düzenlemek istiyorsunuz, yoksa bu özel çeviriyi mi düzenlemek istiyorsunuz?" + action_original: "Orijinali düzenle" + action_translation: "Çevrilmiş konu başlığını düzenle" + editing_translation: "%{language} çevirisini düzenleme" post_list: title: "En son gönderiler" empty: "Gönderi yok" aria_post_number: "%{title} - gönderi #%{postNumber}" bulk: + selected: + one: "%{count} gönderi seçildi" + other: "%{count} gönderi seçildi" + select_all: "Tümünü seç" clear_all: "Tümünü temizle" actions: "Toplu eylemler" post: + accessible_heading: "%{username} tarafından gönderildi %{date}" + heading_anchor: "Başlık bağlantısı" confirm_delete: "Bu gönderiyi silmek istediğinize emin misiniz?" quote_reply: "Alıntı" quote_reply_shortcut: "Alıntı yapın (veya q tuşuna basın)" @@ -3772,8 +4087,13 @@ tr_TR: deleted_by_author_simple: "(gönderi yazarı tarafından silindi)" collapse: "daralt" load_more_replies: "daha fazla yanıt yükle" + load_more_posts_above: "Yukarıda daha fazla gönderi yükle" + load_more_posts_below: "Aşağıda daha fazla gönderi yükle" sr_collapse_replies: "Gömülü yanıtları daralt" sr_load_more_replies: "Daha fazla gömülü yanıt yükle" + loading_more_posts_above: "Yukarıda daha fazla gönderi yükleniyor..." + loading_more_posts_below: "Aşağıda daha fazla gönderi yükleniyor..." + loading_complete: "Yükleme tamamlandı" sr_date: "Gönderi tarihi" sr_expand_replies: one: "Bu gönderinin %{count} yanıtı var" @@ -3828,6 +4148,9 @@ tr_TR: edit: "Düzenle" delete: "Sil" add: "Yeni çeviri ekle" + manage: + one: "Çevirileri yönet (%{count} tane mevcut)" + other: "Çevirileri yönet (%{count} tane mevcut)" view: one: "%{count} çevrilmiş yerel ayarı görüntüle" other: "%{count} çevrilmiş yerel ayarı görüntüle" @@ -3836,8 +4159,10 @@ tr_TR: confirm_delete: "\"%{languageCode}\" için çevirileri silmek istediğinizden emin misiniz?" success: "Çeviriler başarıyla güncellendi" post_language_selector: + title: "Gönderi Dili" none: "Yok" edit_warning: + message: "Bu, çevrilmiş bir gönderidir.

Orijinal gönderiyi %{language} dilinde mi düzenlemek istiyorsunuz, yoksa bu çeviriyi mi düzenlemek istiyorsunuz?" action_original: "Orijinal gönderiyi düzenle" action_translation: "Bu çeviriyi düzenle" errors: @@ -3858,6 +4183,7 @@ tr_TR: attachment_upload_not_allowed_for_new_user: "Üzgünüz, yeni kullanıcılar ek yükleyemez." attachment_download_requires_login: "Üzgünüz, ekleri indirebilmek için giriş yapmanız gerekiyor." cancel_composer: + confirm: "Gönderinizi silmek istiyor musunuz?" discard: "Kapat" via_email: "bu gönderi e-posta yoluyla geldi" via_auto_generated_email: "bu gönderi otomatik olarak oluşturulmuş bir e-posta yoluyla geldi" @@ -3930,6 +4256,7 @@ tr_TR: delete_post_notice: "Resmî Bildiriyi Sil" remove_timer: "zamanlayıcıyı kaldır" edit_timer: "zamanlayıcıyı düzenle" + remove_yourself_from_pm: "Bu mesajdan kendinizi kaldırmak istediğinizden emin misiniz? Artık bu mesajı göremez ve yanıtlayamazsınız." actions: people: like: @@ -3961,6 +4288,7 @@ tr_TR: one: "Bu gönderileri birleştirmek istediğinizden emin misiniz?" other: "Bu %{count} gönderiyi birleştirmek istediğinizden emin misiniz?" revisions: + diff_too_complex: "Fark görüntülenemeyecek kadar karmaşık. Lütfen daha küçük düzenlemeleri tek tek görüntülemeyi deneyin." locale: no_locale_set: "Dil ayarlanmadı" locale_removed: "Dil kaldırıldı" @@ -4036,6 +4364,7 @@ tr_TR: instructions: "Bu gönderiye bir bağlantı paylaşın:" original_language: "Bu gönderi orijinal olarak %{language} dilinde yazıldı" original_language_and_outdated: "Bu gönderi orijinal olarak %{language} dilinde yazıldı. Çeviri güncel olmayabilir" + ai_translation_disclaimer: "AI tarafından üretilen çeviriler yanlış olabilir." category: none: "(kategori yok)" all: "Tüm kategoriler" @@ -4048,7 +4377,10 @@ tr_TR: general: "Genel" settings: "Ayarlar" advanced: "Gelişmiş" + show_advanced: "Gelişmiş ayarlar" topic_template: "Şablon" + topic_title_placeholder: "Kategori konusu başlığı yer tutucusu" + topic_title_placeholder_placeholder: "[isteğe bağlı] bu kategori için özel konu başlığı yer tutucusu" tags: "Etiketler" localizations: "Yerelleştirmeler" localization: @@ -4072,24 +4404,52 @@ tr_TR: delete: "Sil" add: "Gerekli etiket grubu ekleyin" placeholder: "Etiket grubu seç…" + min_count: "Etiket sayısı" tag_group: "Etiket grubu" topic_featured_link_allowed: "Bu kategoride öne çıkan bağlantılara izin ver" + delete: "Kategoriyi sil" + create: "Yeni kategori" + create_with_type: "Yeni %{typeName} kategorisi" create_long: "Yeni bir kategori oluştur" + settings_apply_to_all_of_type_warning: "Aşağıdaki değişiklikler bu türdeki tüm kategoriler için geçerli olacaktır." + type_settings_schema: + category_settings: "Kategori ayarları" + category_custom_fields: "Kategori ayarları" + site_settings: "Site ayarları" + choose_type: + title: "Kategori türünü seçin" + requires_plugin: "Eklenti gerektirir" + create_category: "Kategori oluştur" + save: "Kategoriyi kaydet" unsaved_changes: "Kaydedilmemiş değişiklikleriniz var" + slug: "Kategori Kısa Adı" + parent: "Ana kategori" slug_placeholder: "(İsteğe bağlı) url için çizgiyle ayrılmış kelimeler" creation_error: Kategori oluşturulurken bir hata oluştu. save_error: Kategori kaydedilirken bir hata oluştu. + errors: + self_lockout: "Kendi erişiminizi kaldıracak şekilde kategori izinlerini değiştirmek üzeresiniz. Devam etmek istediğinizden emin misiniz?" validations: + emoji_required: "Bir emoji seçin." icon_required: "Simge seçin." + name: "Kategori adı" + untitled: "Başlıksız kategori" description: "Açıklama" + logo: "Kategori logosu görüntüsü" + logo_dark: "Karanlık mod kategori logosu görüntüsü" logo_description: "Önerilen 1:1 en boy oranı ve minimum 200 piksel boyut. Boş bırakılırsa hiçbir görüntü gösterilmez." + background_image: "Kategori arka plan resmi" + background_image_dark: "Koyu renkli kategori arka plan resmi" style: "Stil" icon: "Simge" emoji: "Emoji" + select_emoji: "Emoji seç" background_color: "Renk" foreground_color: "Metin rengi" color_validations: cant_be_empty: "boş olamaz" + incorrect_length: "#RRGGBB veya #RGB biçimiyle eşleşmelidir" + non_hexdecimal: "sadece onaltılık karakterler (0-9, A-F) içermelidir" styles: type: "Stil" icon: "Simge" @@ -4101,12 +4461,16 @@ tr_TR: emoji: "Emoji" color_used: "Kullanılan renk" predefined_colors: "Önceden tanımlanmış renk seçenekleri" + name_placeholder: "Bir veya iki kelime önerilir" color_placeholder: "Herhangi bir web rengi" delete_confirm: "Bu kategoriyi silmek istediğinizden emin misiniz?" delete_error: "Kategori silinirken bir hata oluştu." list: "Kategorileri listele" no_description: "Lütfen bu kategori için bir açıklama ekleyin." change_in_category_topic: "Açıklamayı düzenle" + description_updated: "Açıklama güncellendi" + description_expand: "Daha fazla göster" + description_collapse: "Daha az göster" already_used: "Bu renk başka bir kategori tarafından kullanılmış." color_palette: "Renk paleti" security: "Güvenlik" @@ -4117,8 +4481,15 @@ tr_TR: reply: "Yanıtla" create: "Oluştur" no_groups_selected: "Hiçbir gruba erişim izni verilmedi; bu kategori yalnızca personel tarafından görülebilir." + everyone_full_access: 'Bu kategori herkese açıktır, herkes görebilir, yanıtlayabilir ve gönderi oluşturabilir. İzinleri kısıtlamak için, “%{everyone_group}” grubuna verilen izinlerden birini veya birkaçını kaldırın.' + everyone_reply_access: 'Bu kategori herkese açıktır, herkes konuları görebilir ve yanıtlayabilir. İzinleri kısıtlamak için “%{everyone_group}” grubunu kaldırın.' + everyone_see_access: 'Bu kategori herkese açıktır, herkes gönderileri görebilir. İzinleri kısıtlamak için “%{everyone_group}” grubunu kaldırın.' + specific_groups_have_access: "Bu kategori özeldir, yalnızca seçilen gruplar görebilir, yanıtlayabilir ve gönderi oluşturabilir." + all_parent_groups_used: "Ana kategorideki tüm gruplar eklenmiştir. Daha fazla grup eklemek için, önce bunları ana kategoriye ekleyin." toggle_reply: "Yanıtlama iznini aç/kapat" toggle_full: "Oluşturma iznini aç/kapat" + inherited: 'Bu izin “%{everyone_group}” grubundan devralınmıştır.' + special_warning: "Bu önceden belirlenmiş bir kategoridir ve güvenlik ayarları düzenlenemez. Bu kategoriyi kullanmak istemiyorsanız, yeniden kullanmak yerine silin." uncategorized_security_warning: "Bu kategori özeldir. Kategorisi olmayan konular için tutma alanı olarak tasarlanmıştır; güvenlik ayarlarına sahip olamaz." uncategorized_general_warning: 'Bu kategori özeldir. Kategori seçilmeyen yeni konular için varsayılan kategori olarak kullanılır. Bu davranışı önlemek ve kategori seçimini zorlamak isterseniz lütfen buradaki ayarı devre dışı bırakın. Adı veya açıklamayı değiştirmek isterseniz Özelleştir / Metin İçeriği''ne gidin.' pending_permission_change_alert: "Bu kategoriye %{group} eklemediniz; eklemek için bu düğmeye tıklayın." @@ -4135,20 +4506,35 @@ tr_TR: all_topics_wiki: "Varsayılan olarak yeni konu wiki yapın" allow_unlimited_owner_edits_on_first_post: "İlk gönderide sınırsız sahibi düzenlemelerine izin ver" subcategory_list_style: "Alt Kategori Listesi Stili:" + sort_order: "Konu listesi sıralama ölçütü:" + default_view: "Varsayılan konu listesi:" + default_top_period: "Varsayılan en iyi dönem:" + default_list_filter: "Varsayılan liste filtresi:" allow_badges_label: "Bu kategoride rozet verilmesine izin verin" + edit_permissions: "Düzenleme izinleri" reviewable_by_group: "Personele ek olarak, bu kategorideki içerik şu kişiler tarafından da incelenebilir:" review_group_name: "grup adı" require_topic_approval: "Tüm yeni konular için moderatör onayı gerektir" require_reply_approval: "Tüm yeni yanıtlar için moderatör onayı gerektir" this_year: "bu yıl" position: "Kategoriler sayfasındaki pozisyon:" + default_position: "Varsayılan Pozisyon" position_disabled: "Kategoriler aktivite sırasına göre görüntülenir. Listelerdeki kategorilerin sırasını kontrol etmek için \"sabit kategori pozisyonları\" ayarını etkinleştirin." minimum_required_tags: "Bir konuda gerekli minimum etiket sayısı:" + default_slow_mode: 'Bu kategorideki yeni konular için “Yavaş mod”u etkinleştirin.' + subcategory_of: "Alt kategorisi..." none_subcategory_text: "Hiçbiri" + subcategory_permissions_warning: "Özel bir kategorinin alt kategorisi genel olamaz." visibility: title: "Görünürlük" public: "Genel" + all_members: "Tüm üyeler" group_restricted: "Özel" + who_can_see: "Bu kategoriyi kimler görebilir?" + who_can_post: "Bu kategoride kimler yayın yapabilir?" + which_groups_can_access: "Bu kategoride hangi gruplar görüntüleme ve paylaşım yapabilir?" + more_options_hint: "gelişmiş ayarlar'da daha fazla izin mevcuttur." + inherited_from_parent: "İzinler üst kategoriden devralınır. Ayrıntıları belirlemek için gelişmiş ayarlar sayfasını ziyaret edin." num_auto_bump_daily: "Günlük olarak otomatik olarak üste çıkacak açık konu sayısı:" auto_bump_cooldown_days: "Aynı konuyu tekrar açmadan önce geçmesi gereken gün sayısı:" navigate_to_first_post_after_read: "Konular okunduktan sonra ilk gönderiye gidin" @@ -4170,14 +4556,18 @@ tr_TR: title: "Sessize alındı" description: "Bu kategorideki yeni konular hakkında hiçbir zaman bildirim almayacaksınız ve en son bölümünde görünmeyecekler." search_priority: + label: "Arama önceliği" options: normal: "Normal" ignore: "Yok say" + very_low: "Çok düşük" low: "Düşük" high: "Yüksek" + very_high: "Çok yüksek" sort_options: default: "varsayılan" likes: "Beğeniler" + op_likes: "Orijinal gönderi beğenileri" views: "Görüntülemeler" posts: "Gönderiler" activity: "Aktivite" @@ -4198,6 +4588,7 @@ tr_TR: email: "E-posta" list_filters: all: "Tüm konular" + none: "Alt kategori yok" colors_disabled: "Category style olarak none belirlenmiş olduğundan renk seçemezsiniz." anonymous_flagging: title: "Yasa dışı içeriği bildirin" @@ -4457,10 +4848,15 @@ tr_TR: preloader_text: "Yükleniyor" lightbox: download: "İndir" + open: "Orijinal görüntü" + image_info: "Görüntü bilgileri" + quote: "Resmi alıntıla" previous: "Önceki (Sol ok tuşu)" next: "Sonraki (Sağ ok tuşu)" counter: "%curr% / %total%" close: "Kapat (Esc)" + zoom: "Yakınlaştır (Z tuşu)" + error: "Görüntü yüklenemiyor" content_load_error: 'İçerik yüklenemedi.' image_load_error: 'Görüntü yüklenemedi.' cannot_render_video: Tarayıcınız codec'i desteklemediği için bu video işlenemiyor. @@ -4482,6 +4878,7 @@ tr_TR: latest: "%{shortcut} En Son" new: "%{shortcut} Yeni" unread: "%{shortcut} Okunmamış" + unseen: "%{shortcut} Görünmez" categories: "%{shortcut} Kategoriler" top: "%{shortcut} En Üst" bookmarks: "%{shortcut} Yer imleri" @@ -4496,10 +4893,12 @@ tr_TR: back: "%{shortcut} Geri" up_down: "%{shortcut} Seçileni taşı ↑ ↓" open: "%{shortcut} Seçili konuyu aç" + open_new_window: "%{shortcut} Seçilen konuyu yeni sekmede/pencerede aç" next_prev: "%{shortcut} Önceki/Sonraki bölüm" go_to_unread_post: "%{shortcut} Okunmamış ilk gönderiye git" application: title: "Uygulama" + create: "%{shortcut} Yeni bir konu veya kişisel mesaj oluşturun" notifications: "%{shortcut} Bildirimleri aç" hamburger_menu: "%{shortcut} Navigasyon menüsünü aç" user_profile_menu: "%{shortcut} Kullanıcı menüsünü aç" @@ -4626,6 +5025,7 @@ tr_TR: add_to_calendar: "Takvime ekle" google: "Google Takvim" ics: "ICS" + default_title: "Planlanmış Etkinlik" tagging: all_tags: "Tüm etiketler" other_tags: "Diğer Etiketler" @@ -4640,18 +5040,25 @@ tr_TR: choose_for_topic_required_group: one: "'%{name}' içinden %{count} etiket seç…" other: "'%{name}' içinden %{count} etiket seç…" + info: "Etiket bilgilerini göster" default_info: "Bu etiket hiçbir kategoriyle sınırlı değil ve eş anlamlısı yok." staff_info: "Kısıtlama eklemek için bu etiketi bir etiket grubuna koyun." category_restricted: "Bu etiket, erişim izninizin olmadığı kategorilerle sınırlı." synonyms: "Eş Anlamlılar" synonyms_description: "Aşağıdaki etiketler kullanıldığında %{base_tag_name}ile değiştirilir." + synonyms_inline: "Bu eşanlamlılar %{base_tag_name} ile değiştirilecektir:" save: "Etiketin adını ve açıklamasını kaydedin" tag_groups_info: one: 'Bu etiket %{tag_groups} grubuna ait.' other: "Bu etiket şu gruplara ait: %{tag_groups}." + tag_groups_info_prefix: + one: "Bu etiket gruba aittir " + other: "Bu etiket şu gruplara aittir: " category_restrictions: one: "Sadece şu kategoride kullanılabilir:" other: "Yalnızca şu kategorilerde kullanılabilir:" + restricted_to: "Sınırlı" + no_synonyms: "Bu etiketin eşanlamlısı yoktur." edit_synonyms: "Eş Anlamlıları Düzenle" add_synonyms_label: "Eş anlamlı ekleyin:" add_synonyms: "Ekle" @@ -4670,20 +5077,35 @@ tr_TR: one: "Eş anlamlısı da silinecek." other: "%{count} eş anlamlısı da silinecek." edit_tag: "Etiket adını ve açıklamasını düzenle" + edit: "Bu etiketi düzenle" description: "Açıklama" settings: title: "Ayarlar" + edit_title: "Etiketi düzenle: %{name}" + edit_tag_prefix: "Etiketi düzenle:" + select_tag: "Düzenlemek için bir etiket seçin" general: "Genel" localizations: "Yerelleştirmeler" back: "Geri" name: "Ad" slug: "Kısa ad" name_placeholder: "Etiket adı" + slug_placeholder: "Etiket kısa adı (isteğe bağlı, addan otomatik olarak oluşturulur)" + saved: "Etiket ayarları kaydedildi" + no_synonyms: "Bu etiket için tanımlanmış eşanlamlı yoktur." + add_synonym_placeholder: "Eşanlamlı olarak eklemek için etiketleri arayın..." synonyms_subtitle: "Aşağıdaki etiketler kullanıldığında %{name}ile değiştirilir" + save: "Etiketi kaydet" + delete: "Etiketi sil" + synonyms_hint: "Yukarıdaki etiketler kullanıldığında, %{baseTagName} ile değiştirilecektir." + add_synonyms_confirm: "Şu anda %{synonymNames} kullanan tüm yerler %{tagName} kullanacak şekilde değiştirilecektir. Bu değişikliği yapmak istediğinizden emin misiniz?" localization: + hint: "Farklı dillerdeki kullanıcılara farklı etiket adları göstermek için yerelleştirmeler ekleyin." locale: "Yerel Ayar" name: "Ad" description: "Açıklama" + add: "Yerelleştirme Ekle" + remove: "Yerelleştirmeyi Kaldır" sort_by: "Sıralama ölçütü:" sort_by_count: "sayı" sort_by_name: "ad" @@ -4693,7 +5115,15 @@ tr_TR: upload_description: "Etiketleri toplu olarak oluşturmak için bir csv dosyası yükleyin" upload_instructions: "Satır başına bir tane, isteğe bağlı olarak \"tag_name,tag_group\" biçiminde bir etiket grubu ile." upload_successful: "Etiketler başarıyla yüklendi" + bulk_create_inline_placeholder: "Etiketler oluşturun (virgülle ayrılmış)" bulk_create_button: "Oluştur" + bulk_create_success: + one: "%{count} etiket oluşturuldu:" + other: "%{count} etiket oluşturuldu:" + bulk_create_already_exist: + one: "%{count} etiket zaten var:" + other: "%{count} etiket zaten var:" + bulk_create_some_failed: "Bazı etiketler oluşturulamadı:" delete_unused_confirmation: one: "%{count} etiket silinecek: %{tags}" other: "%{count} etiket silinecek: %{tags}" @@ -4727,13 +5157,18 @@ tr_TR: description: "Bu etikete sahip yeni konular hakkında bildirim almayacaksınız ve okunmamış sekmenizde görünmeyecekler." groups: back_btn: "Tüm etiketlere dön" + title: "Etiket grupları" about_heading: "Bir etiket grubu seçin veya yeni bir tane oluşturun" about_heading_empty: "Başlamak için yeni bir etiket grubu oluşturun" about_description: "Etiket grupları, birçok etiket için izinleri tek bir yerden yönetmenize yardımcı olur." + new: "Yeni grup" + new_title: "Yeni grup oluştur" + edit_title: "Etiket grubunu düzenle" tags_label: "Bu gruptaki etiketler" parent_tag_label: "Üst etiket" parent_tag_description: "Bu gruptaki etiketler yalnızca üst etiket mevcutsa kullanılabilir." one_per_topic_label: "Bu gruptan konu başına bir etiketle sınırlandırın" + new_name: "Yeni etiket grubu" name_placeholder: "Ad" save: "Kaydet" delete: "Sil" @@ -4775,6 +5210,7 @@ tr_TR: safe_mode: enabled: "Güvenli mod etkin, güvenli moddan çıkmak için bu tarayıcı penceresini kapatın" theme_preview_notice: "Şu anda bir temayı ön izliyorsunuz, normal site yapılandırmanıza dönmek için bu tarayıcı sekmesini veya penceresini kapatın." + theme_preview_failed: "Tema mevcut olmadığı veya erişim izniniz olmadığı için önizleme yapılamadı." image_removed: "(görüntü kaldırıldı)" pause_notifications: title: "Bildirimleri şu süreyle duraklat…" @@ -4844,6 +5280,7 @@ tr_TR: tags_form_modal: title: "Etiketlerde gezinmeyi düzenle" filter_placeholder: "Etiketleri filtrele" + no_tags: "Mevcut filtrelerle eşleşen etiket bulunamadı." subtitle: text: "ve bu sitenin en popüler etiketlerini otomatik olarak gösteririz" edit_navigation_modal_form: @@ -4924,6 +5361,9 @@ tr_TR: click_to_get_started: "Başlamak için buraya tıklayın." header_link_text: "Kategoriler" header_action_title: "Kenar çubuğu kategorilerinizi düzenleyin" + header_action_new: "Yeni kategori" + header_action_edit_sidebar: "Kenar çubuğu kategorilerini düzenle" + header_action_edit_header_dropdown: "Navigasyon kategorilerini düzenle" configure_defaults: "Varsayılanları yapılandır" community: edit_section: @@ -4995,6 +5435,8 @@ tr_TR: light: "Açık" dark: "Koyu" auto: "Otomatik" + title: "Renk modu" + aria_label: "Renk modu, şu anda %{mode}" welcome_topic_banner: title: "Karşılama Konunuzu oluşturun" description: "Karşılama konunuz, yeni üyelerin okuyacağı ilk şeydir. Bunu “asansör konuşmanız” veya “hedef tanımınız” olarak düşünün. Herkese bu topluluğun kimler için olduğunu, burada ne bulmayı bekleyebileceklerini ve önce ne yapmalarını istediğinizi açıklayın." @@ -5170,9 +5612,19 @@ tr_TR: bookmarks: "Yer imi eklediğiniz %{category} kategorisindeki etiketsiz konular" default: "%{category} kategorisindeki etiketsiz %{filter} konuları" categories: "Tüm kategoriler" + content_localization: + toggle_localized: + translated: "Sayfa makine tarafından çevrilmiştir. Orijinali görüntülemek için tıklayın." + not_translated: "Sayfa çevrilmedi. Çevirmek için tıklayın." + translations_enabled: "Çeviriler etkinleştirildi" + translations_disabled: "Çeviriler devre dışı bırakıldı" + language_switcher: + title: "Site dilini değiştir" admin_js: type_to_filter: "Filtrelemek için yazın…" settings: "Ayarlar" + reset_filter: "Filtreyi sıfırla" + toggle_filters: "Açılır filtreleri değiştir" admin: title: "Discourse Yöneticisi" moderator: "Moderatör" @@ -5187,11 +5639,13 @@ tr_TR: title: "Mevcut raporlar listesi" sidebar_title: "Raporlar" back: "Tüm raporlara geri dön" + group_engagement: "Taahhüt" group_traffic: "Trafik" group_members: "Üyeler" - group_moderation: "Moderasyon" - group_security: "Güvenlik" + group_content: "İçerik ve Sağlık" + group_moderation_and_security: "Moderasyon ve Güvenlik" group_other: "Diğer" + legacy_warning: "Bu eski bir rapordur. Yakında kullanımdan kaldırılacaktır. Yenisini bulmak için yardıma ihtiyacınız varsa destek ekibiyle iletişime geçin." config_sections: account: title: "Hesap" @@ -5211,27 +5665,73 @@ tr_TR: title: "Gelişmiş" upcoming_changes: name: "Ad" + plugin: "Eklenti" + metadata: "Meta veri" enabled: "Etkin mi" + enabled_for: "Şunlar için etkinleştirildi..." + show_image: "Görüntüyü göster" + edit_groups: "Katılım gruplarını düzenle" + groups_updated: "Gruplar güncellendi!" + save_groups: "Grupları kaydet" + add_groups_to_enable: "Bu özelliği etkinleştirmek için gruplar ekleyin" + no_changes_to_save: "Kaydedilecek değişiklik yok" select_groups: "Grupları seç…" + opt_in_groups: "Katılımcı gruplar" + show_related_settings: "İlgili ayarları göster..." + opt_in_groups_instructions: "Opt-in grupları, belirli bir kullanıcı grubunun bir değişikliği herkese yayınlanmadan önce test etmesine izin vermek için kullanılabilir. Bir değişiklik Kararlı durumuna geçtiğinde bu grupların artık geçerli olmayacağını unutmayın." + enabled_for_throttle: "Bu değişikliğin kimler için etkinleştirileceğini çok hızlı bir şekilde değiştirdiniz. Lütfen birkaç saniye bekleyin ve tekrar deneyin." + change_enabled_for_success: "Bu değişikliği %{enabledFor} için etkinleştirdiniz." + change_disabled: "Bu değişikliği reddetmiş bulunuyorsunuz." + permanent_notice: "Bu değişiklik artık kalıcıdır ve yakında kaldırılacaktır. Artık bu seçeneği devre dışı bırakamazsınız." + permanent_soon_notice: "Bu değişiklik yakında kalıcı hale gelecektir. Artık bu seçeneği devre dışı bırakamayacaksınız." + permanent_no_group_selection: "Yok, kalıcı değişiklikler tüm gruplar için geçerlidir." + no_changes: "Şu anda yaklaşan bir değişiklik yoktur." preview: "Ön izle" enabled_for_options: + no_one: "Hiç kimse" everyone: "Herkes" + staff: "yalnızca %{staffGroupName}" + specific_groups: "Belirli grup(lar)" + specific_groups_with_group_names: + one: "%{groupNames} grubu" + other: "gruplar %{groupNames}" statuses: experimental: "Deneysel" + alpha: "Alfa" + beta: "Beta" + stable: "Stabil" + permanent: "Kalıcı" impact_roles: admins: "Yöneticiler" moderators: "Moderatörler" staff: "Personel" + all_members: "Tüm Üyeler" + developers: "Geliştiriciler" filter: + search_placeholder: "Ad, açıklama veya eklentiye göre filtrele..." + no_results: "Yaklaşan değişiklikler filtrelerinize uymuyor" all: "Tümü" + enabled_all: "Tüm etkin durumlar" enabled: "Etkin mi" + enabled_for_staff: "%{staffGroupName} için etkinleştirildi" + enabled_for_specific_groups: "Belirli gruplar için etkinleştirildi" disabled: "Devre Dışı" + impact_type_all: "Tüm darbe türleri" impact_type_feature: "Özellik" impact_type_other: "Diğer" + status_all: "Tüm durumlar" + status_conceptual: "Kavramsal" status_experimental: "Deneysel" + status_alpha: "Alfa" + status_beta: "Beta" + status_stable: "Stabil" + status_permanent: "Kalıcı" + impact_role_all: "Tüm etki rolleri" impact_role_admins: "Yöneticiler" impact_role_moderators: "Moderatörler" impact_role_staff: "Personel" + impact_role_all_members: "Tüm üyeler" + impact_role_developers: "Geliştiriciler" config: about: title: "Siteniz hakkında" @@ -5262,17 +5762,32 @@ tr_TR: title: "Yerelleştirme" header_description: "Topluluğunuzun arayüz dilini ve üyeleriniz için diğer yerelleştirme seçeneklerini yapılandırın" keywords: "yerel|dil|zaman dilimi|unicode|ltr" + upcoming_changes: + title: "Yaklaşan değişiklikler" + header_description: "Sitenizi etkileyebilecek Discourse'da yapılacak değişikliklerin listesi ve katılabileceğiniz deneysel özellikler. Etki, tür ve duruma göre filtreleyebilirsiniz.\n\nKatılım grupları, belirli bir kullanıcı grubunun bir değişikliği herkese sunulmadan önce test etmesine olanak sağlamak için kullanılabilir, ancak bu gruplar değişiklik Kalıcı duruma geçtiğinde artık geçerli olmayacaktır." login: title: "Giriş ve kimlik doğrulama" header_description: "Kullanıcıların oturum açma ve kimlik doğrulama yöntemlerini, gizli dizileri ve anahtarları, OAuth2 sağlayıcılarını ve daha fazlasını yapılandırın" sub_pages: common_settings: title: "Ayarlar" + authenticators: + title: "Sosyal medya hesaplarıyla giriş" + discourseconnect: + title: "Discourse Connect" discourse_id: title: "Discourse kimliği" discourse_id: title: "Discourse kimliği" + stats: + total_users: "Toplam kullanıcı sayısı" + signups_30_days: "Kayıtlar (30 gün)" + logins_30_days: "Girişler (30 gün)" + regenerate_credentials: "Kimlik bilgilerini yeniden oluştur" + regenerate_confirm: "Discourse ID kimlik bilgilerinizi yeniden oluşturmak istediğinizden emin misiniz? Bu işlem yeni bir istemci gizli anahtarı oluşturacaktır. Kimlik bilgilerinin yeniden oluşturulması normalde gerekli değildir, ancak güvenliği artırmak için yararlı olabilir." + description: "Discourse ID, kullanıcıların tek bir hesapla birden fazla Discourse sitesine giriş yapabilmelerini sağlayan tek oturum açma hizmetidir. Google, Facebook, Apple ve Github gibi yaygın sosyal oturum açma sağlayıcıları ek yapılandırma gerektirmeden desteklenir." learn_more: "Daha fazla bilgi edin" + regenerate_success: "Kimlik bilgileri başarıyla yeniden oluşturuldu." logo: title: "Logo" header_description: "Sitenizde kullanılan logoları ve simgeleri yapılandırın" @@ -5288,6 +5803,7 @@ tr_TR: help_text: "Önerilen boyut 600 x 80 pikseldir." large_icon: title: "Kare simge" + description: "Logo görüntüsünün kare versiyonu sitenin üst kısmında görünür ve aynı zamanda mobil uygulama logosu olarak da kullanılır." help_text: "Önerilen boyut 512 x 512 pikseldir." square_icon_dark: required: "Koyu mod için farklı bir kare simge kullanılsın mı?" @@ -5359,24 +5875,61 @@ tr_TR: modal_yes: "Evet" modal_no: "Hayır, sadece ileriye dönük olarak uygula" welcome_banner: + title: "Hoş geldiniz afişi" + header_description: "Sitenizi ziyaret eden kullanıcılara gösterilen arama çubuğu içeren banner'ı yapılandırın." + saved: "Hoş geldiniz afişi ayarları başarıyla kaydedildi." form: + enabled_themes: + label: "Temalarda etkinleştirildi..." + description: "Banner'ın hangi temalarda görüntüleneceğini seçin. Yalnızca etkin temalar gösterilir." + select_label: "Temaları seçin" + background_image: + label: "Arka plan görüntüsü" + description: "Bu resim, banner metninin arkasında görüntülenecektir." text_color: label: "Metin rengi" + description: "Yukarıdaki 'Arka plan resmi' yüklendiğinde, banner metin rengini okunabilirliğini korumak için bu ayarı kullanın. Boş bırakıldığında veya arka plan resmi yüklenmediğinde, aktif tema rengi kontrol eder." page_visibility: + label: "Sayfa görünürlüğü" + description: "Banner'ın nerede görüntüleneceğini seçin." options: top_menu_pages: "Üst menü sayfaları" + homepage: "Yalnızca ana sayfa" + discovery: "Keşif sayfaları" all_pages: "Tüm sayfalar" location: label: "Konum" + description: "Banner'ın sayfada nerede görüneceğini seçin." options: above_topic_content: "Yukarıdaki konu içeriği" below_site_header: "Aşağıdaki site başlığı" text_section: + title: "Özelleştirilebilir metin" locale_label: "Dil" + header_new_members: + label: "Yeni üyeler için başlık" + description: "Kullanılabilir değişkenler: %{site_name}, %{preferred_display_name}" + placeholder: "Hoş geldiniz, %{preferred_display_name}!" header_logged_in: + label: "Giriş yapmış üyeler için başlık" + description: "Kullanılabilir değişkenler: %{site_name}, %{preferred_display_name}" placeholder: "Tekrar hoş geldiniz %{preferred_display_name}!" header_anonymous: + label: "Anonim ziyaretçiler için başlık" + description: "Kullanılabilir değişken: %{site_name}" placeholder: "%{site_name}'a hoş geldiniz!" + subheader_logged_in: + label: "Giriş yapmış üyeler için alt başlık" + description: "Giriş yapmış kullanıcılar için başlığın altında gösterilen ikincil metin." + placeholder: "Topluluktaki yenilikleri inceleyin" + subheader_anonymous: + label: "Anonim ziyaretçiler için alt başlık" + description: "Anonim ziyaretçiler için başlığın altında gösterilen ikincil metin." + placeholder: "Tartışmalara katılmak için topluluğumuza katılın" + search_placeholder: + label: "Arama yer tutucusu" + description: "Hoş geldiniz bannerındaki arama kutusu için yer tutucu metin." + placeholder: "Konuları ara..." navigation: title: "Gezinme" header_description: "Siteniz için gezinme bağlantılarını ve menü ögelerini yapılandırın. Bu, birincil gezinme menüsünün konumunu ve davranışını, ana sayfanın üst kısmındaki hızlı bağlantıları ve yönetici kenar çubuğunu içerir" @@ -5571,6 +6124,9 @@ tr_TR: embedding: title: "Gömme" header_description: "Discourse, IFRAME oluşturan bir Javascript API'si kullanarak bir konudaki yorumları uzak bir siteye yerleştirme yeteneğine sahiptir" + form_templates: + title: "Form şablonları" + header_description: "Form şablonları, konu oluşturma akışının bir parçası olarak veri doğrulamalı yapılandırılmış bir form uygulamanıza olanak tanır." theme_site_settings: setting: "Ayar" overridden_by: "Geçersiz kılan:" @@ -5579,6 +6135,9 @@ tr_TR: select_setting: "Güncel tema değerlerine bakmak için bir site ayarı seçin" add: "Tema sitesi ayarlarına git" help: "Şu anda kullandığınız tema: %{currentTheme}. Tema site ayarlarını değiştirmek için tema yapılandırma sayfasına gidin veya ayarlarını düzenlemek için aşağıdaki tabloda bağlantılı bir temaya tıklayın." + filter: "Filtre tema site ayarlarını ad, açıklama veya tema adı ile filtreleyin..." + filter_no_results: "Filtreye uyan tema sitesi ayarı bulunamadı" + site_setting_warning: 'Bu ayar, sitenizin varsayılan teması (%{defaultThemeName}) tarafından yönetilir. Bu ayarı temanın düzenleme sayfasından değiştirebilirsiniz.' search: modal_title: "Yöneticide her şeyi arayın" title: "Ara" @@ -5610,6 +6169,8 @@ tr_TR: new_features: title: "Yenilikler" subtitle: "Sürekli olarak yeni özellikler ve geliştirmeler yayınlıyoruz. Bu sayfa önemli noktaları kapsıyor, ancak kapsamlı sürüm notlarını görmek için \"Daha fazla bilgi edinin\" seçeneğine tıklayabilirsiniz." + no_new_features_found: "Feed'de hiçbir öğe bulunmuyor veya seçtiğiniz filtre hiçbir sonuç vermedi. Önceki yeni özellik duyurularını Discourse Meta topluluğunda görebilirsiniz." + no_new_features_error: "Feed yüklenirken bir hata oluştu. Önceki yeni özellik duyurularını Discourse Meta topluluğunda görebilirsiniz." learn_more: "Daha fazla bilgi edinin..." last_checked: "Son kontrol" refresh_problems: "Yenile" @@ -5673,10 +6234,12 @@ tr_TR: all: "Tümü" view_table: "tablo" view_graph: "grafik" - refresh_report: "Raporu Yenile" + refresh_report: "Yenile" daily: Günlük monthly: Aylık weekly: Haftalık + chart_group_period: "Bir dönem seçin" + value_so_far: "%{value} (şimdiye kadar)" dates: "Tarihler (UTC)" groups: "Tüm gruplar" disabled: "Bu rapor devre dışı" @@ -5687,7 +6250,9 @@ tr_TR: trending_search: more: 'Arama günlükleri' disabled: 'Trend olan arama raporu devre dışı bırakıldı. Veri toplamak için günlük arama sorgularını etkinleştirin.' + average_chart_label: Toplamları değil, ortalamaları göster sort_button: "%{column} kriterine göre sırala" + sort_button_current: "%{column}, %{direction} ile sıralanmış" sort_ascending: "artan" sort_descending: "azalan" filters: @@ -5793,6 +6358,7 @@ tr_TR: cancel: "İptal et" continue: "Devam et" copy_key: "Kopyala" + key_copied_to_clipboard: "API anahtarı panoya kopyalandı" back: "API anahtarlarına geri dön" revoke: "Geri çek" undo_revoke: "İptal işlemini geri al" @@ -5860,6 +6426,7 @@ tr_TR: recover: Bir konuyu kurtarın. read_lists: En iyi, yeni, en son vb. gibi konu listelerini okuyun. RSS de desteklenir. status: "Bir konunun durumunu güncelleyin. Durum: kapalı, arşiv, görünür, sabitlenmiş. Etkin: true, false. Yalnızca o kategorideki konuların durum değişikliklerine izin vermek için burada ve request içeriğinde bir category_id belirtin." + change_owner: Bir konudaki gönderilerin sahipliğini değiştirin. posts: edit: Herhangi bir gönderiyi veya belirli bir gönderiyi düzenleyin. delete: Bir gönderi silin. @@ -5892,6 +6459,7 @@ tr_TR: suspend: Kullanıcı hesaplarını askıya alın. delete: Kullanıcı hesaplarını silin. list: Kullanıcıların bir listesini alın. + create: Yeni bir kullanıcı oluşturun. user_status: read: Kullanıcı durumunu okuyun. update: Kullanıcı durumunu güncelleyin. @@ -5995,6 +6563,7 @@ tr_TR: user_destroyed: "Kullanıcı silindi" user_suspended: "Kullanıcı askıya alındı" user_unsuspended: "Kullanıcı askıya alınma durumu kaldırıldı" + user_anonymized: "Kullanıcı anonimleştirildi" reviewable_event: group_name: "İncelenebilir Olaylar" reviewable_created: "İncelenebilir öge hazır" @@ -6227,8 +6796,10 @@ tr_TR: install: "Yükle" theme_site_settings: title: "Tema site ayarları" + description: "Temaların, temel site ayarlarının küçük bir alt kümesini geçersiz kılarak tüm site deneyimi üzerinde daha fazla kontrol sahibi olmasını sağlayan ayarlar." themes: title: "Temalar" + description: "Sitenizin genel görünümünü ve hissini tüm kullanıcılar için değiştiren site genelinde geçerli temalar." themes_intro: "Başlamak için yeni bir tema yükleyin veya bu kaynakları kullanarak sıfırdan kendi temanızı oluşturun." new_theme: "Yeni tema" back: "Temalara geri dön" @@ -6294,6 +6865,8 @@ tr_TR: title: "Renk seçenekleri" toggle: "Kullanıcı tarafından seçilebilir" toggle_description: "Renk paleti, kullanıcılar tarafından seçilebilir" + toggle_default_light_on_theme: "Renk paleti, varsayılan temadaki (%{themeName}) varsayılan açık renk paletidir." + toggle_default_dark_on_theme: "Renk paleti, varsayılan temadaki varsayılan koyu palettir (%{themeName})." colors: title: "Renkler" save_changes: "Değişiklikleri kaydet" @@ -6384,6 +6957,7 @@ tr_TR: confirm: "Bu yedeklemeyi yok etmek istediğinizden emin misiniz?" restore: is_disabled: "Geri yükleme şu anda devre dışı. Etkinleştirmek için site ayarlarını ziyaret edin." + is_disabled_title: "Geri yükleme şu anda devre dışıdır. Etkinleştirmek için site ayarlarında “geri yüklemeye izin ver” seçeneğini arayın." label: "Geri Yükle" title: "Yedeklemeyi geri yükle" confirm: "Bu yedeklemeyi geri yüklemek istediğinizden emin misiniz?" @@ -6426,20 +7000,27 @@ tr_TR: delete: "Sil" delete_confirm: '"%{theme_name}" adlı temayı silmek istediğinizden emin misiniz?' bulk_delete: "Emin misiniz?" + bulk_themes_delete_confirm: "Bu işlem aşağıdaki temaları kaldıracak ve sitenizdeki hiçbir kullanıcı tarafından artık kullanılamayacaklardır:" + bulk_components_delete_confirm: "Bu işlem aşağıdaki bileşenleri kaldıracak ve artık sitenizdeki hiçbir kullanıcı tarafından kullanılamayacaktır:" color: "Renk" opacity: "Opaklık" copy: "Eş Kopya" copy_to_clipboard: "Panoya kopyala" copied_to_clipboard: "Panoya Kopyalandı" copy_to_clipboard_error: "Veriler Panoya kopyalanırken hata oluştu" + theme_owner: "Sahibi:" email_templates: title: "E-posta" subject: "Konu" multiple_subjects: "Bu e-posta şablonunda birden fazla konu mevcut." + multiple_bodies: "Bu e-posta şablonu birden fazla gövdeye sahiptir." body: "Gövde" revert: "Değişiklikleri Geri Al" revert_confirm: "Değişikliklerinizi geri almak istediğinizden emin misiniz?" + search_templates: "Şablon adına göre filtrele..." + no_templates_found: "Filtrelerinize uyan şablon bulunamadı." edit: "Düzenle" + back: "Şablonlara geri dön" component: all_filter: "Tümü" used_filter: "Kullanılmış" @@ -6474,6 +7055,8 @@ tr_TR: create_name: "Ad" save: "Kaydet" long_title: "Sitenizin renklerini, CSS ve HTML içeriğini değiştirin" + dark_mode: "%{themeName} karanlık mod" + light_mode: "%{themeName} açık mod" edit: "Düzenle" edit_confirm: "Bu uzak bir temadır, CSS/HTML'yi düzenlerseniz temayı bir dahaki sefere güncellemeniz için değişiklikleriniz silinir." update_confirm: "Bu yerel değişiklikler güncelleme ile silinecek. Devam etmek istediğinizden emin misiniz?" @@ -6501,6 +7084,7 @@ tr_TR: default_light_scheme: "Açık (varsayılan)" color_scheme_select: "Tema tarafından kullanılacak renkleri seçin." dark_color_scheme_select: "Koyu modda tema tarafından kullanılacak renkleri seçin." + edit_colors: "Renkleri düzenle" custom_sections: "Özel bölümler:" theme_components: "Tema Bileşenleri" add_all_themes: "Tüm temaları ekle" @@ -6512,10 +7096,12 @@ tr_TR: convert_theme_alert_generic: "Bu temayı bileşene dönüştürmek istediğinizden emin misiniz?" convert_theme_tooltip: "Bu temayı bileşene dönüştür" inactive_themes: "Etkin olmayan temalar:" + set_default_theme: "Varsayılan olarak ayarla" default_theme: "Varsayılan tema" set_default_success: "Varsayılan tema %{theme} olarak ayarlandı" setting_was_saved: "Tema ayarı kaydedildi" install_success: "%{theme} başarıyla yüklendi!" + delete_success: "%{theme} başarıyla silindi!" inactive_components: "Kullanılmayan bileşenler:" selected: one: "%{count} tane seçildi" @@ -6688,12 +7274,16 @@ tr_TR: select_base: title: "Temel renk paletini seçin" description: "Temel palet:" + non_default_theme_warning: "Tema için kişisel tercihleriniz varsayılanlardan farklıdır. Burada yaptığınız değişiklikler size uygulanmayabilir, ancak varsayılanı (%{themeName}) kullanan herkese uygulanacaktır." + custom_schemes_warning: "%{colorModes} renk paleti için kişisel tercihleriniz varsayılan ayarlardan farklıdır. %{colorModes} paletinde yapılan değişiklikler sizin için geçerli olmayabilir, ancak varsayılan ayarları kullanan herkes için geçerli olacaktır." light: "açık" dark: "koyu" title: "Renkler" edit: "Düzenle" + view: "Görüntüle" set_default_light: "Varsayılan temada açık renk paleti olarak ayarla (%{theme})" set_default_dark: "Varsayılan temada koyu renk paleti olarak ayarla (%{theme})" + set_default_success: "%{schemeName} %{themeName} için varsayılan palet olarak ayarlandı" saved_refreshing: "Kaydedildi! Renkler yenileniyor..." from_theme: "Temadan: %{name}" filters: @@ -6703,7 +7293,12 @@ tr_TR: from_theme: "Temadan" no_results: "Renk paleti bulunamadı" default_light_badge: + text: "Varsayılan ışık" + title: "Varsayılan ışık renk paleti" reset: "Filtreleri sıfırla" + default_dark_badge: + text: "Varsayılan koyu renk" + title: "Varsayılan koyu renk paleti" system_palette: "Bu yerleşik bir renk paleti; düzenlenemez veya silinemez." back_to_colors: "Renk paletlerine geri dön" long_title: "Renk paletleri" @@ -7023,6 +7618,12 @@ tr_TR: tag_group_change: "etiket grubunu değiştir" delete_associated_accounts: "ilişkili hesapları sil" change_theme_site_setting: "tema site ayarını değiştirin" + stop_impersonating: "kişiyi taklit etmeyi bırak" + upcoming_change_toggled: "yaklaşan değişiklik etkinleştirildi" + upcoming_change_available: "yakında değişiklik mevcut" + change_site_setting_groups: "site ayar gruplarını değiştir" + discourse_id_regenerate_credentials: "Discourse ID kimlik bilgilerini yeniden oluştur" + configure_category_type: "kategori türünü yapılandır" screened_emails: title: "Taranan e-postalar" description: "Biri yeni bir hesap oluşturmaya çalıştığında, aşağıdaki e-posta adresleri kontrol edilir ve kayıt engellenir veya başka bir işlem gerçekleştirilir." @@ -7077,6 +7678,7 @@ tr_TR: clear_all: Tümünü temizle clear_all_confirm: "%{action} eylemi için izlenen tüm kelimeleri temizlemek istediğinizden emin misiniz?" invalid_regex: '"%{word}" izlenen kelimesi geçersiz bir normal ifade.' + invalid_regex_multiple: "Geçersiz Düzenli İfadeler:" regex_warning: 'İzlenen kelimeler düzenli ifadeler ve otomatik olarak kelime sınırlarını içermiyorlar. İfadenin tam kelimelerle eşleşmesini istiyorsanız ifadenizin başına ve sonuna \b ekleyin.' actions: block: "Engelle" @@ -7109,6 +7711,7 @@ tr_TR: success: "Başarılı" exists: "Zaten mevcut" upload: "Dosyadan ekle" + upload_successful: "Yükleme başarılı. Kelimeler kısa süre içinde işlenecektir." case_sensitivity_label: "büyük/küçük harfe duyarlı" case_sensitivity_description: "Sadece eşleşen karakter muhafazası olan kelimeler" html_label: "HTML" @@ -7159,6 +7762,7 @@ tr_TR: upload: "Dosya yükle" multiselect: "Çoktan seçmeli" tagchooser: "Etiket Grubu seçici" + composer: "Markdown yanıtı" validations_modal: button_title: "Doğrulamalar" modal_title: "Doğrulama Seçenekleri" @@ -7200,7 +7804,10 @@ tr_TR: second: "Seçenek 2" third: "Seçenek 3" edit_category: + toggle_freeform: "Form şablonu devre dışı bırakıldı" + toggle_form_template: "Form şablonu etkinleştirildi" select_template: "Form şablonları seçin" + select_template_help: "Form şablonları ekle/düzenle" errors: multiple_tags_not_allowed: '"%{tag_name}" etiketinden daha fazla etiket seçemezsiniz. Sorunları önlemek için Form Şablonu kullanın' impersonate: @@ -7208,6 +7815,7 @@ tr_TR: help: "Hata ayıklama amacıyla bir kullanıcı hesabının kimliğine bürünmek için bu aracı kullanın. Bittiğinde oturumu kapatmanız gerekecek." not_found: "Kullanıcı bulunamadı." invalid: "Üzgünüz, o kullanıcının kimliğine bürünemezsiniz." + error: "Oops. Beklenmedik bir hata oluştu." users: title: "Kullanıcılar" description: "Kullanıcıları görüntüleyin ve yönetin." @@ -7316,6 +7924,17 @@ tr_TR: penalty_post_actions: "İlişkili gönderiyle ne yapmak istiyorsunuz?" penalty_post_delete: "Gönderiyi sil" penalty_post_delete_replies: "Gönderiyi ve tüm yanıtları silin" + penalty_post_delete_all: "Kullanıcı tarafından oluşturulan tüm konuları + tüm yanıtları sil" + penalty_post_delete_all_confirmation_MF: | + Bu işlem + { TOPICS, plural, + one {# topic} + other {# topics} + } ve + { REPLIES, plural, + one {# reply} + other {# replies} + } öğelerini silecektir. Bu işlem geri alınamaz! Bunu yapmak istediğinizden emin misiniz? penalty_post_edit: "Gönderiyi düzenleyin" penalty_post_none: "Hiçbir şey yapma" penalty_count: "Ceza Sayısı" @@ -7373,6 +7992,11 @@ tr_TR: approve_bulk_success: "Başarılı! Seçilen tüm kullanıcılar onaylandı ve bilgilendirildi." time_read: "Okuma Zamanı" post_edits_count: "Gönderi Düzenlemeleri" + upcoming_changes: + title: "Kullanıcı yaklaşan değişiklikler" + description: "Grupları değiştirmek veya yaklaşan değişiklikleri etkinleştirmek veya devre dışı bırakmak için lütfen yaklaşan değişiklikler yapılandırma sayfası'nı ziyaret edin." + filter_placeholder: "Yaklaşan değişiklikleri ada veya açıklamaya göre filtrele" + filter_no_results: "Yakında yapılacak değişiklik bulunamadı" exports: title: Kullanıcı dışa aktarmaları download: @@ -7397,6 +8021,9 @@ tr_TR: button: "Tüm gönderileri sil" progress: title: "Gönderileri silme ilerleme durumu" + description: + one: "@%{username} tarafından yazılan %{count} gönderi siliniyor..." + other: "@%{username} tarafından yazılan %{count} gönderi siliniyor..." confirmation: title: "@%{username} tarafından gönderilen tüm gönderileri sil" description: | @@ -7408,6 +8035,7 @@ tr_TR: text: "@%{username} adlı kullanıcının gönderilerini sil" delete: "@%{username} adlı kullanıcının gönderilerini sil" cancel: "İptal et" + all_enqueued: "@%{username}'nın tüm gönderileri silinmek üzere sıraya alınmıştır." merge: button: "Birleştir" prompt: @@ -7434,6 +8062,8 @@ tr_TR: cancel: "İptal et" merging_user: "Kullanıcı birleştiriliyor…" merge_failed: "Kullanıcılar birleştirilirken bir hata oluştu." + delete_forbidden_because_admin: "Yöneticiler silinemez." + delete_posts_forbidden_because_admin: "Yöneticilerin tüm gönderilerini silinemiyor." delete_forbidden: one: "Gönderileri olan kullanıcılar silinemez. Bir kullanıcıyı silmeye çalışmadan önce tüm gönderileri silin. (%{count} günden eski gönderiler silinemez.)" other: "Gönderileri olan kullanıcılar silinemez. Bir kullanıcıyı silmeye çalışmadan önce tüm gönderileri silin. (%{count} günden eski gönderiler silinemez.)" @@ -7580,6 +8210,10 @@ tr_TR: title: "Kullanıcı kartında göster" enabled: "Kullanıcı kartında gösterilir" disabled: "Kullanıcı kartında gösterilmez" + show_on_signup: + title: "Kayıt formunda göster" + enabled: "Gösterilen kayıt formu" + disabled: "Kayıt formunda gösterilmiyor" searchable: title: "Aranabilir" enabled: "Aranabilir" @@ -7608,6 +8242,9 @@ tr_TR: more_than_50_results: "50'den fazla sonuç var. Lütfen aramanızı daraltın." no_results: "Eşleşen site metni yok" interpolation_keys: "Mevcut enterpolasyon tuşları:" + interpolation_key_insert: "Eklemek için tıklayın" + interpolation_key_used: "Zaten kullanılmış" + interpolation_key_invalid: "Bilinmeyen anahtar — enterpolasyon yapılmayacaktır" outdated: title: "Bu çeviri güncel değil" description: "Bu anahtar için varsayılan çeviri, bu geçersiz kılma oluşturulduktan sonra değişti. Lütfen aşağıdan çevirinizin orijinal amaçta yapılan değişikliklerle eşleşip eşleşmediğini kontrol edin." @@ -7655,6 +8292,9 @@ tr_TR: label: "Yükle" title: "Görüntü yükle" download_file: "İndir" + upload_restrictions: + extensions: "Kabul Edilenler: %{extensions}" + max_size: "Maksimum: %{size}" selectable_avatars: title: "Kullanıcıların seçebileceği avatarların listesi" table_column_heading: @@ -7693,6 +8333,7 @@ tr_TR: experimental: "Deneysel" secret_list: invalid_input: "Girdi alanları boş olamaz veya dikey çubuk karakteri içeremez." + already_exists: "%{key} girişi zaten mevcut." default_categories: modal_description: one: "Bu değişikliği tarihsel olarak uygulamak ister misiniz? Bu, %{count} mevcut kullanıcının tercihlerini değiştirir." @@ -7717,13 +8358,23 @@ tr_TR: prompt: "Bu ayarı değiştirmenin siteniz için geniş kapsamlı veya istenmeyen sonuçları olabilir. Devam etmek istediğinizden emin misiniz?" confirm: "Evet, eminim" min_password_length: + prompt: "Şifre politikanızı değiştirmek üzeresiniz. Bu, bundan sonra şifrelerini değiştiren tüm kullanıcıları etkileyecektir. Devam etmek istediğinizden emin misiniz?" confirm: "Evet, şifre politikasını güncelle" min_admin_password_length: + prompt: "Şifre politikanızı değiştirmek üzeresiniz. Bu, bundan sonra şifrelerini değiştiren tüm yöneticileri etkileyecektir. Devam etmek istediğinizden emin misiniz?" confirm: "Evet, şifre politikasını güncelle" - password_unique_charactes: + password_unique_characters: + prompt: "Şifre politikanızı değiştirmek üzeresiniz. Bu, bundan sonra şifrelerini değiştiren tüm kullanıcıları etkileyecektir. Devam etmek istediğinizden emin misiniz?" confirm: "Evet, şifre politikasını güncelle" block_common_passwords: + prompt: "Şifre politikanızı değiştirmek üzeresiniz. Bu, bundan sonra şifrelerini değiştiren tüm kullanıcıları etkileyecektir. Devam etmek istediğinizden emin misiniz?" confirm: "Evet, şifre politikasını güncelle" + clean_up_inactive_users_after_days: + prompt: "Bu değeri 0 dışında bir değere ayarlamak, o kadar gün boyunca aktif olmayan kullanıcıların kalıcı olarak silinmesine neden olacaktır. Devam etmek istediğinizden emin misiniz?" + confirm: "Evet, bu değeri 0 olarak ayarlamadığım sürece, aktif olmayan kullanıcıların kalıcı olarak silineceğini anlıyorum." + job_status: + completed: "Güncelleme tamamlandı" + enqueued: "Güncelleme devam ediyor" badges: status: Durum title: Rozetler @@ -7757,7 +8408,10 @@ tr_TR: no_user_badges: "%{name} adlı kullanıcıya hiç rozet verilmedi." no_badges: Verilebilecek rozet yok. none_selected: "Başlamak için bir rozet seçin" + filter_placeholder: "Rozetleri filtrele..." + no_badges_found: "Rozet bulunamadı" sections: + design: Tasarım query: Sorgu settings: Ayarlar usage_heading: Kullanım @@ -7860,6 +8514,7 @@ tr_TR: category: "Kategoride yayınla" tags: "Konu etiketleri" post_author: "Gönderi yazarı" + post_author_description: "Bu ana bilgisayardaki tüm gömülü konuların yazarı, blog sayfası meta etiketlerini geçersiz kılar. Sayfanın veya etiketlerinden yazarı okumak için boş bırakın." post_author_with_default: "Gönderi yazarı (varsayılan olarak %{author})" add_host: "Sunucu ekle" posts_and_topics: "Gönderiler ve konu yapılandırması" diff --git a/config/locales/client.ug.yml b/config/locales/client.ug.yml index cbad2778ccfc7..ae7a6a4691a0d 100644 --- a/config/locales/client.ug.yml +++ b/config/locales/client.ug.yml @@ -9,8 +9,13 @@ ug: blocks: ghost: status: "ھالەت" + conditions: "شەرت" + arguments: "ئۆزگەرگۈچى" + container_args: "يۈكدان ئۆزگەرگۈچىسى" in_location: "دا" hidden: "يوشۇرۇن" + not_registered: "خەتلەتمىگەن" + no_visible_children: "كۆرۈنۈشچان تارماق تۈرى يوق" failed: "مەغلۇب بولدى" carousel: go_to_slide: "%{index}-سىيرىلمىغا يۆتكەل" @@ -332,6 +337,8 @@ ug: theme_source: "ئۆرنەك '%{name}'" plugin_source: "قىستۇرما «%{name}»" unknown_source: "ئۆرنەك ياكى قىستۇرمىڭىزدىن بىرى" + dev_tools: + drag_to_move: "سۆرەپ يۆتكە" s3: regions: ap_northeast_1: "ئاسىيا تىنچ ئوكيان (توكيو)" @@ -421,7 +428,10 @@ ug: pill: "تەۋسىيە" pm_title: "تەۋسىيە ئۇچۇر" admin_onboarding_banner: + invite_collaborators: + action: "تەكلىپ قۇر" start_posting: + title: "يوللاشنى باشلا" back: "كەينى" spread_the_word: action: "ئۇلانما كۆچۈر" @@ -1726,6 +1736,10 @@ ug: apps: "ئەپ" navigation_menu: "يولباشچى تىزىملىك" upcoming_changes: "كەلگۈسى ئۆزگىرىش" + calendar_subscriptions: "يىلنامە" + calendar_subscriptions: + copied: "كۆچۈرۈلدى!" + add_to_google: "Google يىلنامە" change_password: success: "(ئېلخەت يوللاندى)" in_progress: "(ئېلخەت يوللاۋاتىدۇ…)" @@ -2336,6 +2350,7 @@ ug: form_kit: reset: ئەسلىگە قايتۇر optional: تاللاشچان + required: زۆرۈر dirty_form: "ئۆزگەرتىشلىرىڭىزنى تاپشۇرمىدىڭىز! راستتىنلا ئايرىلامسىز؟" errors: starts_with: "چوقۇم %{prefix} بىلەن باشلىنىدۇ" @@ -2355,6 +2370,9 @@ ug: too_short: one: "كەم دېگەندە %{count} ھەرپ بولۇشى كېرەك." other: "كەم دېگەندە %{count} ھەرپ بولۇشى كېرەك" + color: + already_used: "ئىشلىتىلگەن" + edit_presets: "رەڭ ئالدىن تەڭشىكىنى تەھرىرلەيدۇ" close: "تاقا" assets_changed_confirm: "بۇ تور بېكەت يۇمشاق دېتال يېڭىلاشنى تاپشۇرۇۋالدى. ھازىر ئەڭ يېڭى نەشرىگە ئېرىشسۇنمۇ؟" logout: "سىز تىزىمدىن چىققان." @@ -2401,6 +2419,7 @@ ug: } چېكىدىن ئېشىپ كەتتى. learn_more: "مول بىلىم…" learn_more_with_link: "مول بىلىم…" + feedback_with_link: "قايتۇرما ئىنكاس…" mute: ئۈنسىز unmute: ئۈنلۈك last_post: يوللانغان ۋاقىت @@ -2884,6 +2903,7 @@ ug: upload_description: "بۇ جايغا يۈكلەش چۈشەندۈرۈشى كىرگۈزۈلىدۇ" olist_title: "نومۇرلۇق تىزىم" ulist_title: "بەلگە تىزىمى" + list_title: "تىزىم" list_item: "تىزىم تۈرى" toggle_direction: "يۆنىلىش ئالماشتۇر" apply_wrap_title: "ئوراشنى قوللان" @@ -2969,6 +2989,9 @@ ug: image: "سۈرەت" grid_label: "بۇ شادا سۈپىتىدە كۆرسىتىلىدۇ" grid_mode_grid: "شادا" + grid_mode_carousel: "نۆۋەتلىشىپ تارقىتىش" + grid_mode_title: "سۈرەتدان ئۇسلۇبىنى %{mode} غا تەڭشەيدۇ" + remove_grid: "شادىنى چىقىرىۋەت" image_scale_button: "سۈرەتنى %%{percent} كە تەڭشە" delete_image_button: سۈرەت ئۆچۈر toggle_image_grid: سۈرەت سېتكىسىنى ئالماشتۇر @@ -3308,11 +3331,8 @@ ug: confirm: "جەزملە" select_all: "ھەممىنى تاللا" clear_all: "ھەممىنى تازىلا" - unlist_topics: "تىزىلمىغان تېما" - relist_topics: "قايتا تىزىلغان تېما" reset_bump_dates: "چوققىلانغان چېسلانى ئەسلىگە قايتۇر" defer: "ئوقۇلمىغان بەلگىسى سال" - delete: "تېما ئۆچۈر" delete_topics_count: one: "تېما ئۆچۈر" other: "تېما ئۆچۈر" @@ -3351,36 +3371,25 @@ ug: other: "يېڭىغا پەرۋا قىلما (%{count})" toggle: "تېمىنى توپ تاللاشنى ئالماشتۇر" actions: "توپ مەشغۇلات" - change_category: "سەھىپە تەڭشەك…" - close_topics: "تېمىنى تاقا" - archive_topics: "تېما ئارخىپلاشتۇر" move_messages_to_inbox: "قوبۇللاش ساندۇقىغا يۆتكە" archive_messages: "ئارخىپقا يۆتكە" - notification_level: "ئۇقتۇرۇش…" change_notification_level: "ئۇقتۇرۇش دەرىجىسىنى ئۆزگەرت" choose_new_category: "تېمىغا يېڭى سەھىپە تاللىنىدۇ:" - selected: - one: "سىز %{count} تېما تاللىدىڭىز." - other: "سىز %{count} تېما تاللىدىڭىز." selected_sole_category: one: "سەھىپىدىنن %{count} تېما تاللىدىڭىز:" other: "سەھىپىدىنن %{count} تېما تاللىدىڭىز:" selected_count: one: "%{count} تاللاندى" other: "%{count} تاللاندى" - change_tags: "بەلگە ئالماشتۇر" - append_tags: "بەلگە قوش" choose_new_tags: "بۇ تېمىغا يېڭى بەلگە تاللىنىدۇ:" - choose_append_tags: "بۇ تېمىغا قوشىدىغان يېڭى خەتكۈچ تاللىنىدۇ:" changed_tags: "بۇ تېمىلارنىڭ بەلگىسى ئۆزگەرتىلگەن." - remove_tags: "ھەممە خەتكۈچنى چىقىرىۋەت" confirm_remove_tags: one: "ھەممە بەلگە بۇ تېمىدىن چىقىرىۋېتىلىدۇ. راستتىنلا شۇنداق قىلامسىز؟" other: "ھەممە بەلگە %{count} تېمىدىن چىقىرىۋېتىلىدۇ. راستتىنلا شۇنداق قىلامسىز؟" progress: one: "ئىلگىرىلىشى: %{count} تېما" other: "ئىلگىرىلىشى: %{count} تېما" - notify: "ئىشلەتكۈچىگە بۇ ئۆزگىرىشنى ئۇقتۇرىدۇ." + notify: "ئىشلەتكۈچىگە بۇ ئۆزگىرىشنى ئۇقتۇرىدۇ" performing: "توپ مەشغۇلات ئىجرا قىلىۋاتىدۇ، سەل كۈتۈڭ…" completed: "توپ مەشغۇلات مۇۋەپپەقىيەتلىك تاماملاندى!" error_topic_count: @@ -3408,7 +3417,6 @@ ug: name: "پەرۋا قىلما" close_topics: name: "تاقا" - note: "ئەسكەرتىش" optional: (تاللاشچان) archive_topics: name: "ئارخىپ" @@ -3422,24 +3430,18 @@ ug: name: "تىزىمغا قايتا قوش" remove_tags: name: "بەلگىنى چىقىرىۋەت" - append_tags: - name: "بەلگە قوش" replace_tags: name: "بەلگە ئالماشتۇر" delete_topics: name: "ئۆچۈر" update_category: name: "سەھىپىنى يېڭىلا" - description: "تاللىغان تېمىغا يېڭى سەھىپە تاللايدۇ" reset_bump_dates: name: "چوققىلىغان چېسلانى ئەسلىگە قايتۇر" - description: "چوققىلانغان ۋاقتىنى يازما يوللانغان ئاخىرقى ۋاقىتقا ئەسلىگە قايتۇرىدۇ، بۇ يازما تىزىمىنىڭ تەرتىپىگە تەسىر كۆرسىتىدۇ" defer: name: "ئوقۇلمىغان بەلگىسى سال" - description: "تېمىغا ئوقۇلمىدى بەلگىسى سالىدۇ" update_notifications: name: "ئوقتۇرۇش يېڭىلا" - description: "ئۇقتۇرۇش دەرىجىسىنى كۆزىتىش، ئىزلاش، ئادەتتىكى ياكى ئۈنسىز ھالەتكە ئۆزگەرتىدۇ" topic: filter_to: one: "تېمىدىكى %{count} يازما" @@ -4232,6 +4234,8 @@ ug: delete: "سەھىپە ئۆچۈر" create: "يېڭى سەھىپە" create_long: "يېڭى سەھىپە قۇرىدۇ" + type_settings_schema: + site_settings: "بېكەت تەڭشىكى" save: "سەھىپە ساقلا" unsaved_changes: "ساقلانمىغان ئۆزگەرتىشلىرىڭىز بار" slug: "سەھىپە قىسقارتما" @@ -4275,6 +4279,8 @@ ug: list: "سەھىپە تىزىمىنى كۆرسەت" no_description: "بۇ سەھىپىنىڭ چۈشەندۈرۈشىنى قوشۇڭ." change_in_category_topic: "چۈشەندۈرۈش تەھرىر" + description_expand: "تېخىمۇ كۆپ كۆرسەت" + description_collapse: "ئازراق كۆرسەت" already_used: "بۇ رەڭ باشقا بىر سەھىپىگە ئىشلىتىلگەن" color_palette: "رەڭ تاختا" security: "بىخەتەرلىك" @@ -5399,8 +5405,6 @@ ug: back: "ھەممە دوكلاتقا قايت" group_traffic: "ئېقىم" group_members: "ئەزا" - group_moderation: "رىياسەتچىلىك" - group_security: "بىخەتەرلىك" group_other: "باشقا" config_sections: account: @@ -5933,7 +5937,7 @@ ug: all: "ھەممىسى" view_table: "جەدۋەل" view_graph: "گرافىك" - refresh_report: "دوكلاتنى يېڭىلا" + refresh_report: "يېڭىلا" daily: كۈندىلىك monthly: ئايلىق weekly: ھەپتىلىك @@ -8012,7 +8016,7 @@ ug: confirm: "ھەئە، ئىم تۈزۈمىنى يېڭىلا" min_admin_password_length: confirm: "ھەئە، ئىم تۈزۈمىنى يېڭىلا" - password_unique_charactes: + password_unique_characters: confirm: "ھەئە، ئىم تۈزۈمىنى يېڭىلا" block_common_passwords: confirm: "ھەئە، ئىم تۈزۈمىنى يېڭىلا" diff --git a/config/locales/client.uk.yml b/config/locales/client.uk.yml index 1e5a18a8076a5..c09a3a096dc5a 100644 --- a/config/locales/client.uk.yml +++ b/config/locales/client.uk.yml @@ -9,9 +9,19 @@ uk: blocks: ghost: status: "Статус" + conditions: "Умови" + arguments: "Аргументи" + container_args: "Аргументи контейнера" in_location: "в" hidden: "приховано" + not_registered: "не зареєстровано" + no_visible_children: "немає видимих потомків" failed: "помилка" + ghost_reasons: + optional_missing_hint: "Цей необов'язковий блок не відображається, оскільки він не зареєстрований." + no_visible_children_hint: "Цей блок контейнера не рендериться, оскільки жоден з його дочірніх блоків не є видимим." + condition_failed_hint: "Цей блок не відтворюється, оскільки його умови не виконані." + head_hidden_tail_hint: "Цей блок не відтворюється, оскільки інший блок був відтворений спочатку в контейнері `head`." carousel: go_to_slide: "Перейти до слайда %{index}" previous: "Попередній слайд" @@ -359,6 +369,7 @@ uk: skip_to_top: "Перейти до початку" skip_user_nav: "Перейти до вмісту профілю" emails_are_disabled: "Надсилання повідомлень електронною поштою було глобально вимкнено адміністратором. Жодне сповіщення електронною поштою не буде надіслано." + emails_are_disabled_no_smtp: "Вся вихідна електронна пошта вимкнена, оскільки не налаштовано SMTP-сервер. Електронні листи будь-якого типу не можуть бути надіслані." emails_are_disabled_non_staff: "Надсилання листів електронною поштою було вимкнено для користувачів, які не є членами команди обслуговування." software_update_prompt: message: "Ми оновили сайт, , будь ласка, оновіть , щоб все працювало безперебійно." @@ -384,12 +395,27 @@ uk: broken_page_change_alert: "Обробник onPageChange викликав помилку. Зверніться до інструментів розробника браузера для отримання додаткової інформації." broken_plugin_alert: "Викликано плагіном '%{name}'" broken_transformer_alert: "Сталася помилка. Ваш сайт може працювати неправильно." + broken_block_alert: "Виявлено помилку конфігурації блоку. Перегляньте консоль браузера для отримання детальної інформації." + broken_block_factory_alert: "Не вдалося завантажити блок. Деякі елементи інтерфейсу можуть відображатися неправильно." critical_deprecation: notice: "[Повідомлення адміністратора] %{source} містить код, який потребує оновлення. (id:%{id})" learn_more_link: "(дізнатися більше)" theme_source: "Тема '%{name}'" plugin_source: "Плагін '%{name}'" unknown_source: "Одна з ваших тем або плагінів" + dev_tools: + drag_to_move: "Перетягніть, щоб перемістити" + toggle_plugin_outlet_debug: "Переключити налагодження розетки плагіна" + toggle_block_debug: "Переключити налагодження блоків" + block_debug: + outlet_boundaries: "Зовнішні межі" + visual_overlay: "Візуальне накладення" + ghost_blocks: "Блоки-привиди" + condition_debugging: "Налагодження умов" + toggle_safe_mode: "Увімкнути/вимкнути безпечний режим" + toggle_verbose_localization: "Увімкнути/вимкнути детальну локалізацію" + toggle_mobile_view: "Переключити мобільний перегляд" + disable_dev_tools: "Вимкнути інструменти для розробників" s3: regions: ap_northeast_1: "Азія (Токіо)" @@ -498,6 +524,11 @@ uk: title: "Розпочати публікацію" description: "Дайте людям щось, про що можна поговорити разом" action: "Ідеї-криголами" + choose_option: "З чого б ви хотіли почати?" + predefined_topics: "Шаблони криголамів" + predefined_topics_subtitle: "Дайте новим учасникам тему для обговорення, виберіть шаблон для редагування та створіть свій власний." + predefined_topics_description: "Виберіть з колекції тем для початку розмови, щоб розпочати обговорення" + use_predefined: "Переглянути шаблони" back: "Назад" icebreakers: fun_facts: @@ -1988,6 +2019,23 @@ uk: apps: "Застосунки" navigation_menu: "Меню навігації" upcoming_changes: "Майбутні зміни" + calendar_subscriptions: "Календар" + calendar_subscriptions: + description: "Створіть URL-адреси підписки для синхронізації з улюбленим додатком календаря (Календар Google, Календар Apple, Outlook тощо). Ці URL-адреси є приватними посиланнями на події календаря для вашого облікового запису (нагадування про закладки, події календаря тощо). Ви завжди можете скасувати або поновити створені URL-адреси підписки. " + generate: "Згенерувати URL-адреси підписки" + regenerate: "Згенерувати URL-адреси повторно" + regenerate_confirm: "Це зробить недійсними ваші існуючі URL-адреси підписки на календар. Будь-які програми календаря, що використовують старі URL-адреси, перестануть отримувати оновлення. Продовжити?" + revoke: "Скасувати підписку" + revoke_confirm: "Це скасує URL-адреси вашої підписки на календар. Будь-які програми календаря, які їх використовують, перестануть отримувати оновлення. Продовжити?" + urls_warning: "URL-адреси підписки готові! Натисніть кнопки нижче, щоб прив’язати їх до вашого календаря. Примітка: ці URL-адреси відображаються лише один раз." + bookmarks: "Нагадування про закладки" + bookmarks_description: "Ваші закладки з датами нагадування" + copy: "Копіювати URL-адресу" + copied: "Скопійовано!" + add_to_google: "Календар Google" + add_to_outlook: "Microsoft Outlook" + add_to_apple: "Календар Apple" + active_subscription: "У вас активна підписка на календар." change_password: success: "(лист надіслано)" in_progress: "(надсилання листа)" @@ -2632,6 +2680,7 @@ uk: form_kit: reset: Скинути optional: опціонально + required: Обов’язкове errors_summary_title: one: "Виправте цю помилку, щоб продовжити" few: "Виправте ці помилки, щоб продовжити" @@ -3238,6 +3287,7 @@ uk: upload_description: "введіть опис завантаження" olist_title: "Нумерований список" ulist_title: "Маркований список" + list_title: "Списки" list_item: "Елемент списку" toggle_direction: "Змінити напрямок" apply_wrap_title: "Застосувати загортання" @@ -3255,6 +3305,7 @@ uk: collapse: "Згорнути панель редактора" open: "Відкрити панель редактора" abandon: "Закрити панель редактора та видалити чернетку" + edit_reason: "Додайте причину редагування" enter_fullscreen: "Панель редактора на весь екран" exit_fullscreen: "Вийти з повноекранного режиму редактора" exit_fullscreen_prompt: "Натисніть ESC, щоб вийти з повноекранного режиму" @@ -3429,9 +3480,13 @@ uk: available: title: "Майбутні зміни" description: "'%{changeName}' доступний для попереднього перегляду" + description_two: "'%{changeName1}' та '%{changeName2}' доступні для попереднього перегляду" + description_many: "'%{changeName}' та %{otherChangeCount} інших змін доступні для попереднього перегляду" automatically_promoted: title: "Майбутні зміни" description: "'%{changeName}' було автоматично ввімкнено" + description_two: "'%{changeName1}' та '%{changeName2}' були автоматично ввімкнені" + description_many: "'%{changeName}' та %{otherChangeCount} інших змін було автоматично ввімкнено" dismiss_confirmation: body: default: @@ -3498,8 +3553,8 @@ uk: votes_released: "голосування опубліковано" new_features: "випущено нові функції дискурсу" admin_problems: "нова порада на інформаційній панелі вашого сайту" - upcoming_change_available: "доступна нова майбутня зміна '%{changeName}'" - upcoming_change_automatically_promoted: "майбутню зміну '%{changeName}' було автоматично ввімкнено" + upcoming_change_available: "доступні нові майбутні зміни" + upcoming_change_automatically_promoted: "майбутні зміни було автоматично ввімкнено" upload_selector: change: "Змінити" delete: "Видалити" @@ -3718,8 +3773,8 @@ uk: confirm: "Підтвердити" select_all: "Обрати все" clear_all: "Очистити все" - unlist_topics: "Виключити з усіх списків тем" - relist_topics: "Повторний Список тем" + unlist_topics: "Скасувати список тем" + relist_topics: "Перебудувати список тем" reset_bump_dates: "Скинути дату підняття" defer: "Позначити як непрочитане" delete: "Видалити теми" @@ -3777,19 +3832,14 @@ uk: other: "Відхилити (%{count}) нових…" toggle: "перемикання масового вибору тем" actions: "Масові дії" - change_category: "Обрати категорію" + change_category: "Оновити категорію" close_topics: "Закрити теми" archive_topics: "Архівувати теми" move_messages_to_inbox: "Перемістити у Вхідні" archive_messages: "Перемістити до архіву" - notification_level: "Сповіщення…" + notification_level: "Сповіщення про оновлення" change_notification_level: "Змінити рівень сповіщень" choose_new_category: "Виберіть новий розділ для цих тем:" - selected: - one: "Ви вибрали %{count} тему." - few: "Ви вибрали %{count} теми." - many: "Ви вибрали %{count} тем." - other: "Ви вибрали %{count} тем." selected_sole_category: one: "Ви вибрали %{count} тему з категорії:" few: "Ви вибрали %{count} теми з категорії:" @@ -3800,23 +3850,63 @@ uk: few: "%{count} вибрано" many: "%{count} вибрано" other: "%{count} вибрано" - change_tags: "Замінити теґи" + change_tags: "Замінити теги" append_tags: "Додати теґи" choose_new_tags: "Виберіть нові теґи для цих тем:" - choose_append_tags: "Виберіть нові теґи, щоб додати що цих тем:" + choose_append_tags: "Додати теґи" changed_tags: "Теґи цих тем було змінено." - remove_tags: "Видалити всі теґи" + remove_tags: "Видалити теги" confirm_remove_tags: one: "Усі теґи будуть видалені з цієї теми. Ви впевнені" few: "Усі теґи будуть видалені з %{count} тем. Ви впевнені?" many: "Усі теґи будуть видалені з %{count} тем. Ви впевнені?" other: "Усі теґи буде видалено з %{count} тем. Ви впевнені?" + confirm_update_topics: + one: "Оновити %{count} тему" + few: "Оновити %{count} теми" + many: "Оновити %{count} тем" + other: "Оновити %{count} тем" + confirm_close_topics: + one: "Закрити %{count} тему" + few: "Закрити %{count} теми" + many: "Закрити %{count} тем" + other: "Закрити %{count} тем" + confirm_archive_topics: + one: "Архівувати %{count} тему" + few: "Архівувати %{count} теми" + many: "Архівувати %{count} тем" + other: "Архівувати %{count} тем" + confirm_unlist_topics: + one: "Видалити %{count} тему" + few: "Видалити %{count} теми" + many: "Видалити %{count} тем" + other: "Видалити %{count} тем" + confirm_relist_topics: + one: "Перерахувати %{count} тему" + few: "Перерахувати %{count} теми" + many: "Перерахувати %{count} тем" + other: "Перерахувати %{count} тем" + confirm_archive_messages: + one: "Архівувати %{count} повідомлення" + few: "Архівувати %{count} повідомлення" + many: "Архівувати %{count} повідомлень" + other: "Архівувати %{count} повідомлень" + confirm_move_to_inbox: + one: "Перемістити %{count} повідомленнядо папки \"Вхідні\"" + few: "Перемістити %{count} повідомлення до папки \"Вхідні\"" + many: "Перемістити %{count} повідомлень до папки \"Вхідні\"" + other: "Перемістити %{count} повідомлень до папки \"Вхідні\"" + confirm_delete_topics: + one: "Видалити %{count} тему" + few: "Видалити %{count} теми" + many: "Видалити %{count} тем" + other: "Видалити %{count} тем" progress: one: "Обробка: %{count} тема" few: "Обробка: %{count} теми" many: "Обробка: %{count} тем" other: "Обробка: %{count} тем" - notify: "Повідомте користувачів про цю зміну." + notify: "Повідомте користувачів про цю зміну" performing: "Виконання масових операцій, зачекайте…" completed: "Масові операції успішно завершено!" completed_count: @@ -3862,38 +3952,44 @@ uk: name: "Відкласти" close_topics: name: "Закрити" - note: "Примітка" + description: "Закриті теми запобігають появі нових відповідей. Дізнатися більше" + note: "Додати примітку до цих тем" optional: (опціонально) archive_topics: name: "Архів" + description: "Архівні теми приховані від пошуку та списку останніх тем. Дізнатися більше" archive_messages: name: "Перемістити до архіву" move_messages_to_inbox: name: "Перемістити у Вхідні" unlist_topics: name: "Вилучити зі списку" + description: "Непублічні теми приховані у списку тем, але до них все ще можна отримати доступ за прямим посиланням. Дізнатися більше" relist_topics: name: "Вставити повторно" remove_tags: name: "Видалити теги" + description: "Видалити всі теги з вибраних тем." append_tags: - name: "Додати теґи" + name: "Додати теги" + description: "Додати наступні теги до вибраних тем:" replace_tags: name: "Замінити теґи" + description: "Замінити всі існуючі теги на вибрані теми наступним:" delete_topics: name: "Видалити" + description: "Видалити вибрані теми назавжди. Цю дію не можна скасувати." update_category: name: "Оновити категорію" - description: "Виберіть нову категорію для обраних тем" + description: "Перемістити всі вибрані теми до наступної категорії:" reset_bump_dates: name: "Скинути дату підняття" - description: "Скинути дату підняття теми до дати останнього створеного повідомлення, що впливає на порядок у списку тем" + description: "Ви хочете оновити дати оновлень до дати останнього створеного допису? Це може вплинути на їх порядок у списку тем." defer: name: "Позначити як непрочитане" - description: "Позначити теми як непрочитані" update_notifications: name: "Сповіщення про оновлення" - description: "Змініть рівень сповіщень на «Перегляд», «Стеження», «Звичайний» або «Вимкнено»." + description: "Оновіть свій особистий рівень сповіщень для вибраних тем до:" topic: filter_to: one: "%{count} допис в темі" @@ -4091,6 +4187,11 @@ uk: few: "Останній допис в цій темі зроблений %{count} години назад, а тому дана тема буде закрита негайно." many: "Останній допис в цій темі зроблений %{count} годин тому, а тому дана тема буде закрита негайно." other: "Останній допис в цій темі зроблений %{count} годин тому, а тому дана тема буде закрита негайно." + auto_delete_immediate: + one: "Останній допис у темі %{count} годину тому, тему буде негайно видалено." + few: "Останній допис у темі був %{count} години тому, тему буде негайно видалено." + many: "Останній допис у темі був %{count} годин тому, тему буде негайно видалено." + other: "Останній допис у темі був %{count} годин тому, тему буде негайно видалено." timeline: back: "Назад" back_description: "Повернутися до вашого останнього непрочитаного допису" @@ -4675,6 +4776,7 @@ uk: many: "Ви впевнені, що хочете об’єднати ці %{count} дописів?" other: "Ви впевнені, що хочете об’єднати ці %{count} дописів?" revisions: + diff_too_complex: "Різниця занадто складна для відображення. Спробуйте переглянути окремі менші редагування." locale: no_locale_set: "Мова не встановлена" locale_removed: "Мову вилучено" @@ -4750,6 +4852,7 @@ uk: instructions: "Поширити посилання на цей допис:" original_language: "Цей пост був спочатку написаний мовою %{language}" original_language_and_outdated: "Цей пост був спочатку написаний мовою %{language}. Переклад може бути застарілим." + ai_translation_disclaimer: "Переклади, створені штучним інтелектом, можуть бути неточними." category: none: "(без розділу)" all: "Всі розділи" @@ -4764,6 +4867,8 @@ uk: advanced: "Розширений" show_advanced: "Розширені налаштування" topic_template: "Шаблон" + topic_title_placeholder: "Заповнювач назви теми категорії" + topic_title_placeholder_placeholder: "[необов'язково] тимчасова назва теми для цієї категорії" tags: "Теґи" localizations: "Локалізації" localization: @@ -4787,11 +4892,22 @@ uk: delete: "Вилучити" add: "Додайте необхідну групу теґів" placeholder: "Вибрати групу тегів…" + min_count: "Кількість тегів" tag_group: "Група тегів" topic_featured_link_allowed: "Дозволити популярні посилання в цьому розділі" delete: "Видалити категорію" create: "Нова категорія" + create_with_type: "Нова категорія %{typeName}" create_long: "Створити розділ" + settings_apply_to_all_of_type_warning: "Зміни будуть застосовані до всіх категорій цього типу" + type_settings_schema: + category_settings: "Налаштування категорії" + category_custom_fields: "Налаштування категорії" + site_settings: "Налаштування сайту" + choose_type: + title: "Виберіть тип категорії" + requires_plugin: "Потребує плагін" + create_category: "Створити категорію" save: "Зберегти категорію" unsaved_changes: "Є незбережені зміни" slug: "Посилання на розділ" @@ -4840,6 +4956,9 @@ uk: list: "Список категорій" no_description: "Будь ласка, додайте опис для цього розділу." change_in_category_topic: "Редагувати опис" + description_updated: "Опис оновлено" + description_expand: "Показати більше" + description_collapse: "Показати менше" already_used: "Цей колір вже використовується іншим розділом" color_palette: "Кольорова палітра" security: "Безпека" @@ -6082,6 +6201,7 @@ uk: admin_js: type_to_filter: "Текст для пошуку…" settings: "Налаштування" + reset_filter: "Скинути фільтр" toggle_filters: "Перемкнути випадаючі фільтри" admin: title: "Адміністратор Discourse" @@ -6097,11 +6217,13 @@ uk: title: "Список доступних звітів" sidebar_title: "Звіти" back: "Назад до всіх звітів" + group_engagement: "Залучення" group_traffic: "Трафік" group_members: "Учасники" - group_moderation: "Модерація" - group_security: "Безпека" + group_content: "Контент і здоров'я" + group_moderation_and_security: "Модерація та безпека" group_other: "Інше" + legacy_warning: "Це застарілий звіт. Незабаром його буде вилучено. Якщо вам потрібна допомога в пошуку заміни, зверніться до служби підтримки." config_sections: account: title: "Обліковий запис" @@ -6146,6 +6268,7 @@ uk: enabled_for_options: no_one: "Ніхто" everyone: "Усі" + staff: "тільки %{staffGroupName}" specific_groups: "Конкретна(і) група(и)" specific_groups_with_group_names: one: "група %{groupNames}" @@ -6170,6 +6293,7 @@ uk: all: "Всі" enabled_all: "Усі увімкнені стани" enabled: "Включено" + enabled_for_staff: "Увімкнено для %{staffGroupName}" enabled_for_specific_groups: "Увімкнено для певних груп" disabled: "Вимкнено" impact_type_all: "Всі види впливу" @@ -6259,6 +6383,7 @@ uk: help_text: "Рекомендований розмір - 600 x 80 пікселів." large_icon: title: "Квадратна іконка" + description: "Квадратна версія зображення логотипу відображається у верхній частині сайту та також є логотипом мобільного додатку." help_text: "Рекомендований розмір становить 512 х 512 пікселів." square_icon_dark: required: "Використовувати інший квадратний значок для темного режиму?" @@ -6701,10 +6826,11 @@ uk: all: "Все" view_table: "Таблиця" view_graph: "Графік" - refresh_report: "Оновити звіт" + refresh_report: "Оновити" daily: За день monthly: Щомісяця weekly: Щотижня + chart_group_period: "Виберіть період" value_so_far: "%{value} (поки що)" dates: "Дати (UTC)" groups: "Усі групи" @@ -8117,6 +8243,7 @@ uk: upcoming_change_available: "доступні майбутні зміни" change_site_setting_groups: "змінити групи налаштувань сайту" discourse_id_regenerate_credentials: "відновити облікові дані Discourse ID" + configure_category_type: "налаштування типу категорії" screened_emails: title: "Перевірені адреси електронної пошти" description: "Коли хтось намагатиметься створити новий обліковий запис, наступні електронні скриньки буде перевірено, і реєстрацію заблоковано, або вжито якихось інших дій." @@ -8763,6 +8890,9 @@ uk: more_than_50_results: "Знайдено понад 50 результатів. Будь ласка виправте параметри пошуку." no_results: "Відповідних текстів на сайті не знайдено" interpolation_keys: "Доступні ключі інтерполяції:" + interpolation_key_insert: "Click to insert" + interpolation_key_used: "Вже використано" + interpolation_key_invalid: "Невідомий ключ — інтерполяція не буде виконана" outdated: title: "Цей переклад застарів" description: "Переклад за замовчуванням для цього ключа змінився після створення цього перевизначення. Будь ласка, перевірте нижче, чи ваш переклад відповідає будь-яким змінам, які були внесені до оригіналу." @@ -8891,7 +9021,7 @@ uk: min_admin_password_length: prompt: "Ви збираєтеся змінити свою політику паролів. Це вплине на всіх адміністраторів, які змінюватимуть свої паролі відтепер. Ви впевнені, що хочете продовжити?" confirm: "Так, оновити політику паролів" - password_unique_charactes: + password_unique_characters: prompt: "Ви збираєтеся змінити свою політику паролів. Це вплине на всіх користувачів, які змінюватимуть свої паролі відтепер. Ви впевнені, що хочете продовжити?" confirm: "Так, оновити політику паролів" block_common_passwords: diff --git a/config/locales/client.ur.yml b/config/locales/client.ur.yml index 11feff18bf86c..78a8af8f5ca26 100644 --- a/config/locales/client.ur.yml +++ b/config/locales/client.ur.yml @@ -1734,6 +1734,9 @@ ur: apps: "اَیپس" navigation_menu: "نیویگیشن مینو" upcoming_changes: "آنے والی تبدیلیاں" + calendar_subscriptions: + copied: "کاپی کر لیا!" + add_to_google: "گوگل کیلنڈر" change_password: success: "(ای میل بھیج دی گئی)" in_progress: "(ای میل بھیجی جا رہی ہے)" @@ -2344,6 +2347,7 @@ ur: form_kit: reset: رِی سَیٹ optional: اختیاری + required: درکار ہے dirty_form: "آپ نے اپنی تبدیلیاں جمع نہیں کروائیں! کیا آپ واقعی چھوڑنا چاہتے ہیں؟" errors: starts_with: "%{prefix}سے شروع ہونا چاہیے" @@ -3124,8 +3128,6 @@ ur: votes_released: "ووٹ جاری کر دیا گیا" new_features: "ڈسکورس کی نئی خصوصیات جاری کر دی گئی ہیں" admin_problems: "آپ کی سائٹ ڈَیش بورڈ پر نیا مشورہ" - upcoming_change_available: "نئی آنے والی تبدیلی '%{changeName}' دستیاب ہے" - upcoming_change_automatically_promoted: "آنے والی تبدیلی '%{changeName}' خود بخود فعال ہو گئی ہے" upload_selector: change: "تبدیل" delete: "مٹائیں" @@ -3325,11 +3327,8 @@ ur: confirm: "تصدیق کریں" select_all: "تمام منتخب کریں" clear_all: "تمام کو حزف کریں" - unlist_topics: "بغیر فہرست موضوعات" - relist_topics: "موضوعات دوبارہ فہرست کریں" reset_bump_dates: "ٹکرانے کی تاریخوں کی دوبارہ ترتیب" defer: "بغیر پڑھے نشان زد" - delete: "موضوعات حذف کریں" delete_topics_count: one: "موضوع حذف کریں" other: "موضوعات حذف کریں" @@ -3368,36 +3367,24 @@ ur: other: "نیا (%{count}) برخاست" toggle: "موضوعات کے حجمی انتخاب کو ٹوگل کریں" actions: "حجمی عوامل" - change_category: "زمرہ سیٹ" - close_topics: "موضوع بند کریں" - archive_topics: "موضوع محفوظ" move_messages_to_inbox: "اِنباکس میں منتقل کریں" archive_messages: "آرکائیو میں منتقل" - notification_level: "اطلاعات۔۔۔" change_notification_level: "نوٹیفیکیشن لیول تبدیل کریں" choose_new_category: "موضوعات کیلئے نئے زمرہ کا انتخاب کریں:" - selected: - one: "آپ نے %{count} موضوع منتخب کیا۔" - other: "آپ نے %{count} موضوعات منتخب کیے۔" selected_sole_category: one: "آپ نے زمرہ سے %{count} موضوع منتخب کیا ہے:" other: "آپ نے زمرہ سے %{count} موضوعات کا انتخاب کیا ہے:" selected_count: one: "%{count} کا انتخاب" other: "%{count} کا انتخاب" - change_tags: "ٹیگز بدلیں" - append_tags: "ٹیگز میں اضافہ کریں" choose_new_tags: "ان موضوعات کیلئے نئے ٹیگز کا انتخاب کریں:" - choose_append_tags: "ان موضوعات پر اضافہ کرنے کیلئے نئے ٹیگز کا انتخاب کریں:" changed_tags: "ان موضوعات کے ٹیگز تبدیل کر دیے گئے تھے۔" - remove_tags: "تمام ٹیگز ہٹا دیں" confirm_remove_tags: one: "اس موضوع سے تمام دھجیاں ہٹا دی جائیں گی۔ کیا آپ کو یقین ہے؟" other: "تمام دھجیوں کو %{count} موضوعات سے ہٹا دیا جائے گا۔ کیا آپ کو یقین ہے؟" progress: one: "پیش رفت: %{count} موضوع" other: "پیش رفت: %{count} موضوعات" - notify: "اس تبدیلی کے بارے میں صارفین کو مطلع کریں۔" performing: "حجم آپریشنز ہو رہے ہیں، براہ کرم انتظار کریں۔۔۔" completed: "حجمی اختیارات کامیابی سے مکمل ہو گئے!" error_topic_count: @@ -3426,7 +3413,6 @@ ur: name: "بر خاست کریں" close_topics: name: "بند کریں" - note: "نوٹ" optional: (اختیاری) archive_topics: name: "محفوظ شدہ" @@ -3440,24 +3426,18 @@ ur: name: "دوبارہ لگانا" remove_tags: name: "دھجیاں ہٹائیں" - append_tags: - name: "ٹیگز میں اضافہ کریں" replace_tags: name: "ٹیگز بدلیں" delete_topics: name: "مٹائیں" update_category: name: "تازہ ترین زمرہ" - description: "منتخب کردہ موضوعات کے لیے نئے زمرے کا انتخاب" reset_bump_dates: name: "ٹکرانے کی تاریخیں دوبارہ ترتیب دیں" - description: "موضوع کی ٹکرانے کی تاریخ کو آخری تخلیق کردہ پوسٹ کی تاریخ پر دوبارہ ترتیب دیں، جو موضوع کی فہرست میں ترتیب کو متاثر کرتی ہے۔" defer: name: "غیر پڑھا ہوا نشان زد" - description: "موضوعات کو بغیر پڑھے کے بطور نشان زد" update_notifications: name: "اطلاعات کو اپ ڈیٹ" - description: "نوٹیفکیشن لیول کو دیکھنا، ٹریکنگ، نارمل، یا خاموش میں بدلنا" topic: filter_to: one: "موضوع میں %{count} پوسٹ" @@ -4276,6 +4256,8 @@ ur: delete_confirm: "کیا آپ واقعی اِس زمرہ کو مٹانا چاہتے ہیں؟" delete_error: "اِس زمرہ کو مٹانے میں ایک خرابی کا سامنا کرنا پڑا۔" no_description: "براہ مہربانی اس زمرہ کی تفصیل شامل کریں۔" + description_expand: "مزید دکھائیں" + description_collapse: "کم دکھائیں" already_used: "یہ رنگ دوسرے زمرہ کیلیے استعمال ہو چکا ہے۔" security: "سیکورٹی" security_add_group: "ایک گروپ شامل کریں" @@ -5362,8 +5344,6 @@ ur: back: "تمام رپورٹس پر واپس" group_traffic: "ٹریفک" group_members: "ممبران" - group_moderation: "ماڈریٹر کا کام" - group_security: "سیکورٹی" group_other: "دیگر" config_sections: account: @@ -5850,7 +5830,7 @@ ur: all: "تمام" view_table: "ٹیبل" view_graph: "گراف" - refresh_report: "رپورٹ رِیفریش کریں" + refresh_report: "تازہ کریں" daily: روزانہ monthly: ماہانہ weekly: ہفتہ وار diff --git a/config/locales/client.vi.yml b/config/locales/client.vi.yml index 03183ff2e19d4..e984a026acae6 100644 --- a/config/locales/client.vi.yml +++ b/config/locales/client.vi.yml @@ -1632,6 +1632,10 @@ vi: apps: "Ứng dụng" navigation_menu: "Menu điều hướng" upcoming_changes: "Các thay đổi sắp tới" + calendar_subscriptions: "Lịch" + calendar_subscriptions: + copied: "Đã sao chép!" + add_to_google: "Google Lịch" change_password: success: "(email đã gửi)" in_progress: "(đang gửi email)" @@ -2225,6 +2229,7 @@ vi: form_kit: reset: Cài lại optional: tùy chọn + required: bắt buộc dirty_form: "Bạn chưa gửi các thay đổi của mình! Bạn có chắc muốn thoát?" errors: starts_with: "Phải bắt đầu bằng %{prefix}" @@ -2962,8 +2967,6 @@ vi: votes_released: "đã trả lượt bình chọn" new_features: "tính năng mới của Discourse đã ra mắt" admin_problems: "Lời khuyên mới trên bảng điều khiển" - upcoming_change_available: "thay đổi mới sắp tới '%{changeName}' hiện đã có sẵn" - upcoming_change_automatically_promoted: "thay đổi sắp tới '%{changeName}' đã được kích hoạt tự động" upload_selector: change: "Thay đổi" delete: "Xóa" @@ -3154,11 +3157,8 @@ vi: confirm: "Xác nhận" select_all: "Chọn hết" clear_all: "Xóa hết" - unlist_topics: "Không công khai chủ đề" - relist_topics: "Mở lại công khai chủ đề" reset_bump_dates: "Đặt lại ngày đẩy" defer: "Đánh dấu là chưa đọc" - delete: "Xóa chủ đề" delete_topics_count: other: "Xóa chủ đề" delete_posts_count: @@ -3189,31 +3189,21 @@ vi: other: "Loại bỏ Mới (%{count})" toggle: "Bật/tắt chọn nhiều chủ đề cùng lúc" actions: "Thao tác hàng loạt" - change_category: "Chọn chuyên mục…" - close_topics: "Đóng các chủ đề" - archive_topics: "Chủ đề Lưu trữ" move_messages_to_inbox: "Chuyển sang hộp thư" archive_messages: "Di chuyển đến Lưu trữ" - notification_level: "Thông báo…" change_notification_level: "Thay đổi mức thông báo" choose_new_category: "Chọn chuyên mục mới cho chủ đề này:" - selected: - other: "Bạn đã chọn %{count} chủ đề" selected_sole_category: other: "Bạn đã chọn %{count} chủ đề từ chuyên mục:" selected_count: other: "%{count} được chọn" - change_tags: "Thay thế thẻ" - append_tags: "Thêm thẻ" choose_new_tags: "Chọn thẻ mới cho các chuyên mục sau:" - choose_append_tags: "Chọn các thẻ mới để thêm vào cho các chủ đề này:" changed_tags: "Các thẻ của các chủ đề đó đã được thay đổi." - remove_tags: "Xóa tất cả các thẻ" confirm_remove_tags: other: "Tất cả các thẻ sẽ bị xóa khỏi %{count} chủ đề. Bạn có chắc không?" progress: other: "Tiến độ: %{count} chủ đề" - notify: "Thông báo cho người dùng về thay đổi này." + notify: "Thông báo cho người dùng về thay đổi này" performing: "Đang thực hiện các thao tác hàng loạt, vui lòng chờ…" completed: "Các thao tác xử lý hàng loạt đã hoàn tất!" error_topic_count: @@ -3241,7 +3231,6 @@ vi: name: "Bỏ qua" close_topics: name: "Đóng" - note: "Ghi chú" optional: (tùy chọn) archive_topics: name: "Lưu Trữ" @@ -3255,24 +3244,18 @@ vi: name: "Công khai lại" remove_tags: name: "Xóa thẻ" - append_tags: - name: "Thêm thẻ" replace_tags: name: "Thay thế thẻ" delete_topics: name: "Xóa" update_category: name: "Cập nhật chuyên mục" - description: "Chọn chuyên mục mới cho các chủ đề đã chọn này" reset_bump_dates: name: "Đặt lại ngày đẩy" - description: "Đặt lại ngày đẩy chủ đề thành ngày tạo tút cuối cùng, điều này ảnh hưởng đến thứ tự hiển thị trong danh sách chủ đề" defer: name: "Đánh dấu là Chưa đọc" - description: "Đánh dấu chủ đề là chưa đọc" update_notifications: name: "Cập nhật thông báo" - description: "Thay đổi mức độ thông báo thành Giám sát, Theo dõi, Bình thường hoặc Phớt lờ." topic: filter_to: other: "%{count} tút trong chủ đề" @@ -4029,6 +4012,8 @@ vi: delete: "Xóa chuyên mục" create: "Chuyên mục mới" create_long: "Tạo Chủ đề mới" + type_settings_schema: + site_settings: "Cài đặt trang web" save: "Lưu chuyên mục" unsaved_changes: "Bạn có những thay đổi chưa được lưu" slug: "Đường dẫn chuyên mục" @@ -4076,6 +4061,8 @@ vi: list: "Danh sách chuyên mục" no_description: "Hãy thêm mô tả cho chuyên mục này" change_in_category_topic: "Sửa mô tả" + description_expand: "Hiện thêm" + description_collapse: "Thu gọn" already_used: "Màu này đã được dùng bởi chuyên mục khác" color_palette: "Bảng màu" security: "Bảo mật" @@ -5174,8 +5161,6 @@ vi: back: "Quay lại tất cả báo cáo" group_traffic: "Băng thông" group_members: "Thành viên kênh" - group_moderation: "Người kiểm duyệt" - group_security: "Bảo mật" group_other: "Khác" config_sections: account: @@ -5749,7 +5734,7 @@ vi: all: "Tất cả" view_table: "bảng" view_graph: "đồ thị" - refresh_report: "Làm mới báo cáo" + refresh_report: "Làm mới" daily: hằng ngày monthly: Hàng tháng weekly: Hàng tuần @@ -7841,7 +7826,7 @@ vi: min_admin_password_length: prompt: "Bạn sắp thay đổi chính sách mật khẩu. Điều này sẽ ảnh hưởng đến tất cả quản trị viên khi họ thay đổi mật khẩu kể từ bây giờ. Bạn có chắc muốn tiếp tục?" confirm: "Có, cập nhật chính sách mật khẩu" - password_unique_charactes: + password_unique_characters: prompt: "Bạn sắp thay đổi chính sách mật khẩu của mình. Điều này sẽ ảnh hưởng đến tất cả thành viên khi thay đổi mật khẩu kể từ bây giờ. Bạn có chắc muốn tiếp tục?" confirm: "Có, cập nhật chính sách mật khẩu" block_common_passwords: diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml index 55c745cb09864..beff00720d53d 100644 --- a/config/locales/client.zh_CN.yml +++ b/config/locales/client.zh_CN.yml @@ -18,10 +18,10 @@ zh_CN: no_visible_children: "没有可见子项" failed: "失败" ghost_reasons: - optional_missing_hint: "由于该可选代码块未注册,因此不会被渲染。" - no_visible_children_hint: "由于该容器块中的所有子元素都不可见,因此该容器块不会被渲染。" - condition_failed_hint: "由于条件不满足,此代码块未渲染。" - head_hidden_tail_hint: "由于 `head` 容器中已先渲染了另一个代码块,因此该代码块未被渲染。" + optional_missing_hint: "由于未注册,此可选代码块不会呈现。" + no_visible_children_hint: "由于所有子元素都不可见,此容器块不会呈现。" + condition_failed_hint: "由于条件不满足,此代码块不会呈现。" + head_hidden_tail_hint: "由于 `head` 容器中已先呈现了另一个代码块,此代码块不会呈现。" carousel: go_to_slide: "转到幻灯片 %{index}" previous: "上一张幻灯片" @@ -285,13 +285,13 @@ zh_CN: skip_to_top: "跳转到顶部" skip_user_nav: "跳到个人资料内容" emails_are_disabled: "所有外发电子邮件已被管理员全局禁用。任何类型的电子邮件通知都不会发出。" - emails_are_disabled_no_smtp: "由于未配置SMTP服务器,所有外发邮件功能均已禁用。无法发送任何类型的邮件。" + emails_are_disabled_no_smtp: "由于未配置 SMTP 服务器,所有外发电子邮件均已禁用。无法发送任何类型的电子邮件。" emails_are_disabled_non_staff: "非管理员用户无法向外发送电子邮件。" software_update_prompt: message: "我们更新了网站,请刷新以保持网站顺利运行。" dismiss: "忽略" notifications_tracking: - tooltip: "通知级别: %{level}" + tooltip: "通知级别:%{level}" back_button: "返回" welcome_banner: header: @@ -311,8 +311,8 @@ zh_CN: broken_page_change_alert: "onPageChange 处理程序出错。请查看浏览器开发者工具了解更多信息。" broken_plugin_alert: "由插件 '%{name}' 引起" broken_transformer_alert: "出错了。您的网站可能无法正常运行。" - broken_block_alert: "检测到区块配置错误。请查看浏览器控制台了解详情。" - broken_block_factory_alert: "区块加载失败。某些 UI 元素可能无法正确显示。" + broken_block_alert: "检测到块配置错误。请查看浏览器控制台了解详情。" + broken_block_factory_alert: "块加载失败。某些 UI 元素可能无法正确显示。" critical_deprecation: notice: "[管理员通知] %{source} 包含需要更新的代码。(id:%{id})" learn_more_link: "(了解详情)" @@ -320,9 +320,9 @@ zh_CN: plugin_source: "插件 '%{name}'" unknown_source: "您的某个主题或插件" dev_tools: - drag_to_move: "拖动移动" + drag_to_move: "拖动以移动" toggle_plugin_outlet_debug: "切换插件出口调试" - toggle_block_debug: "切换区块调试" + toggle_block_debug: "切换块调试" block_debug: outlet_boundaries: "出口边界" visual_overlay: "视觉叠加" @@ -417,23 +417,22 @@ zh_CN: pill: "推荐" pm_title: "建议的消息" admin_onboarding_banner: - launch_in_easy_steps: "启动只需 %{step_count} 个简单步骤" - skipped: "管理员入职培训清单现已跳过。如果您想重新启用该清单,请在网站设置中查找 ``enable site owner onboarding` 选项。" - congrats_onboarding_complete: "恭喜您完成入职流程!" + launch_in_easy_steps: "只需 %{step_count} 个简单步骤启动" + skipped: "管理员入门核对清单现已跳过。如果您想重新启用该清单,请在站点设置中查找 `enable site owner onboarding` 选项。" + congrats_onboarding_complete: "恭喜您完成入门流程!" invite_collaborators: - title: "邀请合作者" - description: "早期成员有助于让您的社区充满活力。" + title: "邀请协作者" + description: "早期成员有助于让您的社区充满活力" action: "创建邀请" start_posting: title: "开始发帖" description: "给人们一些共同谈论的话题" action: "破冰创意" - choose_option: "你想如何开始?" + choose_option: "您想如何开始?" predefined_topics: "破冰模板" - predefined_topics_subtitle: "给新成员一些话题,选择一个模板进行编辑,然后自己制作。" - predefined_topics_description: "从一系列对话开场白中挑选一些,开启讨论。" + predefined_topics_subtitle: "给新成员一些话题,选择一个模板进行编辑,然后自行制作。" + predefined_topics_description: "从一系列对话开场白中挑选一些,开启讨论" use_predefined: "浏览模板" - start_with_this: "从这里开始" back: "返回" icebreakers: fun_facts: @@ -447,12 +446,12 @@ zh_CN: body: "欢迎来到社区!让我们互相认识一下。请介绍一下自己,并谈谈你的兴趣爱好。我先来:我对技术充满热情,喜欢教别人!" what_is_your_favorite_food: title: "你最喜欢吃什么?" - body: "与社区分享您最喜爱的食物!我先说:我喜欢披萨,尤其是加了奶酪和意大利辣香肠的披萨。" + body: "与社区分享你最喜爱的食物!我先说:我喜欢披萨,尤其是加了奶酪和意大利辣香肠的披萨。" spread_the_word: title: "广而告之!" description: "将链接分享给你社交网络中的所有人" action: "复制链接" - copied_to_clipboard: "链接已复制到剪贴板!" + copied_to_clipboard: "链接已复制到剪贴板!" about: edit: "编辑此页面" simple_title: "关于" @@ -609,7 +608,7 @@ zh_CN: other_drafts: other: "+其他 %{count} 个草稿" embed_mode: - storage_access_prompt: "已有 %{site_name} 账户?允许访问你的会话,以你的身份发表评论。" + storage_access_prompt: "已有 %{site_name} 帐户?允许访问您的会话,以您的身份发表评论。" allow_access: "允许访问" continue_as_guest: "以访客身份继续" topic_count_all: @@ -672,17 +671,17 @@ zh_CN: filtered_flagged_by: "举报者" unknown: title: - other: "您有来自已禁用插件的待审核队列项目:" + other: "您有来自已禁用插件的待审核队列条目:" instruction: "除非您启用相关插件,否则它们无法正确显示。请启用插件并刷新页面。或者,您可以忽略它们。了解详情…" reviewable_unknown_source: "%{reviewableType}(未知插件)" reviewable_known_source: "%{reviewableType}(来自 '%{pluginName}' 插件)" ignore_all: "全部忽略" enable_plugins: "启用插件" - delete_confirm: "确定要删除所有由禁用插件创建的审核队列项目吗?" - ignore_success: "所有由禁用插件创建的审核已被删除。" + delete_confirm: "确定要删除所有由禁用插件创建的审核队列条目吗?" + ignore_success: "所有由禁用插件创建的审核队列条目均已被删除。" explain: why: "解释为什么此条目最终进入队列" - title: "审核队列项目评分" + title: "审核队列条目评分" formula: "公式" subtotal: "小计" total: "总计" @@ -696,10 +695,10 @@ zh_CN: title: "所提交的举报一直都获得同意的用户将获得加分。" trust_level_bonus: name: "信任级别" - title: "由较高信任级别的用户创建的可审核条目具有较高的分数。" + title: "由较高信任级别的用户创建的举报具有较高的分数。" type_bonus: name: "奖励加分" - title: "某些可审核类型可以由管理人员分配加分,以使其具有更高的优先级。" + title: "某些举报类型可由管理人员指定加分,以使其具有更高的优先级。" revise_and_reject_post: title: "修订" reason: "原因" @@ -708,7 +707,7 @@ zh_CN: custom_reason: "清楚地描述原因" other_reason: "其他…" optional: "可选" - stale_help: "此可审核条目已被 %{username} 解决。" + stale_help: "此条目已被 %{username} 解决。" claim_help: optional: "您可以认领此条目以避免被他人审核。" required: "您必须先认领条目才能进行审核。" @@ -1708,6 +1707,23 @@ zh_CN: apps: "应用" navigation_menu: "导航菜单" upcoming_changes: "即将推出的更改" + calendar_subscriptions: "日历" + calendar_subscriptions: + description: "生成订阅 URL,以便与您常用的日历应用(例如 Google 日历、Apple 日历、Outlook 等)同步。这些 URL\n 是您帐户中日历事件(例如书签提醒、日历事件等)的私有 URL。您可以随时撤销或续订生成的订阅 URL。 " + generate: "生成订阅 URL" + regenerate: "重新生成 URL" + regenerate_confirm: "这将使您现有的日历订阅 URL 失效。任何使用旧 URL 的日历应用都将无法收到更新。是否继续?" + revoke: "撤销订阅" + revoke_confirm: "这将撤销您现有的日历订阅 URL。任何使用这些 URL 的日历应用都将停止接收更新。是否继续?" + urls_warning: "订阅 URL 已准备就绪!点击下方按钮即可将其 URL 到您的日历应用。注意:这些 URL 仅显示一次。" + bookmarks: "书签提醒" + bookmarks_description: "您的书签及提醒日期" + copy: "复制 URL" + copied: "已复制!" + add_to_google: "Google 日历" + add_to_outlook: "微软 Outlook" + add_to_apple: "Apple 日历" + active_subscription: "您有一个活跃的日历订阅。" change_password: success: "(电子邮件已发送)" in_progress: "(正在发送电子邮件)" @@ -2301,8 +2317,9 @@ zh_CN: form_kit: reset: 重置 optional: 可选 + required: 必选 errors_summary_title: - other: "修复这些错误以继续" + other: "修复错误以继续" dirty_form: "您没有提交更改!确定要离开吗?" errors: starts_with: "必须以 %{prefix} 开头" @@ -2573,7 +2590,7 @@ zh_CN: google_classic: "Google Classic(已弃用,改为 Noto Emoji)" facebook_messenger: "Facebook Messenger(已弃用,改为 Standard)" openmoji: OpenMoji - standard: Standard + standard: 标准 fluentui: Fluent Emoji noto: Noto Emoji twemoji: Twemoji @@ -2827,6 +2844,7 @@ zh_CN: collapse: "最小化编辑器面板" open: "打开编辑器面板" abandon: "关闭编辑器并舍弃草稿" + edit_reason: "添加您的编辑理由" enter_fullscreen: "进入全屏编辑器" exit_fullscreen: "退出全屏编辑器" exit_fullscreen_prompt: "按 ESC 退出全屏" @@ -2971,9 +2989,13 @@ zh_CN: available: title: "即将推出的更改" description: "'%{changeName}' 可供预览" + description_two: "'%{changeName1}' 和 '%{changeName2}' 可供预览" + description_many: "'%{changeName}' 和 %{otherChangeCount} ' 更多更改可供预览" automatically_promoted: title: "即将推出的更改" description: "'%{changeName}' 已自动启用" + description_two: "'%{changeName1}' 和 '%{changeName2}' 已自动启用" + description_many: "'%{changeName}' 和 %{otherChangeCount} 的更多更改已自动启用" dismiss_confirmation: body: default: @@ -3028,8 +3050,8 @@ zh_CN: votes_released: "投票额度已释放" new_features: "新的 Discourse 功能已发布" admin_problems: "网站信息中心有新建议" - upcoming_change_available: "即将发生的新变化 '%{changeName}' 已可用" - upcoming_change_automatically_promoted: "即将推出的更改 '%{changeName}' 已自动启用" + upcoming_change_available: "即将推出的新变化已发布" + upcoming_change_automatically_promoted: "即将发生的更改已自动启用" upload_selector: change: "更改" delete: "删除" @@ -3211,7 +3233,7 @@ zh_CN: deleted_post: "(已删除的帖子)" post_number_with_topic_title: "帖子 #%{post_number} - %{title}" new_post_in_topic: "%{title} 中的新帖子" - new_post_in_deleted_topic: "在已删除的主题中发布新帖" + new_post_in_deleted_topic: "在已删除的话题中发布新帖" user_requires_approval: "%{username} 需要审批" default_item: "可审核条目 #%{reviewable_id}" topics: @@ -3256,31 +3278,45 @@ zh_CN: other: "忽略新话题(%{count} 个)…" toggle: "切换话题批量选择" actions: "批量操作" - change_category: "设置类别…" + change_category: "更新类别" close_topics: "关闭话题" archive_topics: "归档话题" move_messages_to_inbox: "移至收件箱" archive_messages: "移至归档" - notification_level: "通知…" + notification_level: "更新通知" change_notification_level: "更改通知级别" choose_new_category: "为话题选择新类别:" - selected: - other: "您已选择 %{count} 个话题。" selected_sole_category: other: "您已从以下类别中选择 %{count} 个话题。" selected_count: other: "已选择 %{count} 个" change_tags: "替换标签" - append_tags: "附加标签" + append_tags: "添加标签" choose_new_tags: "为这些话题选择新标签:" - choose_append_tags: "为这些话题选择要附加的新标签:" + choose_append_tags: "添加标签" changed_tags: "这些话题的标签已更改。" - remove_tags: "移除所有标签" + remove_tags: "移除标签" confirm_remove_tags: other: "所有标签将从 %{count} 个话题中移除。确定吗?" + confirm_update_topics: + other: "更新 %{count} 个话题" + confirm_close_topics: + other: "关闭 %{count} 个话题" + confirm_archive_topics: + other: "存档 %{count} 个话题" + confirm_unlist_topics: + other: "关闭 %{count} 个话题" + confirm_relist_topics: + other: "重新公开 %{count} 个主题" + confirm_archive_messages: + other: "存档 %{count} 个消息" + confirm_move_to_inbox: + other: "将 %{count} 个消息移至收件箱" + confirm_delete_topics: + other: "删除 %{count} 个话题" progress: other: "进度:%{count} 个话题" - notify: "将此更改通知用户。" + notify: "通知用户此变更" performing: "正在执行批量操作,请稍候…" completed: "批量操作成功完成!" completed_count: @@ -3314,44 +3350,50 @@ zh_CN: name: "忽略" close_topics: name: "关闭" - note: "备注" + description: "关闭的话题阻止新的回复。 了解更多" + note: "为这些话题添加注释" optional: '(可选)' archive_topics: name: "归档" + description: "已存档的话题列表在搜索和最新主题列表中被隐藏。 了解更多的" archive_messages: name: "移至归档" move_messages_to_inbox: name: "移至收件箱" unlist_topics: name: "取消公开" + description: "未公开的主题不会显示在话题列表中,但仍可通过直接链接访问。 了解更多" relist_topics: name: "重新公开" remove_tags: name: "移除标签" + description: "从所选话题中移除所有标签。" append_tags: - name: "附加标签" + name: "添加标签" + description: "为选定的话题添加以下标签:" replace_tags: name: "替换标签" + description: "将所选话题的所有现有标签替换为以下内容:" delete_topics: name: "删除" + description: "永久删除所选话题。此操作无法撤销。" update_category: name: "更新类别" - description: "为所选话题选择新类别" + description: "将所有选定的话题移至以下类别:" reset_bump_dates: name: "重置顶帖日期" - description: "将话题顶帖日期重置为最后创建的帖子的日期,这会影响话题列表中的排序" + description: "您是否想更新顶帖日期为帖子最后创建的日期?这可能会影响它们在话题列表列表中的排序。" defer: name: "标记为未读" - description: "将话题标记为未读" update_notifications: name: "更新通知" - description: "将通知级别更改为“正在关注”、“正在跟踪”、“常规”或“已设为免打扰”" + description: "将所选话题的个人通知级别更新为:" topic: filter_to: other: "话题中的 %{count} 个帖子" create: "新建话题" create_long: "创建新话题" - create_group: "新话题和草稿" + create_group: "新建话题和草稿" open_draft: "打开草稿" private_message: "开始消息" archive_message: @@ -3510,6 +3552,8 @@ zh_CN: auto_close_title: "自动关闭设置" auto_close_immediate: other: "该话题中的最后一个帖子已经存在 %{count} 小时,因此该话题将被立即关闭。" + auto_delete_immediate: + other: "该话题中的最后一篇帖子已经存在 %{count} 小时,因此该话题将被立即删除。" timeline: back: "返回" back_description: "返回上一个未读帖子" @@ -3986,6 +4030,7 @@ zh_CN: confirm: other: "确定要合并这 %{count} 个帖子吗?" revisions: + diff_too_complex: "差异过于复杂,无法显示。请尝试查看各个较小的修改。" locale: no_locale_set: "未设置语言" locale_removed: "语言已移除" @@ -4061,6 +4106,7 @@ zh_CN: instructions: "分享此帖子的链接:" original_language: "此帖子最初使用%{language}编写" original_language_and_outdated: "此帖子最初使用%{language}编写。译文可能已过时" + ai_translation_disclaimer: "AI 生成的翻译可能不准确。" category: none: "(无类别)" all: "所有类别" @@ -4075,6 +4121,8 @@ zh_CN: advanced: "高级" show_advanced: "高级设置" topic_template: "模板" + topic_title_placeholder: "类别话题标题占位符" + topic_title_placeholder_placeholder: "[可选] 此分类的自定义话题标题占位符" tags: "标签" localizations: "本地化" localization: @@ -4103,7 +4151,16 @@ zh_CN: topic_featured_link_allowed: "在此类别中允许精选链接" delete: "删除类别" create: "新建类别" + create_with_type: "新 %{typeName} 类别" create_long: "创建新类别" + settings_apply_to_all_of_type_warning: "以下更改将适用于此类型的所有类别" + type_settings_schema: + category_settings: "类别设置" + category_custom_fields: "类别设置" + site_settings: "网站设置" + choose_type: + title: "选择类别类型" + requires_plugin: "需要插件" create_category: "创建类别" save: "保存类别" unsaved_changes: "您有未保存的更改" @@ -4116,7 +4173,7 @@ zh_CN: self_lockout: "您即将更改类别权限,这将移除您自己的访问权限。确定要继续吗?" validations: emoji_required: "选择一个表情符号。" - icon_required: "选择一个图标." + icon_required: "选择一个图标。" name: "类别名称" untitled: "无标题类别" description: "描述" @@ -4153,6 +4210,9 @@ zh_CN: list: "列出类别" no_description: "请为此类别添加描述。" change_in_category_topic: "编辑描述" + description_updated: "描述已更新" + description_expand: "展开" + description_collapse: "收起" already_used: "此颜色已被其他类别使用" color_palette: "调色板" security: "安全性" @@ -4163,15 +4223,15 @@ zh_CN: reply: "回复" create: "创建" no_groups_selected: "没有群组被授予访问权限;此类别仅对管理人员可见。" - everyone_full_access: '此类别是公开的,任何人都可以查看、回复和创建帖子。要限制权限,请移除授予 "%{everyone_group}" 组的一个或多个权限。' - everyone_reply_access: '此分类为公开分类,所有人都可以查看和回复主题。如需限制权限,请移除 "%{everyone_group}" 组。' - everyone_see_access: '此分类为公开分类,所有人都可以查看帖子。如需限制权限,请移除 "%{everyone_group}" 分组。' + everyone_full_access: '此类别为公开类别,任何人都可以查看、回复和创建帖子。要限制权限,请移除授予“%{everyone_group}”群组的一个或多个权限。' + everyone_reply_access: '此类别为公开类别,所有人都可以查看和回复话题。要限制权限,请移除“%{everyone_group}”群组。' + everyone_see_access: '此类别为公开类别,所有人都可以查看帖子。要限制权限,请移除“%{everyone_group}”群组。' specific_groups_have_access: "此类别为不公开类别,只有所选群组可以查看、回复和创建帖子。" - all_parent_groups_used: "父类别下的所有分组已添加。要添加更多分组,请先将其添加到父类别。" + all_parent_groups_used: "父类别下的所有群组均已添加。要添加更多群组,请先将其添加到父类别。" toggle_reply: "切换回复权限" toggle_full: "切换创建权限" - inherited: '此权限继承自 "%{everyone_group}"' - special_warning: "这是一个预先设置好的分类,安全设置无法编辑。如果您不想使用此分类,请将其删除,而不是重新用于其他用途。" + inherited: '此权限继承自“%{everyone_group}”' + special_warning: "这是一个预先设置的类别,安全设置无法编辑。如果您不想使用此类别,请将其删除,而不是重新用于其他用途。" uncategorized_security_warning: "此类别比较特殊。它旨在作为没有类别的话题的存放区域;不能有安全性设置。" uncategorized_general_warning: '此类别比较特殊。它用作未选择类别的新话题的默认类别。如果您想要避免此行为并强制选择类别,请在此处禁用该设置。如果您想要更改其名称或描述,请转到自定义/文本内容。' pending_permission_change_alert: "您还没有将 %{group} 添加到此类别;点击此按钮添加它们。" @@ -4214,9 +4274,9 @@ zh_CN: group_restricted: "不公开" who_can_see: "谁可以查看此类别" who_can_post: "谁可以在此类别中发帖" - which_groups_can_access: "哪些群组可以查看和发布此类别的内容" - more_options_hint: "更多权限可在 高级设置中找到。" - inherited_from_parent: "权限继承自父类别。要进行细化,请访问 高级设置。" + which_groups_can_access: "哪些群组可以查看此类别以及在此类别下发帖" + more_options_hint: "更多权限可在高级设置中找到。" + inherited_from_parent: "权限继承自父类别。要进行细化,请访问高级设置。" num_auto_bump_daily: "每天自动顶贴的开放话题的数量:" auto_bump_cooldown_days: "再次顶帖同一话题之前的最短天数。" navigate_to_first_post_after_read: "阅读话题后导航到第一个帖子" @@ -4710,10 +4770,10 @@ zh_CN: tag_groups_info: other: "此标签属于以下组:%{tag_groups}。" tag_groups_info_prefix: - other: "此标签属于以下分组: " + other: "此标签属于群组: " category_restrictions: other: "它只能用于以下类别:" - restricted_to: "仅限于" + restricted_to: "限于" no_synonyms: "此标签没有同义词。" edit_synonyms: "编辑同义词" add_synonyms_label: "添加同义词:" @@ -4734,7 +4794,7 @@ zh_CN: description: "描述" settings: title: "设置" - edit_title: "编辑标签: %{name}" + edit_title: "编辑标签:%{name}" edit_tag_prefix: "编辑标签:" select_tag: "选择要编辑的标签" general: "常规" @@ -4743,17 +4803,17 @@ zh_CN: name: "名称" slug: "缩略名" name_placeholder: "标签名称" - slug_placeholder: "标签别名(可选,根据名称自动生成)" + slug_placeholder: "标签缩略名(可选,根据名称自动生成)" saved: "标签设置已保存" - no_synonyms: "没有为此标签定义同义词。" - add_synonym_placeholder: "搜索可添加为同义词的标签..." + no_synonyms: "没有为此缩略名定义同义词。" + add_synonym_placeholder: "搜索可添加为同义词的标签…" synonyms_subtitle: "使用以下标签时,它们将被替换为 %{name}。" save: "保存标签" delete: "删除标签" synonyms_hint: "使用上述标签时,它们将被替换为 %{baseTagName}。" - add_synonyms_confirm: "当前使用 %{synonymNames} 的地方都将更改为使用 %{tagName} 。您确定要进行此更改吗?" + add_synonyms_confirm: "当前使用 %{synonymNames} 的地方都将更改为使用 %{tagName}。确定要进行此更改吗?" localization: - hint: "添加本地化功能,以便为不同语言的用户显示不同的标签名称。" + hint: "添加本地化,为不同语言的用户显示不同的标签名称。" locale: "语言区域" name: "名称" description: "描述" @@ -5280,15 +5340,14 @@ zh_CN: group_traffic: "流量" group_members: "成员" group_content: "内容与健康" - group_moderation: "审核" - group_security: "安全性" + group_moderation_and_security: "审核与安全" group_other: "其他" - legacy_warning: "这是一份旧版报告,即将停用。如果您需要帮助寻找替代报告,请联系技术支持。" + legacy_warning: "这是一份旧版报告,即将停用。如果您需要帮助寻找替代报告,请联系支持团队。" config_sections: account: title: "帐户" reports: - title: "举报" + title: "报告" community: title: "社区" appearance: @@ -5315,20 +5374,20 @@ zh_CN: no_changes_to_save: "没有要保存的更改" select_groups: "选择群组…" opt_in_groups: "选择加入的群组" - show_related_settings: "显示相关设置..." + show_related_settings: "显示相关设置…" opt_in_groups_instructions: "选择加入的群组可以用于让特定用户群组在向所有人发布更改前进行测试。请注意,当更改进入稳定状态后,这些群组将不再适用。" enabled_for_throttle: "您修改此更改启用对象的速度过快。请稍等片刻后再试。" change_enabled_for_success: "您已为 %{enabledFor} 启用此更改" change_disabled: "您已选择不加入此更改" permanent_notice: "此更改现已永久生效,并将很快被移除。您无法再选择退出。" - permanent_soon_notice: "这一变化将很快永久生效。您将无法再选择退出。" + permanent_soon_notice: "此更改将很快永久生效。您将无法再选择退出。" permanent_no_group_selection: "不适用,永久更改适用于所有群组。" no_changes: "目前暂无即将推出的更改" preview: "预览" enabled_for_options: no_one: "没有人" everyone: "所有人" - staff: "%{staffGroupName} 仅限" + staff: "仅限 %{staffGroupName}" specific_groups: "特定群组" specific_groups_with_group_names: other: "群组 %{groupNames}" @@ -5350,8 +5409,8 @@ zh_CN: all: "所有" enabled_all: "所有已启用的状态" enabled: "已启用" - enabled_for_staff: "已启用 %{staffGroupName}" - enabled_for_specific_groups: "为特定群组启用" + enabled_for_staff: "已对 %{staffGroupName} 启用" + enabled_for_specific_groups: "已对特定群组启用" disabled: "已禁用" impact_type_all: "所有影响类型" impact_type_feature: "功能" @@ -5401,7 +5460,7 @@ zh_CN: keywords: "语言区域|语言|时区|unicode|ltr" upcoming_changes: title: "即将推出的更改" - header_description: "即将到来的 Discourse 更新列表,可能会影响您的站点,以及您可以选择加入的实验性功能。您可以按影响程度、更改类型和状态进行筛选。\n\n选择加入组可用于让特定用户组在更新发布给所有人之前进行测试,不过一旦更新进入稳定状态,这些组就不再相关。" + header_description: "即将推出的 Discourse 更改列表,可能会影响您的站点,以及您可以选择加入的实验性功能。您可以按影响、类型和状态进行筛选。\n\n选择加入的群组可以用于让特定用户群组在向所有人发布更改前进行测试,当更改进入永久状态后,这些群组将不再适用。" login: title: "登录与身份验证" header_description: "配置用户登录和验证身份的方式、机密与密钥、OAuth2 提供商等。" @@ -5440,7 +5499,7 @@ zh_CN: help_text: "建议尺寸为 600 x 80 像素。" large_icon: title: "方形图标" - description: "网站顶部会显示一个方形版本的徽标图像,该徽标同时也是移动应用程序的徽标。" + description: "方形版本的徽标图片会显示在站点顶部,也是移动应用徽标。" help_text: "建议尺寸为 512 x 512 像素。" square_icon_dark: required: "为深色模式使用不同的方形图标?" @@ -5623,7 +5682,7 @@ zh_CN: title: "日志" header_description: "查看和管理备份、恢复和上传内容" reports: - title: "举报" + title: "报告" header_description: "报告是帮助您了解站点上所发生事情的强大工具。它们可以帮助您了解趋势、发现问题并根据数据做出决策。" sub_pages: settings: @@ -5762,7 +5821,7 @@ zh_CN: header_description: "Discourse 能够使用创建 IFRAME 的 Javascript API 在远程网站中嵌入话题的评论" form_templates: title: "表单模板" - header_description: "表单模板允许您在主题创建流程中强制执行结构化表单和数据验证。" + header_description: "表单模板允许您在话题创建流程中强制执行结构化表单和数据验证。" theme_site_settings: setting: "设置" overridden_by: "覆盖者" @@ -5804,8 +5863,8 @@ zh_CN: new_features: title: "最新变化" subtitle: "我们一直在发布新功能和改进。本页涵盖了重点内容,但您也可以点击“了解详情”查看详细的版本说明。" - no_new_features_found: "新闻源中没有项目,或者您所选的过滤器没有返回结果。 您可以在 Discourse Meta 社区 上看到以前的新功能公告。" - no_new_features_error: "加载最新功能列表时出现错误。您可以在Discourse Meta 社区查看以前的新功能公告。" + no_new_features_found: "Feed 中没有条目,或者您的所选筛选器没有返回结果。 您可以在 Discourse Meta 社区上看到以前的新功能公告。" + no_new_features_error: "加载 Feed 时出错。您可以在 Discourse Meta 社区上查看以前的新功能公告。" learn_more: "了解详情…" last_checked: "上次检查" refresh_problems: "刷新" @@ -5865,10 +5924,11 @@ zh_CN: all: "所有" view_table: "表格" view_graph: "图表" - refresh_report: "刷新报告" + refresh_report: "刷新" daily: 每天 monthly: 每月 weekly: 每周 + chart_group_period: "选择一个时间段" value_so_far: "%{value}(目前为止)" dates: "日期 (UTC)" groups: "所有群组" @@ -5985,7 +6045,7 @@ zh_CN: cancel: "取消" continue: "继续" copy_key: "复制" - key_copied_to_clipboard: "API密钥已复制到剪贴板" + key_copied_to_clipboard: "API 密钥已复制到剪贴板" back: "返回到 API 密钥" revoke: "撤销" undo_revoke: "取消撤销" @@ -6623,8 +6683,8 @@ zh_CN: delete: "删除" delete_confirm: '确定要删除“%{theme_name}”吗?' bulk_delete: "确定吗?" - bulk_themes_delete_confirm: "这将卸载以下主题,您网站上的任何用户将无法再使用它们:" - bulk_components_delete_confirm: "这将卸载以下主题组件,您网站上的任何用户将无法再使用它们:" + bulk_themes_delete_confirm: "这将卸载以下主题,您站点上的任何用户将无法再使用它们:" + bulk_components_delete_confirm: "这将卸载以下组件,您站点上的任何用户将无法再使用它们:" color: "颜色" opacity: "不透明度" copy: "复制" @@ -7239,6 +7299,7 @@ zh_CN: upcoming_change_available: "即将推出的更改已可用" change_site_setting_groups: "更改站点设置群组" discourse_id_regenerate_credentials: "重新生成 Discourse ID 凭据" + configure_category_type: "配置类别类型" screened_emails: title: "已屏蔽的电子邮件地址" description: "当有人尝试创建新帐户时,将检查以下电子邮件地址并禁止注册,或执行某些其他操作。" @@ -7836,6 +7897,9 @@ zh_CN: more_than_50_results: "结果超过 50 个。请优化您的搜索。" no_results: "找不到匹配的网站文本" interpolation_keys: "可用的插值键:" + interpolation_key_insert: "点击插入" + interpolation_key_used: "已使用" + interpolation_key_invalid: "未知密钥——将不会进行插值" outdated: title: "此翻译已过时" description: "自此替换创建以来,此键的默认翻译已更改。请在下面检查您的翻译是否与对原始意图所做的任何更改相符。" @@ -7949,7 +8013,7 @@ zh_CN: min_admin_password_length: prompt: "您即将修改密码策略。这将影响所有从现在起更改密码的管理员。确定要继续吗?" confirm: "是,更新密码策略" - password_unique_charactes: + password_unique_characters: prompt: "您即将修改密码策略。这将影响所有从现在起更改密码的用户。确定要继续吗?" confirm: "是,更新密码策略" block_common_passwords: @@ -7994,8 +8058,8 @@ zh_CN: no_user_badges: "%{name} 尚未被授予任何徽章。" no_badges: 没有可供授予的徽章。 none_selected: "选择一个徽章以开始" - filter_placeholder: "筛选徽章……" - no_badges_found: "未找到徽章" + filter_placeholder: "筛选徽章…" + no_badges_found: "找不到徽章" sections: design: 设计 query: 查询 diff --git a/config/locales/client.zh_TW.yml b/config/locales/client.zh_TW.yml index 539aa21004587..8b12f1a2e3275 100644 --- a/config/locales/client.zh_TW.yml +++ b/config/locales/client.zh_TW.yml @@ -1498,6 +1498,9 @@ zh_TW: tags: "標籤" interface: "界面" apps: "應用" + calendar_subscriptions: + copied: "已複製!" + add_to_google: "Google 行事曆" change_password: success: "( 寄出的郵件 )" in_progress: "( 正在傳送郵件 )" @@ -2070,6 +2073,7 @@ zh_TW: form_kit: reset: 重置 optional: 選擇性 + required: 必填 dirty_form: "您尚未提交您的更改!您確實要離開嗎?" errors: required: "必要設定" @@ -2877,11 +2881,8 @@ zh_TW: confirm: "確認" select_all: "選擇全部" clear_all: "清除全部" - unlist_topics: "未在列表中的話題" - relist_topics: "討論話題" reset_bump_dates: "重設上浮日期" defer: "標記未讀" - delete: "刪除話題" delete_topics_count: other: "刪除話題" dismiss: "忽略" @@ -2908,26 +2909,18 @@ zh_TW: other: "忽略(%{count} 個)" toggle: "批次切換選擇話題" actions: "批次操作" - change_category: "設定分類" - close_topics: "關閉話題" - archive_topics: "已封存的話題" move_messages_to_inbox: "移動到收件匣" archive_messages: "移至封存" - notification_level: "通知…" change_notification_level: "變更通知層級" choose_new_category: "為話題選擇新類別:" - selected: - other: "你已選擇了 %{count} 個話題。" selected_sole_category: other: "您已從以下類別中選擇 %{count} 個話題。" selected_count: other: "已選擇 %{count} 個" - change_tags: "取代標記" - append_tags: "向後追加標記" + append_tags: "新增標記" choose_new_tags: "為話題選擇新標籤" - choose_append_tags: "為話題選擇新標籤" + choose_append_tags: "新增標記" changed_tags: "話題的標籤已修改" - remove_tags: "移除所有標記" confirm_remove_tags: other: "所有標記將從 %{count} 個話題中移除。確定嗎?" progress: @@ -2953,7 +2946,6 @@ zh_TW: name: "忽略" close_topics: name: "關閉" - note: " 分類已經沒有其它話題了。" optional: (選擇性) archive_topics: name: "封存" @@ -2967,24 +2959,18 @@ zh_TW: name: "重新公開" remove_tags: name: "移除標記" - append_tags: - name: "向後追加標記" replace_tags: name: "取代標記" delete_topics: name: "刪除" update_category: name: "更新分類" - description: "為選取的主題選擇新類別" reset_bump_dates: name: "重設上浮日期" - description: "將主題更新日期重設為上次建立貼文的日期,這會影響主題清單中的排序" defer: name: "標註為未讀" - description: "將主題標記為未讀" update_notifications: name: "更新通知" - description: "將通知層級變更為「關注」、「追蹤」、「正常」或「靜音」" topic: filter_to: other: "本話題中的 %{count} 帖" @@ -3680,6 +3666,8 @@ zh_TW: placeholder: "選擇標記群組…" topic_featured_link_allowed: "允許在該分類中發布精選的連結標題" create_long: "建立新的分類" + type_settings_schema: + site_settings: "網站設定" slug_placeholder: "(選填) 在 url 加上虛線" creation_error: 建立分類時發生錯誤。 save_error: 儲存分類時發生錯誤。 @@ -3705,6 +3693,8 @@ zh_TW: delete_error: "刪除此分類時發生錯誤。" no_description: "請為此分類新增描述。" change_in_category_topic: "編輯描述" + description_expand: "顯示更多" + description_collapse: "顯示更少" already_used: "此顏色已經用於其它分類" security: "安全性" security_add_group: "新增群組" @@ -4649,8 +4639,6 @@ zh_TW: back: "返回到所有報告" group_traffic: "流量" group_members: "成員" - group_moderation: "管理" - group_security: "安全性" group_other: "其他" config_sections: account: @@ -5038,7 +5026,7 @@ zh_TW: all: "全部" view_table: "表格" view_graph: "圖表" - refresh_report: "重新整理報告" + refresh_report: "重新整理" daily: 日 monthly: 月 weekly: 周 @@ -6939,7 +6927,7 @@ zh_TW: confirm: "是的,更新密碼原則" min_admin_password_length: confirm: "是的,更新密碼原則" - password_unique_charactes: + password_unique_characters: confirm: "是的,更新密碼原則" block_common_passwords: confirm: "是的,更新密碼原則" diff --git a/config/locales/server.ar.yml b/config/locales/server.ar.yml index 14d6043978d55..55fecc49a8fcd 100644 --- a/config/locales/server.ar.yml +++ b/config/locales/server.ar.yml @@ -60,6 +60,8 @@ ar: inline_oneboxer: topic_page_title_post_number: "#%{post_number}" topic_page_title_post_number_by_user: "#%{post_number} بواسطة %{username}" + too_many_urls: "لا يمكن تحويل أكثر من 10 عناوين URL إلى مربعات مضمنة أحادية في طلب واحد." + concurrency_not_allowed: "لا يُسمح بإرسال طلبات متزامنة لتحويل عناوين URL إلى مربعات مضمنة أحادية. يُرجى إرسال طلب واحد في كل مرة." components: enabled_filter: "مفعَّلة" disabled_filter: "متوقفة" @@ -338,6 +340,7 @@ ar: errors: &errors format: ! "%{attribute} %{message}" format_with_full_message: "%{attribute}: %{message}" + diff_too_complex: "الفرق معقد للغاية بحيث لا يمكن حسابه بأمان. يرجى تجربة تعديلات أصغر." messages: invalid_locale: "%{invalid_locale} ليست لغة صالحة" too_long_validation: @@ -453,6 +456,7 @@ ar: slow_down_crawler_user_agent_must_be_at_least_3_characters: "يجب ألا يقل طول وكلاء المستخدمين عن 3 أحرف لتجنُّب تقييد معدل المستخدمين القانونيين من غير قصد." slow_down_crawler_user_agent_cannot_be_popular_browsers: "لا يمكنك إضافة أيٍّ من القيم التالية إلى الإعداد: %{values}." strip_image_metadata_cannot_be_disabled_if_composer_media_optimization_image_enabled: "لا يمكنك إيقاف إزالة البيانات الوصفية للصورة إذا كان 'composer media optimization image enabled' مفعلًا. أوقف 'composer media optimization image enabled' قبل إيقاف إزالة البيانات الوصفية للصورة." + x_summary_large_image_no_svg: "لا يمكن أن تكون صور ملخص X المُستخدَمة في البيانات الوصفية لـ twitter:image بتنسيق svg." tl0_and_anonymous_flag: "يجب إدخال 'site contact email' أو 'email address to report illegal content' للمستخدمين المجهولين." allow_likes_in_anonymous_mode_without_anonymous_mode_enabled: "يشترط هذا الإعداد تفعيل خيار \"السماح بوضع المستخدم المجهول\" مسبقًا." conflicting_google_user_id: 'تم تغيير معرِّف حساب Google لهذا الحساب؛ مطلوب تدخُّل فريق العمل لأسباب أمنية. يُرجى التواصل مع فريق العمل وتوجيهه إلى
https://meta.discourse.org/t/76575' @@ -1528,9 +1532,10 @@ ar: description: "قائمة بحالات البلاغات متضمنةً نوع البلاغ، وكاتب المنشور، ومقدِّم البلاغ، والوقت حتى التعامل معه." visits: title: "زيارات المستخدم" - xaxis: "اليوم" + xaxis: + desktop: "سطح المكتب" + mobile: "الجوَّال" yaxis: "عدد الزيارات" - description: "عدد زيارات المستخدمين المسجَّلين." signups: title: "الاشتراكات" xaxis: "اليوم" @@ -1594,10 +1599,8 @@ ar: description: "مشاهدات الصفحة للمستخدمين الذين سجَّلوا الدخول والمستخدمين المجهولين ومتتبعات ارتباطات الويب المعروفة وحركات الزيارات الأخرى." description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "المستخدمون النشطون يوميًا/المستخدمون النشطون شهريًا" xaxis: "اليوم" yaxis: "المستخدمون النشطون يوميًا/المستخدمون النشطون شهريًا" - description: "عدد الأعضاء الذين سجَّلوا الدخول في اليوم الماضي مقسومًا على عدد الأعضاء الذين سجَّلوا الدخول في الشهر الماضي - يتم عرض نسبة مئوية تشير إلى \"الاستمرار في المتابعة\" للمجتمع. ننصحك بالبقاء فوق 20%." daily_engaged_users: title: "المستخدمون المتفاعلون يوميًا" xaxis: "اليوم" @@ -1915,6 +1918,7 @@ ar: many: "لقد تسبَّب استطلاع البريد الإلكتروني في حدوث %{count} خطأ في آخر 24 ساعة. راجع السجلات للمزيد من التفاصيل." other: "لقد تسبَّب استطلاع البريد الإلكتروني في حدوث %{count} خطأ في آخر 24 ساعة. راجع السجلات للمزيد من التفاصيل." missing_mailgun_api_key: "تم إعداد الخادم لإرسال الرسائل الإلكترونية عبر Mailgun، لكنك لم تقدِّم مفتاح API المُستخدَم للتحقُّق من رسائل خطاف الويب." + qq_mail_smtp: "من المعروف أن خادم SMTP الخاص بك (%{smtp_address}) يتسبب في تكرار رسائل البريد الإلكتروني مع Discourse. لا يقوم بريد QQ بإرجاع إقرارات مناسبة، مما يجعل Discourse يعيد محاولة عمليات الإرسال الناجحة. انظر البدائل الموصى بها." bad_favicon_url: "فشل تحميل رمز favicon. تحقَّق من إعداد الرمز المفضل في إعدادات الموقع." poll_pop3_timeout: "مهلة الاتصال بخادم POP3 على وشك الانتهاء. ولم يتم استرداد البريد الإلكتروني الوارد. يُرجى التحقق من إعدادات POP3 وموفر الخدمة." poll_pop3_auth_error: "الاتصال بخادم POP3 يفشل بسبب خطأ في المصادقة. يُرجى التحقق من إعدادات POP3." @@ -2015,6 +2019,8 @@ ar: max_oneboxes_per_post: "تعيين الحد الأقصى لعدد لوحات المعاينة التي يمكن تضمينها في منشور واحد. توفِّر لوحات المعاينة للمحتوى المرتبط داخل المنشور." facebook_app_access_token: "رمز يتم إنشاؤه من معرِّف تطبيق Facebook أو الرمز السري لديك. ويتم استخدامه لإنشاء لوحات معاينة لموقع Instagram." github_onebox_access_tokens: "تعيين مؤسسة أو مستخدم GitHub لرمز وصول GitHub المستخدم لإنشاء لوحات معاينة GitHub للمستودعات الخاصة، والإصدارات، وطلبات السحب، والمشكلات، ومحتويات الملفات. بدون هذا، سيتم عرض عناوين URL العامة لـ GitHub فقط في لوحة المعانية." + reddit_onebox_client_id: "مُعرّف عميل Reddit API OAuth المستخدَم لمصادقة صناديق Reddit الأحادية. أنشئ تطبيقًا من نوع \"البرنامج النصي\" على reddit.com/prefs/apps/apps للحصول على بيانات الاعتماد." + reddit_onebox_client_secret: "سر عميل Reddit API OAuth المستخدّم لمصادقة صناديق Reddit الأحادية. موجود ضمن تطبيق من نوع \"البرنامج النصي\" الذي تم إنشاؤه على reddit.com/prefs/apps." logo: "صورة الشعار في الجزء العلوي الأيمن من موقعك. استخدم صورة مستطيلة عريضة بارتفاع 120 ونسبة عرض إلى ارتفاع أكبر من 3:1. وإذا تركتها فارغة، فسيتم عرض نص عنوان الموقع." logo_small: "صورة الشعار الصغيرة في الجزء العلوي الأيمن من موقعك، وتظهر عند التمرير لأسفل. استخدم صورة مربعة بمقاس 120 × 120. وإذا تركتها فارغة، فسيتم عرض صورة رمزية لمنزل." digest_logo: "الشعار البديل المُستخدَم أعلى ملخص البريد الإلكتروني لموقعك. استخدم صورة مستطيلية عريضة. لا تستخدم صورة SVG. وإذا تركتها فارغة، فسيتم استخدام الصورة من إعداد `logo`." @@ -2026,6 +2032,7 @@ ar: manifest_icon: "الصورة المُستخدَمة كشعار/صورة البداية على Android. سيتم تغيير حجمها تلقائيًا إلى 512 × 512. وإذا تركتها فارغة، فسيتم استخدام large_icon." manifest_screenshots: "لقطات شاشة تعرض ميزات المثيل ووظيفته على صفحة رسالة التثبيت الخاصة به. يجب أن تكون جميع الصور من تحميلات محلية وبالأبعاد نفسها." favicon: "الرمز المفضَّل لموقعك، راجع https://en.wikipedia.org/wiki/Favicon للعمل بشكلٍٍ صحيح على شبكة توصيل المحتوى، يجب أن تكون الصورة بتنسيق png. سيتم تغيير حجمها إلى 32 × 32. وإذا تركتها فارغة، فسيتم استخدام large_icon." + apple_touch_icon: "الشعار المُستخدَم على أجهزة Apple اللمسية. سيتم تغيير حجمها تلقائيًا إلى 180x180. وإذا تركتها فارغة، فسيتم استخدام large_icon." opengraph_image: "صورة opengraph افتراضية، يتم استخدامها عندما لا تحتوي الصفحة على صورة أخرى مناسبة. وإذا تركتها فارغة، فسيتم استخدام large_icon." x_summary_large_image: "بطاقة Twitter من نوع \"summary large image\" (يجب أن تكون على الأقل بعرض 280 بكسل وارتفاع 150 بكسل، ولا يمكن أن تكون بصيغة .svg). إذا تُرك هذا الحقل فارغًا، يتم إنشاء البيانات الوصفية التقليدية باستخدام opengraph_image بشرط ألا تكون أيضًا بصيغة .svg" notification_email: "عنوان البريد الإلكتروني المُستخدَم في حقل \"من:\" عند إرسال جميع رسائل النظام الأساسية. يجب تعيين سجلات SPF وDKIM وreverse PTR للنطاق المحدَّد هنا بشكلٍٍ صحيح لتصل الرسالة الإلكترونية." @@ -2194,6 +2201,7 @@ ar: enable_local_logins_via_email: "السماح للمستخدمين بطلب رابط تسجيل الدخول بنقرة واحدة ليتم إرساله إليهم عبر البريد الإلكتروني" allow_new_registrations: "السماح بعمليات تسجيل جديدة من المستخدمين. يمكنك إلغاء تحديد هذا الإعداد لمنع أي شخص من إنشاء حساب جديد." enable_signup_cta: "إظهار إشعار للمستخدمين المجهولين العائدين تطالبهم بالاشتراك للحصول على حساب." + enable_discourse_id: "تفعيل المصادقة من خلال معرف Discourse، وهي خدمة تسجيل دخول موحد (SSO) تتيح للمستخدمين تسجيل الدخول إلى عدة مواقع Discourse باستخدام حساب واحد فقط. يتم دعم مقدمي خدمة تسجيل الدخول بحساب تواصل اجتماعي الشائعين مثل Google وFacebook وApple وGitHub دون الحاجة إلى أي إعداد إضافي. لمزيد من التفاصيل، تفضل بزيارة id.discourse.com." enable_google_oauth2_logins: "تفعيل مصادقة Google Oauth2. هذه هي طريقة المصادقة التي تدعمها Google حاليًا. وتتطلَّب مفتاحًا ورمزًا سريًا. راجع إعداد تسجيل الدخول عبر Google لمنصة Discourse." google_oauth2_client_id: "معرِّف العميل الفريد الذي يوفره تطبيق Google الخاص بك، والذي يُستخدم في عملية المصادقة." google_oauth2_client_secret: "الرمز السري للعميل لتطبيق Google" @@ -2416,6 +2424,8 @@ ar: num_flaggers_to_close_topic: "الحد الأدنى لعدد البلاغات المطلوب لإيقاف موضوع مؤقتًا للتدخل" num_hours_to_close_topic: "عدد الساعات المطلوبة لإيقاف موضوع مؤقتًا للتدخل" auto_respond_to_flag_actions: "تفعيل الرد التلقائي عند تجاهل بلاغ" + min_first_post_typing_time: "الحد الأدنى للمدة الزمنية التي يجب على المستخدم الكتابة خلالها، إذا لم يتم استيفاء الحد، فسيدخل المنشور تلقائيًا في قائمة انتظار الموافقة. قم بالتعيين إلى 0 للإيقاف (لا يوصى بذلك)" + fast_typing_threshold: "الحد الأدنى من الوقت الذي يجب أن يكتب فيه المستخدم منشوره الأول. إذا لم يتم استيفاء الحد الأدنى، فسيدخل المنشور تلقائيًا في قائمة المراجعة. الحد الأدنى هو ثانية واحدة، والقياسي هو 3 ثوانٍ، والأعلى هو 5 ثوانٍ." auto_silence_fast_typers_on_first_post: "كتم المستخدمين تلقائيًا عندما لا يستوفون `fast typing threshold`" auto_silence_fast_typers_max_trust_level: "الحد الأقصى لمستوى الثقة المطلوب لكتم أصحاب الطباعة السريعة تلقائيًا" auto_silence_first_post_regex: "التعبير العادي غير الحساس لحالة الأحرف الذي إذا تم تمريره سيؤدي إلى كتم أول منشور بواسطة المستخدم وإرساله إلى قائمة انتظار الموافقة. مثال: ستؤدي كتابة raging|a[bc]a إلى كتم جميع المنشورات التي تتضمَّن raging أو aba أو aca في البداية. ينطبق ذلك على أول منشور فقط. تم إيقافه: استخدم \"كتم الكلمات المُراقَبة\" بدلًا منه." @@ -2434,6 +2444,7 @@ ar: alternative_reply_by_email_addresses: "قائمة النماذج البديلة للرد عبر البريد الإلكتروني على عناوين البريد الإلكتروني الوارد. مثال: %%{reply_key}@reply.example.com|replies+%%{reply_key}@example.com" incoming_email_prefer_html: "استخدام HTML بدلًا من النص للرسائل الإلكترونية الواردة" strip_incoming_email_lines: "إزالة المسافات السابقة واللاحقة من كل سطر من الرسائل الإلكترونية الواردة" + disable_emails: "منع Discourse من إرسال أي نوع من الرسائل الإلكترونية. حدِّد \"نعم\" لإيقاف الرسائل الإلكترونية الصادرة إلى جميع المستخدمين. حدِّد \"غير فريق العمل\" لإيقاف الرسائل الإلكترونية للمستخدمين من غير فريق العمل فقط." allow_email_invites: "عند تعطيله، لن يتمكن المستخدمون من إرسال رسائل الدعوة عبر Discourse" strip_images_from_short_emails: "إزالة الصور من الرسائل الإلكترونية التي يقل حجمها عن 2800 بايت" short_email_length: "تحديد الحد الأقصى للطول، بالبايت، ليتم تصنيف البريد الإلكتروني على أنه \"قصير\" وإزالة الصور. إذا لم يتجاوز حجم الرسالة الإلكترونية هذا الإعداد، فستتم إزالة أي صور (مثل الصور الرمزية والرموز التعبيرية) ضمن الرسالة الإلكترونية." @@ -2527,13 +2538,14 @@ ar: allow_likes_in_anonymous_mode: "فعّل هذا الإعداد للسماح للمستخدمين الذين يتصفحون موقعك بشكل مجهول بالإعجاب بالمنشورات. عند التفعيل، يمكن للمستخدمين اختيار إخفاء هويتهم عند الإعجاب بالمنشورات أو الموضوعات في جميع أنحاء الموقع. يتطلب هذا الإعداد تفعيل خيار \"السماح بالوضع المجهول\" (allow anonymous mode)." anonymous_posting_allowed_groups: "المجموعات المسموح لها بتفعيل خاصية النشر المجهول. يتطلب هذا الإعداد تفعيل خيار \"السماح بالوضع المجهول\"." anonymous_account_duration_minutes: "لحماية إخفاء الهوية، أنشئ حسابًا مجهولًا جديدًا كل N دقيقة لكل مستخدم. مثال: إذا تم التعيين إلى 600، سيتم إنشاء حساب مجهول جديد بمجرد مرور 600 دقيقة على آخر منشور وتحوُّل المستخدم إلى مجهول." - hide_user_profiles_from_public: "إيقاف بطاقات المستخدمين والملفات الشخصية لهم ودليل المستخدم للمستخدمين المجهولين" hide_new_user_profiles: "إخفاء الملفات الشخصية من مستوى الثقة 1 أو أقل عن العامة أو المستخدمين من مستوى الثقة 1 حتى ينشروا لأول مرة. يتم إيقاف هذه الميزة بشكلٍ غير مشروط على المواقع التي تتطلب موافقة المستخدمين (must_approve_users) والمواقع التي تتطلب دعوة فقط (invite_only)." allow_users_to_hide_profile: "السماح للمستخدمين بإخفاء ملفاتهم الشخصية ووجودهم" hide_user_activity_tab: "إخفاء علامة تبويب النشاط في ملفات تعريف المستخدم باستثناء المسؤول والذات." delete_associated_accounts_on_password_reset: "حذف الحساب المرتبط بالمستخدم عندما يغير المستخدم كلمة المرور." allow_featured_topic_on_user_profiles: "السماح للمستخدمين بعرض رابط لموضوع على بطاقة المستخدم والملف الشخصي" show_inactive_accounts: "السماح للمستخدمين الذين سجَّلوا الدخول باستعراض الملفات الشخصية للحسابات غير النشطة" + hide_silencing_reasons: "عدم عرض أسباب تقييد أو كتم المستخدم علنًا على صفحة ملفه الشخصي." + hide_suspension_reasons: "عدم عرض أسباب التعليق بشكلٍٍ عام في الملفات الشخصية للمستخدمين" log_personal_messages_views: "تسجيل مرات عرض الرسائل الشخصية بواسطة المسؤول للمستخدمين/المجموعات الأخرى" ignored_users_count_message_threshold: "إرسال إشعار إلى المشرفين إذا تم تجاهل مستخدم معيَّن بواسطة هذا العدد من المستخدمين الآخرين" ignored_users_message_gap_days: "وقت الانتظار قبل إرسال إشعار إلى المشرفين مرة أخرى بشأن مستخدم تم تجاهله بواسطة الكثيرين" @@ -2547,6 +2559,7 @@ ar: dont_feed_the_trolls_threshold: "عدد البلاغات من المستخدمين الآخرين قبل تحذير المستخدم" enable_mobile_theme: "تستخدم الأجهزة الجوَّالة سمة متوافقة مع الجوَّال، مع إمكانية التبديل إلى الموقع الكامل. يمكنك إيقاف هذا إذا كنت تريد استخدام ورقة أنماط مخصَّصة تستجيب بشكلٍٍ كامل." dominating_topic_minimum_percent: "ما النسبة المئوية للمنشورات التي يجب على المستخدم إنشاؤها في الموضوع قبل أن يتم تذكيره بالسيطرة الزائدة على الموضوع." + pm_warn_user_last_seen_months_ago: "تحذير المستخدمين، عند إنشاء رسالة شخصية، عندما يكون المستلم المستهدف لم يظهر منذ أكثر من n من الأشهر." suppress_uncategorized_badge: "عدم إظهار الشارة للموضوعات غير المصنَّفة في قوائم الموضوعات" header_dropdown_category_count: "عدد الفئات التي يمكن عرضها في القائمة المنسدلة للرأس" permalink_normalizations: "تطبيق التعبير العادي التالي قبل مطابقة الروابط الثابتة، على سبيل المثال: سيؤدي استخدام /(topic.*)\\?.*/\\1 إلى إزالة سلاسل الاستعلام من مسارات الموضوع. التنسيق هو regex+string. استخدم \\1 وما إلى ذلك للوصول إلى الالتقاطات." @@ -2722,6 +2735,7 @@ ar: dashboard_hidden_reports: "السماح بإخفاء التقارير المحدَّدة من لوحة المعلومات" dashboard_visible_tabs: "اختيار علامات التبويب المرئية في لوحة المعلومات" dashboard_general_tab_activity_metrics: "اختيار التقارير التي سيتم عرضها كمقاييس للنشاط في علامة التبويب \"عام\"" + gravatar_enabled: "تفعيل خدمة Gravatar لصور الحسابات الشخصية للمستخدمين. سيؤدي تعطيل هذا إلى منع المستخدمين من تغيير صورهم إلى Gravatar، ولكنه لن يؤثر في من يستخدمها بالفعل." gravatar_name: "تحديد اسم مقدِّم خدمة Gravatar. يُستخدَم هذا الاسم عادةً لتحديد المصدر الذي يوفر صور Gravatar الرمزية للموقع." gravatar_base_url: "تحديد عنوان URL للوصول إلى واجهة برمجة تطبيقات مقدِّم خدمة Gravatar. يُعد هذا الإعداد بالغ الأهمية لتحويل عناوين البريد الإلكتروني إلى عناوين URL لـ Gravatar حيث يتم تخزين صور الرمزية." gravatar_login_url: "عنوان URL نسبة إلى `gravatar_base_url`، والذي يوفر للمستخدم تسجيل الدخول إلى خدمة Gravatar." @@ -2734,19 +2748,23 @@ ar: suggest_weekends_in_date_pickers: "تضمين عطلات نهاية الأسبوع (السبت والأحد) في اقتراحات منتقي التاريخ (يمكنك إيقاف هذا الإعداد إذا كنت تستخدم Discouse في أيام الأسبوع فقط؛ أي من الاثنين إلى الجمعة)." show_bottom_topic_map: "يظهر خريطة الموضوع أسفل الموضوع عندما يحتوي على 10 ردود أو أكثر." show_topic_map_in_topics_without_replies: "يظهر خريطة الموضوع حتى إذا كان الموضوع لا يحتوي على ردود." + enable_site_owner_onboarding: "يعرض لوحةً على الصفحة الرئيسية للمسؤولين الجدد لمساعدتهم على البدء. أعد تفعيل هذا الإعداد لعرض خطوات الإعداد مرة أخرى." enable_welcome_banner: "عرض بانر في صفحات قائمة الموضوعات الرئيسية بهدف الترحيب بالأعضاء وتمكينهم من إجراء البحث ضمن محتوى الموقع." welcome_banner_image: "تحديد صورة لتُعرض في خلفية بانر الترحيب." welcome_banner_location: "يحدد مكان ظهور بانر الترحيب على الصفحة." welcome_banner_page_visibility: "يحدد الصفحات التي سيظهر فيها بانر الترحيب." welcome_banner_text_color: "عند ضبط إعداد \"صورة بانر الترحيب\"، استخدم هذا الإعداد لتغيير لون نص البانر لضمان وضوح قراءته. إذا تُرك الحقل فارغًا أو لم يتم تحميل أي صورة، تتحكم السمة النشطة في تحديد اللون." splash_screen: "يعرض شاشة تحميل مؤقتة أثناء تحميل أصول الموقع" + splash_screen_image: "صورة SVG لعرضها على شاشة البداية أثناء تحميل الموقع. يجب أن تستخدم صور SVG المتحركة فقط تحويل CSS أو الرسوم المتحركة المعتمة. استخدم أسماء فريدة لفئات CSS والإطارات الرئيسية. يمكنك استخدام var(--الأساسي) و var(--الثانوي) و var(--الثالث) للإشارة إلى ألوان السمات." navigation_menu: "تحديد القائمة المنسدلة للشريط الجانبي أو الرأس كقائمة التنقل الرئيسية لموقعك. يوصى بالشريط الجانبي." default_navigation_menu_categories: "سيتم عرض الفئات المحدَّدة ضمن قسم فئات قائمة التنقل بشكلٍٍ افتراضي." default_navigation_menu_tags: "سيتم عرض الفئات المحدَّدة ضمن قسم وسوم قائمة التنقل بشكلٍٍ افتراضي." experimental_new_new_view_groups: 'تفعيل قائمة موضوعات جديدة تجمع بين الموضوعات الجديدة وغير المقروءة، ووضع رابط "الكل" في رابط الشريط الجانبي إليها' + enable_form_templates: "فعّل ميزة قوالب النماذج. وبتفعيلها، يمكنك تطبيق نموذج منظم مع التحقق من صحة البيانات كجزء من عملية إنشاء الموضوع." show_preview_for_form_templates: "تفعيل ميزة معاينة قوالب النماذج" lazy_load_categories_groups: "التحميل البطيء لمعلومات الفئة لمستخدمي هذه المجموعات فقط. يؤدي هذا إلى تحسين الأداء على المواقع ذات الفئات المتعددة." enable_auto_grid_images: "يُغلف النظام تلقائيًا الصور ضمن وسوم [grid] عند تحميل 3 صور أو أكثر في أداة الإنشاء." + impersonate_without_logout: "السماح للمسؤولين بانتحال شخصية مستخدم آخر دون الحاجة إلى تسجيل الخروج من حساب المسؤول." experimental_impersonation_time_limit_minutes: "المدة الزمنية قبل إنهاء جلسة انتحال الشخصية تلقائيًا." page_loading_indicator: "إعداد مؤشر التحميل الذي يظهر في أثناء التنقل في الصفحة داخل Discourse. يكون 'Spinner' مؤشرًا لصفحة كاملة، بينما يعرض 'Slider' شريطًا ضيقًا أعلى الشاشة." show_user_menu_avatars: "إظهار الصور الرمزية للمستخدم في قائمة المستخدم" @@ -2768,11 +2786,14 @@ ar: content_localization_crawler_param: "تقديم المحتوى المترجم لزواحف الويب عند تفعيل خيار \"تمكين توطين المحتوى\" وخيار \"تعيين اللغة من المعامل\". يتم تحديد قائمة اللغات المدعومة في إعداد \"اللغات المدعومة لتوطين المحتوى\"." content_localization_use_default_locale_when_unsupported: "تقديم المحتوى المترجم بلغة الموقع الافتراضية للمستخدمين الذين لا توجد لغتهم المفضلة ضمن \"اللغات المدعومة لتوطين المحتوى\"." content_localization_allow_author_localization: "السماح للمؤلفين بتحديث الترجمات المحلية لموضوعاتهم ومنشوراتهم الخاصة عبر قائمة المنشور." - enable_upcoming_changes: "تمكين التغييرات القادمة" fake_upcoming_change: "هذا التغيير الوهمي مزيف ويُستخدم لأغراض الاختبار فقط. لا داعي لترجمة هذه العبارة." floating_dismiss_topics_on_mobile: "يعرض زرًا عائمًا باسم \"رفض...\" في نسخة الهاتف المحمول لقائمة الموضوعات، ما يسهل الوصول إليه ويحرر مساحة في الجزء العلوي من قائمة الموضوعات." rename_faq_to_guidelines: "يعيد هذا التغيير تسمية صفحة الأسئلة الشائعة إلى \"الإرشادات\". ستظل صفحة الأسئلة الشائعة متاحة على الرابط /faq. ويستمر إعداد \"رابط الأسئلة الشائعة\" في العمل كما هو." + experimental_tag_settings_page: "قم بتمكين صفحة إعدادات مخصصة للوسوم في /tag/:slug/:id/edit." enable_simplified_category_creation: "يُفعّل هذا الإعداد إنشاء الفئات بطريقة مبسطة مع تقليل عدد الخيارات وتوفير واجهة أكثر نظافة ووضوحًا." + enable_custom_splash_screen: "يتيح بتخصيص شاشة البداية للتحميل باستخدام صورة SVG الخاصة بك. قم بتحميل صورة عبر إعداد \"صورة شاشة البداية\". تحذير: قد يؤثر ذلك سلبًا على نتائج LCP وفهرسة Google." + modernize_foundation_theme: "يطرح هذا التغيير تعديلات تصميمية على سمة Foundation في Discourse." + reporting_improvements: "تحسينات على التنقل والتصميم وسهولة الاستخدام لتقارير مسؤول Discourse." errors: invalid_css_color: "لون غير صالح. أدخِل اسم لون أو قيمة سداسية عشرية." invalid_datetime: "تنسيق التاريخ والوقت غير صالح. يرجى التأكد من إدخال تاريخ ووقت صحيحين." @@ -2780,6 +2801,8 @@ ar: invalid_username: "لا يوجد مستخدم باسم المستخدم هذا." valid_username: "يوجد مستخدم باسم المستخدم هذا." invalid_group: "لا توجد مجموعة بهذا الاسم." + invalid_svg: "صورة SVG غير صالحة. يجب أن تحتوي على عنصر SVG وألا تحتوي على نصوص برمجية أو معالجات أحداث." + invalid_upload: "التحميل غير صالح أو غير موجود." invalid_topic: "لا يمكن العثور على أي موضوع مرتبط بهذا المعرف." invalid_integer_min_max: "يجب أن تكون القيمة بين %{min} و%{max}." invalid_integer_min: "يجب أن تكون القيمة %{min} أو أكبر." @@ -2825,6 +2848,12 @@ ar: reply_by_email_disabled: "يجب عليك تفعيل `reply by email` أولًا قبل تفعيل هذا الإعداد." discourse_connect_url_is_empty: "يجب عليك تعيين `discourse connect url` قبل تفعيل هذا الإعداد." enable_local_logins_disabled: "يجب عليك تفعيل `enable local logins` أولًا قبل تفعيل هذا الإعداد." + min_username_length_exists: "لا يمكنك تعيين الحد الأدنى لطول اسم المستخدم على قيمة أطول من أقصر اسم مستخدم (%{username})." + min_group_name_length_exists: "لا يمكنك تعيين الحد الأدنى لطول اسم المجموعة على قيمة أطول من أقصر اسم مستخدم (%{group_name})." + min_username_length_range: "لا يمكنك تعيين الحد الأدنى لطول اسم المستخدم على قيمة أطول من الحد الأقصى لطول اسم مستخدم." + max_username_length_exists: "لا يمكنك تعيين الحد الأقصى لطول اسم المستخدم على قيمة أقصر من أطول اسم مستخدم (%{username})." + max_group_name_length_exists: "لا يمكنك تعيين الحد الأقصى لطول اسم المستخدم على قيمة أقصر من أطول اسم مجموعة (%{group_name})." + max_username_length_range: "لا يمكنك تعيين الحد الأقصى لطول اسم المستخدم على قيمة أقل من الحد الأدنى لطول اسم مستخدم." invalid_hex_value: "يجب أن تكون قيم اللون عبارة عن رموز سداسية عشرية مكوَّنة من 6 أرقام." empty_selectable_avatars: "يجب عليك تحميل صورتَين رمزيَّتَين قابلتَين للتحديد على الأقل قبل تفعيل هذا الإعداد." category_search_priority: @@ -3167,6 +3196,7 @@ ar: csrf_detected: "عذرًا، لقد انتهت مدة صلاحية التفويض، أو تم التبديل بين المتصفحات. يُرجى إعادة المحاولة." request_error: "عذرًا، حدث خطأ عند بدء عملية التفويض. يُرجى إعادة المحاولة." invalid_iat: "عذرًا، لا يمكننا التحقق من رمز التفويض بسبب اختلاف توقيت الخادم. يُرجى إعادة المحاولة." + unauthorized: "عذرًا، لم يقم مزود خدمة تسجيل الدخول بالمصادقة على طلبك؛ يُرجى المحاولة مرةً أخرى أو التواصل مع المسؤول." omniauth_error_unknown: "حدث خطأ ما في أثناء عملية تسجيل الدخول، يُرجى إعادة المحاولة." omniauth_confirm_title: "تسجيل الدخول باستخدام %{provider}" omniauth_confirm_button: "متابعة" @@ -3404,35 +3434,9 @@ ar: new_version_mailer: title: "رسالة الإصدار الجديد" subject_template: "[%{email_prefix}] إصدار جديد من Discourse، يتوفَّر تحديث" - text_body_template: | - مرحى، أصبح هناك إصدار جديد من‎ [Discourse](https://www.discourse.org) ‎متاحًا! - - إصدارك ‎:%{installed_version}‎ - إصدار جديد: **%{new_version}**‎ - - ‎- ‎ التحديث باستخدام **[تحديث المتصفح بنقرة واحدة]‎(%{base_url}/admin/update)**‎ - - ‎ - ‎راجع الجديد في [ملاحظات الإصدار]‎(https://meta.discourse.org/tag/release-notes) ‎أو راجع‎ [‎سجل التغييرات الأولي على GitHub](https://github.com/discourse/discourse/commits/main)‎ - - ‎- ‎ انتقل إلى ‎ [meta.discourse.org](https://meta.discourse.org) ‎ للحصول على الأخبار والمناقشة والدعم لمنصة ‎Discourse new_version_mailer_with_notes: title: "رسالة الإصدار الجديد مع الملاحظات" subject_template: "يتوفَّر تحديث [%{email_prefix}]" - text_body_template: | - مرحى، أصبح هناك إصدار جديد من ‎[Discourse](https://www.discourse.org) ‎متاحًا متوفر! - - إصدارك‎: %{installed_version}‎ - الإصدار الجديد‎: **%{new_version}**‎ - - ‎- التحديث باستخدام **[تحديث المتصفح بنقرة واحدة]‎(%{base_url}/admin/update)**‎ - - ‎- راجع الجديد في [ملاحظات الإصدار]‎(https://meta.discourse.org/tag/release-notes) ‎أو اعرض‎ [‎سجل التغييرات الأولي على GitHub](https://github.com/discourse/discourse/commits/main)‎ - - - انتقل إلى [meta.discourse.org](https://meta.discourse.org) للحصول على الأخبار والمناقشة والدعم لمنصة Discourse - - ‎### ملاحظات الإصدار - - %{notes} flag_reasons: off_topic: "تم الإبلاغ عن منشورك على أنه **خارج الموضوع**: يشعر المجتمع بأنه غير مناسب للموضوع، كما هو محدَّد حاليًا في العنوان وأول منشور." inappropriate: "تم الإبلاغ عن منشورك على أنه **غير لائق**: يشعر المجتمع بأنه هجومي أو مسيء أو يتضمَّن سلوكًا ينمُّ عن كراهية أو ينتهك [إرشادات مجتمعنا](%{base_path}/guidelines)." @@ -5504,6 +5508,7 @@ ar: dev_mode: title: "وضع المطور" enable_rack_mini_profiler: "تفعيل Rack Mini Profiler بحيث يظل فعالًا عبر تغييرات الجلسة لمدة ساعة واحدة." + enter: "دخول وضع المطور" wizard: title: "إعداد Discourse" step: diff --git a/config/locales/server.be.yml b/config/locales/server.be.yml index 2f2fac28862df..00c56237c0d63 100644 --- a/config/locales/server.be.yml +++ b/config/locales/server.be.yml @@ -607,7 +607,8 @@ be: description: "Спіс статусаў сцягоў у тым ліку тыпу сцяга, плаката, і Назіральнік YouTube часу рэзалюцыі." visits: title: "візіты карыстальнікаў" - xaxis: "дзень" + xaxis: + mobile: "Мабільны" yaxis: "колькасць наведванняў" signups: title: "Рэгістрацый" @@ -1138,7 +1139,6 @@ be: enable_user_directory: "Пакажыце каталог карыстальнікаў для прагляду" enable_group_directory: "Забяспечыць каталог груп для прагляду" anonymous_account_duration_minutes: "Для таго, каб абараніць ананімнасць стварыць новы ўліковы запіс ананімнай кожныя N хвілін для кожнага карыстальніка. Прыклад: калі ўсталявана 600, як толькі 600 хвілін скончыцца апошняга паведамлення і карыстальнік перамыкаецца на Анон, новы ананімны рахунак створаны." - hide_user_profiles_from_public: "Адключыць прыстасаваныя карты, профілі карыстальнікаў і каталог карыстальніка для ананімных карыстальнікаў." show_inactive_accounts: "Дазволіць зарэгістраваным карыстальнікам праглядаць профілі неактыўных уліковых запісаў." log_personal_messages_views: "Увайсці асабістыя погляды паведамленні ад адміністратара для іншых карыстальнікаў" ignored_users_count_message_threshold: "Апавяшчаць мадэратараў, калі канкрэтны карыстальнік ігнаруе многіх іншых карыстальнікаў." diff --git a/config/locales/server.bg.yml b/config/locales/server.bg.yml index ecdfd60909360..aebea74212757 100644 --- a/config/locales/server.bg.yml +++ b/config/locales/server.bg.yml @@ -511,7 +511,8 @@ bg: flag: Тип visits: title: "Потребителски посещения " - xaxis: "Ден" + xaxis: + mobile: "Мобилен" yaxis: "Брой на посещенията" signups: xaxis: "Ден" @@ -535,7 +536,6 @@ bg: yaxis: "Ден" dau_by_mau: xaxis: "Ден" - description: "Броят на членовете, които са влезли в системата през последния ден, разделен на броя на членовете, които са влезли в системата през последния месец - дава %, който показва \"привързаността\" на общността. Стремете се към >20%." daily_engaged_users: xaxis: "Ден" profile_views: diff --git a/config/locales/server.bs_BA.yml b/config/locales/server.bs_BA.yml index 4048b5fc722d3..ca5ffe96615d3 100644 --- a/config/locales/server.bs_BA.yml +++ b/config/locales/server.bs_BA.yml @@ -413,7 +413,9 @@ bs_BA: flag: Tip visits: title: "User Visits" - xaxis: "Day" + xaxis: + desktop: "Desktop" + mobile: "Mobilno" yaxis: "Number of visits" signups: xaxis: "Day" diff --git a/config/locales/server.ca.yml b/config/locales/server.ca.yml index 4c32c5871bf16..324a746915702 100644 --- a/config/locales/server.ca.yml +++ b/config/locales/server.ca.yml @@ -789,7 +789,9 @@ ca: description: "Llista dels estats de les banderes incloent-hi la classe de bandera, el publicador, el reportador i el temps de resolució." visits: title: "Visites de l'usuari" - xaxis: "Dia" + xaxis: + desktop: "Escriptori" + mobile: "Mòbil" yaxis: "Nombre de visites" signups: title: "Registres" @@ -826,10 +828,8 @@ ca: site_traffic: yaxis: "Dia" dau_by_mau: - title: "DAU/MAU" xaxis: "Dia" yaxis: "DAU/MAU" - description: "Nombre de membres que han iniciat sessió el darrer dia dividit pel nombre de membres que ha iniciat sessió el darrer mes. Dóna un % que indica l'_adhesivitat_ de la comunitat. Objectiu >20%." daily_engaged_users: title: "Usuaris diaris compromesos" xaxis: "Dia" @@ -1431,7 +1431,6 @@ ca: enable_group_directory: "Proporciona un directori de grups per a navegar-hi" group_in_subject: "Estableix %%{optional_pm} en l'assumpte del correu al nom del primer grup en MP. Vegeu: Personalitza el format de l'assumpte en correus estàndard." anonymous_account_duration_minutes: "Per a protegir l'anonimat, crea un compte anònim nou per a cada usuari cada N minuts. Per exemple: si és configurat a 600, tan bon punt passin 600 minuts des de la darrera publicació *i* l'usuari canviï a anònim, es crearà un nou compte anònim." - hide_user_profiles_from_public: "Inhabilita targetes d'usuari, perfils d'usuari i directori d'usuaris per a usuaris anònims." show_inactive_accounts: "Permet que els usuaris que han iniciat la sessió explorin els perfils dels comptes inactius." log_personal_messages_views: "Registra les visualitzacions dels missatges personals d'altres usuaris o grups fetes per administradors." ignored_users_count_message_threshold: "Notifica als moderadors si un usuari determinat és ignorat per molts altres usuaris." diff --git a/config/locales/server.cs.yml b/config/locales/server.cs.yml index c3e95c2cd8e2e..4a19e9ba35a7c 100644 --- a/config/locales/server.cs.yml +++ b/config/locales/server.cs.yml @@ -1371,9 +1371,10 @@ cs: description: "Seznam stavů nahlášení včetně typu, přispěvatele, ohlašovatele a doby do odbavení." visits: title: "Návštěvy uživatelů" - xaxis: "Den" + xaxis: + desktop: "Desktop" + mobile: "Mobilní verze" yaxis: "Počet návštěv" - description: "Počet návštěv přihlášených uživatelů." signups: title: "Registrace" xaxis: "Den" @@ -1435,10 +1436,8 @@ cs: description: "Počty zobrazených stránek pro přihlášené uživatele, anonymní uživatele, známé prohledávače a další provoz." description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "DAU/MAU" xaxis: "Den" yaxis: "DAU/MAU" - description: "Počet členů, kteří se přihlásili za poslední den, vydělený počtem členů, kteří se přihlásili za poslední měsíc – vrátí %, které označuje „přilnavost“ komunity. Zaměřte se na > 20 %." daily_engaged_users: title: "Denně zapojení uživatelé" xaxis: "Den" @@ -2270,7 +2269,6 @@ cs: group_in_subject: "Nastavit %%{optional_pm} v předmětu e-mailu podle názvu první skupiny v SZ, viz: Přizpůsobit formát předmětu pro standardní e-maily" allow_anonymous_mode: "Povolit uživatelům možnost přepnout se při odesílání příspěvků do anonymního režimu. Po aktivaci mohou uživatelé při vytváření příspěvků nebo témat na webu zvolit skrytí své identity. Viz také `allow anonymous likes`." anonymous_account_duration_minutes: "Pro ochranu anonymity vytvářet pro každého uživatele každých N minut nový anonymní účet. Příklad: pokud je nastaveno na 600, jakmile od posledního příspěvku uplyne 600 minut A ZÁROVEŇ se uživatel přepne na anonymního uživatele, vytvoří se nový anonymní účet." - hide_user_profiles_from_public: "Zakázat uživatelské karty, uživatelské profily a adresář uživatelů pro nepřihlášené uživatele." hide_new_user_profiles: "Skrýt profily uživatelů s úrovní důvěryhodnosti 1 nebo nižší před veřejností a uživatelům s úrovní důvěryhodnosti 1 důvěřovat, dokud poprvé nepřispějí. Tato funkce je bezpodmínečně zakázána na stránkách s nastavením 'must_approve_users' a 'invite_only'." allow_users_to_hide_profile: "Umožnit uživatelům skrýt svůj profil a přítomnost" hide_user_activity_tab: "Skrýt kartu Aktivita v uživatelském profilu pro jiné uživatele, než jsou správci a vlastníci profilu." @@ -2791,35 +2789,9 @@ cs: new_version_mailer: title: "Nová verze" subject_template: "[%{email_prefix}] Nová verze Discourse, k dispozici jsou aktualizace" - text_body_template: | - Hurá, k dispozici je nová verze [Discourse](https://www.discourse.org)! - - Vaše verze: %{installed_version} - Nová verze: **%{new_version}** - - - Aktualizuzjte pomocí našeho snadného **[upgrade jedním kliknutím v prohlížeči](%{base_url}/admin/upgrade)** - - - Podívejte se, co je nového v [poznámkách k vydání](https://meta.discourse.org/tag/release-notes) nebo si prohlédněte [protokol změn na GitHubu](https://github.com/discourse/discourse/commits/main) - - - Navštivte [meta.discourse.org](https://meta.discourse.org) pro novinky, diskuze a podporu Discourse nebo [meta.discourse.cz](https://meta.discourse.cz) pro českou verzi. new_version_mailer_with_notes: title: "Nová verze s poznámkami" subject_template: "[%{email_prefix}] k dispozici je aktualizace" - text_body_template: | - Hurá, k dispozici je nová verze [Discourse](https://www.discourse.org)! - - Vaše verze: %{installed_version} - Nová verze: **%{new_version}** - - - Aktualizuzjte pomocí našeho snadného **[upgrade jedním kliknutím v prohlížeči](%{base_url}/admin/upgrade)** - - - Podívejte se, co je nového v [poznámkách k vydání](https://meta.discourse.org/tag/release-notes) nebo si prohlédněte [protokol změn na GitHubu](https://github.com/discourse/discourse/commits/main) - - - Navštivte [meta.discourse.org](https://meta.discourse.org) pro novinky, diskuze a podporu Discourse nebo [meta.discourse.cz](https://meta.discourse.cz) pro českou verzi. - - ### Poznámky k vydání - - %{notes} flag_reasons: off_topic: "Váš příspěvek byl označen jako **mimo téma**: komunita se domnívá, že se nehodí k tématu, jak je aktuálně definováno v názvu a prvním příspěvku." inappropriate: "Váš příspěvek byl označen jako **nevhodný**: komunita se domnívá, že je útočný, urážlivý, že se jedná o nenávistné chování nebo o porušení [našich komunitních zásad](%{base_path}/guidelines)." diff --git a/config/locales/server.da.yml b/config/locales/server.da.yml index 3df1706af7a88..f09e46f93351b 100644 --- a/config/locales/server.da.yml +++ b/config/locales/server.da.yml @@ -925,7 +925,9 @@ da: flagger: Indberetter visits: title: "Brugerbesøg" - xaxis: "Dag" + xaxis: + desktop: "Desktop" + mobile: "Mobil" yaxis: "Antal besøg" signups: title: "Tilmeldinger" @@ -979,7 +981,6 @@ da: yaxis: "Dag" description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "DAU/MAU" xaxis: "Dag" yaxis: "DAU/MAU" daily_engaged_users: @@ -1508,7 +1509,6 @@ da: staff_user_custom_fields: "En liste over brugertilpassede felter, der kan hentes for personale med API'en." enable_user_directory: "Gør det muligt at gennemse et indeks af brugere " enable_group_directory: "Tilbyd en oversigt over grupper til gennemsyn" - hide_user_profiles_from_public: "Deaktiver brugerkort, brugerprofiler og brugerkatalog for anonyme brugere." show_inactive_accounts: "Tillad brugere der er logget ind at gennemse profiler af inaktive konti." user_selected_primary_groups: "Tillad brugere at indstille deres egen primære gruppe" allow_profile_backgrounds: "Tillad brugere at uploade en profil baggrund." diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index c602fbbbeac3d..80e4e17044a8a 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -260,6 +260,7 @@ de: errors: &errors format: ! "%{attribute} %{message}" format_with_full_message: "%{attribute}: %{message}" + diff_too_complex: "Die Unterschiede sind zu komplex, um sicher berechnet zu werden. Bitte versuche es mit kleineren Änderungen." messages: invalid_locale: "%{invalid_locale} ist keine gültige Sprachvariante" too_long_validation: @@ -279,7 +280,7 @@ de: greater_than: muss größer als %{count} sein greater_than_or_equal_to: muss größer oder gleich %{count} sein has_already_been_used: "wird bereits verwendet" - in: muss in %{count} sein + in: muss innerhalb von %{count} sein inclusion: ist nicht in der Liste enthalten invalid: ist ungültig is_invalid: "scheint unklar zu sein, ist das ein ganzer Satz?" @@ -816,6 +817,10 @@ de: other: "Diese Kategorie kann nicht gelöscht werden, weil sie %{count} Themen enthält. Das älteste Thema ist %{topic_link}." topic_exists_no_oldest: "Diese Kategorie kann nicht gelöscht werden, da die Anzahl der Themen %{count} beträgt." uncategorized_description: "Themen, welche keine Kategorie benötigen oder in keine existierende Kategorie passen." + category_types: + discussion: + name: "Diskussion" + title: "Diskussion" trust_levels: admin: "Administrator" staff: "Team" @@ -1139,6 +1144,8 @@ de: weekly: "wöchentlich" every_month: "jeden Monat" every_six_months: "alle sechs Monate" + calendar_subscriptions: + application_name: "Kalender-Abonnements" user_api_key: title: 'Autorisiere „%{application_name}“' authorize: "Genehmigen" @@ -1227,9 +1234,11 @@ de: description: "Liste der Meldungszustände einschließlich Art der Meldung, Beitragsersteller, Meldungsersteller und Zeit bis zur Lösung." visits: title: "Benutzerbesuche" - xaxis: "Tag" + xaxis: + desktop: "Desktop" + mobile: "Mobil" yaxis: "Anzahl der Besuche" - description: "Anzahl der Besuche von angemeldeten Benutzern." + description: "Anzahl der Besuche von angemeldeten Benutzern nach Gerätetyp." signups: title: "Neue Benutzer" xaxis: "Tag" @@ -1293,10 +1302,9 @@ de: description: "Seitenaufrufe für angemeldete Benutzer, anonyme Benutzer, bekannte Crawler und anderen Traffic." description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "TAB/MAB" + title: "TAB / MAB" xaxis: "Tag" yaxis: "TAB/MAB" - description: "Anzahl der Mitglieder, die sich innerhalb des letzten Tages angemeldet haben, geteilt durch die Anzahl der Mitglieder, die sich im letzten Monat angemeldet haben – liefert eine Prozentzahl, welche die „Bindung“ der Community angibt. Erstrebenswert sind 20 % oder mehr." daily_engaged_users: title: "Täglich engagierte Benutzer" xaxis: "Tag" @@ -1795,6 +1803,7 @@ de: moderators_manage_categories: "Moderatoren erlauben, Kategorien zu erstellen und zu verwalten" moderators_manage_groups: "Moderatoren erlauben, Gruppen zu erstellen und zu verwalten" moderators_change_post_ownership: "Moderatoren erlauben, die Eigentümerschaft des Beitrags zu ändern" + change_post_ownership_allowed_groups: "Erlaube Benutzern in diesen Gruppen, den Eigentümer von Beiträgen zu ändern" cors_origins: "Erlaubte Adressen für Cross-Origin-Requests (CORS). Jede Adresse muss http:// oder https:// enthalten. Die Umgebungsvariable DISCOURSE_ENABLE_CORS muss gesetzt sein, um CORS zu aktivieren." use_admin_ip_allowlist: "Administratoren können sich nur anmelden, wenn sie eine IP-Adresse nutzen, die in der Liste der gefilterten IPs definiert ist (Administration > Protokolle > Gefilterte IPs)." blocked_ip_blocks: "Eine Liste von privaten IP-Blöcken, die nie von Discourse indiziert werden sollen" @@ -2230,7 +2239,7 @@ de: allow_likes_in_anonymous_mode: "Aktiviere diese Einstellung, um Benutzern im anonymen Modus das Markieren von Beiträgen mit „Gefällt mir“ zu ermöglichen. Wenn diese Einstellung aktiviert ist, können die Benutzer ihre Identität verbergen, wenn sie Beiträge oder Themen auf der Website mit „Gefällt mir“ versehen. Für diese Einstellung muss die Einstellung `allow anonymous mode` aktiviert sein." anonymous_posting_allowed_groups: "Gruppen, die den anonymen Modus nutzen dürfen. Für diese Einstellung muss die Einstellung „allow anonymous mode“ aktiviert sein." anonymous_account_duration_minutes: "Erzeuge alle N Minuten ein neues anonymes Konto je Benutzer, um die Anonymität zu gewährleisten. Beispiel: Ein Wert von 600 sorgt dafür, dass ein neues anonymes Konto erzeugt wird, wenn ein Benutzer in den anonymen Modus wechselt UND mindestens 600 Minuten seit dem letzten Beitrag dieses Benutzers vergangen sind." - hide_user_profiles_from_public: "Deaktiviert Benutzerkarten, Benutzerprofile und das Benutzerverzeichnis für anonyme Benutzer." + hide_user_profiles_from_public: "Deaktiviere Benutzerkarten und Benutzerprofile für anonyme Benutzer. Zusammengefasste Statistiken im Benutzerverzeichnis sind weiterhin zugänglich." hide_new_user_profiles: "Verstecke Benutzerprofile der Vertrauensstufe 1 oder niedriger vor der Öffentlichkeit und bei Benutzern der Vertrauensstufe 1, bis sie zum ersten Mal posten. Diese Funktion ist auf Websites mit must_approve_users und invite_only bedingungslos deaktiviert." allow_users_to_hide_profile: "Benutzern erlauben, ihr Profil und ihre Präsenz auszublenden" hide_user_activity_tab: "Blende die Registerkarte „Aktivität“ in Benutzerprofilen (außer für Administratoren und den Benutzer selbst) aus." @@ -2448,7 +2457,7 @@ de: welcome_banner_page_visibility: "Legt fest, auf welchen Seiten das Willkommensbanner erscheinen soll." welcome_banner_text_color: "Wenn du die Einstellung „Welcome banner image“ konfiguriert hast, kannst du mit dieser Einstellung die Textfarbe des Banners ändern, um sicherzustellen, dass er lesbar bleibt. Wenn du keine Farbe wählst oder kein Hintergrundbild hochgeladen hast, wird die Farbe vom aktiven Theme bestimmt." splash_screen: "Zeigt einen temporären Ladebildschirm an, während Website-Assets geladen werden" - splash_screen_image: "Ein SVG-Bild, das auf dem Bildschirm angezeigt wird, während die Website geladen wird. Animierte SVGs sollten nur CSS-Transformations oder - Deckkraftanimationen verwenden. Verwende eindeutige Namen für die Css-Klassen und Keyframes. Du kannst var(--primary), var(--secondary) und var(--tertiary) verwenden, um auf die Farben des Themes zu verweisen." + splash_screen_image: "Ein SVG-Bild, das auf dem Bildschirm angezeigt wird, während die Website geladen wird. Animierte SVGs sollten nur CSS-Transformations oder -Deckkraftanimationen verwenden. Verwende eindeutige Namen für die CSS-Klassen und Keyframes. Du kannst var(--primary), var(--secondary) und var(--tertiary) verwenden, um auf die Farben des Themes zu verweisen." navigation_menu: "Lege die Seitenleiste oder das Kopfzeilen-Drop-down als Hauptnavigationsmenü für deine Website fest. Die Seitenleiste wird empfohlen." default_navigation_menu_categories: "Ausgewählte Kategorien werden standardmäßig im Abschnitt „Kategorien“ des Navigationsmenüs angezeigt." default_navigation_menu_tags: "Ausgewählte Schlagwörter werden standardmäßig im Abschnitt „Schlagwörter“ des Navigationsmenüs angezeigt." @@ -2479,13 +2488,12 @@ de: content_localization_crawler_param: "Liefert lokalisierte Inhalte an Webcrawler, wenn 'content localization enabled' und 'set locale from param' aktiviert sind. Die Liste der unterstützten Sprachumgebungen ist in 'content localization supported locales' definiert." content_localization_use_default_locale_when_unsupported: "Biete Benutzern, deren bevorzugte Sprache nicht in 'content localization supported locales' konfiguriert ist, lokalisierte Inhalte in der Standardsprache der Website an." content_localization_allow_author_localization: "Ermögliche es Autoren, die Lokalisierungen ihrer eigenen Themen und Beiträge über das Beitragsmenü zu aktualisieren." - enable_upcoming_changes: "Aktiviere bevorstehende Änderungen" fake_upcoming_change: "Dies ist keine echte bevorstehende Änderung. Sie dient zu Testzwecken und muss nicht übersetzt werden." floating_dismiss_topics_on_mobile: "Zeigt auf dem Handy über der Themenliste eine schwebende „Verwerfen …“-Schaltfläche, um den Zugriff zu erleichtern und Platz im oberen Bereich der Themenliste freizugeben" rename_faq_to_guidelines: "Diese Änderung benennt die FAQ-Seite in „Richtlinien“ um. Die FAQ-Seite ist weiterhin unter /faq erreichbar. Die Einstellung „faq url“ funktioniert wie bisher." experimental_tag_settings_page: "Aktiviere eine eigene Einstellungsseite für Schlagwörter unter /tag/:slug/:id/edit." enable_simplified_category_creation: "Ermöglicht eine vereinfachte Kategorienerstellung mit weniger Optionen und einer übersichtlicheren Oberfläche." - enable_custom_splash_screen: "Ermöglicht die Anpassung des Ladebildschirms mit einem eigenen SVG-Bild. Lade ein Bild über die Einstellung \"Splash Screen Image\" hoch. Achtung! Dies kann sich negativ auf die LCP-Bewertung und die Google-Indexierung auswirken." + enable_custom_splash_screen: "Ermöglicht die Anpassung des Ladebildschirms mit einem eigenen SVG-Bild. Lade ein Bild über die Einstellung „Splash Screen Image“ hoch. Achtung! Dies kann sich negativ auf die LCP-Bewertung und die Google-Indexierung auswirken." modernize_foundation_theme: "Diese Änderung führt Design-Änderungen am Foundation-Theme in Discourse ein." reporting_improvements: "Verbesserungen der Navigation, des Designs und der Benutzerfreundlichkeit für die Admin-Berichte in Discourse." errors: @@ -3040,9 +3048,9 @@ de: Deine Version: %{installed_version} Neue Version: **%{new_version}** - - Aktualisierung mit dem einfachen **[Ein-Klick-Browser-Update](%{base_url}/admin/update)** durchführen + - Aktualisiere mit unserem einfachen **[Ein-Klick-Browser-Update](%{base_url}/admin/update)** - - Sieh dir die Neuerungen in den [Versionshinweisen](https://meta.discourse.org/tag/release-notes) an oder wirf einen Blick auf alle [Änderungen bei GitHub](https://github.com/discourse/discourse/commits/main) + - Sieh dir die Neuerungen in den [Versionshinweisen](https://releases.discourse.org/changelog/%{new_version}) an - Besuche [meta.discourse.org](https://meta.discourse.org) für Neuigkeiten, Diskussionen und Unterstützung rund um Discourse new_version_mailer_with_notes: @@ -3054,9 +3062,9 @@ de: Deine Version: %{installed_version} Neue Version: **%{new_version}** - - Aktualisierung mit dem einfachen **[Ein-Klick-Browser-Update](%{base_url}/admin/update)** durchführen + - Aktualisiere mit unserem einfachen **[Ein-Klick-Browser-Update](%{base_url}/admin/update)** - - Sieh dir die Neuerungen in den [Versionshinweisen](https://meta.discourse.org/tag/release-notes) an oder wirf einen Blick auf alle [Änderungen bei GitHub](https://github.com/discourse/discourse/commits/main) + - Sieh dir die Neuerungen in den [Versionshinweisen](https://releases.discourse.org/changelog/%{new_version}) an - Besuche [meta.discourse.org](https://meta.discourse.org) für Neuigkeiten, Diskussionen und Unterstützung rund um Discourse diff --git a/config/locales/server.el.yml b/config/locales/server.el.yml index f8609e615452c..5d93da10ad452 100644 --- a/config/locales/server.el.yml +++ b/config/locales/server.el.yml @@ -257,6 +257,7 @@ el: delete_topic_failed: "Παρουσιάστηκε σφάλμα κατά τη διαγραφή αυτού του θέματος. Παρακαλώ επικοινωνήστε με τον διαχειριστή του ιστότοπου." reading_time: "Χρόνος ανάγνωσης" likes: "Μου Αρέσει" + action_already_performed: "Ωχ! Έχετε ήδη εκτελέσει αυτήν την ενέργεια. Μπορείτε να δοκιμάσετε να ανανεώσετε τη σελίδα;" too_many_replies: one: "Λυπούμαστε, αλλά οι νέοι χρήστες έχουν προσωρινό περιορισμό %{count} απάντησης ανά νήμα." other: "Λυπούμαστε, αλλά οι νέοι χρήστες περιορίζονται προσωρινά σε %{count} απαντήσεις στο ίδιο θέμα." @@ -526,6 +527,8 @@ el: one: "%{count} «Μου αρέσει»" other: "%{count} «Μου αρέσει»" rate_limiter: + slow_down: "Έχεις εκτελέσει αυτήν την ενέργεια πάρα πολλές φορές, δοκίμασε ξανά αργότερα." + too_many_requests: "Έχεις εκτελέσει αυτήν την ενέργεια πάρα πολλές φορές. Περίμενε %{time_left} πριν δοκιμάσεις ξανά." by_type: public_group_membership: "Συμμετέχετε/αποχωρείτε από ομάδες λίγο πολύ συχνά. Παρακαλούμε περιμένετε %{time_left} πριν προσπαθήσετε ξανά." hours: @@ -709,6 +712,8 @@ el: draft_backup: pm_title: "Αντίγραφα ασφαλείας προσχεδίων από τρέχοντα θέματα" pm_body: "Θέμα που περιέχει αντίγραφα ασφαλείας προσχεδίων" + user_activity: + no_log_search_queries: "Οι καταγραφές των ερωτημάτων αναζήτησης είναι αυτήν τη στιγμή απενεργοποιημένες (ένας διαχειριστής μπορεί να τις ενεργοποιήσει στις ρυθμίσεις του ιστότοπου)." topic_flag_types: spam: title: "Ανεπιθύμητα" @@ -833,7 +838,9 @@ el: description: "Λίστα καταστάσεων αναφορών, συμπεριλαμβανομένου του τύπου αναφοράς, του συντάκτη, του χρήστη που έκανε την αναφορά και του χρόνου έως την επίλυση." visits: title: "Επισκέψεις Χρήστη" - xaxis: "Ημέρα" + xaxis: + desktop: "Για υπολογιστές" + mobile: "Mobile" yaxis: "Αριθμός επισκέψεων" signups: title: "Εγγραφές" @@ -1136,8 +1143,9 @@ el: min_search_term_length: "Ελάχιστο έγκυρο μήκος όρου αναζήτησης σε χαρακτήρες" search_prefer_recent_posts: "Εάν η αναζήτηση στην ιστοσελίδα σας είναι αργή, αυτή η επιλογή δημιουργεί κατάλογο των πιο πρόσφατων αναρτήσεων πρώτα" search_recent_posts_size: "Πόσες πρόσφατες αναρτήσεις να κρατηθούν στο ευρετήριο " - log_search_queries: "Κατέγραψε τις αναζητήσεις που εκτελούνται από χρήστες" + log_search_queries: "Καταγραφή των ερωτημάτων αναζήτησης που εκτελούνται από χρήστες" search_query_log_max_size: "Μέγιστος αριθμός αναζητήσεων που θα τηρούνται" + search_query_log_max_retention_days: "Μέγιστος χρόνος διατήρησης των ερωτημάτων αναζήτησης, σε ημέρες." search_default_sort_order: "Προεπιλεγμένη σειρά ταξινόμησης για αναζήτηση πλήρους σελίδας" search_experience: "Η προεπιλεγμένη θέση και εμφάνιση της αναζήτησης σε υπολογιστές" allow_uncategorized_topics: "Επιτρέψτε σε νήματα να δημιουργούνται χωρίς κατηγοριοποίηση. ΠΡΟΣΟΧΗ: Εάν υπάρχουν μη κατηγοριοποιημένα νήματα, πρέπει να τα επανακατηγοριοποιήσετε πριν τα κλείσετε." @@ -1385,7 +1393,6 @@ el: allow_anonymous_mode: "Ενεργοποιήστε την επιλογή για τους χρήστες να μεταβαίνουν σε ανώνυμη λειτουργία για δημοσίευση. Όταν ενεργοποιηθεί, οι χρήστες μπορούν να επιλέξουν την απόκρυψη της ταυτότητάς τους κατά τη δημιουργία αναρτήσεων ή θεμάτων σε ολόκληρο τον ιστότοπο. Δείτε επίσης την επιλογή `allow anonymous likes`." allow_likes_in_anonymous_mode: "Ενεργοποιήστε αυτήν τη ρύθμιση για να επιτρέψετε στους χρήστες που περιηγούνται στον ιστότοπό σας ανώνυμα να κάνουν \"Μου αρέσει\" σε αναρτήσεις. Όταν ενεργοποιηθεί, οι χρήστες μπορούν να επιλέξουν να αποκρύπτεται η ταυτότητά τους όταν κάνουν \"Μου αρέσει\" σε αναρτήσεις ή θέματα σε ολόκληρο τον ιστότοπο. Αυτή η ρύθμιση απαιτεί την ενεργοποίηση της ρύθμισης `allow anonymous mode`." anonymous_account_duration_minutes: "Για να προστατευθεί η ανωνυμία δημιούργησε ένα νέο ανώνυμο λογαριασμό κάθε Ν λεπτά για κάθε χρήστη. Παράδειγμα: εάν τεθεί στο 600, μόλις περάσουν 600 λεπτά από την τελευταία ανάρτηση ΚΑΙ ο χρήστης αλλάξει σε ανώνυμος, ένας νέος ανώνυμος λογαριασμός δημιουργείται." - hide_user_profiles_from_public: "Απενεργοποιήσε τις κάρτες χρηστών, τα προφίλ χρηστών και τον κατάλογο χρηστών για ανώνυμους χρήστες. " allow_featured_topic_on_user_profiles: "Να επιτρέπεται στους χρήστες να αναδεικνύουν έναν σύνδεσμο για ένα θέμα στην κάρτα χρήστη και το προφίλ τους." allow_profile_backgrounds: "Επίτρεψε στους χρήστες να μεταφορτώνουν εικόνες φόντου στο προφίλ." get_a_room_threshold: "Ο αριθμός των αναρτήσεων που πρέπει να κάνει ένας χρήστης στον ίδιο άνθρωπο και στο ίδιο θέμα προτού να προειδοποιηθεί. " @@ -2825,6 +2832,8 @@ el: label: "Δημόσια" private: label: "Ιδιωτική" + search_logs: + graph_title: "Πλήθος αναζητήσεων" onebox: gitlab: show_original: "εμφάνιση πρωτότυπου" diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 565be4c9d8dc1..e233fc455135b 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -895,9 +895,11 @@ en: uncategorized_description: "Topics that don't need a category, or don't fit into any other existing category." category_types: + not_available: "Category type '%{type_name}' is not available" discussion: name: "Discussion" - description: "General discussion topics" + title: "discussion" + description: "A standard category with all the essentials for conversation." trust_levels: admin: "Admin" @@ -1245,6 +1247,9 @@ en: every_month: "every month" every_six_months: "every six months" + calendar_subscriptions: + application_name: "Calendar Subscriptions" + user_api_key: title: 'Authorize "%{application_name}"' authorize: "Authorize" @@ -1333,9 +1338,11 @@ en: description: "List of flags' statuses including type of flag, poster, flagger, and time to resolution." visits: title: "User Visits" - xaxis: "Day" + xaxis: + desktop: "Desktop" + mobile: "Mobile" yaxis: "Number of visits" - description: "Number of signed-in user visits." + description: "Number of signed-in user visits by device type." signups: title: "Signups" xaxis: "Day" @@ -1399,10 +1406,10 @@ en: description: "Pageviews for logged in users, anonymous users, known crawlers and other traffic." description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "DAU/MAU" + title: "DAU / MAU" xaxis: "Day" yaxis: "DAU/MAU" - description: "Number of members that logged in in the last day divided by number of members that logged in in the last month – returns a % which indicates community 'stickiness'. Aim for >20%." + description: "The share of monthly active members who returned in the last day. This percentage shows how regularly people come back; also called the community 'stickiness'. Aim for > 20%." daily_engaged_users: title: "Daily Engaged Users" xaxis: "Day" @@ -1915,6 +1922,7 @@ en: moderators_manage_categories: "Allow moderators to create and manage categories" moderators_manage_groups: "Allow moderators to create and manage groups" moderators_change_post_ownership: "Allow moderators to change post ownership" + change_post_ownership_allowed_groups: "Allow users in these groups to change post ownership" cors_origins: "Allowed origins for cross-origin requests (CORS). Each origin must include http:// or https://. The DISCOURSE_ENABLE_CORS env variable must be set to true to enable CORS." use_admin_ip_allowlist: "Admins can only log in if they are at an IP address defined in the Screened IPs list (Admin > Logs > Screened Ips)." blocked_ip_blocks: "A list of private IP blocks that should never be crawled by Discourse" @@ -2759,7 +2767,6 @@ en: content_localization_crawler_param: "Serve localized content to web crawlers when 'content localization enabled' and 'set locale from param' is enabled. The list of supported locales is defined in 'content localization supported locales'." content_localization_use_default_locale_when_unsupported: "Serve localized content in the site's default locale to users whose preferred language is not listed in 'content localization supported locales'." content_localization_allow_author_localization: "Allow authors update localizations of their own topics and posts via the post menu." - enable_upcoming_changes: "Enable upcoming changes" fake_upcoming_change: "This is a fake upcoming change for testing purposes. No need to translate this string." floating_dismiss_topics_on_mobile: "Shows a floating 'Dismiss...' button on mobile for the topic list for easier access and to free up space in the top of the topic list" rename_faq_to_guidelines: "This change renames the FAQ page to Guidelines. The FAQ page will still be available at /faq. The 'faq url' setting works as before." @@ -2891,6 +2898,8 @@ en: exclude_tag_group: "Exclude topics with tags from a specific tag group" activity_before: "Show topics with last activity before a date (YYYY-MM-DD or days ago)" activity_after: "Show topics with last activity after a date (YYYY-MM-DD or days ago)" + bookmarked_before: "Show topics bookmarked before a date (YYYY-MM-DD or days ago)" + bookmarked_after: "Show topics bookmarked after a date (YYYY-MM-DD or days ago)" created_before: "Show topics created before a date (YYYY-MM-DD or days ago)" created_after: "Show topics created after a date (YYYY-MM-DD or days ago)" created_by: "Show topics created by a specific user or group" @@ -3351,7 +3360,7 @@ en: - Update using our easy **[one-click browser update](%{base_url}/admin/update)** - - See what's new in the [release notes](https://meta.discourse.org/tag/release-notes) or view the [raw GitHub changelog](https://github.com/discourse/discourse/commits/main) + - See what's new in the [release notes](https://releases.discourse.org/changelog/%{new_version}) - Visit [meta.discourse.org](https://meta.discourse.org) for news, discussion, and support for Discourse @@ -3366,7 +3375,7 @@ en: - Update using our easy **[one-click browser update](%{base_url}/admin/update)** - - See what's new in the [release notes](https://meta.discourse.org/tag/release-notes) or view the [raw GitHub changelog](https://github.com/discourse/discourse/commits/main) + - See what's new in the [release notes](https://releases.discourse.org/changelog/%{new_version}) - Visit [meta.discourse.org](https://meta.discourse.org) for news, discussion, and support for Discourse diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml index ab1266fac068b..6c70868fe9fcd 100644 --- a/config/locales/server.es.yml +++ b/config/locales/server.es.yml @@ -805,6 +805,10 @@ es: other: "No se puede eliminar esta categoría porque tiene %{count} temas. El tema más antiguo es %{topic_link}." topic_exists_no_oldest: "No se puede eliminar esta categoría porque el número de temas es %{count}." uncategorized_description: "Temas que no necesitan una categoría o no encajan en ninguna de las categorías existentes." + category_types: + discussion: + name: "Debate" + title: "debate" trust_levels: admin: "Administrador" staff: "Personal" @@ -1128,11 +1132,14 @@ es: every_month: "cada mes" every_six_months: "cada seis meses" user_api_key: + title: 'Autorizar a "%{application_name}"' authorize: "Autorizar" deny: "Cancelar" read: "leer" read_write: "lectura/escritura" logged_in_as: "Sesión iniciada como" + permissions_header: 'Esto permitirá a "%{application_name}" hacer lo siguiente:' + redirect_warning: "Si lo autorizas, se te redireccionará a" instructions: 'Acabamos de generar una nueva clave API de usuario para que uses con «%{application_name}». Pega la siguiente clave en tu aplicación:' otp_description: '¿Te gustaría permitir a «%{application_name}» acceder a este sitio?' otp_confirmation: @@ -1212,9 +1219,10 @@ es: description: "Lista de estados de denuncia que incluye el tipo de denuncia, el autor, el usuario que denuncia y el tiempo de resolución." visits: title: "Visitas de usuario" - xaxis: "Día" + xaxis: + desktop: "Escritorio" + mobile: "Móvil" yaxis: "Número de visitas" - description: "Número de visitas de usuarios registrados." signups: title: "Registros" xaxis: "Día" @@ -1276,10 +1284,8 @@ es: description: "Páginas vistas por usuarios registrados, usuarios anónimos, crawlers conocidos y otro tráfico." description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "UAD/UAM" xaxis: "Día" yaxis: "UAD/UAM" - description: "Número de miembros que han iniciado sesión durante el último día dividido entre el número de miembros que han iniciado sesión durante el último mes – resulta en un % que indica el grado de «permanencia» de la comunidad. Apuntar a >20 %." daily_engaged_users: title: "Usuarios involucrados a diario" xaxis: "Día" @@ -2177,7 +2183,6 @@ es: group_in_subject: "Configura %%{optional_pm} en el título del correo electrónico para nombrar el primer grupo en MP, consulta: Personalizar el formato del asunto para correos electrónicos estándar" allow_anonymous_mode: "Activa la opción de que los usuarios cambien al modo anónimo para publicar. Cuando está activada, los usuarios pueden optar por ocultar su identidad al crear publicaciones o temas en todo el sitio. Véase también «allow_anonymous_likes»." anonymous_account_duration_minutes: "Para proteger el anonimato, crear una nueva cuenta anónima cada N minutos para cada usuario. Ejemplo: si se establece en 600, tan pronto como pasen 600 minutos desde la última publicación Y el usuario cambie a anónimo, se creará una nueva cuenta anónima." - hide_user_profiles_from_public: "Desactiva las tarjetas de usuario, los perfiles y el directorio de usuarios para usuarios anónimos." hide_new_user_profiles: "Oculta los perfiles de usuarios de nivel de confianza 1 o inferior al público y a los usuarios de nivel de confianza 1 hasta que publiquen por primera vez. Esta característica está desactivada incondicionalmente en los sitios must_approve_users y invite_only." allow_users_to_hide_profile: "Permitir a los usuarios ocultar su perfil y presencia" hide_user_activity_tab: "Ocultar la pestaña de actividad en los perfiles de usuario, excepto para el Administrador y para mí." @@ -2745,6 +2750,7 @@ es: updating_user_ids: "Actualizando identificadores de usuario…" deleting_source_user: "Eliminando usuario de origen…" user: + anonymized: "[eliminado debido a la anonimización del usuario]" deactivated: "Ha sido desactivado debido a muchos correod electrónicos rechazados a «%{email}»." deactivated_by_staff: "Desactivado por el personal" deactivated_by_inactivity: @@ -2921,35 +2927,9 @@ es: new_version_mailer: title: "Correo electrónico de nueva versión" subject_template: "[%{email_prefix}] Nueva versión de Discourse, actualización disponible" - text_body_template: | - ¡Bien! ¡Hay una nueva versión de [Discourse](https://www.discourse.org) disponible! - - Tu versión: %{installed_version} - Nueva versión: **%{new_version}** - - - Actualiza usando el **[actualizador en un clic en tu navegador](%{base_url}/admin/upgrade)** - - - Echa un vistazo a las novedades en las [notas de la versión](https://meta.discourse.org/tag/release-notes), o mira el [registro de cambios completo en GitHub](https://github.com/discourse/discourse/commits/main) - - - Visita [meta.discourse.org](https://meta.discourse.org) para noticias, debate y ayuda sobre Discourse new_version_mailer_with_notes: title: "Correo electrónico de nueva versión con notas" subject_template: "[%{email_prefix}] actualización disponible" - text_body_template: | - ¡Bien! ¡Hay una nueva versión de [Discourse](https://www.discourse.org) disponible! - - Tu versión: %{installed_version} - Nueva versión: **%{new_version}** - - - Actualiza usando el **[actualizador en un clic en tu navegador](%{base_url}/admin/upgrade)** - - - Echa un vistazo a las novedades en las [notas de la versión](https://meta.discourse.org/tag/release-notes), o mira el [registro de cambios completo en GitHub](https://github.com/discourse/discourse/commits/main) - - - Visita [meta.discourse.org](https://meta.discourse.org) para noticias, debate y ayuda sobre Discourse - - ### Notas de la versión - - %{notes} flag_reasons: off_topic: "Tu publicación fue denunciada como **sin relación con el tema**: la comunidad piensa que no se ajusta debidamente al tema, definido por el título o la primera publicación." inappropriate: "Tu publicación fue denunciada como **inapropiada**: la comunidad piensa que es ofensiva, abusiva, una conducta de odio o que vulnera alguna de las [directrices de la comunidad](%{base_path}/guidelines)." @@ -3729,6 +3709,7 @@ es: %{respond_instructions} user_replied: title: "Usuario respondió" + preview: "Alguien ha respondido a tu publicación." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3751,6 +3732,7 @@ es: %{respond_instructions} user_quoted: title: "Usuario citado" + preview: "Alguien ha citado tu publicación." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3762,6 +3744,7 @@ es: %{respond_instructions} user_linked: title: "Usuario enlazado" + preview: "Publicación enlazada desde otro tema." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3773,6 +3756,7 @@ es: %{respond_instructions} user_mentioned: title: "Usuario mencionado" + preview: "Alguien te ha mencionado en una publicación." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3861,6 +3845,7 @@ es: %{respond_instructions} user_posted_pm: title: "Usuario envió un MP" + preview: "Alguien te ha enviado un mensaje personal." subject_template: "[%{email_prefix}] [MP] %{topic_title}" text_body_template: | %{header_instructions} @@ -3949,6 +3934,7 @@ es: preheader: "Un breve resumen desde %{since}" forgot_password: title: "Olvidé la contraseña" + preview: "Restablece tu contraseña." subject_template: "[%{email_prefix}] restablecer contraseña" text_body_template: | Alguien ha pedido restablecer tu contraseña en [%{site_name}](%{base_url}). @@ -4037,6 +4023,7 @@ es: %{base_url}/u/confirm-old-email/%{email_token} notify_old_email: title: "Antiguo correo electrónico de notificaciones" + preview: "Dirección de correo electrónico actualizada." subject_template: "[%{email_prefix}] Tu dirección de correo electrónico ha sido cambiada" text_body_template: "Este es un mensaje automatizado para comunicarte que tu correo electrónico para \nel sitio %{site_name} ha sido modificado. Si esto fue un error, ponte en contacto con un \nadministrador del sitio.\n\nTu correo electrónico fue modificado por:\n\n%{new_email}\n" notify_old_email_add: @@ -4051,6 +4038,7 @@ es: %{new_email} signup_after_approval: title: "Entrar después de ser aprobado" + preview: "Nueva cuenta aprobada." subject_template: "¡Tu solicitud fue aprobada en %{site_name}!" text_body_template: | ¡Te damos la bienvenida a %{site_name}! @@ -4901,6 +4889,8 @@ es: deprecation_error_label: Hacer que las depreciaciones de Javascript produzcan un error enter: "Activar modo seguro" must_select: "Debes escoger al menos una opción para entrar en el modo seguro." + dev_mode: + title: "Modo de desarrollo" wizard: title: "Instalación de Discourse" step: @@ -4957,6 +4947,8 @@ es: pr_summary: "%{commits} commits cambiaron %{changed_files} archivos con %{additions} adiciones y %{deletions} eliminaciones" no_description: "Contribuye al desarrollo de %{repo} creando una cuenta en GitHub." pr_title: + default: "Pull request" + draft: "Borrador de pull request" closed: "Pull request cerrado" status_date: open: "abierto" @@ -4978,6 +4970,7 @@ es: confirm_body: "¡Bien! Se han activado las notificaciones." custom: "Notificación de %{username} en %{site_title}" staff_action_logs: + redacted: "[contenido no visible]" json_too_long: "Valores no registrados porque superan los límites de longitud de columna" not_found: "no encontrado" unknown: "desconocido" @@ -5156,9 +5149,13 @@ es: reject_and_delete: title: "Rechazar y eliminar la publicación" complete: "Publicación rechazada y eliminada." + reject_and_delete_standalone: + title: "No, eliminar publicación" reject_and_keep_deleted: title: "Mantener publicación eliminada" complete: "La publicación se ha rechazado y se ha mantenido eliminada." + reject_and_keep_deleted_standalone: + title: "No, mantener la publicación eliminada" scrub: title: Borrar registro approve_and_restore: @@ -5257,6 +5254,10 @@ es: reserved_id: "tiene una palabra clave reservada como id: %{id}" unsafe_description: "tiene una descripción HTML no segura" invalid_tag_group: "tiene un grupo de etiquetas no válido: %{tag_group_name}" + discourse_id: + already_registered: "Este sitio ya está registrado con Discourse ID" + errors: + regenerate_failed: "Error al regenerar las credenciales. Inténtalo de nuevo más tarde." activemodel: errors: <<: *errors diff --git a/config/locales/server.et.yml b/config/locales/server.et.yml index cfb713ae6261b..970505327c4a8 100644 --- a/config/locales/server.et.yml +++ b/config/locales/server.et.yml @@ -549,7 +549,9 @@ et: poster: Postitaja visits: title: "Kasutajakülastused" - xaxis: "Päev" + xaxis: + desktop: "Töölaud" + mobile: "Mobiil" yaxis: "Külastajate arv" signups: xaxis: "Päev" diff --git a/config/locales/server.fa_IR.yml b/config/locales/server.fa_IR.yml index e679e6d5daca7..571db2d955640 100644 --- a/config/locales/server.fa_IR.yml +++ b/config/locales/server.fa_IR.yml @@ -1105,9 +1105,10 @@ fa_IR: flagger: گزارش‌دهنده visits: title: "بازدید کاربران" - xaxis: "روز" + xaxis: + desktop: "کامپیوتر" + mobile: "موبایل" yaxis: "تعداد بازدید ها" - description: "تعداد بازدیدهای کاربران وارد شده" signups: title: "ثبت‌نام‌ها" xaxis: "روز" @@ -1164,10 +1165,8 @@ fa_IR: description: "بازدید از صفحه برای کاربران وارد شده، کاربران ناشناس، خزنده های شناخته شده و سایر ترافیک‌ها." description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "DAU/MAU" xaxis: "روز" yaxis: "DAU/MAU" - description: "تعداد اعضایی که در روز گذشته وارد سیستم شده‌اند تقسیم بر تعداد اعضایی که در ماه گذشته وارد شده‌اند - درصدی را نشان می‌دهد که نشان‌دهنده «چسبندگی» انجمن است. بیش از ۲۰٪ را هدف بگیرید." daily_engaged_users: title: "کاربران فعال روزانه" xaxis: "روز" @@ -1709,7 +1708,6 @@ fa_IR: enable_group_directory: "یک فهرست راهنما برای گروه‌ها فراهم کنید" allow_anonymous_mode: "گزینه‌ای را فعال کنید که به کاربران اجازه دهد برای ارسال نوشته‌ها به حالت ناشناس تغییر کنند. با فعال‌سازی، کاربران می‌توانند هویت خود را هنگام ایجاد نوشته‌ها یا موضوعات در وبگاه پنهان کنند. همچنین به اجازه پسندیده ناشناس مراجعه کنید." anonymous_account_duration_minutes: "برای محافظت از ناشناس ماندن، هر N دقیقه برای هر کاربر یک حساب‌کاربری ناشناس بساز. برای مثال: اگر به ۶۰۰ تنظیم شود، به محض اینکه ۶۰۰ دقیقه از آخرین فرسته گذشت و کاربر به حالت ناشناس تغییر کرد، حساب کاربری جدید ناشناس ساخته می شود." - hide_user_profiles_from_public: "غیر‌فعال‌سازی کارت کاربری، پروفایل کاربر و فهرست راهنمای کاربر برای کاربران ناشناس." allow_profile_backgrounds: "به کاربر اجازه بده تا پس‌زمینه نمایه خود را بارگذاری کند." get_a_room_threshold: "تعداد نوشته‌هایی که کاربر باید در یک موضوع ایجاد کند تا به او اخطار داده شود." enable_mobile_theme: "دستگاه های موبایلی که از قالب مناسب موبایل استفاده می کنند٬‌ با قابلیت جابجایی به حالت نمایش کامل. اگر از استایلی استفاده می‌کنید که کاملا واکنشگرا است این قسمت را غیر‌فعال کنید." diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml index dcf6113236096..b258d87a617a0 100644 --- a/config/locales/server.fi.yml +++ b/config/locales/server.fi.yml @@ -1211,9 +1211,10 @@ fi: description: "Luettelo lippujen statuksista sisältäen lippujen tyypit, kirjoittajat, liputtajat ja selvitysajat." visits: title: "Käyttäjien vierailut" - xaxis: "Päivä" + xaxis: + desktop: "Työpöytä" + mobile: "Mobiili" yaxis: "Vierailujen määrä" - description: "Kirjautuneiden käyttäjien vierailujen määrä." signups: title: "Rekisteröitymiset" xaxis: "Päivä" @@ -1275,10 +1276,8 @@ fi: description: "Kirjautuneiden käyttäjien, anonyymien käyttäjien, tunnettujen hakurobottien ja muun liikenteen sivunkatselut." description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "PAK/KAK" xaxis: "Päivä" yaxis: "PAK/KAK" - description: "Käyttäjät, jotka kirjautuivat sisään viimeisen päivän aikana, jaettuna käyttäjillä, jotka kirjautuivat sisään viimeisen kuukauden aikana – tuottaa prosenttiarvon, joka ilmaisee yhteisön sitoutuneisuutta. Tähtää yli 20 prosenttiin." daily_engaged_users: title: "Sitoutuneet päivittäiskäyttäjät" xaxis: "Päivä" @@ -2175,7 +2174,6 @@ fi: group_in_subject: "Aseta %%{optional_pm} sähköpostin aiheessa ensimmäisen ryhmän nimeksi yksityisviestissä, katso: Customize subject format for standard emails" allow_anonymous_mode: "Ota käyttöön valinta, jolla käyttäjät voivat vaihtaa anonyymiin tilaan viestin julkaisua varten. Kun tämä aktivoidaan, käyttäjät voivat halutessaan piilottaa henkilöllisyytensä luodessaan viestejä tai ketjuja sivustolla. Katso myös \"allow anonymous likes\"." anonymous_account_duration_minutes: "Suojellaksesi anonymiteettiä, luo käyttäjälle uusi anonyymi tili N minuutin välein. Esimerkki: jos arvoksi asetetaan 600, kun 600 minuuttia tulee kuluneeksi edellisestä viestistä JA käyttäjä vaihtaa anonyymiin tilaan, luodaan uusi anonyymi tili." - hide_user_profiles_from_public: "Älä näytä käyttäjäkortteja, käyttäjäprofiileita tai käyttäjähakemistoa anonyymeille käyttäjille." hide_new_user_profiles: "Piilota luottamustason 1 tai alempien tasojen käyttäjäprofiilit yleisöltä ja luottamustason 1 käyttäjiltä, kunnes he lähettävät ensimmäisen viestinsä. Tämä ominaisuus on poistettu käytöstä ehdoitta must_approve_users- ja invite_only-sivustoilla." allow_users_to_hide_profile: "Salli käyttäjien piilottaa profiilinsa ja läsnäolonsa" hide_user_activity_tab: "Piilota toimintavälilehti käyttäjäprofiileista, paitsi ylläpitäjältä ja itseltä." @@ -2916,35 +2914,9 @@ fi: new_version_mailer: title: "Uusi versio" subject_template: "[%{email_prefix}] Uusi Discourse-versio, päivitys saatavilla" - text_body_template: | - Hurraa, uusi [Discourse-versio](https://www.discourse.org) on saatavilla! - - Sinun versiosi: %{installed_version} - Uusi versio: **%{new_version}** - - – Päivitä käyttäen helppoa **[yhden klikkauksen päivitystä selaimessa](%{base_url}/admin/update)** - - – Katso, mikä on uutta [julkaisutiedoista](https://meta.discourse.org/tag/release-notes) tai tutki [raakaa GitHubin muutoslokia](https://github.com/discourse/discourse/commits/main) - - – Käy osoitteessa [meta.discourse.org](https://meta.discourse.org) lukemassa uutisia ja keskustelua tai hae apua Discourseen liittyen new_version_mailer_with_notes: title: "Uusi versio julkaisumuistiolla" subject_template: "[%{email_prefix}] päivitys saatavilla" - text_body_template: | - Hurraa, uusi [Discourse-versio](https://www.discourse.org) on saatavilla! - - Sinun versiosi: %{installed_version} - Uusi versio: **%{new_version}** - - – Päivitä käyttäen helppoa **[yhden klikkauksen päivitystä selaimessa](%{base_url}/admin/update)** - - – Katso, mikä on uutta [julkaisutiedoista](https://meta.discourse.org/tag/release-notes) tai tutki [raakaa GitHubin muutoslokia](https://github.com/discourse/discourse/commits/main) - - – Käy osoitteessa [meta.discourse.org](https://meta.discourse.org) lukemassa uutisia ja keskustelua tai hae apua Discourseen liittyen - - ### Julkaisutiedot - - %{notes} flag_reasons: off_topic: "Viestisi merkittiin **eksyvän aiheesta**: koetaan, ettei se ei kuulu ketjun aiheeseen, jonka määrittelevät sen aloitusviesti ja otsikko." inappropriate: "Viestisi liputettiin **sopimattomaksi**: se koetaan loukkaavaksi, herjaavaksi, vihamieliseksi toiminnaksi tai [yhteisön sääntöjen](%{base_path}/guidelines) vastaiseksi." diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml index dc8faeddfc492..e42714cd4c48b 100644 --- a/config/locales/server.fr.yml +++ b/config/locales/server.fr.yml @@ -1211,9 +1211,10 @@ fr: description: "Liste des statuts de signalement : type de signalement, auteur, signaleur et temps de résolution." visits: title: "Visites d'utilisateurs" - xaxis: "Jour" + xaxis: + desktop: "Bureau" + mobile: "Mobile" yaxis: "Nombre de visites" - description: "Nombre de visites d'utilisateurs connectés." signups: title: "Inscriptions" xaxis: "Jour" @@ -1275,10 +1276,8 @@ fr: description: "Pages vues par les utilisateurs connectés, les utilisateurs anonymes, les robots d'indexation connus et les autres trafics." description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "DAU/MAU" xaxis: "Jour" yaxis: "DAU/MAU" - description: "Nombre d'utilisateurs qui se sont connectés au cours de la dernière journée, divisé par le nombre d'utilisateurs qui se sont connectés au cours du dernier mois. Valeur exprimée en % qui représente le taux d'adhésion de la communauté. Viser > 20 %." daily_engaged_users: title: "Utilisateurs impliqués au quotidien" xaxis: "Jour" @@ -2176,7 +2175,6 @@ fr: group_in_subject: "Mettre %%{optional_pm} dans le sujet de l'e-mail au nom du premier groupe du message direct. Voir : personnaliser le format du sujet des e-mails ordinaires" allow_anonymous_mode: "Activez l'option permettant aux utilisateurs de passer en mode anonyme pour publier. Lorsque cette option est activée, les utilisateurs peuvent choisir de masquer leur identité lors de la création de publications ou de sujets sur le site. Voir aussi « allow_anonymous_likes »." anonymous_account_duration_minutes: "Pour protéger l'anonymat, créer un nouveau compte anonyme toutes les N minutes pour chaque utilisateur. Exemple : si la valeur 600 est choisie, lorsque 600 minutes seront passées après le dernier message ET que l'utilisateur passera en mode anonyme, un nouveau compte anonyme lui sera créé." - hide_user_profiles_from_public: "Désactiver les cartes, les profils et le répertoire d'utilisateurs pour les visiteurs." hide_new_user_profiles: "Masquez les profils d'utilisateurs de niveau de confiance 1 ou inférieur au public et les utilisateurs de niveau de confiance 1 jusqu'à ce qu'ils envoient une publication pour la première fois. Cette fonctionnalité est désactivée sans condition sur les sites must_approve_users et invite_only." allow_users_to_hide_profile: "Autoriser les utilisateurs à masquer leur profil et leur présence" hide_user_activity_tab: "Masquez l'onglet d'activité sur les profils d'utilisateur, à l'exception d'Admin et de Self." @@ -2928,35 +2926,9 @@ fr: new_version_mailer: title: "Nouvelle version" subject_template: "[%{email_prefix}] Nouvelle version de Discourse, mise à jour disponible" - text_body_template: | - Hourra ! Une nouvelle version de [Discourse](https://www.discourse.org) est disponible ! - - Votre version : %{installed_version} - Nouvelle version : **%{new_version}** - - - Effectuez facilement la mise à jour depuis votre navigateur en utilisant la **[mise à jour en 1 clic](%{base_url}/admin/update)** - - - Découvrez les nouveautés en consultant les [notes de version](https://meta.discourse.org/tag/release-notes) ou l'[historique GitHub](https://github.com/discourse/discourse/commits/main) - - - Rendez vous sur [meta.discourse.org](https://meta.discourse.org) pour consulter des actualités, des discussions et obtenir de l'aide concernant Discourse new_version_mailer_with_notes: title: "Nouvelle version avec notes de modifications" subject_template: "[%{email_prefix}] Mise à jour disponible" - text_body_template: | - Hourra ! Une nouvelle version de [Discourse](https://www.discourse.org) est disponible ! - - Votre version : %{installed_version} - Nouvelle version : **%{new_version}** - - - Effectuez facilement la mise à jour depuis votre navigateur en utilisant la **[mise à jour en 1 clic](%{base_url}/admin/update)** - - - Découvrez les nouveautés en consultant les [notes de version](https://meta.discourse.org/tag/release-notes) ou l'[historique GitHub](https://github.com/discourse/discourse/commits/main) - - - Rendez vous sur [meta.discourse.org](https://meta.discourse.org) pour consulter des actualités, des discussions et obtenir de l'aide concernant Discourse - - ### Notes de version - - %{notes} flag_reasons: off_topic: "Votre message a été signalé comme étant **hors sujet** : la communauté considère qu'il ne correspond pas au sujet en question qui est défini par son titre et son premier message." inappropriate: "Votre message a été signalé comme étant **inapproprié** : la communauté estime qu'il est offensant, abusif, qu'il s'agit d'un comportement haineux ou qu'il enfreint les [lignes directrices de notre communauté](%{base_path}/guidelines)." diff --git a/config/locales/server.gl.yml b/config/locales/server.gl.yml index e085d6a67719f..16380f3a8c421 100644 --- a/config/locales/server.gl.yml +++ b/config/locales/server.gl.yml @@ -877,7 +877,9 @@ gl: description: "Listaxe do estado das alertas que inclúe o tipo de alerta, o usuario denunciado, o denunciante e o tempo de resolución." visits: title: "Visitas de usuarios" - xaxis: "Día" + xaxis: + desktop: "Escritorio" + mobile: "Móbil" yaxis: "Número de visitas" signups: title: "Rexistros" @@ -922,10 +924,8 @@ gl: yaxis: "Día" description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "UAD/UAM" xaxis: "Día" yaxis: "UAD/UAM" - description: "Número de membros que iniciaron sesión no último día entre o número de membros que iniciaron sesión no último mes - devolve a porcentaxe que indica o grao de permanencia da comunidade. Obxectivo: >20%." daily_engaged_users: title: "Usuarios comprometidos a diario" xaxis: "Día" @@ -1595,7 +1595,6 @@ gl: enable_category_group_moderation: "Permitirlles aos grupos moderar contido en categorías específicas" group_in_subject: "Estabelece %%{optional_pm} no asunto do correo electrónico co nome do primeiro grupo en MP, véxase: Personaliza o formato do asunto para correos estándar" anonymous_account_duration_minutes: "Para protexer o anonimato, crear unha nova conta anónima cada N minutos para cada usuario. Exemplo: se se estabelece en 600, así que pasen 600 minutos desde a última publicación E o usuario cambie a anónimo, crearase unha nova conta anónima." - hide_user_profiles_from_public: "Desactivar tarxetas de usuario, perfís de usuario e directorio de usuarios para usuarios anónimos." allow_users_to_hide_profile: "Permitirlles aos usuarios agochar o seu perfil e presenza" allow_featured_topic_on_user_profiles: "Permitir aos usuarios salientar unha ligazón a un tema da súa tarxeta de usuario e perfil." show_inactive_accounts: "Permitir aos usuarios coa sesión iniciada ver os perfís de contas inactivas." diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index 0d58fb0d44a83..a80d6c3dd2c0f 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -1366,9 +1366,10 @@ he: description: "רשימת מצבי גבלים לרבות סוג הדגל, מפרסם, מסמן בדגל וזמן הפתרון." visits: title: "ביקורי משתמש" - xaxis: "יום" + xaxis: + desktop: "מחשב-שולחני" + mobile: "נייד" yaxis: "מספר ביקורים" - description: "מספר המשתמשים המבקרים שנכנסו למערכת." signups: title: "הרשמות" xaxis: "יום" @@ -1432,10 +1433,8 @@ he: description: "תצוגות דף עבור משתמשים מחוברים, משתמשים אלמוניים, וסורקים אוטומטיים (crawlers) ותעבורה מסוגים נוספים." description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "יחס פעילות יומי/חודשי" xaxis: "יום" yaxis: "יחס פעילות יומי/חודשי" - description: "מספר החברים שנכנסו ביממה האחרונה לחלק במספר החברים שנכנסו בחודש האחרון – מחזירה אחוז שמציין את ‚דבקות’ הקהילה. עדיף לכוון לערך שעולה על 20%." daily_engaged_users: title: "משתמשים מעורבים יומית" xaxis: "יום" @@ -2355,7 +2354,6 @@ he: allow_likes_in_anonymous_mode: "הפעלת ההגדרה הזאת תאפשר למשתמשים שגולשים באתר שלך באלמוניות לסמן לייק על פוסטים. כשהאפשרות מופעלת, משתמשים יכולים להסוות את הזהות שלהם בסימון לייק לפוסטים או נושאים ברחבי האתר. ההגדרה הזאת דורשת שגם ההגדרה `allow anonymous mode` (לאפשר מצב אלמוני) תהיה פעילה." anonymous_posting_allowed_groups: "קבוצות שמורשות להפעיל פרסום אלמוני. ההגדרה הזאת דורשת שההגדרה `allow anonymous mode` (לאפשר מצב אלמוני) תהיה פעילה." anonymous_account_duration_minutes: "כדי להגן על האלמוניות יש ליצור חשבון אלמוני חדש כל N דקות עבור כל משתמש. למשל: אם ההגדרה היא 600, בחלוף 600 דקות מהפוסט האחרון וגם אם המשתמש עבר למצב אלמוני, ייווצר חשבון אלמוני חדש." - hide_user_profiles_from_public: "להשבית כרטיסי משתמשים, פרופילי משתמשים וספריית משתמשים עבור משתמשים אלמוניים." hide_new_user_profiles: "הסתרת דרגת אמון 1 ומטה לפרופילי משתמשים ממשתמשים ציבוריים ובדרגת אמון 1 עד שיפרסמו בפעם הראשונה. היכולת הזאת מושבתת ללא תנאים באתרי must_approve_users ו־invite_only (חובה לאשר משתמשים ובהזמנה בלבד בהתאמה)." allow_users_to_hide_profile: "לאפשר למשתמשים להחביא את הפרופיל והנוכחות שלהם" hide_user_activity_tab: "להסתיר את לשונית הפעילות בפרופילי משתמש למעט למנהלים ולעצמי." @@ -2589,7 +2587,6 @@ he: content_localization_enabled: "הצגת תוכן מתורגם/מקומי למשתמשים לפי הדפדפן או העדפות שפת המשתמש. תוכן שכזה יכול לכלול קטגוריות, תגיות, פוסטים ונושאים. השפות הנתמכות מוגדרות תחת ‚content localization supported locales’ (שפות נתמכות לתרגום תוכן)." content_localization_allowed_groups: "קבוצות שמורשות לעדכן תוכן שתורגם לשפה המקומית. נדרשת הפעלת ‚content localization enabled’ (תרגום תוכן פעיל)." content_localization_language_switcher: "הצגת בורר שפות בכותרת, הוא יאפשר למבקרים להחליף בין הגרסאות המתורגמות של Discourse ותוכן שנתרם על ידי המשתמשים. משתמש בשפה שהוגדרה ב‚שפות שנתמכות לתרגום תוכן’ (content localization supported locales)." - enable_upcoming_changes: "הפעלת שינויים עתידיים" fake_upcoming_change: "זה שינוי עתידי מזויף למטרות בדיקה. לא צריך לתרגם את המחרוזת הזאת." errors: invalid_css_color: "צבע שגוי. נא למלא את שם הצבע או ערך הקסדצימלי." @@ -3169,35 +3166,9 @@ he: new_version_mailer: title: "שולח-מיילים של גרסה חדשה" subject_template: "[%{email_prefix}] גרסת Discourse חדשה, עדכון זמין." - text_body_template: | - הידד, יצאה גרסה חדשה של [Discourse](https://www.discourse.org)! - - הגרסה שלך: %{installed_version} - הגרסה החדשה: **%{new_version}** - - - ניתן לעדכן בעזרת **[עדכון מהיר בלחיצה אחת דרך הדפדפן](%{base_url}/admin/update)** - - - מה שחדש בגרסה מופיע ב[הערות ההפצה](https://meta.discourse.org/tag/release-notes) או שניתן לצפות [ביומן השינויים הגולמי ב־GitHub](https://github.com/discourse/discourse/commits/main) - - - ממליצים לך לבקר ב־[meta.discourse.org](https://meta.discourse.org) לקבלת חדשות, דיונים ותמיכה ב־Discourse new_version_mailer_with_notes: title: "שולח-מיילים של גרסה חדשה עם הערות" subject_template: "[%{email_prefix}] עדכון זמין" - text_body_template: | - היאח, יצאה גרסה חדשה של [Discourse](https://www.discourse.org)! - - הגרסה שלך: %{installed_version} - הגרסה החדשה: **%{new_version}** - - - אפשר לעדכן בעזרת **[עדכון בלחיצה אחת דרך הדפדפן](%{base_url}/admin/update)** - - - צפייה ב[הערות המהדורה](https://meta.discourse.org/tag/release-notes) תציג בפניך את כל השינויים או צפייה ב[יומן השינויים הגולמי של GitHub](https://github.com/discourse/discourse/commits/main) - - - ניתן לבקר ב־[meta.discourse.org](https://meta.discourse.org) לחדשות, דיונים ותמיכה ב־Discourse - - ### הערות מהדורה - - %{notes} flag_reasons: off_topic: "הפוסט שלך סומן כ**חורג מהנושא**: הקהילה מרגישה שהוא לא מתאים לנושא, כפי שמוגדר על ידי הכותרת והפוסט הראשון." inappropriate: "הפוסט שלך סומן כ**בלתי הולם**: הקהילה מרגישה שהוא מעליב, פוגע, מלבה שנאה או מפר את [הנחיות הקהילה שלנו](%{base_path}/guidelines)" diff --git a/config/locales/server.hr.yml b/config/locales/server.hr.yml index 2c20c9deb58d1..fe0522d65c498 100644 --- a/config/locales/server.hr.yml +++ b/config/locales/server.hr.yml @@ -905,7 +905,9 @@ hr: flag: Tip visits: title: "Posjete korisnika" - xaxis: "Dan" + xaxis: + desktop: "Desktop" + mobile: "Mobilni" yaxis: "Broj posjeta" signups: xaxis: "Dan" diff --git a/config/locales/server.hu.yml b/config/locales/server.hu.yml index ae62c12290d60..5353a01589930 100644 --- a/config/locales/server.hu.yml +++ b/config/locales/server.hu.yml @@ -60,6 +60,8 @@ hu: inline_oneboxer: topic_page_title_post_number: "#%{post_number}" topic_page_title_post_number_by_user: "#%{post_number} általa: %{username}" + too_many_urls: "Egyetlen kérésben legfeljebb 10 URL alakítható át soron belüli oneboxszá." + concurrency_not_allowed: "Az URL-ek soron belüli oneboxszá alakítására irányuló párhuzamos kérések nem engedélyezettek. Kérjük, egyszerre csak egy kérést küldjön." components: enabled_filter: "Engedélyezed" disabled_filter: "Kikapcsolt" @@ -258,6 +260,7 @@ hu: errors: &errors format: ! "%{attribute} %{message}" format_with_full_message: "%{attribute}: %{message}" + diff_too_complex: "A változtatások összehasonlítása túl összetett a biztonságos kiszámításhoz. Kérjük, próbálkozzon kisebb módosításokkal." messages: invalid_locale: "%{invalid_locale} nem érvényes nyelv" too_long_validation: @@ -345,6 +348,7 @@ hu: slow_down_crawler_user_agent_must_be_at_least_3_characters: "A felhasználói ügynököknek legalább 3 karakter hosszúaknak kell lenniük, hogy elkerüljék a jogos felhasználók véletlen sebességkorlátozását." slow_down_crawler_user_agent_cannot_be_popular_browsers: "A következő értékek egyikét sem adhatja hozzá a beállításhoz: %{values}." strip_image_metadata_cannot_be_disabled_if_composer_media_optimization_image_enabled: "Nem lehet letiltani a szalagkép metaadatait, ha a composer médiaoptimalizáló kép engedélyezve van. Kapcsolja ki ezt az opciót, mielőtt letiltaná a szalagkép metaadatokat." + x_summary_large_image_no_svg: "Az X összefoglaló képeihez használt twitter:image metaadat nem lehet .svg formátumú kép." tl0_and_anonymous_flag: "A névtelen felhasználók számára meg kell adni a „webhely kapcsolatfelvételi e-mail-címét” vagy „az illegális tartalom bejelentéséhez szükséges e-mail-címet”." allow_likes_in_anonymous_mode_without_anonymous_mode_enabled: "Ehhez a beállításhoz először engedélyezni kell az 'anonim mód engedélyezése' beállítást." conflicting_google_user_id: 'A fiók Google-fiók azonosítója megváltozott; biztonsági okokból a személyzet beavatkozása szükséges. Kérjük, lépjen kapcsolatba a személyzettel, és mutassa meg nekik a következő címet:
https://meta.discourse.org/t/76575' @@ -813,6 +817,10 @@ hu: other: "Ez a kategória nem törölhető, mert %{count} témája van. A legrégebbi téma a %{topic_link}." topic_exists_no_oldest: "A kategóriát nem lehet törölni, mert a benne lévő témák száma %{count}." uncategorized_description: "Témák, amelyeknek nincs szükségük kategóriára, vagy nem férnek bele semmilyen más létező kategóriába." + category_types: + discussion: + name: "Beszélgetés" + title: "beszélgetés" trust_levels: admin: "Adminisztrátor" staff: "Stáb" @@ -1224,9 +1232,10 @@ hu: description: "Megjelölések állapotának listája, beleértve azok típusát, a bejegyzés létrehozóját, a megjelölést beküldőjét és a határidőt." visits: title: "Felhasználói látogatások" - xaxis: "Nap" + xaxis: + desktop: "Asztali" + mobile: "Mobil" yaxis: "Látogatások száma" - description: "A bejelentkezett felhasználói látogatások száma." signups: title: "Feliratkozások" xaxis: "Nap" @@ -1290,10 +1299,8 @@ hu: description: "Oldalmegtekintések bejelentkezett felhasználók, névtelen felhasználók, ismert keresőrobotok és egyéb forgalom számára." description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "NAF/HAF" xaxis: "Nap" yaxis: "NAF/HAF" - description: "Az utolsó napon bejelentkezett tagok száma osztva az elmúlt hónapban bejelentkezett tagok számával – %-ot ad vissza, ami a közösség „ragadósságát” jelzi. 20% feletti cél." daily_engaged_users: title: "Napi aktív felhasználók" xaxis: "Nap" @@ -1708,6 +1715,8 @@ hu: max_oneboxes_per_post: "Állítsa be az egyetlen bejegyzésben megjeleníthető oneboxok maximális számát. A oneboxok a bejegyzésen belül előnézetet biztosítanak a linkelt tartalomról." facebook_app_access_token: "Egy token, amelyet a Facebook alkalmazás azonosítójából és titkos kulcsából generáltak. Az Instagram oneboxok generálására használják." github_onebox_access_tokens: "Egy GitHub szervezet vagy felhasználó hozzárendelése egy GitHub hozzáférési tokenhez, amelyet privát repók, kommitok, pull requestek, issue-k és fájltartalmak GitHub oneboxainak generálására használnak. Enélkül csak nyilvános GitHub URL-ek lesznek oneboxolva." + reddit_onebox_client_id: "Reddit API OAuth ügyfél-azonosító (client ID) a hitelesített Reddit-oneboxok használatához. A hitelesítő adatok beszerzéséhez hozzon létre egy 'script' típusú alkalmazást a reddit.com/prefs/apps oldalon." + reddit_onebox_client_secret: "Reddit API OAuth ügyfél-titok a hitelesített Reddit-oneboxokhoz. Megtalálható a reddit.com/prefs/apps oldalon létrehozott 'script' típusú alkalmazás adatai között." logo: "A webhelye bal felső sarkában megjelenő logó kép. Használjon széles, téglalap alakú képet 120 pixel magassággal és 3:1-nél nagyobb képaránnyal. Ha üresen hagyja, a webhely címének szövege fog megjelenni." logo_small: "A webhelye bal felső sarkában megjelenő kis logó kép, amely görgetéskor látható. Használjon 120 × 120 pixeles négyzet alakú képet. Ha üresen hagyja, egy házikó ikon fog megjelenni." digest_logo: "A webhelye e-mailes összefoglalójának tetején használt alternatív logó kép. Használjon széles, téglalap alakú képet. Ne használjon SVG képet. Ha üresen hagyja, a logo beállításból származó kép lesz használva." @@ -1719,6 +1728,7 @@ hu: manifest_icon: "Androidon logóként/kezdőképernyő képként használt kép. Automatikusan át lesz méretezve 512 × 512 pixelre. Ha üresen hagyja, a large_icon lesz használva." manifest_screenshots: "Képernyőképek, amelyek bemutatják az Ön példányának jellemzőit és funkcionalitását a telepítés oldalon. Minden képnek helyi feltöltésűnek kell lennie és azonos méretűnek." favicon: "Egy favicon az Ön webhelyéhez, lásd https://en.wikipedia.org/wiki/Favicon. A CDN-en való helyes működéshez png formátumúnak kell lennie. 32x32 pixelre lesz átméretezve. Ha üresen hagyja, a large_icon lesz használva." + apple_touch_icon: "Az Apple érintőképernyős eszközeihez használt ikon. Az átlátszó háttér használata nem javasolt. A rendszer automatikusan 180x180-as méretűre méretezi át. Ha üresen marad, a large_icon beállítás kerül felhasználásra." opengraph_image: "Alapértelmezett opengraph kép, amely akkor használatos, amikor az oldalnak nincs más megfelelő képe. Ha üresen hagyja, a large_icon lesz használva." x_summary_large_image: "Twitter kártya 'summary large image' (legalább 280 pixel széles és legalább 150 pixel magas legyen, nem lehet .svg formátumú). Ha üresen hagyja, a normál kártya metaadatai az opengraph_image alapján lesznek generálva, amennyiben az sem .svg formátumú." notification_email: "A feladó e-mail címe, amelyet az összes lényeges rendszerüzenet küldésekor használ a rendszer. Az itt megadott domainhez helyesen beállított SPF, DKIM és fordított PTR rekordokkal kell rendelkeznie ahhoz, hogy az e-mailek megérkezzenek." @@ -1789,6 +1799,7 @@ hu: moderators_manage_categories: "Lehetővé teszi a moderátorok számára a kategóriák létrehozását és kezelését" moderators_manage_groups: "Lehetővé teszi a moderátorok számára a csoportok létrehozását és kezelését" moderators_change_post_ownership: "Engedélyezze a moderátoroknak a bejegyzések tulajdonjogának megváltoztatását" + change_post_ownership_allowed_groups: "Engedélyezze a bejegyzések tulajdonosának módosítását ezen csoportok tagjai számára." cors_origins: "Megengedett források a kereszteredetű kérelmek (CORS) számára. Minden eredetnek tartalmaznia kell a http:// vagy https:// címet. A CORS engedélyezéséhez a DISCOURSE_ENABLE_CORS env változót igaz értékre kell állítani." use_admin_ip_allowlist: "Az adminisztrátorok csak akkor tudnak bejelentkezni, ha a Szűrt IP-címek listában (Admin > Naplók > Szűrt IP-címek) meghatározott IP-címen tartózkodnak." blocked_ip_blocks: "Privát IP-címtartományok listája, amelyeket a Discourse soha nem indexelhet" @@ -1887,6 +1898,7 @@ hu: enable_local_logins_via_email: "Engedélyezze a felhasználóknak, hogy egy kattintással bejelentkezési linket kérjenek, amelyet e-mailben kapnak meg." allow_new_registrations: "Új felhasználók regisztrációjának engedélyezése. Vegye ki a jelölést, hogy megakadályozza, hogy bárki új fiókot hozzon létre." enable_signup_cta: "Mutasson értesítést a visszatérő névtelen felhasználóknak, és ajánlja fel, hogy regisztráljanak egy fiókot." + enable_discourse_id: "Hitelesítés engedélyezése a Discourse ID segítségével. Ez egy egyszeri bejelentkezési (SSO) szolgáltatás, amely lehetővé teszi a felhasználók számára, hogy egyetlen fiókkal több különböző Discourse-oldalra is belépjenek. A népszerű közösségi szolgáltatók, mint a Google, a Facebook, az Apple és a GitHub további beállítások nélkül támogatottak. További részletekért látogasson el az id.discourse.com oldalra." enable_google_oauth2_logins: "Engedélyezze a Google Oauth2 hitelesítést. A Google jelenleg ezt a hitelesítési módszert támogatja. Kulcs és titkos kód szükséges. Lásd: A Google bejelentkezés konfigurálása a Discourseszámára." google_oauth2_client_id: "A Google-alkalmazás által megadott egyedi ügyfél-azonosító, amelyet a hitelesítési folyamathoz használnak." google_oauth2_client_secret: "A Google-alkalmazás titkos kliens kódja." @@ -2109,6 +2121,8 @@ hu: num_flaggers_to_close_topic: "A téma beavatkozás céljából történő automatikus szüneteltetéséhez szükséges egyedi megjelölők minimális száma" num_hours_to_close_topic: "Egy téma szüneteltetésének óraszáma beavatkozás céljából." auto_respond_to_flag_actions: "Automatikus válasz bekapcsolása a megjelölés elvetéséhez." + min_first_post_typing_time: "Az első hozzászólás gépelésével töltött minimális időtartam. Ha a felhasználó nem éri el ezt a küszöbértéket, a bejegyzés automatikusan a jóváhagyásra váró sorba kerül. A kikapcsoláshoz állítsa 0-ra (nem javasolt)." + fast_typing_threshold: "Az első hozzászólás gépelésére fordított minimális idő. Ha az időtartam nem éri el a küszöbértéket, a bejegyzés automatikusan a moderációs sorba kerül. Alacsony: 1 másodperc, normál: 3 másodperc, magas: 5 másodperc." auto_silence_fast_typers_on_first_post: "Automatikusan elnémítja azokat a felhasználókat, akik nem érik el a \"gyors gépelési küszöböt\"." auto_silence_fast_typers_max_trust_level: "Maximális bizalmi szint a gyors gépelők automatikus elnémításához" auto_silence_first_post_regex: "Kis- és nagybetűre nem érzékeny reguláris kifejezés, amely ha teljesül, az első felhasználói bejegyzést elnémítja és a jóváhagyási sorba küldi. Például: raging|a[bc]a , minden olyan bejegyzést elnémít, amely tartalmazza a raging vagy aba vagy aca kifejezést az első alkalommal. Csak az első bejegyzésre vonatkozik. ELAVULT: Használja helyette a Figyelt Szavak Elnémítása funkciót." @@ -2127,6 +2141,7 @@ hu: alternative_reply_by_email_addresses: "Alternatív sablonok listája a bejövő e-mail-címekre történő válaszadáshoz. Példa: %%{reply_key}@reply.example.com|válaszok+%%{reply_key}@example.com" incoming_email_prefer_html: "Szöveg helyett HTML-kódot használjon bejövő e-mailekhez." strip_incoming_email_lines: "Távolítsa el a kezdő és a záró szóközöket a bejövő e-mailek minden sorából." + disable_emails: "Megakadályozza, hogy a Discourse bármilyen e-mailt küldjön. Válassza az „igen” opciót a kimenő e-mailek letiltásához minden felhasználó számára. Válassza a „non-staff” (nem személyzet) opciót, ha csak a nem-staff felhasználók e-mailjeit szeretné letiltani." allow_email_invites: "Ha le van tiltva, a felhasználók nem tudnak meghívókat küldeni a Discourse-on keresztül." strip_images_from_short_emails: "Képek eltávolítása 2800 bájtnál kisebb méretű e-mailekből" short_email_length: "Határozza meg bájtban azt a maximális hosszt, amelyen egy e-mailt „rövid”-nek kell minősíteni a képelnyomás miatt. Ha egy e-mail mérete nem haladja meg ezt a beállítást, az e-mailben található képek (például avatarok és hangulatjelek) törlődnek." @@ -2220,13 +2235,15 @@ hu: allow_likes_in_anonymous_mode: "Engedélyezze ezt a beállítást, hogy a webhelyet névtelenül böngésző felhasználók lájkolhassák a bejegyzéseket. Aktiválás esetén a felhasználók választhatják, hogy identitásuk rejtve maradjon, amikor bejegyzéseket vagy témákat lájkolnak a webhelyen. Ehhez a beállításhoz engedélyezni kell az „névtelen mód engedélyezése” beállítást." anonymous_posting_allowed_groups: "Azok a csoportok, amelyek engedélyezik a névtelen hozzászólás lehetőségét. Ehhez a beállításhoz engedélyezni kell a `engedélyezzük a névtelen módot` beállítást." anonymous_account_duration_minutes: "Az anonimitás védelme érdekében N percenként új névtelen fiókot hoz létre minden felhasználó számára. Példa: ha 600-ra van állítva, amint 600 perc eltelik az utolsó bejegyzés óta ÉS a felhasználó névtelen módra vált, egy új névtelen fiók jön létre." - hide_user_profiles_from_public: "Felhasználói kártyák, felhasználói profilok és felhasználói címtár letiltása névtelen felhasználók számára." + hide_user_profiles_from_public: "A felhasználói kártyák és profilok letiltása a névtelen felhasználók számára. Az összesített statisztikák továbbra is elérhetőek maradnak a felhasználói névjegyzékben." hide_new_user_profiles: "Rejti az 1-es vagy alacsonyabb bizalmi szinttel rendelkező felhasználói profilokat a nyilvánosság és az 1-es szintű felhasználók elől, amíg azok nem posztolnak először. Ez a funkció feltétel nélkül le van tiltva azokon az oldalakon, ahol kötelező a felhasználók jóváhagyása vagy ahol csak meghívással lehet regisztrálni." allow_users_to_hide_profile: "Felhasználók számára engedélyezi a profiljuk és jelenlétük elrejtését" hide_user_activity_tab: "A tevékenység fül elrejtése a felhasználói profilokban, kivéve az Adminisztrátor és saját profil esetében." delete_associated_accounts_on_password_reset: "Törölje a felhasználóhoz tartozó fiókot, amikor a felhasználó megváltoztatja a jelszavát" allow_featured_topic_on_user_profiles: "Engedélyezze a felhasználók számára, hogy a felhasználói kártyájukon és a profiljukon megjelenítsenek egy témára mutató hivatkozást." show_inactive_accounts: "A bejelentkezett felhasználók böngészhetnek az inaktív fiókok profiljai között." + hide_silencing_reasons: "Ne jelenítse meg nyilvánosan a némítási okokat a felhasználói profilokon." + hide_suspension_reasons: "Ne jelenítse meg nyilvánosan a felfüggesztési okokat a felhasználói profilokon." log_personal_messages_views: "Naplózott személyes üzenet megtekinthetősége a rendszergazda által más felhasználók/csoportok számára." ignored_users_count_message_threshold: "Értesítse a moderátorokat, ha egy adott felhasználót ennyi másik felhasználó figyelmen kívül hagy." ignored_users_message_gap_days: "Mennyi ideig kell várni, mielőtt ismét értesítené a moderátorokat egy olyan felhasználóról, akit sokan figyelmen kívül hagytak." @@ -2240,6 +2257,7 @@ hu: dont_feed_the_trolls_threshold: "A többi felhasználótól kapott jelzések száma a figyelmeztetés előtt." enable_mobile_theme: "A mobileszközök mobilbarát témát használnak, és a teljes webhelyre válthatnak. Tiltsa le ezt, ha olyan egyéni stíluslapot szeretne használni, amely teljesen reszponzív." dominating_topic_minimum_percent: "Egy felhasználónak hány százaléknyi bejegyzést kell tennie egy témában, mielőtt figyelmeztetést kap a téma túlzott dominanciájáról." + pm_warn_user_last_seen_months_ago: "Új privát üzenet írásakor figyelmeztesse a felhasználót, ha a címzett több mint n hónapja nem volt aktív." suppress_uncategorized_badge: "Ne jelenítse meg a kategorizálatlan témák jelvényét a témalistákban." header_dropdown_category_count: "Hány kategória jeleníthető meg a fejléc legördülő menüjében." permalink_normalizations: "A következő reguláris kifejezés alkalmazása a permalinkek egyeztetése előtt, például: /(topic.*)\\?.*/\\1 eltávolítja a lekérdezési karakterláncokat a téma útvonalakból. A formátum regex+karakterlánc, használja a \\1 stb. kifejezéseket a csoportok eléréséhez." @@ -2413,6 +2431,7 @@ hu: dashboard_hidden_reports: "Engedélyezze a megadott jelentések elrejtését a vezérlőpulton." dashboard_visible_tabs: "Válassza ki, hogy a vezérlőpult mely lapjai legyenek láthatóak." dashboard_general_tab_activity_metrics: "Válassza ki azokat a jelentéseket, amelyek aktivitási mutatóként jelenjenek meg az általános fülön." + gravatar_enabled: "A Gravatar szolgáltatás használata a felhasználói avatarokhoz. Ennek letiltása megakadályozza, hogy a felhasználók Gravatarra váltsanak, de nem érinti azokat a felhasználókat, akik már jelenleg is azt használják." gravatar_name: "Adja meg a Gravatar szolgáltató nevét. Ezt a nevet általában a Gravatar avatarokat biztosító forrás azonosítására használják a webhelyen." gravatar_base_url: "Adja meg a Gravatar szolgáltató API-jának elérési URL-jét. Ez a beállítás kulcsfontosságú az e-mail címek Gravatar URL-é alakításához, ahol az avatar képek tárolva vannak." gravatar_login_url: "A `gravatar_base_url`-hez viszonyított URL, amely lehetővé teszi a felhasználónak, hogy bejelentkezzen a Gravatar szolgáltatásba." @@ -2425,19 +2444,23 @@ hu: suggest_weekends_in_date_pickers: "Tartalmazza a hétvégéket (szombat és vasárnap) a dátumválasztó javaslatai között (tiltsa le ezt, ha a Discourse-t csak hétköznap, hétfőtől péntekig használja)." show_bottom_topic_map: "Megjeleníti a téma térképét a téma alján, ha az legalább 10 választ tartalmaz." show_topic_map_in_topics_without_replies: "Megjeleníti a téma térképét akkor is, ha a témában nincsenek válaszok." + enable_site_owner_onboarding: "Egy panelt jelenít meg a kezdőlapon az új adminisztrátoroknak, segítve őket a kezdeti lépésekben. Engedélyezze újra ezt a beállítást, ha ismét látni szeretné a bevezetési lépéseket." enable_welcome_banner: "Egy banner megjelenítése a fő témalistás oldalakon, hogy üdvözölje a tagokat, és lehetővé tegye számukra a webhely tartalmának keresését." welcome_banner_image: "Állítson be egy képet, amely az üdvözlő banner hátterében jelenik meg." welcome_banner_location: "Meghatározza, hogy az oldalon hol jelenjen meg az üdvözlő banner." welcome_banner_page_visibility: "Meghatározza, hogy mely oldalakon jelenjen meg az üdvözlő banner." welcome_banner_text_color: "Ha az „Üdvözlő bannerkép” beállítás konfigurálva van, ezzel a beállítással módosíthatja a banner szövegének színét, hogy az olvasható maradjon. Ha üresen hagyja, vagy ha nincs feltöltve kép, az aktív sablon szabályozza a színt." splash_screen: "Ideiglenes betöltési képernyőt jelenít meg, amíg az oldal eszközei betöltődnek." + splash_screen_image: "Az indítóképernyőn megjelenő SVG kép, amely az oldal betöltése közben látható. Az animált SVG-k kizárólag CSS transform vagy opacity animációkat használhatnak. Használjon egyedi neveket a CSS osztályokhoz és a kulcskockákhoz. A téma színeire a var(--primary), var(--secondary) és var(--tertiary) változókkal hivatkozhat." navigation_menu: "Adja meg, hogy az oldalsáv vagy a fejléc legördülő menüje legyen az oldal fő navigációs menüje. Az oldalsáv ajánlott." default_navigation_menu_categories: "A kiválasztott kategóriák alapértelmezetten megjelennek a Navigációs Menü Kategóriák szekciójában." default_navigation_menu_tags: "A kiválasztott címkék alapértelmezetten megjelennek a Navigációs Menü Címkék szekciójában." experimental_new_new_view_groups: 'Engedélyezzen egy új témalistát, amely egyesíti az olvasatlan és új témákat, és az oldalsávon lévő "Minden" hivatkozást jelölje be.' + enable_form_templates: "Az űrlapsablonok funkció engedélyezése. Segítségével strukturált, adatellenőrzéssel ellátott űrlapok használatát írhatja elő a témalétrehozási folyamat részeként." show_preview_for_form_templates: "Az űrlapsablonok előnézetének engedélyezése" lazy_load_categories_groups: "Lusta betöltés alkalmazása a kategória információkra a kiválasztott csoportok felhasználói számára. Ez javítja a teljesítményt olyan webhelyeken, ahol sok kategória van." enable_auto_grid_images: "Automatikusan [grid] címkékbe csomagolja a képeket, ha 3 vagy több képet töltöttek fel a komponálóba." + impersonate_without_logout: "Lehetővé teszi az adminisztrátorok számára, hogy egy felhasználó nevében lépjenek be anélkül, hogy ki kellene jelentkezniük a saját adminisztrátori fiókjukból." experimental_impersonation_time_limit_minutes: "Mennyi idő múlva ér véget automatikusan a megszemélyesítési munkamenet." page_loading_indicator: "A Discourse-on belüli oldalnavigációk során megjelenő betöltési jelző konfigurálása. A 'Spinner' egy teljes oldalas jelző. A 'Slider' egy keskeny sávot jelenít meg a képernyő tetején." show_user_menu_avatars: "Felhasználói avatarok megjelenítése a felhasználói menüben" @@ -2459,11 +2482,14 @@ hu: content_localization_crawler_param: "Lokalizált tartalom kiszolgálása a keresőrobotok számára, ha a „tartalom-lokalizáció engedélyezése” (content localization enabled) és a „nyelv beállítása paraméter alapján” (set locale from param) funkció be van kapcsolva. A támogatott nyelvek listáját a „tartalom-lokalizáció által támogatott nyelvek” (content localization supported locales) beállítás határozza meg." content_localization_use_default_locale_when_unsupported: "A webhely alapértelmezett területi beállításainak megfelelően lokalizált tartalmat jelenítsen meg azoknak a felhasználóknak, akiknek az előnyben részesített nyelve nem szerepel a „tartalom lokalizációjában támogatott területek” listában." content_localization_allow_author_localization: "Lehetővé teheti a szerzők számára saját témáik és bejegyzéseik lokalizációjának frissítését a bejegyzések menüjén keresztül." - enable_upcoming_changes: "Közelgő változások engedélyezése" fake_upcoming_change: "Ez egy hamis, közelgő változás tesztelési célokra. Nem kell lefordítani ezt a karakterláncot." floating_dismiss_topics_on_mobile: "Megjelenít egy lebegő „Elvetés...” gombot mobilon a témalistához a könnyebb hozzáférés és a témalista tetején lévő hely felszabadítása érdekében." rename_faq_to_guidelines: "Ez a módosítás a GYIK-oldalt „Irányelvek” névre nevezi át. A GYIK-oldal továbbra is elérhető marad a /faq útvonalon, a „faq url” beállítás pedig a megszokott módon működik tovább." + experimental_tag_settings_page: "Dedikált beállítási oldal engedélyezése a címkékhez a /tag/:slug/:id/edit útvonalon." enable_simplified_category_creation: "Leegyszerűsített kategória-létrehozási folyamatot tesz lehetővé kevesebb opcióval és letisztultabb felülettel." + enable_custom_splash_screen: "Lehetővé teszi a betöltési kezdőképernyő testreszabását saját SVG-képpel. Töltsön fel egy képet a „kezdőképernyő képe” beállítással. Figyelmeztetés: Ez negatívan befolyásolhatja az LCP-pontszámokat és a Google indexelését." + modernize_foundation_theme: "Ez a módosítás dizájnbeli változtatásokat vezet be a Discourse Foundation témájába." + reporting_improvements: "Navigációs, megjelenésbeli és használhatósági fejlesztések a Discourse adminisztrátori jelentéseihez." errors: invalid_css_color: "Érvénytelen szín. Adjon meg egy színnevet vagy hexaértéket." invalid_datetime: "Érvénytelen dátum/idő formátum. Kérjük, győződjön meg arról, hogy érvényes dátumot és időpontot adott meg." @@ -2471,6 +2497,8 @@ hu: invalid_username: "Nincs ilyen nevű felhasználó." valid_username: "Van egy ilyen nevű felhasználó." invalid_group: "Nincs ilyen nevű csoport." + invalid_svg: "Az SVG kép érvénytelen. Tartalmaznia kell egy SVG elemet, továbbá nem tartalmazhat szkripteket vagy eseménykezelőket." + invalid_upload: "A feltöltés érvénytelen vagy nem létezik." invalid_topic: "Nincs ilyen azonosítóval rendelkező téma." invalid_integer_min_max: "Az értéknek %{min} és %{max} között kell lennie." invalid_integer_min: "Az érték nem lehet kisebb, mint %{min}." @@ -2508,6 +2536,12 @@ hu: reply_by_email_disabled: "A beállítás engedélyezése előtt először engedélyeznie kell a „válasz e-mailben” funkciót." discourse_connect_url_is_empty: "Először be kell állítania egy 'discourse connect url'-t, mielőtt engedélyezné ezt a beállítást." enable_local_logins_disabled: "Először engedélyeznie kell a 'helyi bejelentkezések engedélyezése' opciót, mielőtt ezt a beállítást engedélyezné." + min_username_length_exists: "A 'felhasználónév minimális hossza' nem állítható magasabb értékre a legrövidebb felhasználónévnél (%{username})." + min_group_name_length_exists: "A 'felhasználónév minimális hossza' nem állítható magasabb értékre a legrövidebb csoportnévnél (%{group_name})." + min_username_length_range: "A 'felhasználónév minimális hossza' nem állítható magasabb értékre, mint a 'felhasználónév maximális hossza'." + max_username_length_exists: "A 'felhasználónév maximális hossza' nem állítható kisebb értékre a leghosszabb felhasználónévnél (%{username})." + max_group_name_length_exists: "A 'felhasználónév maximális hossza' nem állítható kisebb értékre a leghosszabb csoportnévnél (%{group_name})." + max_username_length_range: "A 'felhasználónév maximális hossza' nem állítható kisebb értékre, mint a 'felhasználónév minimális hossza'." invalid_hex_value: "A színértékeknek 6 számjegyű hexadecimális kódoknak kell lenniük." empty_selectable_avatars: "A beállítás engedélyezése előtt fel kell töltened legalább két választható avatart." category_search_priority: @@ -2770,6 +2804,7 @@ hu: csrf_detected: "Sajnáljuk, az engedélyezés időtúllépést okozott, vagy böngészőt váltott. Kérjük, próbálja újra." request_error: "Sajnáljuk, hiba történt az engedélyezés megkezdésekor. Kérjük, próbálja újra." invalid_iat: "Sajnáljuk, a szerver órajelének eltérései miatt nem tudjuk ellenőrizni az engedélyezési tokent. Kérjük, próbálja újra." + unauthorized: "Sajnáljuk, a bejelentkezési szolgáltató nem engedélyezte a kérését. Kérjük, próbálja újra, vagy forduljon egy adminisztrátorhoz." omniauth_error_unknown: "Hiba történt a bejelentkezési adatok feldolgozásakor. Kérjük, próbálja újra." omniauth_confirm_title: "Jelentkezzen be a %{provider} használatával" omniauth_confirm_button: "Folytatás" @@ -3000,35 +3035,9 @@ hu: new_version_mailer: title: "Új levelező verzió" subject_template: "[%{email_prefix}] Új Discourse verzió, frissítés elérhető" - text_body_template: | - Hurrá, elérhető a [Discourse](https://www.discourse.org) új verziója! - - A te verziód: %{installed_version} - Új verzió: **%{new_version}** - - - Frissíts egyszerűen **[egykattintásos böngészőfrissítés](%{base_url}/admin/update)** - - - Nézd meg az újdonságokat a [kiadási jegyzetekben](https://meta.discourse.org/tag/release-notes) vagy tekintsd meg a [nyers GitHub changelog](https://github.com/discourse/discourse/commits/main) - - - Látogass el a [meta.discourse.org](https://meta.discourse.org) oldalra a Discourse híreiért, megvitatásáért és támogatásáért. new_version_mailer_with_notes: title: "Új verzió levelező megjegyzésekkel" subject_template: "[%{email_prefix}] frissítés elérhető" - text_body_template: | - Hurrá, elérhető a [Discourse](https://www.discourse.org) új verziója! - - A te verziód: %{installed_version} - Új verzió: **%{new_version}** - - - Frissíts egyszerűen **[egykattintásos böngészőfrissítés](%{base_url}/admin/update)** - - - Nézd meg az újdonságokat a [kiadási jegyzetekben](https://meta.discourse.org/tag/release-notes) vagy tekintsd meg a [nyers GitHub changelog](https://github.com/discourse/discourse/commits/main) - - - Látogass el a [meta.discourse.org](https://meta.discourse.org) oldalra a Discourse híreiért, megvitatásáért és támogatásáért. - - ### Kiadási jegyzet - - %{notes} flag_reasons: off_topic: "Bejegyzését **nem témába vágóként** jelentették: a közösség úgy érzi, hogy a cím és az első bejegyzés alapján nem felel meg a témának." inappropriate: "Bejegyzését **nem megfelelő**ként jelölték meg: a közösség sértőnek, sértőnek, gyűlöletkeltőnek vagy [közösségi irányelveinknek] (%{base_path}/guidelines) megsértésének érzi." @@ -4998,6 +5007,7 @@ hu: dev_mode: title: "Fejlesztői mód" enable_rack_mini_profiler: "Engedélyezze a Rack Mini Profiler 1 órás megőrzését a munkamenet-változások között" + enter: "Belépés a Fejlesztői módba" wizard: title: "Discourse telepítő" step: diff --git a/config/locales/server.hy.yml b/config/locales/server.hy.yml index 8b0787d3319a0..db28ac16bd384 100644 --- a/config/locales/server.hy.yml +++ b/config/locales/server.hy.yml @@ -738,7 +738,9 @@ hy: description: "Դրոշակների կարգավիճակների ցանկը՝ ներառյալ դրոշակի տիպը, գրառողին, դրոշակավորողին և լուծման ժամանակը" visits: title: "Օգտատիրոջ Այցելություններ" - xaxis: "Օր" + xaxis: + desktop: "Համակարգչային" + mobile: "Հեռախոսային" yaxis: "Այցելությունների քանակ" signups: title: "Գրանցումներ" @@ -775,10 +777,8 @@ hy: site_traffic: yaxis: "Օր" dau_by_mau: - title: "DAU/MAU" xaxis: "Օր" yaxis: "DAU/MAU" - description: "Վերջին օրում մուտքագրված անդամների թիվը բաժանած վերջին ամսում մուտքագրված անդամների թվին - վերադարձնում է %, որը մատնանշում է համայնքի 'կպչունությունը': Նպատակն է՝ >20%:" daily_engaged_users: title: "Օրեկան Ներառված Օգտատերեր" xaxis: "Օր" @@ -1343,7 +1343,6 @@ hy: enable_group_directory: "Տրամադրել խմբերի դիրեկտորիա՝ ուսումնասիրման համար" group_in_subject: "Սահմանել %%{optional_pm} էլ. նամակի թեմայում՝ անձնական հաղորդագրության մեջ առաջին խմբի անվան համար, այցելեք՝ Անհատականացնել թեմայի ֆորմատը ստանդարտ էլ. հասցեների համար" anonymous_account_duration_minutes: "Անանունությունը պահպանելու համար ստեղծեք անանուն հաշիվ յուրաքանչյուր N րոպեն մեկ յուրաքանչյուր օգտատիրոջ համար: Օրինակ՝ եթե սահմանված է 600, հենց որ վերջին գրառումից անցնի 600 րոպե ԵՎ օգտատերը միացնի անանուն ռեժիմը, կստեղծվի նոր անանուն հաշիվ:" - hide_user_profiles_from_public: "Անջատել օգտատիրոջ քարտը, պրոֆիլները և դիրեկտորիան անանուն օգտագործողների համար:" show_inactive_accounts: "Թույլատրել մուտքագրված օգտատերերին դիտել ապակտիվ հաշիվների պրոֆիլները:" log_personal_messages_views: "Գրանցել անձնական նամակների դիտումները Ադմինի կողմից այլ օգտատերերի/խմբերի համար:" ignored_users_count_message_threshold: "Ծանուցել մոդերատորներին, եթե մասնավորապես որևէ օգտատեր անտեսվում է այսքան այլ օգտատերերի կողմից:" diff --git a/config/locales/server.id.yml b/config/locales/server.id.yml index f15389993953d..ebae6bbfe5a02 100644 --- a/config/locales/server.id.yml +++ b/config/locales/server.id.yml @@ -924,7 +924,6 @@ id: time_to_resolution: Waktu resolusi visits: title: "Kunjungan Pengguna" - xaxis: "Haru" yaxis: "Jumlah kunjungan" signups: xaxis: "Hari" @@ -965,10 +964,8 @@ id: yaxis: "Hari" description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "DAU/MAU" xaxis: "Hari" yaxis: "DAU/MAU" - description: "Jumlah anggota yang masuk pada hari terakhir dibagi dengan jumlah anggota yang masuk pada bulan lalu – menghasilkan % yang menunjukkan 'stickiness' komunitas. Bertujuan untuk >20%." daily_engaged_users: title: "Pengguna yang Terlibat Harian" xaxis: "Hari" @@ -1291,34 +1288,6 @@ id: blank: "tidak boleh kosong." not_allowed: "tidak diijinkan dari penyedia layanan email ini. Silahkan gunakan alamat email yang lain." blocked: "tidak diperbolehkan." - new_version_mailer: - text_body_template: | - Hore, versi baru dari [Discourse] (https://www.discourse.org) telah tersedia! - - Versi Anda: %{installed_version} - Versi baru: **%{new_version}** - - - Perbarui menggunakan **[pembaruan browser sekali klik] kami yang mudah (%{base_url}/admin/update) ** - - - Lihat apa yang baru di [catatan rilis](https://meta.discourse.org/tag/release-notes) atau lihat [catatan perubahan GitHub](https://github.com/discourse/discourse/commits/main) - - - Kunjungi [meta.discourse.org](https://meta.discourse.org) untuk berita, diskusi, dan dukungan untuk Discourse - new_version_mailer_with_notes: - text_body_template: | - Hore, versi baru [Discourse] (https://www.discourse.org) tersedia! - - Versi Anda: %{installed_version} - Versi baru: **%{new_version}** - - - Perbarui menggunakan ** [pembaruan browser satu-klik] kami yang mudah (%{base_url}/admin/update) ** - - - Lihat apa yang baru di [catatan rilis] (https://meta.discourse.org/tag/release-notes) atau lihat [perubahan GitHub mentah](https://github.com/discourse/discourse/commits/main) - - - Kunjungi [meta.discourse.org](https://meta.discourse.org) untuk berita, diskusi, dan dukungan untuk Discourse - - ### Catatan rilis - - %{notes} system_messages: queued_by_staff: title: "Pesan Membutuhkan Persetujuan" diff --git a/config/locales/server.it.yml b/config/locales/server.it.yml index 6f105be3c5654..1cf83e6859571 100644 --- a/config/locales/server.it.yml +++ b/config/locales/server.it.yml @@ -1211,9 +1211,10 @@ it: description: "Elenco degli stati delle segnalazioni inclusi tipo di segnalazione, autore, segnalante e tempo di risoluzione." visits: title: "Visite Utente" - xaxis: "Giorno" + xaxis: + desktop: "Desktop" + mobile: "Mobile" yaxis: "Numero di visite" - description: "Numero di visite di utenti autenticati." signups: title: "Iscrizioni" xaxis: "Giorno" @@ -1275,10 +1276,8 @@ it: description: "Visualizzazioni di pagina per utenti registrati, utenti anonimi, crawler noti e altro traffico." description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "DAU/MAU" xaxis: "Giorno" yaxis: "DAU/MAU" - description: "Numero di utenti che hanno effettuato l'accesso nell'ultimo giorno diviso per il numero di utenti che hanno effettuato l'accesso nell'ultimo mese: restituisce una % che rappresenta 'l'attaccamento' alla comunità. Obiettivo > 20%." daily_engaged_users: title: "Utenti Impegnati Giornalmente" xaxis: "Giorno" @@ -2170,7 +2169,6 @@ it: group_in_subject: "Imposta %%{optional_pm} nell'oggetto dell'email con il nome del primo gruppo in Messaggio Privato, vedi: Personalizza il formato oggetto per le e-mail standard" allow_anonymous_mode: "Abilita l'opzione che consente all'utente di passare alla modalità anonima per pubblicare. Se attiva, l'utente può scegliere di mantenere privata la propria identità quando pubblica messaggi o argomenti sul sito. Vedi anche `allow anonymous likes`." anonymous_account_duration_minutes: "Per proteggere l'anonimato creare un nuovo account anonimo ogni N minuti per ogni utente. Esempio: se impostato a 600, non appena passano 600 minuti dall'ultimo messaggio E l'utente passa in modalità anonima, viene creato un nuovo account anonimo." - hide_user_profiles_from_public: "Disabilita schede utenti, profili utenti e directory utenti per gli utenti anonimi." hide_new_user_profiles: "Nascondi i profili utente di livello di attendibilità 1 o inferiore al pubblico e considera attendibili gli utenti di livello 1 finché non pubblicano per la prima volta. Questa funzionalità è disabilitata incondizionatamente sui siti must_appprove_users e invite_only." allow_users_to_hide_profile: "Permetti agli utenti di nascondere il loro profilo e la loro presenza" hide_user_activity_tab: "Nasconde la scheda attività su tutti i profili utente eccetto il proprio e quelli dell'amministrazione." @@ -2897,35 +2895,9 @@ it: new_version_mailer: title: "Mailer Nuova Versione" subject_template: "[%{email_prefix}] Nuova versione di Discourse, aggiornamento disponibile" - text_body_template: | - Evviva, è uscita una nuova versione di [Discourse](https://www.discourse.org)! - - La tua versione: %{installed_version} - Nuova versione: **%{new_version}** - - - Passa subito all'ultima versione con l'intuitivo **[aggiornamento da browser in un solo clic](%{base_url}/admin/update)** - - - Scopri le novità nelle [note di rilascio](https://meta.discourse.org/tag/release-notes) o visualizza il [log originale delle modifiche GitHub](https://github.com/discourse/discourse/commits/main) - - - Visita [meta.discourse.org](https://meta.discourse.org): troverai novità, discussioni e supporto su Discourse new_version_mailer_with_notes: title: "Mailer Nuova Versione con Note" subject_template: "[%{email_prefix}] aggiornamento disponibile" - text_body_template: | - Evviva, è uscita una nuova versione di [Discourse](https://www.discourse.org)! - - La tua versione: %{installed_version} - Nuova versione: **%{new_version}** - - - Passa subito all'ultima versione con l'intuitivo **[aggiornamento da browser in un solo clic](%{base_url}/admin/update)** - - - Scopri le novità nelle [note di rilascio](https://meta.discourse.org/tag/release-notes) o visualizza il [log originale delle modifiche GitHub](https://github.com/discourse/discourse/commits/main) - - - Visita [meta.discourse.org](https://meta.discourse.org): troverai novità, discussioni e supporto su Discourse - - ### Note di rilascio - - %{notes} flag_reasons: off_topic: "Il tuo messaggio è stato segnalato come **fuori tema**: la comunità pensa che non riguardi l'argomento, come attualmente definito dal titolo e dal contenuto del primo messaggio." inappropriate: "Il tuo messaggio è stato segnalato come **inappropriato**: la community ritiene che sia offensivo, ingiurioso, oppure che inciti all'odio o rappresenti una violazione delle [nostre linee guida della community](%{base_path}/guidelines)." diff --git a/config/locales/server.ja.yml b/config/locales/server.ja.yml index a941cf154bfb0..ef972c062a809 100644 --- a/config/locales/server.ja.yml +++ b/config/locales/server.ja.yml @@ -1148,9 +1148,10 @@ ja: description: "通報の種類、投稿者、通報者、および解決までの時間など、通報のステータスのリスト。" visits: title: "ユーザーアクセス" - xaxis: "日" + xaxis: + desktop: "デスクトップ" + mobile: "モバイル" yaxis: "アクセス数" - description: "サインイン済みのユーザーの訪問数。" signups: title: "登録" xaxis: "日" @@ -1214,10 +1215,8 @@ ja: description: "ログインユーザー、匿名ユーザー、既知のクローラー、およびその他のトラフィックのページビュー。" description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "DAU/MAU" xaxis: "日" yaxis: "DAU/MAU" - description: "前日にログインしたメンバーの数を先月にログインしたメンバーの数で割った数 - コミュニティーの「粘着性」を示す割合 % を返します。20% 以上を目指してください。" daily_engaged_users: title: "1 日のエンゲージユーザー" xaxis: "日" @@ -2142,7 +2141,6 @@ ja: allow_likes_in_anonymous_mode: "サイトを匿名で閲覧しているユーザーが投稿に「いいね!」できるようにするには、この設定を有効にします。有効にすると、ユーザーはサイト全体で投稿またはトピックに「いいね!」する際に、自分の ID を非表示にすることを選択できます。この設定には `allow_anonymous_mode` 設定が有効になっている必要があります。" anonymous_posting_allowed_groups: "匿名投稿を有効にできるグループ。この設定には `allow anonymous mode` 設定が有効になっている必要があります。" anonymous_account_duration_minutes: "匿名性を守るため、N 分毎に各ユーザーの匿名アカウントを作成しなおします。例 : 600 に設定すると、最終投稿から 600 分が経過し、さらにユーザーが匿名に切り替えると、新しい匿名アカウントが作成されます。" - hide_user_profiles_from_public: "匿名ユーザーのユーザーカード、ユーザープロファイル、およびユーザーディレクトリを無効にする。" hide_new_user_profiles: "信頼レベル 1 以下のユーザープロファイルは、そのユーザーが初めて投稿するまで一般ユーザーと信頼レベル 1 のユーザーに対して非表示になります。この機能は must_approve_users と invite_only サイトでは無条件に無効になります。" allow_users_to_hide_profile: "ユーザーがプロファイルとプレゼンスを非表示することを許可する" hide_user_activity_tab: "管理者と自分以外のユーザープロファイルでアクティビティタブを非表示にします。" @@ -2383,7 +2381,6 @@ ja: content_localization_crawler_param: "'content localization enabled' と 'set locale from param' が有効な場合にローカライズされたコンテンツをウェブクローラーに配信する。サポートされたロケールのリストは 'content localization supported locales' に定義されています。" content_localization_use_default_locale_when_unsupported: "優先言語が 'content localization supported locales' に含まれていないユーザーに、サイトのデフォルトのロケールでローカライズされたコンテンツを配信する。" content_localization_allow_author_localization: "作成者が投稿メニューから自分のトピックと投稿を更新することを許可する。" - enable_upcoming_changes: "次回の変更を有効にする" fake_upcoming_change: "これは実際の次回の変更ではありません。テストを目的としているため、この文字列の翻訳は不要です。" floating_dismiss_topics_on_mobile: "モバイル版では、アクセスの簡易性とトピックリストの上部のスペースを空けるために「閉じる...」フローティングボタンを表示する" rename_faq_to_guidelines: "この変更によって FAQ ページの名前が「ガイドライン」に変更されます。FAQ ページは引き続き /faq で利用できます。'faq url' 設定はこれまで通り機能します。" @@ -2893,35 +2890,9 @@ ja: new_version_mailer: title: "新しいバージョンメーラー" subject_template: "[%{email_prefix}] 新しい Discourse バージョン、更新が利用可能になりました" - text_body_template: | - [Discourse](https://www.discourse.org) の新しいバージョンを使用できるようになりました! - - 現在のバージョン: %{installed_version} - 新しいバージョン: **%{new_version}** - - - *[ワンクリックによるブラウザ更新](%{base_url}/admin/update)**を使って簡単に更新できます - - - [リリースノート](https://meta.discourse.org/tag/release-notes)で新機能を確認するか、[生の GitHub 変更ログ](https://github.com/discourse/discourse/commits/main)をご覧ください - - - Discourse の最新情報、ディスカッション、およびサポートについては、[meta.discourse.org](https://meta.discourse.org) にアクセスしてください new_version_mailer_with_notes: title: "注意付きの新しいバージョンメーラー" subject_template: "[%{email_prefix}] 更新が利用可能になりました" - text_body_template: | - [Discourse](https://www.discourse.org) の新しいバージョンを使用できるようになりました! - - 現在のバージョン: %{installed_version} - 新しいバージョン: **%{new_version}** - - - *[ワンクリックによるブラウザ更新](%{base_url}/admin/update)**を使って簡単に更新できます - - - [リリースノート](https://meta.discourse.org/tag/release-notes)で新機能を確認するか、[生の GitHub 変更ログ](https://github.com/discourse/discourse/commits/main)をご覧ください - - - Discourse の最新情報、ディスカッション、およびサポートについては、[meta.discourse.org](https://meta.discourse.org) にアクセスしてください - - ### リリースノート - - %{notes} flag_reasons: off_topic: "あなたの投稿は「話題に関係ない」として通報されました。コミュニティーはあなたの投稿がタイトルと最初の投稿で定義されているトピックにふさわしくないと判断しました。" inappropriate: "あなたの投稿は**不適切**として通報されました。コミュニティーは投稿が攻撃的、虐待的、ヘイト行為、または[コミュニティーガイドライン](%{base_path}/guidelines)に違反すると感じています。" diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml index 47b1664164dc9..ff931e8a1dd87 100644 --- a/config/locales/server.ko.yml +++ b/config/locales/server.ko.yml @@ -890,7 +890,9 @@ ko: description: "신고 유형, 게시자, 신고자 및 해결 시간을 포함한 신고 상태 목록입니다." visits: title: "사용자 방문 횟수" - xaxis: "일" + xaxis: + desktop: "데스크톱" + mobile: "모바일" yaxis: "방문 횟수" signups: title: "가입" @@ -935,10 +937,8 @@ ko: yaxis: "일" description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "DAU / MAU" xaxis: "일" yaxis: "DAU / MAU" - description: "마지막 날에 로그인 한 회원 수를 지난 달에 로그인 한 회원 수로 나눈 값 – 커뮤니티 '고착성'을 나타내는 %를 반환합니다. 20 % 이상을 목표로하십시오." daily_engaged_users: title: "일일 참여 사용자" xaxis: "일" @@ -1635,7 +1635,6 @@ ko: enable_category_group_moderation: "그룹이 특정 카테고리의 콘텐츠를 관리하도록 허용" group_in_subject: "PM의 첫 번째 그룹 이름으로 이메일 제목에 %%{optional_pm} 을 설정합니다. 참조: 표준 이메일의 제목 형식 사용자 지정" anonymous_account_duration_minutes: "익명성을 보호하기 위해 각 사용자에 대해 N분마다 새 익명 계정을 만듭니다. 예: 600으로 설정하면 마지막 게시물로부터 600분이 경과하고 사용자가 익명으로 전환하는 즉시 새 익명 계정이 생성됩니다." - hide_user_profiles_from_public: "익명 사용자의 사용자 카드, 사용자 프로필 및 사용자 디렉터리를 비활성화합니다." allow_users_to_hide_profile: "사용자가 자신의 프로필과 현재 상태를 숨기도록 허용" allow_featured_topic_on_user_profiles: "사용자가 자신의 사용자 카드 및 프로필에 있는 주제로 연결되는 링크를 제공하도록 허용합니다." show_inactive_accounts: "로그인한 사용자가 비활성 계정의 프로필을 탐색할 수 있도록 허용합니다." diff --git a/config/locales/server.lt.yml b/config/locales/server.lt.yml index fdff51b4026d3..63ad69b4ff5f6 100644 --- a/config/locales/server.lt.yml +++ b/config/locales/server.lt.yml @@ -878,7 +878,9 @@ lt: flagger: Pranešėjas visits: title: "Nario aplankymai" - xaxis: "Diena" + xaxis: + desktop: "Darbalaukis" + mobile: "Mobilus" yaxis: "Apsilankymai" signups: title: "Registracijos" @@ -922,10 +924,8 @@ lt: yaxis: "Diena" description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "DAU/MAU" xaxis: "Diena" yaxis: "DAU/MAU" - description: "Paskutinę dieną prisijungusių narių skaičius, padalytas iš narių, prisijungusių per pastarąjį mėnesį, skaičiaus – pateikiamas %, kuris rodo bendruomenės „lipnumą“. Siekite >20 proc." daily_engaged_users: title: "Kasdien dalyvaujantys vartotojai" xaxis: "Diena" diff --git a/config/locales/server.lv.yml b/config/locales/server.lv.yml index 28fd95c8d0069..b19646ece05a8 100644 --- a/config/locales/server.lv.yml +++ b/config/locales/server.lv.yml @@ -256,7 +256,9 @@ lv: labels: flag: Tips visits: - xaxis: "Diena" + xaxis: + desktop: "Personālais dators" + mobile: "Mobilais" signups: xaxis: "Diena" new_contributors: diff --git a/config/locales/server.nb_NO.yml b/config/locales/server.nb_NO.yml index 5fe7f24b9208a..b7c21596734a4 100644 --- a/config/locales/server.nb_NO.yml +++ b/config/locales/server.nb_NO.yml @@ -660,7 +660,9 @@ nb_NO: time_to_resolution: Løsningstid visits: title: "Brukerbesøk" - xaxis: "Dag" + xaxis: + desktop: "Skrivebord" + mobile: "Mobil" yaxis: "Antall besøk" signups: title: "Nye brukere" @@ -689,7 +691,6 @@ nb_NO: site_traffic: yaxis: "Dag" dau_by_mau: - title: "DAB/MAB" xaxis: "Dag" yaxis: "DAB/MAB" daily_engaged_users: diff --git a/config/locales/server.nl.yml b/config/locales/server.nl.yml index 4defbbb84f89e..30d0087d1a771 100644 --- a/config/locales/server.nl.yml +++ b/config/locales/server.nl.yml @@ -1211,9 +1211,10 @@ nl: description: "Lijst van statussen van markeringen, waaronder het type markering, schrijver, melder, en tijd tot resolutie." visits: title: "Gebruikersbezoeken" - xaxis: "Dag" + xaxis: + desktop: "Desktop" + mobile: "Mobiel" yaxis: "Aantal bezoeken" - description: "Aantal bezoeken van aangemelde gebruikers." signups: title: "Registraties" xaxis: "Dag" @@ -1275,10 +1276,8 @@ nl: description: "Paginaweergaven voor aangemelde gebruikers, bekende crawlers en ander verkeer." description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "DAU/MAU" xaxis: "Dag" yaxis: "DAU/MAU" - description: "Aantal leden dat zich de afgelopen dag heeft aangemeld, gedeeld door het aantal leden dat zich de afgelopen maand heeft aangemeld – geeft een % terug dat retentie van de community aangeeft. Het streven is > 20%." daily_engaged_users: title: "Dagelijkse actieve gebruikers" xaxis: "Dag" @@ -2170,7 +2169,6 @@ nl: group_in_subject: "Stel %%{optional_pm} in het e-mailonderwerp in op de naam van de eerste groep in PB; zie Onderwerpnotatie aanpassen voor standaard e-mails" allow_anonymous_mode: "Schakel deze instelling in om gebruikers toe te staan naar de anonieme modus te schakelen voor het plaatsen van berichten. Als dit is ingeschakeld, kunnen gebruikers ervoor kiezen om hun identiteit te verbergen wanneer ze berichten of topics maken op de site. Zie ook `allow anonymous likes`." anonymous_account_duration_minutes: "Om anonimiteit te beschermen, elke N minuten voor iedere gebruiker een nieuwe anoniem account maken. Voorbeeld: als dit is ingesteld op 600, wordt een nieuwe anonieme account gemaakt als er 600 minuten zijn verstreken na het laatste bericht EN de gebruiker naar anon overschakelt." - hide_user_profiles_from_public: "Gebruikerskaarten, gebruikersprofielen en gebruikerslijst voor anonieme gebruikers uitschakelen." hide_new_user_profiles: "Verberg gebruikersprofielen met vertrouwensniveau 1 of lager voor het publiek en gebruikers met vertrouwensniveau 1 totdat ze voor het eerst een bericht plaatsen. Deze functie is onvoorwaardelijk uitgeschakeld op sites met must_approve_users en invite_only." allow_users_to_hide_profile: "Gebruikers mogen hun profiel en aanwezigheid verbergen" hide_user_activity_tab: "Verberg het tabblad Activiteit in gebruikersprofielen, behalve voor beheerders en jezelf." @@ -2663,7 +2661,7 @@ nl: not_approved: "Je account is nog niet goedgekeurd. Je ontvangt een melding via e-mail zodra je je kunt aanmelden." incorrect_username_email_or_password: "Onjuiste gebruikersnaam, e-mailadres of wachtwoord" incorrect_password: "Onjuist wachtwoord" - incorrect_password_or_passkey: "Onjuist wachtwoord of onjuiste passkey" + incorrect_password_or_passkey: "Onjuist wachtwoord of onjuiste toegangssleutel" wait_approval: "Bedankt voor het registreren. We laten het je weten wanneer je account is goedgekeurd." active: "Je account is geactiveerd en gereed voor gebruik." activate_email: "

Je bent er bijna! We hebben een activerings-e-mail naar %{email} gestuurd. Volg de instructies in de e-mail om je account te activeren.

Als deze niet aankomt, controleer dan je spammap.

" @@ -2784,7 +2782,7 @@ nl: one: "De gebruiker %{username} heeft %{count} bericht in een openbaar topic of persoonlijk bericht, dus deze kan niet worden verwijderd." other: "De gebruiker %{username} heeft %{count} berichten in openbare topics of persoonlijke berichten, dus deze kan niet worden verwijderd." cannot_bulk_delete: "Een of meerdere gebruikers kunnen niet worden verwijderd omdat ze beheerder zijn, te veel berichten hebben of een heel oud bericht hebben." - cannot_remove_all_auth: "Je moet minimaal één gekoppeld account, een passkey of een wachtwoord hebben ingesteld." + cannot_remove_all_auth: "Je moet minimaal één gekoppeld account, een toegangssleutel of een wachtwoord hebben ingesteld." unsubscribe_mailer: title: "Mailer Uitschrijven" subject_template: "Bevestig dat je geen e-mailupdates van %{site_title} meer wilt ontvangen" @@ -2912,35 +2910,9 @@ nl: new_version_mailer: title: "Nieuwe versie mailer" subject_template: "[%{email_prefix}] Nieuwe Discourse-versie, update beschikbaar" - text_body_template: | - Hoera, er is een nieuwe versie van [Discourse](https://www.discourse.org) beschikbaar! - - Jouw versie: %{installed_version} - Nieuwe versie: **%{new_version}** - - - Update via onze eenvoudige **[browserupdate in één klik](%{base_url}/admin/update)** - - - Lees wat er nieuw is in de [releaseopmerkingen](https://meta.discourse.org/tag/release-notes), of bekijk de [ruwe GitHub-veranderingslog](https://github.com/discourse/discourse/commits/main) - - - Ga naar [meta.discourse.org](https://meta.discourse.org) voor nieuws, discussie en ondersteuning voor Discourse new_version_mailer_with_notes: title: "Nieuwe versie Mailer met aantekeningen" subject_template: "[%{email_prefix}] update beschikbaar" - text_body_template: | - Hoera, er is een nieuwe versie van [Discourse](https://www.discourse.org) beschikbaar! - - Jouw versie: %{installed_version} - Nieuwe versie: **%{new_version}** - - - Update via onze eenvoudige **[browserupdate in één klik](%{base_url}/admin/update)** - - - Lees wat er nieuw is in de [release-opmerkingen](https://meta.discourse.org/tag/release-notes), of bekijk de [ruwe GitHub-veranderingslog](https://github.com/discourse/discourse/commits/main) - - - Bezoek [meta.discourse.org](https://meta.discourse.org) voor nieuws, discussie en ondersteuning voor Discourse - - ### Release-opmerkingen - - %{notes} flag_reasons: off_topic: "Je bericht is gemarkeerd als **off-topic**: de community vindt dat het niet goed bij het topic past, zoals momenteel bepaald door de titel en het eerste bericht." inappropriate: "Je bericht is gemarkeerd als **ongepast**: de community vindt het bericht beledigend, grof, hatelijk gedrag of een schending van [onze communityrichtlijnen](%{base_path}/guidelines)." diff --git a/config/locales/server.pl_PL.yml b/config/locales/server.pl_PL.yml index 1c7d12513c7df..4459dbde785c2 100644 --- a/config/locales/server.pl_PL.yml +++ b/config/locales/server.pl_PL.yml @@ -19,7 +19,7 @@ pl_PL: calendar_ics: "%Y%m%dT%H%M%SZ" date: month_names: - - null + - - Styczeń - Luty - Marzec @@ -919,6 +919,12 @@ pl_PL: other: "Nie można usunąć tej kategorii, bo zawiera %{count} tematów. Najstarszy temat to %{topic_link}." topic_exists_no_oldest: "Nie można usunąć tej kategorii z uwagi na liczbę tematów: %{count}." uncategorized_description: "Tematy które nie potrzebują kategorii, albo nie nadają się do żadnej innej." + category_types: + not_available: "Typ kategorii „%{type_name}” jest niedostępny" + discussion: + name: "Dyskusja" + title: "dyskusja" + description: "Standardowa kategoria zawierająca wszystko, co niezbędne do prowadzenia konwersacji." trust_levels: admin: "Administracja" staff: "Zespół" @@ -1292,6 +1298,8 @@ pl_PL: weekly: "co tydzień" every_month: "każdego miesiąca" every_six_months: "co 6 miesięcy" + calendar_subscriptions: + application_name: "Subskrypcje kalendarza" user_api_key: title: 'Autoryzuj "%{application_name}"' authorize: "Autoryzuj" @@ -1380,9 +1388,11 @@ pl_PL: description: "Lista statusów flag, w tym rodzaj flagi, plakat, flagger i czas do rozwiązania." visits: title: "Wizyty użytkowników" - xaxis: "Dzień" + xaxis: + desktop: "Komputer" + mobile: "Mobilnie" yaxis: "Liczba wizyt" - description: "Liczba wizyt zalogowanych użytkowników." + description: "Liczba wizyt zalogowanych użytkowników według typu urządzenia." signups: title: "Podpisy" xaxis: "Dzień" @@ -1449,7 +1459,7 @@ pl_PL: title: "DAU / MAU" xaxis: "Dzień" yaxis: "DAU / MAU" - description: "Liczba członków zalogowanych w ostatnim dniu podzielona przez liczbę członków zalogowanych w ostatnim miesiącu - zwraca % wskazujący 'lepkość' społeczności. Celuj na >20%." + description: "Odsetek aktywnych użytkowników miesięcznie, którzy wrócili w ciągu ostatniego dnia. Ten odsetek pokazuje, jak regularnie ludzie wracają; nazywany jest również „lepkością” społeczności. Celuj w > 20%." daily_engaged_users: title: "Zaangażowani użytkownicy dziennie" xaxis: "Dzień" @@ -1950,6 +1960,7 @@ pl_PL: moderators_manage_categories: "Zezwól moderatorom na tworzenie i zarządzanie kategoriami" moderators_manage_groups: "Zezwól moderatorom na tworzenie i zarządzanie grupami" moderators_change_post_ownership: "Zezwalaj moderatorom na zmianę właściciela posta" + change_post_ownership_allowed_groups: "Zezwalaj użytkownikom w tych grupach na zmianę własności wpisów" cors_origins: "Dozwolone źródła dla zapytać cross-origin (CORS). Każde źródło musi zawierać http:// lub https://. Zmienna środowiskowa DISCOURSE_ENABLE_CORS musi być ustawiona na true żeby włączyć CORS." use_admin_ip_allowlist: "Administratorzy mogą się zalogować tylko wtedy, gdy używają adresu IP zdefiniowanego na liście sprawdzonych adresów IP (Administrator > Logi > Sprawdzone adresy IP)." blocked_ip_blocks: "Lista prywatnych bloków IP, które nigdy nie powinny być indeksowane przez Discourse" @@ -2385,7 +2396,7 @@ pl_PL: allow_likes_in_anonymous_mode: "Włącz to ustawienie, aby umożliwić użytkownikom anonimowo przeglądającym Twoją witrynę polubienie postów. Po aktywacji użytkownicy mogą ukryć swoją tożsamość podczas polubienia postów lub tematów w witrynie. To ustawienie wymaga włączenia opcji „Zezwól na tryb anonimowy”." anonymous_posting_allowed_groups: "Grupy, które mogą zezwalać na anonimowe publikowanie. To ustawienie wymaga włączenia opcji „Zezwól na tryb anonimowy”." anonymous_account_duration_minutes: "Aby chronić anonimowość twórz nowe anonimowe konto co N minut dla każdego użytkownika. Przykład: jeśli ustawione na 600, dopóki nie minie 600 minut od ostatniego wpisu i użytkownik przełącza się na anon, zostanie utworzone nowe anonimowe konto." - hide_user_profiles_from_public: "Wyłącz karty użytkownika, profile użytkowników i katalog użytkowników dla użytkowników anonimowych." + hide_user_profiles_from_public: "Wyłącz karty i profile użytkowników dla użytkowników anonimowych. Zagregowane statystyki będą nadal dostępne w katalogu użytkowników." hide_new_user_profiles: "Ukryj profile użytkowników poziomu zaufania 1 lub niższego przed innymi i użytkownikami poziomu zaufania 1, dopóki nie opublikują po raz pierwszy. Ta funkcja jest bezwarunkowo wyłączona w witrynach must_approve_users i invite_only." allow_users_to_hide_profile: "Zezwalaj użytkownikom na ukrywanie swojego profilu i statusu dostępności." hide_user_activity_tab: "Ukryj kartę aktywności na profilach użytkowników z wyjątkiem administratora i siebie." @@ -2634,7 +2645,6 @@ pl_PL: content_localization_crawler_param: "Wyświetlaj zlokalizowaną treść robotom indeksującym sieć, gdy włączona jest opcja „lokalizacja treści” i „ustaw ustawienia regionalne z parametrów”. Lista obsługiwanych ustawień regionalnych jest zdefiniowana w sekcji „Obsługiwane ustawienia regionalne lokalizacji treści”." content_localization_use_default_locale_when_unsupported: "Wyświetlaj zlokalizowaną treść w domyślnych ustawieniach regionalnych witryny użytkownikom, których preferowany język nie znajduje się na liście „ustawień regionalnych obsługiwanych przez lokalizację treści”." content_localization_allow_author_localization: "Zezwól autorom na aktualizowanie lokalizacji własnych tematów i wpisów poprzez menu wpisów." - enable_upcoming_changes: "Włącz nadchodzące zmiany" fake_upcoming_change: "Jest to fałszywa nadchodząca zmiana do celów testowych. Nie musisz tłumaczyć tego ciągu znaków." floating_dismiss_topics_on_mobile: "Wyświetla na urządzeniu mobilnym pływający przycisk „Odrzuć...” dla listy tematów, aby ułatwić dostęp i zwolnić miejsce u góry listy tematów" rename_faq_to_guidelines: "Ta zmiana zmienia nazwę strony FAQ na Wytyczne. Strona FAQ będzie nadal dostępna pod adresem /faq. Ustawienie „faq url” działa jak poprzednio." @@ -3249,25 +3259,26 @@ pl_PL: * Aktualizacja za pomocą naszego **[aktualizatora w przeglądarce](%{base_url}/admin/update)** - * Dowiedz się, co nowego w [informacjach o wydaniu](https://meta.discourse.org/tag/release-notes) lub przejrzyj [nieprzetworzony dziennik zmian GitHub](https://github.com/discourse/discourse/commits/main) + * Dowiedz się, co nowego w [informacjach o wydaniu](/tag/release-notes) lub przejrzyj [nieprzetworzony dziennik zmian GitHub](https://meta.discourse.org) * Odwiedź stronę [meta.discourse.org](https://meta.discourse.org), aby uzyskać informacje, omówienia i wsparcie dla Discourse new_version_mailer_with_notes: title: "Nowa wersja powiadomień z uwagami" subject_template: "[%{email_prefix}] dostępna aktualizacja" text_body_template: | - Hurra, dostępna jest nowa wersja [Discourse](https://www.discourse.org)! + Hurra, nowa wersja [Discourse](https://www.discourse.org) jest dostępna! Twoja wersja: %{installed_version} Nowa wersja: **%{new_version}** - * Aktualizacja za pomocą naszego **[aktualizatora w przeglądarce](%{base_url}/admin/update)** + - Zaktualizuj, korzystając z naszej łatwej **[aktualizacji przeglądarki jednym kliknięciem](%{base_url}/admin/update)** - * Dowiedz się, co nowego w [informacjach o wydaniu](https://meta.discourse.org/tag/release-notes) lub przejrzyj [nieprzetworzony dziennik zmian GitHub](https://github.com/discourse/discourse/commits/main) + - Zobacz, co nowego w [notatkach dotyczących wydania](https://releases.discourse.org/changelog/%{new_version}) - * Odwiedź stronę [meta.discourse.org](https://meta.discourse.org), aby uzyskać informacje, omówienia i wsparcie dla Discourse + - Odwiedź [meta.discourse.org](https://meta.discourse.org) w celu uzyskania wiadomości, dyskusji i wsparcia dla Discourse + + ### Notatki dotyczące wydania - ### Dziennik zmian %{notes} flag_reasons: off_topic: "Twój wpis został oznaczony jako **nie na temat**: społeczność uważa, że nie pasuje do tematu, w którym został dodany, biorąc pod uwagę jego tytuł i treść pierwszego wpisu." diff --git a/config/locales/server.pt.yml b/config/locales/server.pt.yml index 5866c59e8bbcd..c57da681066e3 100644 --- a/config/locales/server.pt.yml +++ b/config/locales/server.pt.yml @@ -742,7 +742,9 @@ pt: flag: Tipo visits: title: "Visitas do Utilizador" - xaxis: "Dia" + xaxis: + desktop: "Desktop" + mobile: "Móvel" yaxis: "Número de visitas" signups: xaxis: "Dia" @@ -1196,7 +1198,6 @@ pt: max_daily_gravatar_crawls: "Número máximo de vezes que o Discourse irá verificar o Gravatar para avatars personalizados, por dia" enable_user_directory: "Forneça uma diretoria de utilizadores para navegação" anonymous_account_duration_minutes: "Para proteger o anonimato crie uma nova conta anónima a cada N minutos para cada utilizador. Exemplo: se configurado para 600, assim que passarem 600 minutos desde a última mensagem E o utilizador altere para anónimo, uma nova conta anónima é criada." - hide_user_profiles_from_public: "Desativar cartões de utilizador, perfis de utilizador e diretoria de utilizadores para utilizadores anónimos." max_notifications_per_user: "O número máximo de notificações por utilizador, se este número for excedido as notificações antigas serão eliminadas. Reforçado semanalmente. Defina como 0 para desativar" allowed_user_website_domains: "O ''site'' da Web do utilizador será verificado em relação a estes domínios." allow_profile_backgrounds: "Permitir que os utilizadores carreguem fundos de perfil." diff --git a/config/locales/server.pt_BR.yml b/config/locales/server.pt_BR.yml index 5240f1bacb4d0..01714fe9fd0d7 100644 --- a/config/locales/server.pt_BR.yml +++ b/config/locales/server.pt_BR.yml @@ -60,6 +60,8 @@ pt_BR: inline_oneboxer: topic_page_title_post_number: "#%{post_number}" topic_page_title_post_number_by_user: "#%{post_number} de %{username}" + too_many_urls: "Não é possível converter mais de 10 URLs em oneboxes inline numa única solicitação." + concurrency_not_allowed: "Não são permitidas solicitações simultâneas para converter URLs em oneboxes inline. Envie uma solicitação por vez." components: enabled_filter: "Ativado(a)" disabled_filter: "Desativado(a)" @@ -142,6 +144,8 @@ pt_BR: invalid_type: "%{type} não é um tipo válido" humanize_not_valid_string_value: "A propriedade no Ponteiro JSON \"%{property_json_pointer}\" deve ser uma string." not_valid_string_value: "deve ser uma string" + humanize_not_valid_datetime_value: "A propriedade no ponteiro JSON \"%{property_json_pointer}\" deve conter uma data e hora válidas." + not_valid_datetime_value: "deve ser conter uma data e hora válidas" humanize_not_valid_integer_value: "A propriedade no Ponteiro JSON \"%{property_json_pointer}\" deve ser um inteiro." not_valid_integer_value: "deve ser um inteiro" humanize_not_valid_float_value: "A propriedade no Ponteiro JSON \"%{property_json_pointer}\" deve ser do tipo flutuante." @@ -256,6 +260,7 @@ pt_BR: errors: &errors format: ! "%{attribute} %{message}" format_with_full_message: "%{attribute}: %{message}" + diff_too_complex: "O diff é muito complexo para ser computado com segurança. Por favor, tente fazer edições menores." messages: invalid_locale: "%{invalid_locale} não é uma localização válida" too_long_validation: @@ -275,6 +280,7 @@ pt_BR: greater_than: precisar ser maior que %{count} greater_than_or_equal_to: precisa ser maior ou igual a %{count} has_already_been_used: "já está sendo usado(a)" + in: deve estar em %{count} inclusion: não está incluso(a) na lista invalid: é inválido(a) is_invalid: "não faz muito sentido. É uma frase completa?" @@ -342,6 +348,7 @@ pt_BR: slow_down_crawler_user_agent_must_be_at_least_3_characters: "Agentes de usuário(a) devem ter pelo menos três caracteres para evitar limitação de taxa de usuários(as) legítimos(as) sem querer." slow_down_crawler_user_agent_cannot_be_popular_browsers: "Não é possível adicionar nenhum dos valores a seguir à configuração: %{values}." strip_image_metadata_cannot_be_disabled_if_composer_media_optimization_image_enabled: "Você não pode desativar a remoção de metadados de imagem se 'a imagem de otimização de mídia do compositor habilitada' estiver ativada. Desative a 'imagem de otimização de mídia do compositor ativada' antes de desativar a remoção dos metadados da imagem." + x_summary_large_image_no_svg: "Imagens de resumo do X usadas para metadados twitter:image não podem ser uma imagem .svg." tl0_and_anonymous_flag: "É preciso informar o \"site contact email\" ou \"email address to report illegal content\" para usuários(as) anônimos(as)." allow_likes_in_anonymous_mode_without_anonymous_mode_enabled: "Para usar esta configuração, ative a definição \"allow anonymous mode\" primeiro." conflicting_google_user_id: 'A ID da conta Google para esta conta foi alterada. A intervenção da equipe é necessária por razões de segurança. Entre em contato com a equipe e direcione para
https://meta.discourse.org/t/76575' @@ -391,6 +398,7 @@ pt_BR: redemption_count_less_than_max: "deve ser menor que %{max_redemptions_allowed}." email_xor_domain: "Campos de e-mail e domínio não são permitidos ao mesmo tempo" existing_user_success: "Link do convite resgatado com sucesso" + email_invites_disabled: "O envio de e-mails de convite foi desativado." bulk_invite: file_should_be_csv: "O arquivo atualizado deve ter o formato csv." max_rows: "Os primeiros %{max_bulk_invites} convites foram enviados. Tente dividir o arquivo em partes menores." @@ -593,6 +601,7 @@ pt_BR: other: "É possível contar no máximo %{count} domínios de e-mail por vez" no_invites_with_discourse_connect: "É possível convidar apenas usuários(as) registrados(as) quando o DiscourseConnect estiver ativado" no_invites_without_local_logins: "É possível convidar apenas usuários(as) registrados(as) quando entradas de conta em modo local estiver destivado" + update_existing_users_required: "Esta alteração afeta %{count} membros existentes do grupo. Você deve especificar o parâmetro 'update_existing_users' (true ou false) para indicar se as novas configurações padrão de notificação devem ser aplicadas aos membros existentes." default_names: everyone: "todos(as)" admins: "administração" @@ -791,6 +800,9 @@ pt_BR: email_already_used_in_group: "\"%{email}\" já é utilizado pelo grupo \"%{group_name}\"." email_already_used_in_category: "\"%{email}\" já é utilizado pela categoria \"%{category_name}\"." description_incomplete: "A postagem da descrição da categoria deve ter pelo menos um parágrafo." + description_too_long: + one: "A descrição é longa demais (deve ter no máximo %{count} caractere)." + other: "A descrição é longa demais (deve ter no máximo %{count} caracteres)." permission_conflict: "Qualquer grupo que tenha permissão para acessar uma subcategoria também deve ter permissão para acessar a categoria pai. Os grupos a seguir têm acesso a uma das subcategorias, mas não têm acesso à categoria pai: %{group_names}." disallowed_topic_tags: "Este tópico tem etiquetas não permitidas por esta categoria: \"%{tags}\"" disallowed_tags_generic: "Este tópico tem etiquetas não permitidas." @@ -1030,6 +1042,7 @@ pt_BR: too_many_drafts: title: "Excesso de rascunhos." description: "Você atingiu a quantidade máxima de rascunhos permitida. Exclua alguns [rascunhos](%{base_url}/my/activity/drafts) e tente novamente." + bulk_destroy_limit: "Você só pode excluir até %{limit} rascunhos por vez." draft_backup: pm_title: "Rascunhos de backup de tópicos em andamento" pm_body: "Tópico contendo rascunhos salvos" @@ -1133,6 +1146,9 @@ pt_BR: deny: "Cancelar" read: "ler" read_write: "ler/escrever" + logged_in_as: "Logado(a) como" + permissions_header: 'Isso permitirá que "%{application_name}":' + redirect_warning: "A autorização redirecionará você para" instructions: 'Acabamos de gerar uma nova chave de API de usuário(a) para você usar com "%{application_name}", cole a seguinte chave em seu aplicativo:' otp_description: 'Você gostaria de permitir que "%{application_name}" acesse este site?' otp_confirmation: @@ -1212,9 +1228,10 @@ pt_BR: description: "Lista de status dos sinalizadores, incluindo o tipo de sinalizador, autor(a) da postagem, criador(a) do sinalizador e hora da resolução." visits: title: "Acessos do(a) usuário(a)" - xaxis: "Dia" + xaxis: + desktop: "Desktop" + mobile: "Dispositivos móveis" yaxis: "Quantidade de acessos" - description: "Quantidade de acessos de usuários(as) que entraram com a conta" signups: title: "Cadastros" xaxis: "Dia" @@ -1257,6 +1274,8 @@ pt_BR: yaxis: "Dia" description: "Pedidos de API para chaves de API regulares e chaves de API do usuário." consolidated_page_views_browser_detection: + title: "Visualizações de página consolidadas com detecção de navegador (recomendado)" + title_legacy: "Visualizações de página consolidadas com detecção de navegador (recomendado)" xaxis: page_view_anon_browser: "Navegador anônimo" page_view_logged_in_browser: "Navegador de acesso" @@ -1276,10 +1295,8 @@ pt_BR: description: "Visualizações de página para usuários(as) que entraram com a conta, rastreadores conhecidos e outras formas de tráfego." description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "DAU/MAU" xaxis: "Dia" yaxis: "DAU/MAU" - description: "Quantidade de membros que entraram com a conta no último dia dividida pela quantidade de membros que entraram com a conta no último mês. Retorna uma % que indica a \"adesão\" à comunidade. Tente alcançar >20%." daily_engaged_users: title: "Usuários(as) envolvidos(as) diariamente" xaxis: "Dia" @@ -1559,10 +1576,20 @@ pt_BR: anon_views: Anônimo(a) total_views: Total description: "Os 100 tópicos mais visualizados em um intervalo de datas, combinados com visualizações anônimas e com acesso pela conta. É possível filtrar por categoria." + associated_accounts_by_provider: + title: "Contas associadas pelo método de login" + labels: + provider: Provedor de login + no_accounts: "Nenhuma conta associada" + discourse_connect: "SSO via Discourse Connect" + no_sso_accounts: "Contas sem um registro de SSO" + total_users: "Total de contas de usuários ativos" + description: "Mostra o número de contas associadas, agrupadas por provedor de login. Aplicável apenas quando os métodos de login social estiverem ativados." dashboard: problem: twitter_login: 'Parece que não é possível fazer login pelo X no momento. Confira seus dados nas configurações do site.' group_email_credentials: 'Houve um problema nas credenciais do e-mail do grupo %{group_full_name}. Nenhum e-mail será enviado a partir da caixa de entrada do grupo até este problema ser resolvido. %{error}' + upcoming_change_stable_opted_out: 'Seu site optou por não participar da próxima alteração "%{upcoming_change}". Essa alteração agora atingiu o status "Estável" e em breve será removida ou tornada permanente. Visite a página de próximas alterações para conhecer os detalhes sobre essa alteração.' rails_env: "Seu servidor está rodando no modo %{env}." host_names: "O arquivo config/database.yml está usando hostname do localhost padrão. Modifique para usar o hostname do seu site." sidekiq: 'O Sidekiq não está em execução. Muitas tarefas, como envio de e-mails, são executadas de forma assíncrona pelo Sidekiq. Verifique se pelo menos um processo sidekiq está em execução. Aprenda sobre Sidekiq aqui.' @@ -1583,6 +1610,7 @@ pt_BR: one: "A sondagem do e-mail gerou um erro nas últimas 24 horas. Consulte os registros para obter mais detalhes." other: "A sondagem do e-mail gerou %{count} erros nas últimas 24 horas. Consulte os registros para obter mais detalhes." missing_mailgun_api_key: "O servidor está configurado para enviar e-mails pelo Mailgun, mas você não informou a chave de API usada para verificar as mensagens do webhook." + qq_mail_smtp: "Seu servidor SMTP (%{smtp_address}) é conhecido por enviar e-mails duplicados com o Discourse. O QQ Mail não retorna confirmações adequadas, fazendo com que o Discourse tente reenviar mensagens que já foram entregues com sucesso. Veja alternativas recomendadas." bad_favicon_url: "O favicon está falhando ao carregar. Verifique sua configuração de favicon nas configurações do site ." poll_pop3_timeout: "A conexão com o servidor POP3 está atingindo o tempo limite. Verifique suas configurações de POP3 e selecione um provedor de serviço." poll_pop3_auth_error: "A conexão com o servidor POP3 está falhando com um erro de autenticação. Verifique suas configurações de POP3." @@ -1594,6 +1622,7 @@ pt_BR: category_style_deprecated: "Atualmente seu Discourse está usando um estilo de categoria obsoleto que será removido antes da versão beta final do Discourse 3.2. Consulte Movendo para uma configuraçao de site de estilo de categoria único para obter instruções de como manter o estilo de categoria selecionado." maxmind_db_configuration: 'O servidor foi configurado para usar os bancos de dados MaxMind para consultas reversas de IP. Entretanto, não foi configurado um ID de conta MaxMind, o que pode causar falhas no download dos bancos de dados MaxMind futuramente. Leia este guia para saber mais.' admin_sidebar_deprecation: "O layout antigo da administração foi preterido em benefício do novo layout de barra de ferramentas e será removido na próxima versão. Você pode configurar o layout da nova barra lateral antes disso." + starttls_disabled: "A configuração de e-mail de saída está com a opção STARTTLS desativada. Isso quase nunca é necessário. Considere remover a opção
DISCOURSE_SMTP_ENABLE_START_TLS=false
do seu ambiente. Consulte este tópico para mais informações." back_from_logster_text: "Voltar para o site" site_settings: allow_bulk_invite: "Permitir convites em massa com o uso de um arquivo CSV" @@ -1638,6 +1667,7 @@ pt_BR: allow_duplicate_topic_titles_category: "Permita tópicos com títulos duplicados e idênticos se a categoria for diferente. É preciso desativar allow_duplicate_topic_titles." unique_posts_mins: "Com quantos minutos de antecedência um(a) usuário(a) pode criar uma postagem com o mesmo conteúdo outra vez" educate_until_posts: "Quando o(a) usuário(a) começa a digitar suas primeiras (n) postagens novas, exiba o pop-up com o painel instrutivo do novo(a) usuário(a) no compositor." + title: "O nome deste site. Visível para todos os visitantes, inclusive usuários anônimos. Observe que a alteração deste título poderá enviar uma notificação aos usuários do PWA solicitando que atualizem ou desinstalem o aplicativo." site_description: "Descreva este site em uma frase. Visível para todos os visitantes, incluindo usuários anônimos." short_site_description: "Breve descrição em poucas palavras. Visível para todos os visitantes, incluindo usuários anônimos." contact_email: "Endereço de e-mail do contato principal responsável por este site. É usado para notificações críticas e também na página /about para assuntos urgentes. Visível para usuários anônimos em sites públicos." @@ -1645,6 +1675,7 @@ pt_BR: crawl_images: "Recupere imagens de URLs remotas para inserir as dimensões corretas de largura e altura." download_remote_images_to_local: "Converta imagens remotas (hotlinked) em locais baixando-as. Isso preserva o conteúdo mesmo que estas sejam removidas do site remoto no futuro." download_remote_images_threshold: "Espaço mínimo necessário em disco para baixar em modo local imagens remotas (em %)" + disabled_image_download_domains: "Imagens remotas hospedadas nestes domínios nunca serão baixadas." block_hotlinked_media: "Impedir que os usuários introduzam mídia remota (hotlinked) em suas publicações. A mídia remota que não for baixada via 'download_remote_images_to_local' será substituída por um link de espaço reservado." block_hotlinked_media_exceptions: "Uma lista de URLs de base, isentos da configuração block_hotlinked_media. Inclua o protocolo (por exemplo, https://example.com)." editing_grace_period: "Durante (n) segundos após a postagem, as edições não criarão uma nova versão no histórico da postagem." @@ -1680,9 +1711,12 @@ pt_BR: max_oneboxes_per_post: "Defina a quantidade máxima de Oneboxes que podem ser inclusos em uma única postagem. Oneboxes oferecem uma pré-visualização do conteúdo vinculado nela." facebook_app_access_token: "Um token gerado do seu segredo e ID do app Facebook. Usado para gerar Oneboxes do Instagram." github_onebox_access_tokens: "Mapeamento de uma organização do GitHub ou usuário(a) para um token de acesso do GitHub usado na geração de Oneboxes do GitHub para reposições privadas, confirmações, solicitações de pull, problemas e conteúdo de arquivos. Sem isso, apenas URLs públicas do GitHub URLs serão adicionadas ao Onebox." + reddit_onebox_client_id: "ID do cliente OAuth da API do Reddit usado para autenticação de contas Reddit OneBox. Crie um aplicativo do tipo \"script\" em reddit.com/prefs/apps para obter as credenciais." + reddit_onebox_client_secret: "Segredo do cliente OAuth da API do Reddit usado para autenticação de contas unidirecionais do Reddit. Encontrado no aplicativo do tipo 'script' criado em reddit.com/prefs/apps." logo: "A imagem do logotipo no canto superior à esquerda do seu site. Use uma imagem retangular larga com 120 de altura e proporção maior que 3:1. Se for deixada em branco, o texto do título do site será exibido." logo_small: "A pequena imagem do logotipo no canto superior à esquerda do site, exibida ao rolar para baixo. Use uma imagem quadrada de 120×120. Se for deixada em branco, um glifo de página inicial será exibido." digest_logo: "A imagem do logotipo alternativo usada na parte superior do resumo de e-mail do seu site. Use uma imagem retangular larga. Não use uma imagem SVG. Se for deixada em branco, a imagem da configuração \"logotipo\" será usada." + mobile_logo: "O logotipo usado na versão móvel do seu site. Recomendamos um ícone quadrado para evitar sobrecarregar o cabeçalho, mas você pode usar uma imagem retangular larga com altura de 120 pixels e proporção maior que 3:1. Se este campo for deixado em branco, será usada a imagem de configuração do logotipo." logo_dark: "Esquema escuro alternativo para a configuração do site \"logotipo\"." logo_small_dark: "Esquema escuro alternativo para a configuração do site \"logotipo pequeno\"." mobile_logo_dark: "Esquema escuro alternativo para a configuração do site \"logotipo para dispositivo móvel\"." @@ -1690,11 +1724,15 @@ pt_BR: manifest_icon: "Imagem usada como logotipo/splash no Android. Será redimensionada automaticamente para 512×512. Se for deixada em branco, large_icon será usado." manifest_screenshots: "Capturas de tela que mostram os recursos e funcionalidades da sua instância na sua página de alerta de instalação. Todas as imagens devem ser envios locais e devem ter as mesmas dimensões." favicon: "Um favicon para o seu site, consulte https://en.wikipedia.org/wiki/Favicon. Para funcionar corretamente em um CDN, precisa ser um png, que será redimensionado para 32x32. Se for deixado em branco, large_icon será usado." + apple_touch_icon: "Ícone usado para dispositivos Apple touch. Não é recomendado usar um fundo transparente. Será automaticamente redimensionado para 180x180. Se for deixado em branco, large_icon será usado." opengraph_image: "Imagem opengraph padrão, usada quando a página não tiver outra imagem adequada. Se for deixada em branco, large_icon será usado." x_summary_large_image: "Cartão do Twitter \"resumo de imagem grande\" (deve ter pelo menos 280 de largura e pelo menos 150 de altura, não pode ser .svg). Se for deixado em branco, os metadados comuns do cartão são gerados usando o opengraph_image, desde que também não sejam um .svg." notification_email: "O endereço de e-mail utilizado ao enviar e-mails do sistema. O domínio especificado deve ter registros SPF, DKIM e PTR devidamente configurados para que os e-mails funcionem corretamente." + email_custom_headers: "Uma lista de cabeçalhos de e-mail personalizados" email_subject: "Formato de assunto personalizável para e-mails padrão. Acesse https://meta.discourse.org/t/customizing-specific-system-email-templates/88323" detailed_404: "Fornece mais detalhes aos(às) usuários(as) sobre o motivo de não poderem acessar um tópico específico. Observação: isso não é tão seguro porque os(as) usuários(as) saberão se uma URL estiver vinculada a um tópico válido." + enforce_second_factor: "Exija que os(as) usuários(as) ativem autenticação de dois fatores (2FA) antes de acessarem a IU do Discourse. Esta configuração não afeta a autenticação por API ou 'DiscourseConnect provider'. Se `enforce_second_factor_on_external_auth` estiver ativado, os(as) usuários(as) não poderão fazer login com provedores de autenticação externos após a configuração da 2FA." + enforce_second_factor_on_external_auth: "Exija que os(as) usuários(as) ativem autenticação de dois fatores (2FA) todas as vezes. Quando ativada, esta funcionalidade impede o acesso com métodos de autenticação externos, como plugins de redes sociais, se houver 2FA ativada. Quando desativada, os(as) usuários(as) precisam apenas confirmar a 2FA ao acessarem com nome de usuário(a) e senha. Confira também a configuração `enforce_second_factor`." force_https: "Obrigue seu site a usar apenas HTTPS. AVISO: NÃO ative até ter verificado se o HTTPS está totalmente configurado e funcionando em todos os lugares! Você verificou se seu CDN, todas as entradas com conta de rede social e logotipos e dependências externas também são compatíveis com HTTPS?" summary_score_threshold: "A pontuação mínima requerida para uma postagem ser incluída em \"Resumir este tópico\" " summary_posts_required: "Quantidade mínima de postagens em um tópico antes de ativar \"Resumir este tópico\". As alterações desta configuração serão aplicadas de forma retroativa dentro de uma semana." @@ -1752,7 +1790,10 @@ pt_BR: ga_universal_domain_name: "O nome de domínio do Google Universal Analytics, por exemplo: mysite.com; consulte https://google.com/analytics" ga_universal_auto_link_domains: "Ative o monitoramento de domínio cruzado do Google Universal Analytics. Os links de saída para estes domínios conterão a ID de cliente. Consulte Guia de acompanhamento de vários domínios do Google." gtm_container_id: "A id de contêiner do Google Tag Manager, ex.: GTM-ABCD12E.
Observação: para usar o GTM quando a Política de Segurança de Conteúdo (CSP) estiver ativada, consulte a documentação na Meta: Use nonces em scripts do Google Tag Manager." + google_site_verification_token: Token de verificação do Google Search Console. Será incluído como uma meta tag no cabeçalho HTML. enable_escaped_fragments: "Voltar para a API do Google Ajax-Crawling se um webcrawler não for encontrado. Consulte https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" + moderators_manage_categories: "Permitir que moderadores criem e gerenciem categorias" + moderators_manage_groups: "Permitir que moderadores criem e gerenciem grupos." moderators_change_post_ownership: "Permitirem que moderadores(as) alterem a propriedade da postagem" cors_origins: "Origens permitidas para pedidos de origem cruzada (CORS). Cada origem deve incluir http:// ou https://. A variável de ambiente DISCOURSE_ENABLE_CORS deve ser definida como verdadeira para ativar CORS." use_admin_ip_allowlist: "Administradores(as) só podem entrar com a conta se estiverem na lista de IPs filtrados (Administração > Registros > IPs filtrados)." @@ -1764,6 +1805,7 @@ pt_BR: blocked_crawler_user_agents: "Palavra sem diferenciação de maiúsculas e minúsculas na linha do agente do(a) usuário(a) que identifica os rastreadores da web que não devem ter permissão para acessar o site. Não se aplica se a lista de permissões estiver definida." slow_down_crawler_user_agents: 'Agentes de usuário(a) de rastreadores da web que devem ter a taxa limitada conforme a configuração "reduzir taxa de rastreador". Cada valor dever ter pelo menos três caracteres.' slow_down_crawler_rate: "Se slow_down_crawler_user_agents for especificado, essa taxa será aplicada a todos os rastreadores (quantidade de segundos de atraso entre os pedidos)" + llms_txt: "Faça o upload de um arquivo de texto para ser disponibilizado em /llms.txt para os crawlers de LLM. Veja llmstxt.org para mais informações." content_security_policy: "Ative Política de Segurança de Conteúdo (CSP). A CSP é uma camada adicional de segurança que ajuda a impedir certos tipos de ataque, incluindo Cross Site Scripting (XSS) e injeção de dados." content_security_policy_report_only: "Ativar Content-Security-Policy-Report-Only (CSP)" content_security_policy_frame_ancestors: "Restrinja quem incorpora este site em iframes via CSP. Controle os hosts permitidos em Incorporação" @@ -1793,6 +1835,7 @@ pt_BR: top_page_default_timeframe: "O período padrão da página superior para usuários(as) anônimos(as) (ajustado automaticamente para usuários(as) que entraram com sua conta com base no último acesso)." moderators_view_emails: "Permitir que moderadores(as) visualizem endereços de e-mail." moderators_view_ips: "Permitir que a moderação visualize endereços de IP do(a) usuário(a)" + moderators_change_trust_levels: "Permitir que os moderadores alterem os níveis de confiança dos usuários." prioritize_username_in_ux: "Mostrar primeiro o nome de usuário(a) na página do(a) usuário(a), cartão de usuário(a) e postagens (ao desativar, o nome será mostrado primeiro)" enable_rich_text_paste: "Ative a conversão automática de HTML para Markdown ao colar texto no compositor." send_old_credential_reminder_days: "Lembrar credenciais antigas após dias" @@ -1803,6 +1846,8 @@ pt_BR: whispers_allowed_groups: "Permitir comunicação privada dentro de tópicos para membros de grupos especificados." hidden_post_visible_groups: "Permita que membros destes grupos visualizem postagens ocultas. Usuários(as) da equipe sempre podem ser postagens ocultas." allow_index_in_robots_txt: "Especifique no robots.txt que este site tem permissão para ser indexado por mecanismos de pesquisa da web. Você pode substituir seu robots.txt aqui. WARNING: regras configuradas incorretamente poderão impedir que seu site seja rastreado como o esperado." + blocked_email_domains: "Uma lista de domínios de e-mail onde os usuários não têm permissão para registrar contas. Subdomínios são automaticamente processados para os domínios especificados. Os símbolos-curinga `*` e `?` não são suportados. Exemplo: mailinator.com" + allowed_email_domains: "Uma lista de domínios de e-mail onde os usuários DEVEM registrar contas. Os subdomínios são tratados para os domínios específicos. Símbolos-curinga `*` e `?` não são permitidos. AVISO: usuários(as) com domínios de e-mail que não sejam os listados aqui não terão permissão de acesso!" normalize_emails: "Verifique se o e-mail normalizado é único. E-mails normalizados removem todos os pontos do nome do(a) usuário(a) e tudo entre os símbolos + e @." auto_approve_email_domains: "Usuários(as) com endereços de e-mail desta lista de domínios serão aprovados automaticamente. Subdomínios são tratados automaticamente para os domínios específicos. Os símbolos-curinga * e ? não são compatíveis." hide_email_address_taken: "Não informe ao(as) usuários(as) que uma conta existe com um determinado endereço de e-mail durante o cadastro ou processo de recuperação de senha. Exija o e-mail completo para solicitações de \"senha esquecida\"." @@ -1836,6 +1881,7 @@ pt_BR: auth_overrides_email: "Substitui o e-mail local pelo e-mail de algum site externo a cada vez que entrar com a conta, além de impedir alterações locais. Isso se aplica a todos os provedores de autenticação (AVISO: podem ocorrer diferenças devido à normalização de e-mails locais)" auth_overrides_username: "Substitui o nome do(a) usuário(a) local pelo nome do(a) usuário(a) de algum site externo a cada vez que entrar com a conta, além de impedir alterações locais. Isso se aplica a todos os provedores de autenticação (AVISO: podem ocorrer diferenças devido ao tamanho/requisitos do nome do(a) usuário(a))" auth_overrides_name: "Substitui o nome completo local pelo nome completo de algum site externo a cada vez que entrar com a conta, além de impedir alterações locais. Isso se aplica a todos os provedores de autenticação." + auth_overrides_avatar: "Substitui o avatar local pelo avatar do site externo a cada login e impede alterações locais. Aplica-se a todos os provedores de autenticação." discourse_connect_overrides_avatar: "Substitui o avatar do(a) usuário(a) pelo valor do conteúdo do DiscourseConnect. Se for ativado, os(as) usuários(as) não terão permissão para enviar avatares no Discourse." discourse_connect_overrides_location: "Substitui a localização do(a) usuário(a) pelo valor do conteúdo do DiscourseConnect e impede alterações locais." discourse_connect_overrides_website: "Substitui o site do(a) usuário(a) pelo valor do conteúdo do DiscourseConnect e impede alterações locais." @@ -1847,6 +1893,7 @@ pt_BR: enable_local_logins_via_email: "Permita que os(as) usuários(as) solicitem um link para entrar com um clique para ser enviado por e-mail." allow_new_registrations: "Permita cadastro de novos(as) usuários(as). Desmarque isso para evitar que qualquer pessoa crie uma nova conta." enable_signup_cta: "Exiba um aviso aos(as) usuários(as) anônimos(as) que voltaram ao solicitar que criem uma conta." + enable_discourse_id: "Ativar a autenticação pelo Discourse ID, um serviço de cadastro único que permite aos(às) usuários(as) fazer login em mais de um site do Discourse com uma única conta. As empresas mais conhecidas que permitem login com sua conta, como Google, Facebook, Apple e GitHub são suportadas sem precisar de configurações adicionais. Consulte a id.discourse.com para obter mais detalhes." enable_google_oauth2_logins: "Ative a autenticação do Google Oauth2. Este é o método de autenticação que atualmente é compatível com o Google. Requer chave e segredo. Consulte Configuração para entrar com a conta Google no Discourse." google_oauth2_client_id: "O ID de cliente único fornecido pelo seu aplicativo do Google, usado para o processo de autenticação." google_oauth2_client_secret: "Segredo de cliente do seu app Google." @@ -1915,6 +1962,7 @@ pt_BR: invite_link_max_redemptions_limit_users: "A quantidade máxima de resgates de links de convite gerados por usuário(a) não pode exceder este valor." alert_admins_if_errors_per_minute: "Quantidade de erros por minuto para acionar um alerta à administração. Um valor igual a 0 desativa esse recurso. OBSERVAÇÃO: requer reinicialização." alert_admins_if_errors_per_hour: "Quantidade de erros por hora para acionar um alerta à administração. Um valor igual a 0 desativa esse recurso. OBSERVAÇÃO: requer reinicialização." + categories_topics: 'Número de tópicos a serem exibidos na página `/categories`. Se zero, um valor será automaticamente definido para manter as duas colunas simétricas. Relevante apenas para "categorias e tópicos mais recentes ou principais" estilos de página de categoria.' suggested_topics: "Quantidade de tópicos sugeridos exibidos no final de um tópico." limit_suggested_to_category: "Exiba apenas tópicos da categoria atual nos tópicos sugeridos." suggested_topics_max_days_old: "Tópicos sugeridos não devem ter mais de n dia(s)." @@ -1941,6 +1989,7 @@ pt_BR: selectable_avatars_mode: "Permitir que os usuários selecionem um avatar da lista selectable_avatars e limitem os envios de avatares personalizados ao nível de confiança selecionado." selectable_avatars: "Especifique uma coleção de avatares na qual os(as) usuários(as) podem selecionar a imagem do perfil. A imagem escolhida será exibida durante a criação do perfil do(a) usuário(a) ou ao atualizar o avatar do perfil." allow_all_attachments_for_group_messages: "Permitir todos os anexos de e-mail para mensagens de grupo." + image_quality: "Definir o nível de qualidade para as imagens carregadas no seu site. Uma qualidade inferior resultará em arquivos menores." png_to_jpg_quality: "Qualidade do arquivo JPG convertido (1 é a qualidade mais baixa, 99 é a melhor qualidade, 100 para desativar)." recompress_original_jpg_quality: "Qualidade dos arquivos de imagem carregados (1 é a qualidade mais baixa, 99 é a melhor, 100 desativa)." image_preview_jpg_quality: "Qualidade dos arquivos de imagem redimensionados (1 é a qualidade mais baixa, 99 é a melhor, 100 desativa)." @@ -1954,6 +2003,7 @@ pt_BR: video_conversion_enabled: "Ative a conversão de vídeo para arquivos de vídeo enviados. Assim os vídeos poderão ser convertidos em formatos compatíveis com a web." video_conversion_service: "O serviço de conversão de vídeo a ser usado para processamento de vídeos enviados." mediaconvert_role_arn: "Função ARN da AWS IAM para o serviço do MediaConvert. Obrigatório ao usar o AWS MediaConvert para conversão de vídeo." + mediaconvert_output_subdirectory: "Subdiretório no bucket S3 onde o MediaConvert gravará temporariamente os vídeos convertidos antes de serem movidos para o local de upload final." min_ratio_to_crop: "Taxa usada para cortar imagens altas. Digite o resultado da largura/altura." simultaneous_uploads: "Quantidade máxima de arquivos que podem ser arrastados e soltos no compositor" default_invitee_trust_level: "Nível de confiança (0-4) padrão para usuários(as) convidados(as)." @@ -2066,9 +2116,12 @@ pt_BR: num_flaggers_to_close_topic: "Quantidade mínima de usuários(as) sinalizadores únicos(as) exigidos para que um tópico seja automaticamente pausado por intervenção" num_hours_to_close_topic: "Quantidade de horas para pausar um tópico para intervenção." auto_respond_to_flag_actions: "Ative resposta automática ao remover sinalizador." + min_first_post_typing_time: "Quantidade mínima de tempo que o(a) usuário(a) deve passar digitando durante a primeira postagem. Se o limite não for atingido, a postagem entrará automaticamente na fila de aprovação necessária. Defina como 0 para desativar (não recomendado)" + fast_typing_threshold: "Tempo mínimo que o(a) usuário(a) tem para escrever sua primeira postagem. Se o limite não for cumprido, a postagem entrará automaticamente na fila de revisão. Baixo é 1 segundo, o padrão são 3 segundos e alto são 5 segundos." auto_silence_fast_typers_on_first_post: "Silenciar automaticamente usuários(as) que não atenderem ao \"limite de digitação rápida\"" auto_silence_fast_typers_max_trust_level: "Nível máximo de confiança para silenciar automaticamente usuários(as) que digitam rápido" auto_silence_first_post_regex: "Regex sem diferenciação de maiúsculas ou minúsculas que, caso em caso de aprovação, farão que a primeira postagem de um(a) usuário(a) seja silenciada e enviada para a fila de aprovação. Por exemplo: raging|a[bc]a silenciará todas as postagens contendo raging ou aba, ou aca, imediatamente. Isso se aplica apenas à primeira postagem. PRETERIDO: use Silenciar palavras acompanhadas." + moderator_guide_topic: "O tópico que descreve como você modera sua comunidade. O link ficará visível na fila de revisão para moderadores e administradores." reviewable_claiming: "O conteúdo revisável precisa ser reivindicado antes que possa ser aplicado?" reviewable_default_topics: "Mostrar conteúdo revisável agrupado por tópico por padrão" reviewable_default_visibility: "Não mostrar itens revisáveis, a menos que atendam a esta prioridade" @@ -2077,11 +2130,14 @@ pt_BR: allow_all_users_to_flag_illegal_content: "Usuários(as) anônimos(as) verão informações que eles precisam enviar por e-mail à administração para denunciar conteúdo ilegal. Esta configuração tem precedência sobre \"flag post allowed groups\"." email_address_to_report_illegal_content: "Se ficar em branco, será usado o e-mail padrão da administração do site." cooldown_hours_until_reflag: "Quantidade de tempo que os(as) usuários(as) terão que aguardar até poderem sinalizar postagem outra vez" + slow_mode_prevents_editing: "O 'Modo Lento' impede a edição após o 'editing grace period'?" reply_by_email_enabled: "Ative o recurso que permite aos(às) usuários(as) responderem a tópicos direto por e-mail, em vez de exigir que acessem o site com a conta. Confira o guia no Meta para obter mais informações." reply_by_email_address: "Modelo de resposta por e-mail, por exemplo: %%{reply_key}@reply.example.com or replies+%%{reply_key}@example.com" alternative_reply_by_email_addresses: "Lista de modelos alternativos para responder por e-mail a endereços de e-mail recebidos. Por exemplo:%%{reply_key}@reply.example.com|replies+%%{reply_key}@example.com" incoming_email_prefer_html: "Use HTML em vez de texto para e-mail recebido." strip_incoming_email_lines: "Remova os espaços em branco iniciais e finais de cada linha de e-mails recebidos." + disable_emails: "Evita que o Discourse envie qualquer tipo de e-mail. Selecione 'yes' para desativar os e-mails de saída de todos(as) os(as) usuários(as). Selecione 'non-staff' para desativar os e-mails apenas para usuários(as) que não fizerem parte da equipe." + allow_email_invites: "Quando desativada, essa opção impedirá que os usuários enviem e-mails de convite pelo Discourse." strip_images_from_short_emails: "Tirar imagens de e-mails cujo tamanho seja menor que 2.800 bytes" short_email_length: "Defina o tamanho máximo, em bytes, para que um e-mail seja classificado como \"curto\" para compactação de imagem. Se o tamanho do e-mail não exceder esta configuração, as imagens no e-mail (como avatar e emojis) serão removidas." display_name_on_email_from: "Exibir nomes completos no e-mail dos campos" @@ -2142,6 +2198,7 @@ pt_BR: relative_date_duration: "Quantidade de dias após postar em que as datas de postagem serão exibidas como relativas (7 d) em vez de absolutas (20 de fev.)." delete_user_max_post_age: "Não permitir a exclusão de usuários(as) cuja primeira postagem seja mais antiga do que (x) dias." delete_all_posts_max: "Quantidade máxima de postagens que podem ser excluídas de uma vez com o botão Remover todas as postages. Se um(a) usuário(a) tiver mais postagens do que essa quantidade, elas não poderão ser excluídas(as) de uma vez e o(a) usuário(a) não poderá ser excluído(a)." + delete_all_posts_background_threshold: "O número máximo de postagens que podem ser excluídas de uma só vez com o botão \"Excluir todas as postagens\" antes que a exclusão seja processada em segundo plano." delete_user_self_max_post_count: "A quantidade máxima de postagens que um(a) usuário(a) pode ter ao permitir a exclusão da conta de autoatendimento. Defina como 1 para desativar a exclusão da conta do serviço." username_change_period: "A quantidade máxima de dias após o registro em que as contas podem alterar seu nome do(a) usuário(a) (0 para não permitir a mudança de nome do(a) usuário(a))." email_editable: "Permita que os(as) usuários(as) alterem o seu endereço de e-mail após o cadastro." @@ -2170,14 +2227,17 @@ pt_BR: enable_category_group_moderation: "Permitir que grupos moderem conteúdo em categorias específicas" group_in_subject: "Definir %%{optional_pm} no assunto do e-mail como o nome do primeiro grupo em PM, consulte: Personalizar formato de assunto para e-mails padrão" allow_anonymous_mode: "Ative esta opção para os(as) usuários(as) trocarem para o modo anônimo para postagem. Após a ativação, eles(as) podem escolher ocultar suas identidades ao criar postagens ou tópicos através do site. Consulte também \"allow anonymous likes\"." + allow_likes_in_anonymous_mode: "Ative esta configuração para permitir que os(as) usuários(as) que estiverem navegando no seu site de forma anônima curtam as postagens. Após a ativação, os(as) usuários(as) podem escolher ocultar suas identidades ao curtir postagens ou tópicos através do site. Esta configuração requer que a opção `allow anonymous mode` esteja ativada." + anonymous_posting_allowed_groups: "Grupos que podem ativar postagens anônimas. Essa configuração requer que a opção `allow anonymous mode` esteja ativada." anonymous_account_duration_minutes: "Para proteger o anonimato, crie uma conta anônima a cada N minutos para cada usuário(a). Exemplo: se for configurado para 600, assim que passar 600 minutos a partir da última postagen E o(a) usuário(a) trocar para anônimo(a), uma nova conta anônima será criada." - hide_user_profiles_from_public: "Desative cartões de usuário(a), perfis de usuário(a) e diretório do(a) usuário(a) para usuários(as) anônimos(as)." hide_new_user_profiles: "Ocultar perfis de usuário(a) de nível de confiança 1 ou menor e confiar em usuários(as) de nível 1 até postarem pela primeira vez. Este recurso é desabilitado obrigatoriamente em caso de must_approve_users e invite_only sites." allow_users_to_hide_profile: "Permitir que usuários ocultem seu perfil e presença" hide_user_activity_tab: "Oculte a aba de atividades nos perfis de usuários(as), exceto para o(a) Administrador(a) e você mesmo(a)." delete_associated_accounts_on_password_reset: "Exclua a conta associada ao(à) usuário(a) quando este(a) alterar a senha." allow_featured_topic_on_user_profiles: "Permitir que usuários apresentem o link de um tópico em seu cartão de usuário(a) e perfil." show_inactive_accounts: "Permitir que usuários(as) conectados(as) naveguem em perfis de contas inativas." + hide_silencing_reasons: "Não exibir razões de silenciamento publicamente nos perfis de usuário." + hide_suspension_reasons: "Não exibir razões de suspensão publicamente nos perfis de usuário." log_personal_messages_views: "Registre visualizações de mensagens pessoais do(a) administrador(a) para outros(as) usuários(as)/grupos." ignored_users_count_message_threshold: "Notifique moderadores(as) se um(a) usuário(a) específico(a) for ignorado(a) por muitos(as) outros(as) usuários(as)." ignored_users_message_gap_days: "Quanto tempo esperar antes de notificar novamente moderadores(as) sobre um(a) usuário(a) que foi ignorado(a) por muitos(as) outros(as)." @@ -2185,11 +2245,13 @@ pt_BR: clean_up_unused_staged_users_after_days: "Quantidade de dias antes de um(a) usuário(a) encenado(a) não usado(a) (sem nenhuma postagem) ser removido(a). Para desativar a limpeza, defina para 0." user_selected_primary_groups: "Permitir que os(as) usuários(as) definam seu próprio grupo primário" max_notifications_per_user: "Quantidade máxima de notificações por usuário(a). Se esse número for excedido, as notificações antigas serão excluídas. Aplicado semanalmente." + allowed_user_website_domains: "O site do(a) usuário(a) será verificado em comparação a estes domínios." allow_profile_backgrounds: "Permita que os(as) usuários(as) enviem planos de fundo do perfil." get_a_room_threshold: "Quantidade de postagens que um(a) usuário(a) precisa fazer para a mesma pessoa no mesmo tópico antes de ser avisado(a)." dont_feed_the_trolls_threshold: "Número de sinalizadores de outros(as) usuários(as) antes de serem avisados(as)." enable_mobile_theme: "Os dispositivos móveis usam um tema compatível com dispositivos móveis, com a possibilidade de mudar para o site completo. Desative isso se quiser usar um estilo personalizado totalmente responsivo." dominating_topic_minimum_percent: "Percentual de postagens que um(a) usuário(a) precisa fazer em um tópico antes de ser relembrado(a) de ser excessivamente dominante em um tópico." + pm_warn_user_last_seen_months_ago: "Ao criar uma nova mensagem privada, avise aos usuários quando o destinatário de destino não foi visto há mais de n meses." suppress_uncategorized_badge: "Não exiba o emblema para assuntos não categorizados em listas de tópicos." header_dropdown_category_count: "Quantidade de categorias que podem ser exibidas no menu suspenso do cabeçalho." permalink_normalizations: "Aplique o seguinte regex antes de combinar permalinks, por exemplo: /(topic.*)\\?.*/\\1 irá retirar as linhas de consulta das rotas de tópicos. O formato é regex + string use \\ 1 etc. para acessar capturas" @@ -2263,6 +2325,7 @@ pt_BR: disable_watched_word_checking_in_user_fields: "desabilitar verificação de palavras monitoradas nos campos de usuário(a)" watched_words_regular_expressions: "Permite o uso de expressões regulares para filtrar palavras. Após a ativação, este recurso agrupa palavras sensíveis com distinção entre maiúsculas e minúsculas. Em seguida, compila todas as palavras selecionadas e forma uma única expressão regular, adicionando limites de palavra para as palavras monitoradas mais comuns. Consequentemente, este método de filtragem baseado em expressões regulares adiciona uma camada extra de controle sobre a moderação do conteúdo através da compatibilidade com padrões de palavras mais sofisticados. Com esta configuração, também é possível substituir facilmente o texto original pela opção escolhida." enable_fast_edit: "Adiciona um botão ao menu de seleção de postagem para editar um pequeno conteúdo embutido de seleção." + old_post_notice_days: "O número de dias após os quais os avisos de usuários novos e recorrentes serão ocultados. O aviso oficial da postagem permanecerá sempre visível." new_user_notice_tl: "Nível de confiança mínimo necessário para ver novos avisos de postagem do(a) usuário(a)." returning_user_notice_tl: "Nível de confiança mínimo necessário para ver os avisos de postagem do(a) usuário(a) retornando." returning_users_days: "Quantos dias devem passar antes que um(a) usuário(a) seja considerado(a) retornando." @@ -2344,6 +2407,7 @@ pt_BR: force_lowercase_tags: "Obrigar todas as novas etiquetas a ficar totalmente em minúsculas." create_post_for_category_and_tag_changes: "Criar postagem de sussurro quando a categoria ou etiquetas do tópico for alterada. É preciso ativar as publicações de sussurros." automatically_clean_unused_tags: "Exclua automaticamente etiquetas que não estão sendo utilizadas em tópicos ou mensagens pessoais todos os dias." + default_watched_precedence_over_muted: "Notificar os usuários sobre tópicos em categorias ou tags que eles estão acompanhando e que também pertencem a um tópico que eles silenciaram" company_name: "O nome da sua empresa ou organização. Se ficar vazio, não serão fornecidos Termos de Serviço nem Aviso de Privacidade clichês." governing_law: "Especifique a jurisdição que rege os aspectos legais do site, inclusive os Termos de Serviço e a Política de Privacidade. Geralmente é o país onde a empresa que opera o site está registrada ou faz negócios" city_for_disputes: "Especifique a cidade que será usada como jurisdição para a resolução de disputas relacionadas ao uso deste fórum. Geralmente essa informação está inclusa nos documentos legais, como os Termos de Serviço do fórum." @@ -2359,9 +2423,11 @@ pt_BR: sitemap_page_size: "Número de URLs a serem incluídas em cada página de mapa do site. Máx: 50.000" enable_user_status: "Permita que usuários(as) definam uma mensagem de status personalizada (emoji + descrição)." enable_user_tips: "Ativar novas dicas de usuário que descrevem os principais recursos para os(as) usuários(as)" + short_title: "O título curto será usado na tela inicial do usuário, no iniciador de aplicativos ou em outros locais onde o espaço seja limitado. Ele deve ter no máximo 12 caracteres. Observe que alterar este título pode enviar uma mensagem aos usuários do PWA solicitando que atualizem ou desinstalem o aplicativo." dashboard_hidden_reports: "Permita que relatórios específicos sejam ocultos no painel de controle." dashboard_visible_tabs: "Escolha quais abas do painel de controle estão visíveis." dashboard_general_tab_activity_metrics: "Escolha relatórios para serem exibidos como métricas de atividade na aba geral." + gravatar_enabled: "Usar o serviço Gravatar para os avatares dos(as) usuários(as). Desativar impede que os(as) usuários(as) troquem para o Gravatar para obter seus avatares, mas não afeta os(as) usuários(as) que já o usam." gravatar_name: "Especifique o nome do provedor de serviço do Gravatar. Geralmente, o nome é usado para identificar a origem dos avatares do Gravatar no site." gravatar_base_url: "Especifique a URL para acessar a API do provedor do Gravatar. Esta configuração é fundamental para converter endereços de e-mail em URLs do Gravatar onde as imagens de avatares estão armazenadas." gravatar_login_url: "URL relacionada a \"gravatar_base_url\", que permite ao(à) usuário(a) entrar com a conta no serviço Gravatar." @@ -2374,18 +2440,24 @@ pt_BR: suggest_weekends_in_date_pickers: "Inclua fins de semana (sábado e domingo) nas sugestões do seletor de datas (desative isso se você usar o Discourse apenas durante a semana, de segunda a sexta)." show_bottom_topic_map: "Mostra o mapa de tópico na parte inferior do tópico quando tiver pelo menos dez respostas." show_topic_map_in_topics_without_replies: "Mostra o mapa de tópico mesmo se o tópico não tiver nenhuma resposta." + enable_site_owner_onboarding: "Mostra um painel na página inicial para novos administradores, ajudando-os a começar. Reative essa configuração para visualizar novamente as etapas de integração." enable_welcome_banner: "Exiba um banner nas páginas da sua lista de tópicos principais para receber os membros e permitir que eles pesquisem conteúdo no site" welcome_banner_image: "Defina uma imagem para exibir no plano de fundo do banner de boas-vindas." welcome_banner_location: "Determina em que local da página o banner de boas-vindas será exibido." welcome_banner_page_visibility: "Determina em quais páginas o banner de boas-vindas será exibido." + welcome_banner_text_color: "Após configurar a opção 'Welcome banner image', utilize esta configuração para alterar a cor do texto do banner e garantir que ele permaneça legível. Se o campo estiver em branco ou se nenhuma imagem tiver sido carregada, a cor será definida pelo tema ativo." splash_screen: "Exibe uma tela de carregamento temporária enquanto os ativos do site são carregados" + splash_screen_image: "Uma imagem SVG para exibir na tela inicial enquanto o site carrega. SVGs animados devem usar apenas animações criadas com transformações CSS ou opacidade. Use nomes exclusivos para classes CSS e keyframes. Você pode usar var(--primary), var(--secondary) e var(--tertiary) para referenciar cores do tema." navigation_menu: "Especifique a barra lateral ou menu suspenso do cabeçalho como o menu principal de navegação do seu site. É recomendável a barra lateral." default_navigation_menu_categories: "As categorias selecionadas serão exibidas abaixo da seção de Categorias do Menu de Navegação por padrão." default_navigation_menu_tags: "As etiquetas selecionadas serão exibidas na seção Etiquetas do Menu de Navegação por padrão." experimental_new_new_view_groups: 'Ative uma nova lista de tópicos que combina tópicos novos e não lidos e faz o link "Tudo", localizado na barra lateral, apontar para ela.' + enable_form_templates: "Ativar o recurso de modelos de formulário. Com ele, você pode impor um formulário estruturado com validação de dados como parte do fluxo de criação de tópicos." show_preview_for_form_templates: "Ativar a pré-visualização para o recurso de modelos de formulário" lazy_load_categories_groups: "Carregue informações de forma ociosa apenas para os(as) usuários(as) destes grupos. Melhora o desempenho em sites com várias categorias." enable_auto_grid_images: "Envolve automaticamente as imagens em tags [grid] quando três ou mais imagens são carregadas no compositor." + impersonate_without_logout: "Permitir que administradores possam personificar um usuário sem precisar sair de sua conta de administrador." + experimental_impersonation_time_limit_minutes: "Quanto tempo leva para uma sessão de personificação ser encerrada automaticamente?" page_loading_indicator: "Configure o indicador de carregamento mostrado durante as navegações da página no Discourse. O \"Controle giratório\" é um indicador de página completo. O \"Controle deslizante\" mostra uma barra estreita no topo da tela." show_user_menu_avatars: "Mostrar avatadores de usuário(a) no menu do(a) usuário(a)" about_page_hidden_groups: "Não mostre membros de grupos específicos na página /about." @@ -2398,14 +2470,32 @@ pt_BR: rich_editor: "Ative o editor de rich text para o compositor, assim todos(as) usuários(as) poderão alternar entre o modo Markdown atual e o novo editor de rich text para tornar a composição mais intuitiva e amigável." default_composition_mode: "Defina o modo padrão para o compositor da sua comunidade. O modo rich text proporciona uma experiência de escrita mais moderna e familiar para a maioria dos(as) usuários(as), já o modo Markdown pode ser apropriado para públicos mais avançados. Os membros poderão usar um botão de alternância na barra de ferramentas do compositor para alternar entre os modos." reviewable_ui_refresh: "Grupos que podem usar a nova IU experimental na fila de revisão." + viewport_based_mobile_mode: "Usar a largura da viewport para determinar os modos mobile/desktop. Essa configuração será removida em breve. Se você precisar desativá-la, avise-nos no Meta." content_localization_enabled: "Exibe o conteúdo localizado para os(as) usuários(as) com base no navegador ou nas preferências de idioma deles(as). Esse conteúdo pode incluir categorias, etiquetas, postagens e tópicos. Os locais compatíveis estão definidos em \"locais compatíveis com localização de conteúdo\"." + content_localization_supported_locales: "Lista de idiomas compatíveis para os quais o conteúdo do(a) usuário(a) pode ser traduzido. O idioma padrão do site está sempre incluído. Requer 'content localization enabled'." content_localization_allowed_groups: "Grupos com permissão para enviar conteúdo localizado. Requer \"content localization enabled\"." + content_localization_language_switcher: "Mostrar um seletor de idioma no cabeçalho para que os visitantes possam alternar entre as versões traduzidas do Discourse e do conteúdo fornecido pelo(a) usuário(a). Usa idiomas definidos em \"content localization supported locales\"." + content_localization_crawler_param: "Servir conteúdo traduzido para web crawlers quando os parâmetros 'content localization enabled' e 'set locale from param' estiverem habilitados. A lista de idiomas compatíveis está definida em 'content localization supported locales'." + content_localization_use_default_locale_when_unsupported: "Servir conteúdo traduzido no idioma padrão do site para usuários cujo idioma preferido não esteja listado em 'content localization supported locales'." + content_localization_allow_author_localization: "Permitir que os autores atualizem a localização de seus próprios tópicos e postagens por meio do menu da postagem." + fake_upcoming_change: "Esta é uma alteração prevista fictícia para fins de teste. Não é necessário traduzir esta string." + floating_dismiss_topics_on_mobile: "Exibe um botão flutuante \"Fechar...\" na lista de tópicos em dispositivos móveis para facilitar o acesso e liberar espaço na parte superior da lista." + rename_faq_to_guidelines: "Esta alteração renomeia a página de perguntas frequentes para \"Diretrizes\". A página de perguntas frequentes continuará disponível em `/faq`. A configuração \"URL da FAQ\" funciona como antes." + experimental_tag_settings_page: "Ativar uma página de configurações dedicada para tags em /tag/:slug/:id/edit." + enable_simplified_category_creation: "Ativa um fluxo de criação de categorias simplificado, com menos opções e uma interface mais limpa." + enable_custom_splash_screen: "Permite personalizar a tela de carregamento com sua própria imagem SVG. Faça o upload de uma imagem através da configuração 'splash screen image'. Aviso: Isso pode afetar negativamente as pontuações do LCP e a indexação do Google." + modernize_foundation_theme: "Essa alteração introduz modificações de design ao tema Foundation no Discourse." + reporting_improvements: "Melhorias na navegação, design e usabilidade dos relatórios administrativos do Discourse." errors: invalid_css_color: "Cor inválida. Digite o nome da cor ou valor hexadecimal." + invalid_datetime: "Formato de data e hora inválido. Certifique-se de ter inserido uma data e hora válidas." invalid_email: "Endereço de e-mail inválido" invalid_username: "Não há nenhum(a) usuário(a) com este nome de usuário(a)." valid_username: "Há um(a) usuário(a) com este nome de usuário(a)." invalid_group: "Não há nenhum grupo com este nome." + invalid_svg: "A imagem SVG é inválida. Ela deve conter um elemento SVG e nenhum script ou manipulador de eventos." + invalid_upload: "O arquivo carregado é inválido ou não existe." + invalid_topic: "Não há nenhum tópico com este ID." invalid_integer_min_max: "O valor deve estar entre %{min} e %{max}." invalid_integer_min: "O valor deve ser %{min} ou maior." invalid_integer_max: "O valor não pode ser maior que %{max}." @@ -2442,6 +2532,12 @@ pt_BR: reply_by_email_disabled: "Você deve ativar \"responder por e-mail\" antes de ativar esta configuração primeiro." discourse_connect_url_is_empty: "É preciso definir uma \"url de conexão do Discourse\" antes de ativar esta configuração." enable_local_logins_disabled: "Você deve ativar \"ativar entradas com e-mail em modo local\" antes de ativar esta configuração." + min_username_length_exists: "Não é possível definir 'min username length' com um número maior que o comprimento do nome do(a) usuário(a) mais curto (%{username})." + min_group_name_length_exists: "Não é possível definir 'min username length' com um número maior que o comprimento do nome do grupo mais longo (%{group_name})." + min_username_length_range: "Não é possível definir 'max username length' com um valor menor que definido em 'min username length'." + max_username_length_exists: "Não é possível definir 'max username length' com um número menor que o comprimento do nome do(a) usuário(a) mais longo (%{username})." + max_group_name_length_exists: "Não é possível definir 'max username length' com um número menor que o comprimento do nome do grupo mais longo (%{group_name})." + max_username_length_range: "Não é possível definir 'max username length' menor que 'min username length'." invalid_hex_value: "Os valores de cor precisam ser códigos hexadecimais de seis dígitos." empty_selectable_avatars: "É preciso enviar pelo menos dois avatares selecionáveis antes de ativar esta configuração." category_search_priority: @@ -2456,6 +2552,7 @@ pt_BR: other: "A lista deve conter exatamente %{count} valores." markdown_linkify_tlds: "Você não pode incluir um valor de '*'." google_oauth2_hd_groups: "Você deve configurar \"google oauth2 hd\" antes de ativar esta configuração." + discourse_id_registration: "Não foi possível registrar-se automaticamente com o ID do Discourse. Isso pode ser devido a problemas de conectividade de rede, restrições de firewall ou, porque o serviço de Discourse ID está inaccessível. Verifique os logs do servidor para mais informações ou entre em contato com o suporte." linkedin_oidc_credentials: "Você deve configurar as credenciais do LinkedIn OIDC ('linkedin_oidc_client_id' and 'linkedin_oidc_client_secret') antes de habilitar esta configuração." search_tokenize_chinese_enabled: "Você deve desativar o 'search_tokenize_chinese' antes de ativar esta configuração." search_tokenize_japanese_enabled: "Você deve desativar o 'search_tokenize_japanese' antes de ativar esta configuração." @@ -2464,7 +2561,9 @@ pt_BR: invalid_uncategorized_category_setting: 'A categoria "Não categorizado" não pode ser selecionada se "permitir tópicos não categorizados" não estiver ativado.' invalid_search_ranking_weights: "O valor é inválido para a configuração do site search_ranking_weights. Exemplo: '{0.1,0.2,0.3,1.0}'. Observe que o valor máximo para cada peso é 1,0." content_localization_locale_limit: "A quantidade de locais compatíveis não pode exceder %{max}." + content_localization_language_switcher_requirements: "O seletor de idiomas requer que as configurações do site 'set locale from cookie' e 'allow user locale' estejam ativadas e que 'content localization supported locales' inclua pelo menos um idioma." mediaconvert_role_arn_required: "A função ARN da AWS IAM é obrigatória ao usar o AWS MediaConvert para a conversão de vídeo." + mediaconvert_output_subdirectory_required: "O MediaConvert output subdirectory é obrigatório." s3_credentials_required_for_video_conversion: "As credenciais S3 são obrigatórias para a conversão de vídeo. Configure as chaves de acesso S3 ou ative o perfil IAM." keywords: clean_up_inactive_users_after_days: "desativados(as)|inativos(as)|não ativados(as)" @@ -2488,6 +2587,7 @@ pt_BR: filter: description: status: "Filtrar tópicos por status" + in: "Filtrar tópicos em listas pessoais" order: "Classificar tópicos por campo específico" category: "Exibir tópicos em uma categoria específica" category_any: "Exibir tópicos em qualquer uma das categorias especificadas (separadas por vírgula)" @@ -2506,6 +2606,9 @@ pt_BR: activity_after: "Exibir tópicos com atividade mais recente depois de uma data (DD-MM-AAAA ou dias atrás)" created_before: "Exibir tópicos criados antes de uma data (DD-MM-AAAA ou dias atrás)" created_after: "Exibir tópicos criados após uma data (DD-MM-AAAA ou dias atrás)" + created_by: "Exibir tópicos criados por usuário(a) ou grupo específico" + created_by_user: "Exibir tópicos criados por nome de usuário ou grupo (sem @)" + created_by_multiple: "Exibir tópicos criados por qualquer um(a) dos(as) usuários(as) ou grupos especificados(as) (separados por vírgula)" latest_post_before: "Exibir tópicos com postagem mais recente antes de uma data (DD-MM-AAAA ou dias atrás)" latest_post_after: "Exibir tópicos com a postagem mais recente após a data (DD-MM-AAAA ou dias atrás)" likes_min: "Exibir tópicos com pelo menos esta quantidade de curtidas" @@ -2535,6 +2638,7 @@ pt_BR: in_new: "Mostrar tópicos que são novos ou têm respostas novas" in_new_replies: "Mostrar tópicos com respostas novas" in_new_topics: "Mostrar tópicos novos" + in_unseen: "Mostrar tópicos que você ainda não viu." order_activity: "Classificar pela última atividade (mais recente primeiro)" order_activity_asc: "Classificar pela última atividade (mais antiga primeiro)" order_category: "Classificar por nome de categoria (Z-A)" @@ -2555,6 +2659,18 @@ pt_BR: order_views_asc: "Classificar por contagem de visualizações (de menor para maior)" order_read: "Classificar por momento da última leitura (mais recente primeiro)" order_read_asc: "Classificar por momento da última leitura (mais antiga primeiro)" + order_hot: "Classificar por hot score (ordem descendente)" + order_hot_asc: "Classificar por hot score (ordem ascendente)" + users: "Filtrar tópicos por participantes" + users_any: "Exibir tópicos com qualquer um dos usuários especificados (separados por vírgula)" + users_all: "Exibir tópicos com todos os usuários especificados (separados por sinal de mais)" + exclude_users: "Excluir tópicos com determinados(as) usuários(as)." + group: "Filtrar tópicos por grupos" + groups_any: "Exibir tópicos com qualquer uma das tags especificadas (separadas por vírgula)" + groups_all: "Exibir tópicos com todos os grupos especificados (separados por sinal de mais)" + locale: "Filtrar tópicos por idioma original" + locale_any: "Exibir tópicos originalmente escritos em qualquer um dos idiomas especificados (separados por vírgulas)" + exclude_locale: "Excluir tópicos originalmente escritos em um idioma específico." discourse_connect: login_error: "Erro ao entrar com conta" not_found: "Sua conta não pôde ser encontrada. Entre em contato com o(a) administrador(a) do site." @@ -2684,6 +2800,7 @@ pt_BR: csrf_detected: "Desculpe, o tempo para autorização esgotou ou você trocou de navegador. Tente novamente." request_error: "Desculpe, ocorreu um erro ao iniciar a autorização. Tente novamente." invalid_iat: "Desculpe, não foi possível verificar o token de autorização devido à diferença de horário do servidor. Tente novamente." + unauthorized: "Desculpe, o provedor de login não autorizou sua solicitação. Tente novamente ou entre em contato com um administrador." omniauth_error_unknown: "Algo deu errado ao processar seu login, por favor tente novamente." omniauth_confirm_title: "Entrar com a conta usando %{provider}" omniauth_confirm_button: "Continuar" @@ -2737,6 +2854,7 @@ pt_BR: updating_user_ids: "Atualizando ids de usuário(a)…" deleting_source_user: "Excluindo usuário de origem…" user: + anonymized: "[removido devido à anonimização do(a) usuário(a)]" deactivated: "Desativado(a) por causa de muitos e-mails devolvidos para \"%{email}\"." deactivated_by_staff: "Desativado pela equipe" deactivated_by_inactivity: @@ -2913,46 +3031,22 @@ pt_BR: new_version_mailer: title: "Nova versão do mensageiro" subject_template: "[%{email_prefix}] Nova versão do Discourse, atualização disponível" - text_body_template: | - Viva! Uma nova versão do [Discourse](https://www.discourse.org) está disponível! - - Seu versão: %{installed_version} - Nova versão: **%{new_version}** - - - Atualize com facilidade usando a nossa **[atualização no navegador em um clique](%{base_url}/admin/update)** - - - Confira as novidades nas [notas da versão](https://meta.discourse.org/tag/release-notes) ou veja o [registro de alterações não processados GitHub](https://github.com/discourse/discourse/commits/main) - - - Acesse [meta.discourse.org](https://meta.discourse.org) para obter novidades, discussões e suporte para o Discourse new_version_mailer_with_notes: title: "Nova versão do mensageiro com notas" subject_template: "[%{email_prefix}] atualização disponível" - text_body_template: | - Viva! Uma nova versão do [Discourse](https://www.discourse.org) está disponível! - - Seu versão: %{installed_version} - Nova versão: **%{new_version}** - - - Atualize com facilidade usando a nossa **[atualização no navegador em um clique](%{base_url}/admin/update)** - - - Confira as novidades nas [notas da versão](https://meta.discourse.org/tag/release-notes) ou veja o [registro de alterações não processados GitHub](https://github.com/discourse/discourse/commits/main) - - - Acesse [meta.discourse.org](https://meta.discourse.org) para obter novidades, discussões e suporte para o Discourse - - ### Notas da versão - - %{notes} flag_reasons: off_topic: "Sua postagem foi sinalizada como **desvio de tópico**. A comunidade acha que não é compatível com o tópico conforme definida no título e na primeira postagem." inappropriate: "Sua postagem foi sinalizada como **não apropriada**: A comunidade acha que é ofensiva, abusiva, conduta odiosa ou uma violação das [nossas diretrizes da comunidade](%{base_path}/guidelines)." illegal: "Sua postagem foi sinalizada como **ilegal**: a comunidade acha que talvez ela viole a lei." spam: "Sua postagem foi sinalizada como **spam**. A comunidade acha que é um anúncio, algo que de natureza excessivamente promocional em vez de ser útil ou relevante ao tópico como esperado." notify_moderators: "Sua postagem foi sinalizada como **para a atenção do(a) moderador(a)**. A comunidade acha quea algo na postagem exige intervenção manual por um membro da equipe." + needs_approval: "Sua postagem foi marcada **para aprovação**: ela foi automaticamente colocada na fila de revisão por um membro da equipe para garantir que ela atenda às [nossas diretrizes da comunidade](%{base_path}/guidelines)." responder: off_topic: "A postagem foi sinalizada como **desvio de tópico**. A comunidade acha que não é compatível com o tópico conforme definida no título e na primeira postagem." inappropriate: "A postagem foi sinalizada como **não apropriada**: A comunidade acha que é ofensiva, abusiva, conduta odiosa ou uma violação das [nossas diretrizes da comunidade](%{base_path}/guidelines)." spam: "A postagem foi sinalizada como **spam**. A comunidade acha que é um anúncio, algo de natureza excessivamente promocional em vez de ser útil ou relevante ao tópico como esperado." notify_moderators: "A postagem foi sinalizada como **para a atenção do(a) moderador(a)**. A comunidade acha que algo na postagem exige intervenção manual por um membro da equipe." + needs_approval: "A postagem foi marcada **para aprovação**: ela foi automaticamente colocada na fila de revisão por um membro da equipe para garantir que ela atenda às [nossas diretrizes da comunidade](%{base_path}/guidelines)." flags_dispositions: agreed: "Obrigado por nos avisar. Concordamos que há um problema, estamos analisando." agreed_and_deleted: "Obrigado por nos avisar. Concordamos que há um problema, e removemos a postagem." @@ -2972,6 +3066,7 @@ pt_BR: contents_hidden: "Acesse a postagem para ver o seu conteúdo." post_hidden: title: "Postagem oculta" + preview: "Postagem ocultada devido a denúncias de membros da comunidade." subject_template: "Post oculto pelos sinalizadores da comunidade" text_body_template: | Olá, esta é uma mensagem automática de %{site_name} para informar que sua postagem foi oculta. @@ -3031,6 +3126,7 @@ pt_BR: Moderadores do %{site_name} post_hidden_again: title: "Postagem oculta novamente" + preview: "Postagem ocultada novamente pelos membros da comunidade." subject_template: "Postagem oculta por sinalizadores da comunidade, a equipe foi notificada" text_body_template: | Olá, esta é uma mensagem automática de %{site_name} para informar que sua postagem foi oculta outra vez. @@ -3514,6 +3610,7 @@ pt_BR: Para obter mais orientações, consulte nossas [diretrizes da comunidade](%{base_url}/guidelines). too_many_spam_flags: title: "Muitas sinalizadores de spam" + preview: "Postagens temporariamente ocultas devido a denúncias de spam." subject_template: "Nova conta em espera" text_body_template: | Olá, @@ -3536,6 +3633,7 @@ pt_BR: Para obter mais orientações, consulte nossas [diretrizes da comunidade](%{base_url}/diretrizes). silenced_by_staff: title: "Silenciado(a) pela equipe" + preview: "Conta colocada temporariamente em espera." subject_template: "Conta temporariamente em espera" text_body_template: | Olá, @@ -3548,9 +3646,27 @@ pt_BR: user_automatically_silenced: title: "Usuário(a) silenciado(a) automaticamente" subject_template: "O(a) novo(a) usuário(a) %{username} silenciado(a) devido aos sinalizadores da comunidade" + text_body_template: | + Esta é uma mensagem automática. + + O(a) novo(a) usuário(a) [%{username}](%{user_url}) foi silenciado(a) automaticamente. + + [Revise as denúncias](%{base_url}/admin/flags). Se o(a) usuário(a) %{username} tiver sido silenciado(a) para não postar, clique no botão de ativar som do(a) usuário(a) na [página de administração do(a) usuário(a)](%{user_url}). + + Este limite pode ser alterado nas configurações do site "silence_new_user". user_automatically_silenced_with_reason: title: "Usuário(a) silenciado(a) automaticamente" - subject_template: "O(a) novo(a) usuário(a) %{username} silenciado(a) devido aos sinalizadores da comunidade" + subject_template: "O(a) novo(a) usuário(a) %{username} silenciado(a) devido a denúncias da comunidade" + text_body_template: | + Esta é uma mensagem automática. + + O(a) novo(a) usuário(a) [%{username}](%{user_url}) foi silenciado(a) automaticamente. + + Razão: %{reason}. + + [Revise as denúncias](%{base_url}/admin/flags). Se o(a) usuário(a) %{username} tiver sido silenciado(a) para não postar, clique no botão de ativar som do(a) usuário(a) na [página de administração do(a) usuário(a)](%{user_url}). + + Este limite pode ser alterado nas configurações do site "silence_new_user". spam_post_blocked: title: "Postagem de spam bloqueada" subject_template: "Postagens de novo(a) usuário(a )%{username} bloqueadas devido a links repetidos" @@ -3603,6 +3719,12 @@ pt_BR: Olá, Algumas postagens de novos(as) usuários(as) foram removidas pela moderação e estão aguardando revisão. [Aprove-as ou rejeite-as aqui](%{base_url}/review?type=ReviewableQueuedPost). + user_posts_deleted: + title: "Postagens do(a) usuário(a) excluídas" + subject_template: "Todas as postagens de %{user} foram excluídas" + text_body_template: + one: "%{count} postagem de @%{user} foi excluída por @%{staff_user}." + other: "%{count} postagens de @%{user} foram excluídas por @%{staff_user}." unsubscribe_link: | Para cancelar a subscrição destes e-mails, [clique aqui](%{unsubscribe_url}). unsubscribe_link_and_mail: | @@ -3716,6 +3838,7 @@ pt_BR: %{respond_instructions} user_replied: title: "Respondido(a) pelo usuário(a)" + preview: "Alguém respondeu à sua postagem." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3738,6 +3861,7 @@ pt_BR: %{respond_instructions} user_quoted: title: "Citações do(a) usuário(a)" + preview: "Alguém citou você em uma postagem." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3749,6 +3873,7 @@ pt_BR: %{respond_instructions} user_linked: title: "Usuário(a) vinculado(a)" + preview: "Postagem vinculada em outro tópico." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3760,6 +3885,7 @@ pt_BR: %{respond_instructions} user_mentioned: title: "Usuário(a) mencionado(a)" + preview: "Alguém mencionou você em uma postagem." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3815,6 +3941,7 @@ pt_BR: %{respond_instructions} user_posted: title: "Postado(a) pelo(a) usuário(a)" + preview: "Alguém respondeu a um tópico que você está acompanhando." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3848,6 +3975,7 @@ pt_BR: %{respond_instructions} user_posted_pm: title: "MP postada pelo(a) usuário(a)" + preview: "Alguém enviou uma mensagem privada para você." subject_template: "[%{email_prefix}] [MP] %{topic_title}" text_body_template: | %{header_instructions} @@ -3916,6 +4044,12 @@ pt_BR: account_second_factor_disabled: title: "Autenticação de dois fatores desativada" subject_template: "[%{email_prefix}] Autenticação de dois fatores desativada" + text_body_template: | + A autenticação de dois fatores foi desativada na sua conta em %{site_name}. Agora você pode entrar com a conta somente usando a senha. Não é mais necessário um código de autenticação adicional. + + Se você não tiver optado por desativar a autenticação de dois fatores (2FA), alguém pode ter comprometido sua conta. + + Se você tiver alguma dúvida, [entre em contato com nossa equipe prestativa](%{base_url}/sobre). digest: why: "Um breve resumo de %{site_link} desde %{since}" since_last_visit: "Desde a sua última visita" @@ -3936,6 +4070,7 @@ pt_BR: preheader: "Um breve resumo desde %{since}" forgot_password: title: "Esqueci a senha" + preview: "Redefinir sua senha." subject_template: "[%{email_prefix}] Redefinição de senha" text_body_template: | Alguém pediu para redefinir sua senha [%{site_name}](%{base_url}). @@ -3957,6 +4092,7 @@ pt_BR: %{base_url}/session/email-login/%{email_token} set_password: title: "Definir senha" + preview: "Definir a senha da conta." subject_template: "[%{email_prefix}] Configurar senha" text_body_template: | Alguém pediu para adicionar uma senha à sua conta em [%{site_name}](%{base_url}). Como alternativa, você pode entrar com a conta qualquer serviço on-line compatível (Google, Facebook, etc.) associado a esse endereço de e-mail validado. @@ -3967,6 +4103,7 @@ pt_BR: %{base_url}/u/password-reset/%{email_token} admin_login: title: "Entrar com conta de administrador(a)" + preview: "Login de administrador solicitado." subject_template: "[%{email_prefix}] Entrar com conta" text_body_template: | Alguém pediu para entrar com a sua conta em [%{site_name}](%{base_url}). @@ -3977,6 +4114,7 @@ pt_BR: %{base_url}/session/email-login/%{email_token} account_created: title: "Conta criada" + preview: "Nova conta criada para você." subject_template: "[%{email_prefix}] Sua nova conta" text_body_template: | Uma nova conta foi criada para você em%{site_name} @@ -4013,6 +4151,7 @@ pt_BR: text_body_template: "Antes de podermos adicionar um novo endereço de e-mail, precisamos confirmar que você \ncontrola a conta de e-mail atual. Depois de concluir esta etapa, solicitaremos que você \nconfirme o novo endereço de e-mail.\n\nConfirme seu endereço de e-mail atual para %{site_name} clicando no seguinte link: \n\n%{base_url}/u/confirm-old-email/%{email_token}\n" notify_old_email: title: "Notificar e-mail antigo" + preview: "Endereço de e-mail atualizado." subject_template: "[%{email_prefix}] Seu endereço de e-mail foi alterado" text_body_template: | Esta é uma mensagem automática para avisar que seu endereço de e-mail para @@ -4035,6 +4174,7 @@ pt_BR: %{new_email} signup_after_approval: title: "Inscrição após aprovação" + preview: "Nova conta aprovada." subject_template: "Você foi aprovado(a) no %{site_name}!" text_body_template: | Boas-vindas ao %{site_name}! @@ -4060,6 +4200,7 @@ pt_BR: %{reject_reason} signup: title: "Criar conta" + preview: "Confirme sua conta" subject_template: "[%{email_prefix}] Confirme sua nova conta" text_body_template: | Boas-vindas ao %{site_name}! @@ -4082,6 +4223,7 @@ pt_BR: Se não for possível clicar no link acima, tente copiar e colar na barra de endereço do seu navegador. suspicious_login: title: "Alerta de nova entrada com conta" + preview: "Verifique seu dispositivo." subject_template: "[%{site_name}] Nova entrada com conta em %{location}" text_body_template: | Olá, @@ -4107,8 +4249,14 @@ pt_BR: page_not_found: page_title: "Página não encontrada" title: "Oops! Essa página não existe ou é privada." + subtitle: "Procuramos em todos os lugares, mas não conseguimos encontrar a página que você estava procurando." + popular_topics: "Tópicos populares" + recent_topics: "Tópicos recentes" see_more: "Mais" + search_title: "Que tal tentar pesquisar?" search_button: "Pesquisar" + home: "Me leve para casa" + placeholder: "Procurar tópicos por título ou palavras-chave…" offline: title: "Não é possível carregar o aplicativo" offline_page_message: "Parece que você está off-line! Verifique sua conexão de rede e tente novamente." @@ -4117,6 +4265,7 @@ pt_BR: upload: edit_reason: "cópias locais de imagens baixadas" unauthorized: "Desculpe, o arquivo que você está tentando enviar não é autorizado (extensões autorizadas: %{authorized_extensions})." + images_only: "Desculpe, você só pode fazer upload de imagens para esta configuração." pasted_image_filename: "Imagem colada" store_failure: "Falha ao arquivar o envio #%{upload_id} do(a) usuário(a) #%{user_id}." file_missing: "Desculpe, você deve fornecer um arquivo para upload." @@ -4204,6 +4353,8 @@ pt_BR: latte_theme_name: "Latte" summer_theme_name: "Verão" dark_rose_theme_name: "Rosa-escuro" + errors: + cannot_edit_remote_copies: "Não é permitido editar cópias remotas de paletas de cores." edit_this_page: "Editar esta página" csv_export: boolean_yes: "Sim" @@ -4835,6 +4986,15 @@ pt_BR: one: "Você precisa selecionar pelo menos %{count} etiqueta." other: "Você precisa selecionar pelo menos %{count} etiquetas." upload_row_too_long: "O arquivo CSV deve ter uma etiqueta por linha. Opcionalmente, a etiqueta pode ser seguida por uma vírgula e, em seguida, pelo nome do grupo de etiquetas." + bulk_create: + invalid_params: "Parâmetros inválidos. Forneça um array com os nomes das tags." + invalid_name: "Nome de tag inválido." + tag_too_long: + one: "A tag é longa demais (máx. %{count} caractere)." + other: "A tag é longa demais (máx. %{count} caracteres)." + too_many_tags: + one: "Tags demais. Você pode criar até %{count} tag por vez. Para importações maiores, use o recurso de upload de CSV." + other: "Tags demais. Você pode criar até %{count} tags por vez. Para importações maiores, use o recurso de upload de CSV." forbidden: invalid: one: "A etiqueta que você selecionou não pode ser usada" @@ -4861,6 +5021,9 @@ pt_BR: rss_by_tag: "Tópicos etiquetados com %{tag}" finish_installation: congratulations: "Parabéns, você instalou o Discourse!" + login_with_discourse_id: "Entrar com o Discourse ID." + discourse_id_help: "Faça login com o Discourse ID usando o botão abaixo.

Certifique-se de usar uma conta Discourse ID com um e-mail principal que corresponda à variável de ambiente `DISCOURSE_DEVELOPER_EMAILS`." + discourse_id_error_help: "Você optou por pular a configuração de e-mail por enquanto. Infelizmente, devido à mensagem de erro acima, a configuração não poderá prosseguir. Por favor, relate este problema em meta.discourse.org." register: button: "Cadastrar" title: "Cadastrar conta de administrador(a)" @@ -4872,6 +5035,10 @@ pt_BR: resend_email: title: "Enviar novamente e-mail de ativação" message: "

Reenviamos o e-mail de confirmação para %{email}" + discourse_id: + help: "Estamos configurando seu Discourse ID." + no_allowed_emails: "Não há endereços de e-mail permitidos configurados em DISCOURSE_DEVELOPER_EMAILS. Não é possível continuar com a configuração do site." + global_notice: "Nenhum administrador fez login ainda. Faça login usando uma conta Discourse ID com um e-mail que corresponda à variável de ambiente `DISCOURSE_DEVELOPER_EMAILS` para concluir a instalação." safe_mode: title: "Entrar no modo de segurança" description: "O modo de sergurança permite testar seu site sem carregar temas ou personalizações de plugin do cliente. As personalizações de plugin do servidor permanecem ativadas." @@ -4882,14 +5049,20 @@ pt_BR: deprecation_error_label: Faça com que conteúdos obsoletos de Javascript causem um erro enter: "Entrar no modo de segurança" must_select: "Você deve selecionar pelo menos uma opção para entrar no modo de segurança." + dev_mode: + title: "Modo de desenvolvedor" + enable_rack_mini_profiler: "Ative o Rack Mini Profiler para que ele persista entre as mudanças de sessão por 1 hora." + enter: "Entrar no modo de desenvolvedor" wizard: title: "Configuração do Discourse" step: setup: title: "Primeiros passos" + description: "Vamos configurar sua comunidade com o básico. Você sempre poderá alterar essas configurações mais tarde." fields: title: label: "Nome da comunidade" + placeholder: "Hangout de Jane" default_locale: label: "Idioma" login_required: @@ -4897,15 +5070,15 @@ pt_BR: description: "Sua comunidade é pública ou privada?" choices: public: - label: "Público(a)" + label: "Pública" private: - label: "Privado(a)" + label: "Privada" invite_only: label: "Cadastro" description: "Como os membros podem participar desta comunidade?" choices: sign_up: - label: "Cadastrar-se" + label: "Cadastrando-se" invite_only: label: "Apenas convites" must_approve_users: @@ -4937,9 +5110,20 @@ pt_BR: review_by: "Revisão por" pr_summary: "%{commits} confirma %{changed_files} arquivos alterados com %{additions} adições e %{deletions} exclusões" no_description: "Contribua para o desenvolvimento do %{repo} ao criar uma conta no GitHub." + pr_title: + default: "Pull request" + draft: "Rascunho de pull request" + open: "Abrir pull request" + approved: "Pull request aprovado" + changes_requested: "Alterações solicitadas" + merged: "Pull request mesclado (merged)" + closed: "Pull request fechado" status_date: open: "abertos" + draft: "rascunhos" approved: "aprovada" + changes_requested: "alterações solicitadas" + merged: "mesclado" closed: "fechados" discourse_push_notifications: popup: @@ -4955,9 +5139,12 @@ pt_BR: confirm_body: "Tudo pronto! As notificações foram ativadas." custom: "Notificação de %{username} em %{site_title}" staff_action_logs: + redacted: "[conteúdo não visível]" json_too_long: "Valores não registrados, os limites de tamanho da coluna foram excedidos" not_found: "não encontrado(a)" unknown: "desconhecido(a)" + site_setting: + update_existing_users: "atualizar usuários(as) existentes? %{value}" user_merged: "%{username} foi mesclado(a) nesta conta" user_delete_self: "Autoexcluído(a) de %{url}" webhook_deactivation_reason: "Seu webhook foi desativado automaticamente. Recebemos várias respostas de falha de status HTTP \"%{status}\"." @@ -4978,9 +5165,14 @@ pt_BR: auto_deleted_hidden_posts: "Postagens ocultas destruídas automaticamente" seed_data_topic_updated: "Tópico de dados de semente atualizado" seed_data_topic_deleted: "Tópico de dados de semente excluído" + upcoming_changes: + log_manually_toggled: "Ativado manualmente pelo usuário" + log_promoted: > + Essa alteração prevista alcançou o status '%{change_status}' e por isso foi ativada automaticamente no seu site. Consulte a página sobre as próximas alterações para saber mais. reviewables: already_handled: "Obrigado, mas já analisamos esta postagem e determinamos que não precisa ser sinalizada novamente." already_handled_and_user_not_exist: "Obrigado, mas alguém já revisou e esse(a) usuário(a) não existe mais." + post_restored_by_author: "A postagem foi restaurada pelo(a) autor(a)." priorities: low: "Baixo(a)" medium: "Médio(a)" @@ -5046,14 +5238,19 @@ pt_BR: description: "Aceite a sinalização, oculte esta publicação e envie automaticamente ao(à) usuário(a) uma mensagem solicitando edição." complete: "Postagem oculta, o(a) usuário(a) recebeu uma notificação." agree_and_edit: + title: "Editar postagem" description: "Concorde com o sinalizador e abra uma janela do compositor para editar a postagem." complete: "Sinalizador reconhecido, você pode editar a postagem." delete: title: "Excluir" complete: "Postagem excluída." delete_and_ignore: + title: "Excluir postagem e ignorar sinalização" + description: "Excluir a postagem e ignorar a denúncia removendo-a da fila; se for a primeira postagem, exclua também o tópico. " complete: "Postagem excluída." delete_and_ignore_replies: + title: "Excluir a postagem e as respostas, ignorar denúncia" + description: "Excluir a postagem e todas as suas respostas e ignorar a denúncia removendo-a da fila; se for a primeira postagem, excluir também o tópico." confirm: "Você tem certeza de que deseja excluir as respostas desta postagem também?" complete: "Postagem e respostas excluídas." delete_and_agree: @@ -5067,16 +5264,19 @@ pt_BR: complete: "Postagem e respostas excluídas." disagree_and_restore: title: "Restaurar postagem" + description: "Discordar da denúncia e restaurar a publicação." complete: "Postagem restaurada." disagree_bundle: title: "Não" disagree: title: "Manter postagem" + description: "Discordar da denúncia" complete: "Sinalizador ignorado." discard_post: title: "Descartar postagem" complete: "Postagem descartada." revise_and_reject_post: + title: "Solicitar revisão..." complete: "Postagem recusada aguardando revisão." ignore: title: "Ignorar" @@ -5108,6 +5308,7 @@ pt_BR: title: "Não" delete: title: "Excluir usuário(a)" + description: "Excluir usuário sem bloquear" complete: "Usuário(a) excluído(a)." block: title: "Excluir e bloquear usuário(a)" @@ -5117,6 +5318,7 @@ pt_BR: title: "Sim" not_spam: title: "Não" + description: "Não é spam, aprove o usuário." reject: title: "Rejeitar" bundle_title: "Rejeitar…" @@ -5129,32 +5331,68 @@ pt_BR: reject_and_delete: title: "Rejeitar e excluir a postagem" complete: "Postagem recusada e excluída." + reject_and_delete_standalone: + title: "Não, exclua a postagem" reject_and_keep_deleted: title: "Manter a postagem excluída" complete: "Postagem recusada e mantida excluída." + reject_and_keep_deleted_standalone: + title: "Não, mantenha a postagem excluída" scrub: - title: Registro removido + title: Remover registro approve_and_restore: title: "Sim" complete: "Postagem aprovada e restaurada." approve_and_unhide: title: "Sim" complete: "Postagem aprovada e revelada" + post_actions: + bundle_title: "O que você deseja fazer com a postagem?" delete_post: title: "Excluir postagem" + description: "Excluir esta postagem" complete: "Postagem excluída" hide_post: title: "Ocultar postagem" + description: "Ocultar esta postagem da visualização pública" + complete: "Postagem oculta" + unhide_post: + title: "Reexibir postagem" + description: "Tornar esta postagem visível para todos os usuários." + complete: "Postagem não mais oculta" restore_post: title: "Restaurar postagem" + description: "Restaurar esta postagem excluída" complete: "Postagem restaurada" + edit_post: + title: "Editar postagem" + description: "Editar o conteúdo desta postagem" + complete: "Postagem editada" + user_actions: + bundle_title: "O que você deseja fazer com o(a) usuário(a)?" silence_user: title: "Silenciar usuário(a)" + description: "Impedir que o(a) usuário(a) faça postagens" + complete: "Usuário(a) silenciado(a)" + reason: "Usuário(a) silenciado(a) via fila de revisão" suspend_user: title: "Suspender usuário(a)" + description: "Suspender a conta do usuário" + complete: "Usuário(a) suspenso(a)." + reason: "Usuário(a) suspenso(a) via fila de revisão" delete_user: title: "Excluir usuário(a)" + description: "Excluir este(a) usuário(a) do fórum." + complete: "Usuário(a) excluído(a)." reason: "Excluído(a) via fila de revisão" + delete_and_block_user: + title: "Excluir e bloquear" + description: "Excluir o(a) usuário(a) e bloquear seu IP/e-mail." + complete: "Usuário(a) excluído(a) e bloqueado(a)" + delete_user_block: + title: "Excluir e bloquear" + description: "Excluir o(a) usuário(a) e bloquear seu IP/e-mail." + complete: "Usuário(a) excluído(a) e bloqueado(a)" email_style: html_missing_placeholder: "O modelo HTML deve incluir %{placeholder}" notification_level: @@ -5198,6 +5436,11 @@ pt_BR: reserved_id: "tem chave reservada como id: %{id}" unsafe_description: "tem uma descrição HTML não segura" invalid_tag_group: "tem grupo de etiquetas inválido: %{tag_group_name}" + discourse_id: + already_registered: "Este site já está registrado com o Discourse ID." + errors: + not_configured: "O Discourse ID não está configurado. Por favor, ative o Discourse ID primeiro." + regenerate_failed: "Não foi possível regerar as credenciais. Tente novamente mais tarde." activemodel: errors: <<: *errors diff --git a/config/locales/server.ro.yml b/config/locales/server.ro.yml index d4fe1ba5fa977..4c03e4f41a739 100644 --- a/config/locales/server.ro.yml +++ b/config/locales/server.ro.yml @@ -429,6 +429,9 @@ ro: has_subcategories: "Nu putem șterge această categorie pentru că are subcategorii." topic_exists_no_oldest: "Nu poți șterge categoria fiindcă numărul subiectelor este de %{count}." uncategorized_description: "Subiecte care nu au nevoie de o categorie, sau care nu se potrivesc în nicio categorie deja existentă." + category_types: + discussion: + title: "discuție" trust_levels: admin: "Admin" staff: "Membrii echipei" @@ -681,9 +684,10 @@ ro: flag: Tip visits: title: "Vizite ale utilizatorilor" - xaxis: "Zi" + xaxis: + desktop: "Desktop" + mobile: "Mobil" yaxis: "Număr de vizite" - description: "Numărul de vizite ale utilizatorilor conectați." signups: xaxis: "Zi" new_contributors: @@ -1204,7 +1208,6 @@ ro: enable_user_directory: "Furnizează un „carte de telefon” cu utilizatorii" allow_anonymous_mode: "Activează opțiunea pentru ca utilizatorii să treacă la modul anonim pentru postare. Când este activată, utilizatorii pot opta ca identitățile lor să fie ascunse atunci când creează postări sau subiecte pe tot site-ul. Vezi și „permite aprecieri anonime”." anonymous_account_duration_minutes: "Pentru protejarea anonimității, creează un nou cont anonim la fiecare N minute pentru fiecare utilizator. Exemplu: dacă e setat la 600, imediat ce au trecut 600 de minute de la ultima postare șI utilizatorul a comutat pe anonim, va fi creat un nou cont anonim." - hide_user_profiles_from_public: "Dezactivează cardurile, profilurile și „cartea de telefon” pentru utilizatorii anonimi." allow_users_to_hide_profile: "Permite utilizatorilor să-şi ascundă profilul şi prezenţa" allow_profile_backgrounds: "Permite utilizatorilor să încarce fundaluri de profil." get_a_room_threshold: "Numărul de postări pe care un utilizator poate să le facă la adresa aceleiași persoane înainte de a primi un avertisment." diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml index f494984ecd72f..6e84b1a14ce59 100644 --- a/config/locales/server.ru.yml +++ b/config/locales/server.ru.yml @@ -60,6 +60,8 @@ ru: inline_oneboxer: topic_page_title_post_number: "#%{post_number}" topic_page_title_post_number_by_user: "#%{post_number} от пользователя %{username}" + too_many_urls: "Невозможно преобразовать более 10 URL-адресов в однострочные блоки в одном запросе." + concurrency_not_allowed: "Одновременные запросы на преобразование URL-адресов в однострочные блоки не допускаются. Пожалуйста, отправляйте только один запрос за раз." components: enabled_filter: "Включено" disabled_filter: "Отключено" @@ -147,6 +149,8 @@ ru: invalid_type: "Тип «%{type}» не является допустимым" humanize_not_valid_string_value: "Свойство JSON Pointer '%{property_json_pointer}' должно быть строкой." not_valid_string_value: "должно быть строкой" + humanize_not_valid_datetime_value: "Свойство в JSON-указателе '%{property_json_pointer}' должно представлять собой допустимую дату и время." + not_valid_datetime_value: "должна быть действительная дата и время" humanize_not_valid_integer_value: "Свойство JSON Pointer '%{property_json_pointer}' должно быть целым числом." not_valid_integer_value: "должно быть целым" humanize_not_valid_float_value: "Свойство JSON Pointer '%{property_json_pointer}' должно быть числом с плавающей запятой." @@ -295,6 +299,7 @@ ru: errors: &errors format: ! "%{attribute} %{message}" format_with_full_message: "%{attribute}: %{message}" + diff_too_complex: "Разница в значениях слишком сложна для безопасного вычисления. Пожалуйста, попробуйте внести более мелкие изменения." messages: too_long_validation: one: "не может быть длиннее %{count} символа, а введено %{length}." @@ -447,6 +452,7 @@ ru: redemption_count_less_than_max: "должно быть меньше %{max_redemptions_allowed}." email_xor_domain: "Одновременное указание домена и адреса электронной почты не допускается" existing_user_success: "Приглашение использовано" + email_invites_disabled: "Отправка пригласительных писем отключена." bulk_invite: file_should_be_csv: "Загружаемый файл должен быть в формате CSV." max_rows: "Первые приглашения (%{max_bulk_invites}) отправлены. Попробуйте разделить файл на более мелкие части." @@ -683,6 +689,7 @@ ru: other: "Максимальное количество доменов электронной почты, которые можно учесть одновременно, — %{count}" no_invites_with_discourse_connect: "При включении DiscourseConnect вы можете приглашать только зарегистрированных пользователей" no_invites_without_local_logins: "При отключении локальных логинов вы можете приглашать только зарегистрированных пользователей" + update_existing_users_required: "Это изменение затрагивает %{count} существующих участников группы. Необходимо указать параметр 'update_existing_users' (true или false), чтобы определить, следует ли применять новые настройки уведомлений по умолчанию к существующим участникам." default_names: everyone: "все" admins: "администраторы" @@ -903,6 +910,12 @@ ru: other: "Категорию удалить нельзя: в ней содержатся %{count} темы. Самая старая тема: %{topic_link}." topic_exists_no_oldest: "Категорию удалить нельзя: количество тем в ней равно %{count}." uncategorized_description: "Темы, которым не нужна категория, или которые не соответствуют ни одной из существующих категорий." + category_types: + not_available: "Категория типа '%{type_name}' недоступна" + discussion: + name: "Обсуждение" + title: "обсуждение" + description: "Стандартный раздел со всем необходимым для общения." trust_levels: admin: "Администратор" staff: "Персонал" @@ -1178,6 +1191,7 @@ ru: too_many_drafts: title: "Слишком много черновиков" description: "Вы достигли максимального количества разрешенных черновиков. Удалите некоторые из [черновиков] (%{base_url}/my/activity/drafts) и попробуйте снова." + bulk_destroy_limit: "Одновременно можно удалить не более %{limit} черновиков." draft_backup: pm_title: "Резервные копии черновиков из текущих тем" pm_body: "Тема, содержащая резервные копии черновиков" @@ -1275,11 +1289,16 @@ ru: weekly: "еженедельно" every_month: "каждый месяц" every_six_months: "каждые шесть месяцев" + calendar_subscriptions: + application_name: "Подписки на календарь" user_api_key: authorize: "Разрешить" deny: "Нет" read: "чтение" read_write: "чтение и запись" + logged_in_as: "Вы вошли как" + permissions_header: 'Это позволит "%{application_name}:' + redirect_warning: "При авторизации вы будете перенаправлены на" instructions: 'Мы сгенерировали новый API-ключ пользователя для приложения «%{application_name}». Вставьте этот ключ в приложение:' otp_description: 'Разрешить приложению «%{application_name}» доступ к этому сайту?' otp_confirmation: @@ -1359,9 +1378,11 @@ ru: description: "Список статусов жалоб, включая тип жалобы, автора сообщения и жалобы и время, потраченное на разрешение жалоб." visits: title: "Визиты пользователей" - xaxis: "Дата" + xaxis: + desktop: "Настольная" + mobile: "Мобильная" yaxis: "Количество визитов" - description: "Количество визитов авторизованных пользователей." + description: "Количество посещений сайта авторизованными пользователями по типу устройства." signups: title: "Регистрации" xaxis: "Дата" @@ -1404,6 +1425,8 @@ ru: yaxis: "Дата" description: "Запросы к API для обычных и пользовательских API-ключей." consolidated_page_views_browser_detection: + title: "Объединение просмотров страниц с определением браузера (рекомендуется)" + title_legacy: "Объединение просмотров страниц с определением браузера (рекомендуется)" xaxis: page_view_anon_browser: "Анонимный браузер" page_view_logged_in_browser: "Авторизованный браузер" @@ -1426,7 +1449,7 @@ ru: title: "DAU/MAU" xaxis: "Дата" yaxis: "DAU/MAU" - description: "Количество участников, вошедших за последний день, поделённое на количество участников, вошедших за прошедший месяц. Возвращает %, который указывает «удержание» сообщества. Стремитесь к значению > 20%." + description: "Доля ежемесячно активных пользователей, вернувшихся в течение последнего дня. Этот процент показывает, как часто люди возвращаются; это также называется «привязанностью» сообщества. Цель – > 20%." daily_engaged_users: title: "Ежедневно вовлечённые пользователи" xaxis: "Дата" @@ -1716,6 +1739,7 @@ ru: problem: twitter_login: 'Похоже, вход в Твиттер/X сейчас не работает. Проверьте учетные данные в в настройках сайта.' group_email_credentials: 'Возникла проблема с учетными данными электронной почты для группы %{group_full_name}. Электронная почта не будет отправляться из почтового ящика группы, пока эта проблема не будет решена. %{error}' + upcoming_change_stable_opted_out: 'Ваш сайт отказался от предстоящего изменения "%{upcoming_change}". Это изменение теперь имеет статус "Стабильное" и вскоре может быть удалено или сделано постоянным. Посетите страницу предстоящих изменений , чтобы ознакомиться с подробной информацией об этом изменении.' rails_env: "Сервер работает в режиме %{env}." host_names: "Файл config/database.yml использует имя хоста localhost по умолчанию. Измените его на имя хоста сайта." sidekiq: 'Планировщик заданий Sidekiq не запущен. Многие задачи, в том числе отправка писем, должны выполняться им асинхронно. Должен быть запущен хотя бы один процесс sidekiq. Подробнее о Sidekiq — здесь.' @@ -1738,6 +1762,7 @@ ru: many: "Опрос электронной почты вызвал %{count} ошибок за последние 24 часа. Подробности смотрите в журналах." other: "Опрос электронной почты вызвал %{count} ошибки за последние 24 часа. Подробности смотрите в журналах." missing_mailgun_api_key: "Сервер настроен на отправку писем через Mailgun, но вы не предоставили ключ API, используемый для проверки сообщений вебхука." + qq_mail_smtp: "Известно, что ваш SMTP-сервер (%{smtp_address}) вызывает дублирование писем в Discourse. QQ Mail не возвращает корректные подтверждения, из-за чего Discourse повторяет отправку уже успешно завершенных писем. См. рекомендуемые альтернативы." bad_favicon_url: "Значок сайта не загружается. Проверьте его параметры в настройках сайта." poll_pop3_timeout: "Время подключения к серверу POP3 истекло. Не удалось получить входящую почту. Проверьте настройки POP3 и поставщика услуг." poll_pop3_auth_error: "Не удается подключиться к серверу POP3 из-за ошибки аутентификации. Проверьте настройки POP3." @@ -1749,6 +1774,7 @@ ru: category_style_deprecated: "Сейчас в вашем Discourse используется устаревший стиль категорий, который будет удален до выхода финальной бета-версии Discourse 3.2. Инструкции о том, как сохранить выбранный стиль категории, см. в статье «Переход к настройке сайта с единым стилем категорий»." maxmind_db_configuration: 'Сервер сконфигурирован на использование баз данных MaxMind для обратного поиска IP-адресов, но действительный идентификатор аккаунта MaxMind не настроен, что может привести к невозможности загрузки баз данных MaxMind в будущем. Чтобы узнать больше, прочтите это руководство.' admin_sidebar_deprecation: "Макет панели администратора устарел и будет удален в следующей версии. Вместо него будет использоваться новый макет боковой панели. Вы можете настроить новый макет боковой панели сейчас, чтобы включить его заранее." + starttls_disabled: "В настройках исходящей почты параметр STARTTLS отключен. Это практически никогда не требуется. Рекомендуется удалить

DISCOURSE_SMTP_ENABLE_START_TLS=false
из вашей среды. Для получения более подробной информации обратитесь к этой теме." back_from_logster_text: "Вернуться на сайт" site_settings: allow_bulk_invite: "Разрешить массовые приглашения путём загрузки CSV-файла" @@ -1760,6 +1786,7 @@ ru: allow_user_locale: "Разрешить пользователям выбирать язык интерфейса" set_locale_from_accept_language_header: "Устанавливать язык интерфейса для анонимных пользователей по заголовкам языка их браузера" set_locale_from_cookie: "Позволяет задать локаль анонимного пользователя с помощью cookie-файла браузера 'locale'" + set_locale_from_param: "Позволяет задать локаль анонимного пользователя через URL-параметр 'lang', например, ?lang=es" support_mixed_text_direction: "Поддерживать смешанные направления текста слева направо и справа налево" min_post_length: "Минимально допустимая длина публикации в символах (без учета личных сообщений)" min_first_post_length: "Минимально допустимая длина первой публикации (основного текста темы) (без учета личных сообщений)" @@ -1792,6 +1819,7 @@ ru: allow_duplicate_topic_titles_category: "Разрешить создание тем с одинаковыми названиями, если они создаются в разных категориях. (Параметр «allow_duplicate_topic_titles» должен быть отключён)." unique_posts_mins: "Минимальное количество минут между созданием сообщений с одинаковым контентом" educate_until_posts: "Количество первых сообщений новых пользователей, при создании которых необходимо показывать всплывающую подсказку с советами для новичков." + title: "Название этого сайта. Видно всем посетителям, включая анонимных пользователей. Обратите внимание, что изменение этого названия может отправить пользователям PWA запрос на обновление или удаление приложения." site_description: "Опишите сайт одним предложением. Показывается всем посетителям, включая анонимных." short_site_description: "Краткое описание в нескольких словах. Показывается всем посетителям, включая анонимных." contact_email: "Адрес электронной почты ключевого контактного лица, ответственного за этот сайт. Используется для критических уведомлений и отображается на странице /about. На публичных сайтах отображается и для анонимных пользователей." @@ -1838,6 +1866,7 @@ ru: logo: "Логотип в левом верхнем углу сайта. Используйте широкое прямоугольное изображение с высотой 120 и соотношением сторон более чем 3:1. Если оставить поле пустым, будет показан текст заголовка сайта." logo_small: "Уменьшенный логотип в левом верхнем углу сайта, отображаемый при прокрутке вниз. Используйте квадратное изображение 120 × 120. Если оставить поле пустым, будет отображаться значок главной страницы." digest_logo: "Альтернативный логотип, используемый в верхней части страницы, отображающей письма со сводками. Используйте широкое прямоугольное изображение. Не используйте изображение в формате SVG. Если оставить поле пустым, будет использоваться логотип из настройки `logo`." + mobile_logo: "Логотип, используемый в мобильной версии вашего сайта. Мы рекомендуем квадратную иконку, чтобы избежать перегрузки заголовка, но вы можете использовать широкое прямоугольное изображение высотой 120 пикселей и соотношением сторон более 3:1. Если поле оставить пустым, будет использоваться изображение из настроек логотипа." logo_dark: "Альтернативное значение настройки сайта «logo» для тёмной схемы." logo_small_dark: "Альтернативное значение настройки сайта «logo small» для тёмной схемы." mobile_logo_dark: "Альтернативное значение настройки сайта «mobile logo» для тёмной схемы." @@ -1845,6 +1874,7 @@ ru: manifest_icon: "Изображение, используемое в качестве логотипа на Android-устройствах. Размер будет автоматически изменён до 512 × 512. Если оставить поле пустым, будет использоваться «large_icon»." manifest_screenshots: "Скриншоты, демонстрирующие особенности и функциональные возможности приложения, отображаемые на странице с запросом на установку. Все изображения должны быть загружены локально и иметь одинаковые размеры." favicon: "Значок сайта, см. https://ru.wikipedia.org/wiki/Favicon. Для корректного отображения должен быть в формате PNG. Размер будет автоматически изменён до 32x32. Если оставить поле пустым, будет использоваться «large_icon»." + apple_touch_icon: "Значок, предназначенный для сенсорных устройств Apple. Использование прозрачного фона не рекомендуется. Размер значка будет автоматически изменен до 180x180. Если оставить поле пустым, будет использоваться значок large_icon." opengraph_image: "Стандартное изображение opengraph, используемое, если на странице нет другого подходящего изображения. Если оставить поле пустым, будет использоваться «large_icon»." x_summary_large_image: "Сводная карточка Twitter с большим изображением (должна быть не менее 280 пикселей в ширину, не менее 150 пикселей в высоту и не может быть в формате «.svg»). Если оставить поле пустым, обычные метаданные карточки генерируются с использованием «opengraph_image» (если исходное изображение также не в формате «.svg»)." notification_email: "Отправитель: эл. почта, используемая при отправке всех системных писем. Для успешной отправки писем указанный здесь домен должен иметь правильно настроенные SPF, DKIM и reverse PTR." @@ -1908,8 +1938,12 @@ ru: ga_universal_domain_name: "Доменное имя для Google Universal Analytics, например: mysite.com; см. https://google.com/analytics" ga_universal_auto_link_domains: "Включить междоменное отслеживание Google Universal Analytics. К исходящим ссылкам на эти домены будет добавлен идентификатор клиента. См. Как настроить междоменное отслеживание." gtm_container_id: "Идентификатор контейнера Google Tag Manager, например: GTM-ABCD12E.
Примечание. Чтобы использовать GTM при включенной политике безопасности контента (CSP), смотрите документацию на Meta: «Использование переменных nonce в скриптах Google Tag Manager»." + google_site_verification_token: Токен подтверждения Google Search Console. Будет добавлен в качестве метатега в раздел head HTML-кода. enable_escaped_fragments: "Если поисковый робот не обнаружен, переключаться на Google Ajax-Crawling API. См. https://developers.google.com/webmasters/ajax-crawling/docs/learn-more." + moderators_manage_categories: "Разрешите модераторам создавать и управлять категориями." + moderators_manage_groups: "Разрешите модераторам создавать группы и управлять ими." moderators_change_post_ownership: "Разрешать модераторам менять владельца сообщения" + change_post_ownership_allowed_groups: "Разрешить пользователям этих групп менять владельца поста" cors_origins: "Разрешённые источники для междоменных запросов (CORS). Каждый источник должен содержать http:// или https://. Для включения CORS переменная окружения DISCOURSE_ENABLE_CORS должна быть установлена в значение «true»." use_admin_ip_allowlist: "Администраторы могут войти в систему только в том случае, если их IP-адрес в белом списке (Администрирование > Журналы > IP-адреса)." blocked_ip_blocks: "Список локальных диапазонов IP-адресов, которые никогда не должны сканироваться Discourse" @@ -1920,6 +1954,7 @@ ru: blocked_crawler_user_agents: "Уникальное нечувствительное к регистру слово в строке User-Agent, идентифицирующее поисковых роботов, которым запрещён доступ к сайту. Не применяется, если определён белый список." slow_down_crawler_user_agents: 'Значения User Agent, для которых скорость работы должна быть ограничена в соответствии с настройкой «slow down crawler rate». Каждое значение должно состоять не менее чем из трех символов.' slow_down_crawler_rate: "Если указано значение «slow_down_crawler_user_agents» (количество секунд между запросами), то это значение будет применяться ко всем поисковым роботам" + llms_txt: "Загрузите текстовый файл, который будет доступен по адресу /llms.txt для обходчиков LLM. Дополнительную информацию см. на сайте llmstxt.org." content_security_policy: "Включить Content-Security-Policy (CSP). CSP — это дополнительный уровень защиты, который помогает предотвратить определенные типы атак, включая межсайтовый скриптинг (XSS) и внедрение данных." content_security_policy_report_only: "Включить Content-Security-Policy-Report-Only (CSP)" content_security_policy_frame_ancestors: "Ограничить через CSP число тех, кто может встроить этот сайт в iframes. Перечень разрешённых хостов настраивается на закладке Встраивание." @@ -1949,6 +1984,7 @@ ru: top_page_default_timeframe: "Период времени на верхней странице по умолчанию для анонимных пользователей (автоматически настраивается для вошедших в систему пользователей на основе их последнего посещения)." moderators_view_emails: "Разрешать модераторам просматривать адреса электронной почты пользователей." moderators_view_ips: "Разрешить модераторам просматривать IP-адреса пользователей." + moderators_change_trust_levels: "Разрешите модераторам изменять уровни доверия пользователей." prioritize_username_in_ux: "Показывать имя пользователя первым на странице пользователя, карточке пользователя и сообщениях (когда отключённое имя показывается первым)" enable_rich_text_paste: "Включить автоматическое преобразование HTML в Markdown при вставке текста в редактор." send_old_credential_reminder_days: "Напомнить о старых учётных данных через указанное количество дней" @@ -2074,6 +2110,7 @@ ru: invite_link_max_redemptions_limit_users: "Максимальное допустимое количество использований пригласительных ссылок, созданных пользователями." alert_admins_if_errors_per_minute: "Количество ошибок в минуту, необходимое для предупреждения администратора. Для отключения этого параметра установите значение в 0. ВНИМАНИЕ: требуется перезапуск." alert_admins_if_errors_per_hour: "Количество ошибок в час, необходимое для предупреждения администратора. Для отключения этого параметра установите значение в 0. ВНИМАНИЕ: требуется перезапуск." + categories_topics: 'Количество тем для отображения на странице /categories. Если установлено значение 0, значение будет автоматически задано для обеспечения симметрии двух столбцов. Актуально только для стилей страниц категорий "категории и последние/самые популярные темы" .' suggested_topics: "Количество похожих тем, отображаемых под текущей темой." limit_suggested_to_category: "В списке похожих тем показывать темы только из текущей категории." suggested_topics_max_days_old: "Похожие темы не должны быть старше указанного здесь количества дней." @@ -2100,6 +2137,7 @@ ru: selectable_avatars_mode: "Разрешить пользователям выбирать аватар из списка «selectable_avatars» и ограничивать загрузку своих аватаров выбранным уровнем доверия." selectable_avatars: "Укажите коллекцию аватаров, из которых пользователи могут выбирать изображение профиля. Этот выбор появляется при создании профиля пользователя и при обновлении аватара профиля." allow_all_attachments_for_group_messages: "Разрешать все типы почтовых вложений для групповых сообщений." + image_quality: "Установите уровень качества для изображений, загружаемых на ваш сайт. Более низкое качество приведет к уменьшению размера файлов." png_to_jpg_quality: "Качество преобразованного файла JPG (1 — низкое, 99 — лучшее, 100 — отключить параметр)." recompress_original_jpg_quality: "Качество загружаемых файлов JPG (1 — низкое, 99 — лучшее, 100 — отключить параметр)." image_preview_jpg_quality: "Качество файлов JPG при изменении их размера (1 — низкое, 99 — лучшее, 100 — отключить параметр)." @@ -2224,9 +2262,12 @@ ru: num_flaggers_to_close_topic: "Минимальное количество человек, жалующихся на тему, которое требуется для автоматической блокировки и отправки темы на проверку" num_hours_to_close_topic: "Тема блокируется на указанное здесь количество часов, необходимых для её проверки." auto_respond_to_flag_actions: "Включить автоматический ответ при отклонении жалобы." + min_first_post_typing_time: "Минимальное время, которое пользователь должен потратить на ввод текста при первом сообщении. Если этот порог не будет достигнут, сообщение автоматически попадет в очередь на утверждение. Установите значение 0, чтобы отключить эту функцию (не рекомендуется)." + fast_typing_threshold: "Минимальное время в миллисекундах, которое пользователь должен потратить на ввод первой публикации. Если публикация набрана быстрее указанного порога, она автоматически отправится в очередь проверки. Низкий порог — 1 секунда, стандартный — 3 секунды, высокий — 5 секунд." auto_silence_fast_typers_on_first_post: "Автоматически замораживать пользователей, которые не соответствуют параметру `fast typing threshold`" auto_silence_fast_typers_max_trust_level: "Максимальный уровень доверия для автоматической заморозки пользователей, если зафиксирован быстрый набор текста" auto_silence_first_post_regex: "Регулярное выражение (без учета регистра), которое отправит первое сообщение пользователя на проверку и заморозит автора, если в тексте будет найдено совпадение. Пример: выражение `raging|a[bc]a` заморозит сообщения, содержащие «raging», «aba» или «aca». Правило применяется только к первому сообщению пользователя. ЭТА НАСТРОЙКА ЯВЛЯЕТСЯ УСТАРЕВШЕЙ — используйте функцию «Контролируемые слова»." + moderator_guide_topic: "Тема, описывающая порядок модерации вашего сообщества. Ссылка будет видна в очереди на проверку модераторам и администраторам." reviewable_claiming: "Нужно ли резервировать проверяемый контент за конкретным сотрудником, прежде чем отправить контент на проверку?" reviewable_default_topics: "Показывать проверяемый контент, сгруппированный по темам" reviewable_default_visibility: "Не показывать проверяемый контент, если он не соответствует этому приоритету" @@ -2235,11 +2276,14 @@ ru: allow_all_users_to_flag_illegal_content: "Анонимным пользователям будет показано сообщение о том, что для жалобы на нелегальный контент нужно отправить письмо администраторам. Эта настройка имеет приоритет над параметром 'flag post allowed groups'." email_address_to_report_illegal_content: "Если оставить это поле пустым, будет использован адрес электронной почты администратора сайта по умолчанию." cooldown_hours_until_reflag: "Количество часов, в течение которых пользователи не смогут повторно пожаловаться на сообщение" + slow_mode_prevents_editing: "Предотвращает ли «медленный режим» редактирование после истечения «льготного периода редактирования»?" reply_by_email_enabled: "Позволяет пользователям отвечать на темы напрямую по электронной почте, не входя на веб-сайт. Подробнее — в руководстве на Meta." reply_by_email_address: "Шаблон для ответа по электронной почте в формате: %%{reply_key}@reply.example.com или replies+%%{reply_key}@example.com" alternative_reply_by_email_addresses: "Список альтернативных шаблонов для ответа, применяемый на основе входящих адресов электронной почты. Пример: %%{reply_key}@reply.example.com|replies+1%%{reply_key}@example.com" incoming_email_prefer_html: "Использовать HTML вместо обычного текста для входящих писем." strip_incoming_email_lines: "Удалять начальные и конечные пробелы из каждой строки входящих писем." + disable_emails: "Запретить Discourse отправлять любые электронные письма. Выберите «да», чтобы отключить отправку исходящих писем для всех пользователей. Выберите «не для сотрудников», чтобы отключить отправку писем только для пользователей, не являющихся сотрудниками." + allow_email_invites: "При отключении этой функции пользователи не смогут отправлять пригласительные письма через Discourse." strip_images_from_short_emails: "Удалять картинки из коротких писем — размером менее 2800 байт" short_email_length: "Максимальная длина в байтах, при которой электронное письмо будет определено как «короткое». Если размер письма не превышает это значение, изображения в нем (например, аватары и эмодзи) будут удалены." display_name_on_email_from: "Отображать в поле «От» полные имена отправителей электронных писем" @@ -2300,6 +2344,7 @@ ru: relative_date_duration: "Количество дней после создания сообщения, в течение которых дата будет отображаться в относительном виде (7 дней), а не в абсолютном (20 февраля)." delete_user_max_post_age: "Запретить удаление пользователей, чье первое сообщение старше указанного здесь количества дней." delete_all_posts_max: "Максимальное количество сообщений, которое может быть удалено за один раз через кнопку «Удалить все сообщения». Если у пользователя сообщений больше этого числа, сообщения не могут быть удалены за одно нажатие и в этом случае пользователь не может быть удален." + delete_all_posts_background_threshold: "Максимальное количество записей, которые можно удалить одновременно с помощью кнопки «Удалить все записи», прежде чем удаление будет обработано в фоновом режиме." delete_user_self_max_post_count: "Максимальное количество сообщений, которое пользователь может иметь при удалении собственного аккаунта. Установите это значение в -1, если необходимо отключить возможность удаления собственного аккаунта." username_change_period: "Максимальное количество дней после регистрации, в течение которых можно менять свое имя пользователя (установите это значение в 0, если необходимо запретить изменение имени пользователя)." email_editable: "Разрешить пользователям изменять адрес электронной почты после регистрации." @@ -2331,7 +2376,7 @@ ru: allow_likes_in_anonymous_mode: "Включите этот параметр, чтобы разрешить пользователям, просматривающим ваш сайт анонимно, ставить отметки «Нравится» публикациям. При активации этого параметра пользователи могут скрывать свою личность при установке отметок «Нравится» публикациям или темам на сайте. Для этого параметра необходимо включить параметр «Разрешить анонимный режим»." anonymous_posting_allowed_groups: "Группы, которым разрешено анонимное размещение сообщений. Для этого необходимо включить параметр «Разрешить анонимный режим»." anonymous_account_duration_minutes: "Защита от слишком частого создания новых аккаунтов. Пример: если значение установлено в 600, это означает, что должно пройти не менее 600 минут с момента последнего сообщения пользователя и его выхода из системы, после чего он сможет создать новый аккаунт." - hide_user_profiles_from_public: "Отключить отображение карточек пользователей, профилей и списка участников форума для анонимных пользователей." + hide_user_profiles_from_public: "Отключите карточки пользователей и профили пользователей для анонимных пользователей. Сводная статистика по-прежнему будет доступна в каталоге пользователей." hide_new_user_profiles: "Скрывать профили пользователей с уровнем доверия 1 и ниже от публичного просмотра и от пользователей с уровнем доверия 1 до первой публикации. Эта функция всегда отключена на сайтах с настройками must_approve_users и invite_only." allow_users_to_hide_profile: "Разрешить пользователям скрывать свой профиль и присутствие на форуме" hide_user_activity_tab: "Скрыть вкладку действий в профилях пользователей (за исключением своего профиля и администратора)." @@ -2609,6 +2654,8 @@ ru: reply_by_email_disabled: "Перед включением этого параметра необходимо включить параметр «Ответить по электронной почте»." discourse_connect_url_is_empty: "Перед включением этого параметра необходимо настроить параметр «discourse connect url»." enable_local_logins_disabled: "Перед включением этого параметра необходимо включить параметр «Включить локальные аккаунты»." + max_group_name_length_exists: "Вы не можете установить \"максимальную длину имени пользователя\" ниже самого длинного имени группы (%{group_name})." + max_username_length_range: "Вы не можете установить значение «максимальная длина имени пользователя» ниже значения «минимальная длина имени пользователя»." invalid_hex_value: "Значения цвета — шесть цифр в шестнадцатеричной системе исчисления." empty_selectable_avatars: "Для включения этого параметра необходимо загрузить не менее двух аватаров, из которых можно будет сделать выбор." category_search_priority: @@ -2625,6 +2672,7 @@ ru: other: "Значений в списке должно быть ровно %{count}." markdown_linkify_tlds: "Нельзя использовать значение «*»." google_oauth2_hd_groups: "Перед включением этого параметра необходимо задать все настройки «google oauth2 hd»." + discourse_id_registration: "Не удалось автоматически зарегистрироваться в Discourse ID. Это может быть связано с проблемами сетевого подключения, ограничениями брандмауэра или недоступностью службы Discourse ID. Для получения более подробной информации проверьте журналы сервера или обратитесь в службу поддержки." linkedin_oidc_credentials: "Прежде чем включать этот параметр, необходимо настроить учетные данные LinkedIn OIDC ('linkedin_oidc_client_id' and 'linkedin_oidc_client_secret')." search_tokenize_chinese_enabled: "Перед включением этого параметра нужно отключить «search_tokenize_chinese»." search_tokenize_japanese_enabled: "Перед включением этого параметра нужно отключить «search_tokenize_japanese»." @@ -2655,6 +2703,7 @@ ru: filter: description: status: "Фильтровать темы по статусу" + in: "Фильтрация тем в личных списках" order: "Сортировать темы по определенному полю" category: "Показывать темы в определенной категории" category_any: "Показывать темы в любой из указанных категорий (через запятую)" @@ -2673,6 +2722,9 @@ ru: activity_after: "Показывать темы с последней активностью после указанной даты (YYYY-MM-DD или количество дней назад)" created_before: "Показывать темы, созданные до указанной даты (YYYY-MM-DD или количество дней назад)" created_after: "Показывать темы, созданные после указанной даты (YYYY-MM-DD или количество дней назад)" + created_by: "Отображение тем, созданных конкретным пользователем или группой." + created_by_user: "Отображать темы, созданные пользователем по имени или группе (без символа «@»)." + created_by_multiple: "Отобразить темы, созданные любым из указанных пользователей или групп (разделенных запятыми)." latest_post_before: "Показывать темы с последней публикацией до указанной даты (YYYY-MM-DD или количество дней назад)" latest_post_after: "Показывать темы с последней публикацией после указанной даты (YYYY-MM-DD или количество дней назад)" likes_min: "Показывать темы, набравшие как минимум указанное количество лайков" @@ -2723,6 +2775,8 @@ ru: order_views_asc: "Сортировать по количеству просмотров (от меньшего к большему)" order_read: "Сортировать по дате вашего последнего прочтения (сначала недавние)" order_read_asc: "Сортировать по дате вашего последнего прочтения (сначала старые)" + order_hot: "Сортировать по популярности (сверху вниз)" + order_hot_asc: "Сортировка по популярности (наименьшая — первая)" users: "Фильтровать темы по участникам" users_any: "Показывать темы с любым из указанных пользователей (через запятую)" users_all: "Показывать темы со всеми указанными пользователями (разделенными знаком плюса)" @@ -2730,6 +2784,9 @@ ru: group: "Фильтровать темы по группам" groups_any: "Показывать темы с любой из указанных групп (через запятую)" groups_all: "Показывать темы со всеми указанными пользователями (разделенными знаком плюса)" + locale: "Фильтрация тем по языку оригинала" + locale_any: "Показать темы, изначально написанные на любом из указанных языков (разделенные запятыми)." + exclude_locale: "Исключить темы, изначально написанные на конкретном языке." discourse_connect: login_error: "Ошибка входа" not_found: "Мы не можем найти ваш аккаунт. Свяжитесь с администратором сайта." @@ -2897,6 +2954,7 @@ ru: csrf_detected: "Извините, время авторизации истекло, или вы использовали другой браузер для входа в систему. Попробуйте еще раз." request_error: "Извините, при запуске авторизации произошла ошибка. Попробуйте еще раз." invalid_iat: "Извините, не удалось проверить токен авторизации из-за расхождения времени на сервере. Попробуйте еще раз." + unauthorized: "Извините, ваш запрос на авторизацию не был одобрен. Пожалуйста, попробуйте еще раз или свяжитесь с администратором." omniauth_error_unknown: "В процессе входа на сайт произошла ошибка. Повторите попытку." omniauth_confirm_title: "Вход с помощью %{provider}" omniauth_confirm_button: "Продолжить" @@ -2950,6 +3008,7 @@ ru: updating_user_ids: "Обновление идентификаторов пользователя…" deleting_source_user: "Удаление исходного пользователя…" user: + anonymized: "[удалено в связи с анонимизацией пользователя]" deactivated: "Была выключена из-за слишком большого количества возвращённых писем на адрес «%{email}»." deactivated_by_staff: "Выключено персоналом" deactivated_by_inactivity: @@ -3136,32 +3195,32 @@ ru: title: "Выход новой версии" subject_template: "[%{email_prefix}] Вышла новая версия Discourse" text_body_template: | - Ура! Вышла свежая версия [Discourse](https://www.discourse.org)! + Ура! Вышла новая версия [Discourse](https://www.discourse.org)! - Установленная версия: %{installed_version} + Ваша версия: %{installed_version} Новая версия: **%{new_version}** - - Обновитесь, используя наш способ онлайн-обновления **[в один клик](%{base_url}/admin/update)**. + - Обновите с помощью нашего простого **[обновления в один клик в браузере](%{base_url}/admin/update)** - - Посмотрите, что появилось в последней версии: либо на [нашем сайте](https://meta.discourse.org/tag/release-notes), либо на сайте [GitHub](https://github.com/discourse/discourse/commits/main). + - Ознакомьтесь с новинками в [примечаниях к выпуску](https://releases.discourse.org/changelog/%{new_version}) - - На форуме [meta.discourse.org](https://meta.discourse.org) вы найдете актуальные новости, обсуждения и оперативную техническую поддержку по Discourse. + - Посетите [meta.discourse.org](https://meta.discourse.org) для новостей, обсуждений и поддержки Discourse new_version_mailer_with_notes: title: "Выход новой версии (с описанием)" subject_template: "[%{email_prefix}] Вышло обновление" text_body_template: | - Ура! Вышла свежая версия [Discourse](https://www.discourse.org)! + Ура, вышла новая версия [Discourse](https://www.discourse.org)! - Установленная версия: %{installed_version} + Твоя версия: %{installed_version} Новая версия: **%{new_version}** - - Обновитесь, используя наш способ онлайн-обновления **[в один клик](%{base_url}/admin/update)**. + - Обновись, используя наше простое **[обновление браузера одним кликом](%{base_url}/admin/update)** - - Посмотрите, что появилось в последней версии: либо на [нашем сайте](https://meta.discourse.org/tag/release-notes), либо на сайте [GitHub](https://github.com/discourse/discourse/commits/main). + - Узнай, что нового в [заметках о выпуске](https://releases.discourse.org/changelog/%{new_version}) - - На форуме [meta.discourse.org](https://meta.discourse.org) вы найдете актуальные новости, обсуждения и оперативную техническую поддержку по Discourse. + - Посети [meta.discourse.org](https://meta.discourse.org) для новостей, обсуждений и поддержки Discourse - ### Что нового + ### Заметки о выпуске %{notes} flag_reasons: @@ -3170,11 +3229,13 @@ ru: illegal: "Публикация помечена как **незаконный контент**: сообщество считает, что она может нарушать закон." spam: "Ваше сообщение расценено как **спам**. Сообщество считает, что ваше сообщение не имеет отношения к теме, не является актуальным и носит рекламный характер." notify_moderators: "Ваше сообщение расценено как **требующее внимания модератора**. Сообщество считает, что сообщение требует отдельного внимания персонала." + needs_approval: "Ваш пост был помечен **для утверждения**: он автоматически поставлен в очередь на проверку сотрудником, чтобы убедиться, что он соответствует [нашим правилам сообщества](%{base_path}/guidelines)." responder: off_topic: "Сообщение расценено как **офтопик**. Сообщество считает, что сообщение **не относится к теме**, учитывая заголовок темы и содержание первого сообщения." inappropriate: "Сообщество считает сообщение **неприемлемым**, т. е. оскорбительным, непристойным, разжигающим ненависть или нарушающим [рекомендации для сообщества](%{base_path}/guidelines)." spam: "Сообщение расценено как **спам**. Сообщество считает, что сообщение не имеет отношения к теме, не является актуальным и носит рекламный характер." notify_moderators: "Сообщение расценено как **требующее внимания модератора**. Сообщество считает, что сообщение требует отдельного внимания персонала." + needs_approval: "Сообщение было помечено **для утверждения**: оно автоматически поставлено в очередь на проверку сотрудником, чтобы убедиться, что оно соответствует [нашим правилам сообщества](%{base_path}/guidelines)." flags_dispositions: agreed: "Спасибо за информацию. Мы согласны, что это проблема, и уже рассматриваем её." agreed_and_deleted: "Спасибо за информацию. Мы согласны с вами и уже удалили сообщение." @@ -3198,6 +3259,7 @@ ru: contents_hidden: "Откройте сообщение, чтобы увидеть его содержимое." post_hidden: title: "Сообщение скрыто" + preview: "Сообщение скрыто из-за жалоб пользователей." subject_template: "Сообщение скрыто из-за жалоб от сообщества" text_body_template: | Здравствуйте! @@ -3259,6 +3321,7 @@ ru: Модераторы %{site_name} post_hidden_again: title: "Сообщение снова скрыто" + preview: "Сообщение снова скрыто участниками сообщества." subject_template: "Сообщение скрыто из-за жалоб от сообщества, персонал уведомлен" text_body_template: | Здравствуйте! @@ -3743,6 +3806,7 @@ ru: Подробнее смотрите в [рекомендациях для сообщества](%{base_url}/guidelines). too_many_spam_flags: title: "Слишком много жалоб на спам от пользователя" + preview: "Сообщения временно скрыты из-за пометки как спам." subject_template: "Новый аккаунт временно заблокирован" text_body_template: | Здравствуйте! @@ -3765,6 +3829,7 @@ ru: Подробнее смотрите в [рекомендациях для сообщества](%{base_url}/guidelines). silenced_by_staff: title: "Заморозка персоналом" + preview: "Учетная запись временно заблокирована." subject_template: "Аккаунт временно заблокирован" text_body_template: | Здравствуйте! @@ -3777,9 +3842,27 @@ ru: user_automatically_silenced: title: "Автоматическая заморозка пользователя" subject_template: "Новый пользователь %{username} заморожен из-за жалоб сообщества" + text_body_template: | + Это автоматическое сообщение. + + Новый пользователь [%{username}](%{user_url}) был автоматически заблокирован. + + Пожалуйста, [просмотрите флаги](%{base_url}/review). Если %{username} был ошибочно заблокирован от публикации, нажмите кнопку «Разблокировать» на [странице администратора для этого пользователя](%{user_url}). + + Этот порог можно изменить в настройках сайта `silence_new_user`. user_automatically_silenced_with_reason: title: "Автоматическая заморозка пользователя" subject_template: "Новый пользователь %{username} заморожен из-за жалоб сообщества" + text_body_template: | + Это автоматическое сообщение. + + Новый пользователь [%{username}](%{user_url}) был автоматически заблокирован. + + Причина - %{reason} + + Пожалуйста, [просмотрите флаги](%{base_url}/review). Если %{username} был ошибочно заблокирован от публикации, нажмите кнопку «Разблокировать» на [странице администратора для этого пользователя](%{user_url}). + + Этот порог можно изменить в настройках сайта `silence_new_user`. spam_post_blocked: title: "Спам заблокирован" subject_template: "Сообщения нового пользователя %{username} заблокированы из-за повторяющихся ссылок" @@ -3836,6 +3919,9 @@ ru: Здравствуйте! Сообщения от новых пользователей были переданы на проверку и ожидают рассмотрения. [Утвердите или отклоните их](%{base_url}/review?type=ReviewableQueuedPost). + user_posts_deleted: + title: "Сообщения пользователя удалены" + subject_template: "Все сообщения пользователя %{user}были удалены." unsubscribe_link: | [Нажмите сюда](%{unsubscribe_url}), чтобы отписаться от таких писем. unsubscribe_link_and_mail: | @@ -3953,6 +4039,7 @@ ru: %{respond_instructions} user_replied: title: "Пользователь ответил" + preview: "Кто-то ответил на ваш пост." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3975,6 +4062,7 @@ ru: %{respond_instructions} user_quoted: title: "Пользователь процитирован" + preview: "Кто-то процитировал вас в своём посте." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3986,6 +4074,7 @@ ru: %{respond_instructions} user_linked: title: "Ссылка на сообщение пользователя" + preview: "Ссылка на этот пост есть в другой теме." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3997,6 +4086,7 @@ ru: %{respond_instructions} user_mentioned: title: "Пользователь упомянут" + preview: "Кто-то упомянул вас в посте." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -4052,6 +4142,7 @@ ru: %{respond_instructions} user_posted: title: "Публикация пользователем сообщения" + preview: "Кто-то ответил на тему, за которой вы следите." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -4085,6 +4176,7 @@ ru: %{respond_instructions} user_posted_pm: title: "Отправка пользователем личного сообщения" + preview: "Вам кто-то отправил личное сообщение." subject_template: "[%{email_prefix}] [PM] %{topic_title}" text_body_template: | %{header_instructions} @@ -4153,6 +4245,12 @@ ru: account_second_factor_disabled: title: "Двухфакторная аутентификация отключена" subject_template: "[%{email_prefix}] Двухфакторная аутентификация отключена" + text_body_template: | + Двухфакторная аутентификация отключена в вашей учетной записи по адресу %{site_name}. Теперь вы можете войти в систему, используя только свой пароль; дополнительный код аутентификации больше не требуется. + + Если вы не отключили двухфакторную аутентификацию (2FA), возможно, кто-то взломал вашу учетную запись. + + Если у вас возникнут вопросы, [свяжитесь с нашими дружелюбными сотрудниками](%{base_url}/about). digest: why: "Краткая сводка по %{site_link} с %{since}" since_last_visit: "Что нового появилось за время вашего отсутствия:" @@ -4173,6 +4271,7 @@ ru: preheader: "Краткая сводка с %{since}" forgot_password: title: "Восстановление забытого пароля" + preview: "Сбросить пароль." subject_template: "[%{email_prefix}] Восстановление пароля" text_body_template: | Кто-то попросил сбросить пароль на сайте [%{site_name}](%{base_url}). @@ -4194,6 +4293,7 @@ ru: %{base_url}/session/email-login/%{email_token} set_password: title: "Установка пароля" + preview: "Установить пароль для учетной записи." subject_template: "[%{email_prefix}] Установка пароля" text_body_template: | Кто-то попросил добавить пароль к вашему аккаунту на сайте [%{site_name}](%{base_url}). Сейчас вы можете входить в систему с помощью поддерживаемого онлайн-сервиса (Google, Facebook и т. д.), связанного с этим подтверждённым адресом электронной почты. @@ -4204,6 +4304,7 @@ ru: %{base_url}/u/password-reset/%{email_token} admin_login: title: "Вход администратора" + preview: "Запрошен вход в систему администратора." subject_template: "[%{email_prefix}] Вход" text_body_template: | Кто-то попросил войти под вашим аккаунтом на сайт [%{site_name}](%{base_url}). @@ -4214,6 +4315,7 @@ ru: %{base_url}/session/email-login/%{email_token} account_created: title: "Аккаунт создан" + preview: "Для вас создан новый аккаунт." subject_template: "[%{email_prefix}] Ваш новый аккаунт" text_body_template: | Для вас был создан новый аккаунт на сайте %{site_name}. @@ -4262,6 +4364,7 @@ ru: %{base_url}/u/confirm-old-email/%{email_token} notify_old_email: title: "Уведомление на старый адрес электронной почты" + preview: "Адрес электронной почты обновлен." subject_template: "[%{email_prefix}] Ваш адрес электронной почты был изменён" text_body_template: | Это автоматическое сообщение о том, что ваш адрес электронной почты для сайта @@ -4284,6 +4387,7 @@ ru: %{new_email} signup_after_approval: title: "Оповещение после одобрения аккаунта" + preview: "Новый аккаунт одобрен." subject_template: "Ваш аккаунт на сайте %{site_name} одобрен!" text_body_template: | Добро пожаловать на сайт %{site_name}! @@ -4309,6 +4413,7 @@ ru: %{reject_reason} signup: title: "Регистрация" + preview: "Подтвердите свою учетную запись." subject_template: "[%{email_prefix}] Подтверждение нового аккаунта" text_body_template: | Добро пожаловать на сайт %{site_name}! @@ -4331,6 +4436,7 @@ ru: Если ссылка выше не активна, попробуйте скопировать и вставить её в адресную строку браузера. suspicious_login: title: "Оповещение о новом входе" + preview: "Проверьте ваше устройство." subject_template: "[%{site_name}] Новый вход на сайт (место: %{location})" text_body_template: | Здравствуйте! @@ -4361,7 +4467,9 @@ ru: popular_topics: "Популярные темы" recent_topics: "Недавние темы" see_more: "Ещё" + search_title: "Попробуйте воспользоваться поиском?" search_button: "Искать" + placeholder: "Поиск тем по названию или ключевым словам…" offline: title: "Не удаётся загрузить приложение" offline_page_message: "Вы не в сети. Проверьте сетевое подключение и попробуйте снова." @@ -4370,6 +4478,7 @@ ru: upload: edit_reason: "изображения скачаны и сохранены локально" unauthorized: "Вы не можете загрузить файл данного типа (разрешённые типы файлов: %{authorized_extensions})." + images_only: "К сожалению, в этом режиме можно загружать только изображения." pasted_image_filename: "Имя файла изображения" store_failure: "Ошибка при загрузке #%{upload_id} для пользователя #%{user_id}." file_missing: "Необходимо указать файл для загрузки." @@ -4457,6 +4566,8 @@ ru: latte_theme_name: "Латте" summer_theme_name: "Летняя" dark_rose_theme_name: "Тёмная роза" + errors: + cannot_edit_remote_copies: "Внесение изменений в удаленные копии цветовых палитр запрещено." edit_this_page: "Отредактировать эту страницу" csv_export: boolean_yes: "Да" @@ -4912,6 +5023,8 @@ ru: nice_share: name: Славный пиар description: Поделился сообщением с 25 уникальными посетителями + long_description: | + Этот значок присваивается за распространение ссылки, по которой перешли 25 уникальных сторонних посетителей. Спасибо за распространение информации о наших обсуждениях и этом сообществе. good_share: name: Хороший пиар description: Поделился сообщением с 300 уникальными посетителями @@ -5395,9 +5508,13 @@ ru: reject_and_delete: title: "Отклонить и удалить сообщение" complete: "Публикация отклонена и удалена." + reject_and_delete_standalone: + title: "Нет, удалите сообщение." reject_and_keep_deleted: title: "Оставить сообщение удаленным" complete: "Публикация отклонена и останется удаленной." + reject_and_keep_deleted_standalone: + title: "Нет, оставьте сообщение удаленным." approve_and_restore: title: "Да" complete: "Публикация одобрена и восстановлена." @@ -5422,6 +5539,10 @@ ru: title: "Восстановить сообщение" description: "Восстановить этот удаленный пост" complete: "Публикация восстановлена" + edit_post: + title: "Редактировать сообщение" + description: "Отредактировать содержимое этой записи" + complete: "Сообщение отредактировано" user_actions: bundle_title: "Что вы хотите сделать с пользователем?" silence_user: @@ -5492,6 +5613,8 @@ ru: invalid_tag_group: "имеет недопустимую группу тегов: %{tag_group_name}" discourse_id: already_registered: "Этот сайт уже зарегистрирован с Discourse ID" + errors: + regenerate_failed: "Не удалось восстановить учетные данные. Пожалуйста, попробуйте позже." activemodel: errors: <<: *errors diff --git a/config/locales/server.sk.yml b/config/locales/server.sk.yml index 3e8f38ec7fa01..c3b7d11b17fbf 100644 --- a/config/locales/server.sk.yml +++ b/config/locales/server.sk.yml @@ -1361,9 +1361,10 @@ sk: description: "Zoznam stavov vlajok vrátane typu vlajky, plagátu, vlajky a času na vyriešenie." visits: title: "Používateľské návštevy" - xaxis: "Deň" + xaxis: + desktop: "Desktop" + mobile: "Mobil" yaxis: "Počet návštev" - description: "Počet návštev prihlásených používateľov." signups: title: "Registrácie" xaxis: "Deň" @@ -1425,10 +1426,8 @@ sk: description: "Zobrazenia stránok prihlásených používateľov, anonymných používateľov, známych prehľadávačov a inej návštevnosti." description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "DAU/MAU" xaxis: "Deň" yaxis: "DAU/MAU" - description: "Počet členov, ktorí sa prihlásili za posledný deň, vydelený počtom členov, ktorí sa prihlásili za posledný mesiac - vráti %, ktoré udáva \"priľnavosť\" komunity. Snažte sa dosiahnuť > 20 %." daily_engaged_users: title: "Denne zapojení používatelia" xaxis: "Deň" @@ -2319,7 +2318,6 @@ sk: group_in_subject: "Nastavenie %%{optional_pm} v predmete e-mailu na názov prvej skupiny v PM, pozri: Prispôsobenie formátu predmetu pre štandardné e-maily" allow_anonymous_mode: "Povoľte používateľom možnosť prepnúť na anonymný režim odosielania príspevkov. Keď je táto možnosť aktivovaná, používatelia sa môžu rozhodnúť, že ich identita bude pri vytváraní príspevkov alebo tém na celom webe skrytá. Pozrite si tiež časť `povoliť anonymné lajky`." anonymous_account_duration_minutes: "Každých N minút vytvor nový anonymný účet na ochranu používateľskej anonymity. Príklad: Ak je nastavené na 600, akonáhle uplynie 600 minút od posledného príspevku A používateľ prepne do anonymného režimu, vytvorí sa nový anonymný účet." - hide_user_profiles_from_public: "Vypnúť používateľské karty, profily a adresár pre anonymných používateľov." hide_new_user_profiles: "Skryť používateľské profily úrovne 1 alebo nižšej pred verejnými používateľmi a používateľmi úrovne 1 dôveryhodnosti, kým nepridajú prvý príspevok. Táto funkcia je bezpodmienečne zakázaná na stránkach must_approve_users a iba na pozvaných stránkach." allow_users_to_hide_profile: "Umožniť používateľom skryť svoj profil a prítomnosť" hide_user_activity_tab: "Skryť kartu aktivity v používateľských profiloch okrem profilov administrátora a seba." @@ -3106,35 +3104,9 @@ sk: new_version_mailer: title: "Nová verzia Mailer" subject_template: "[%{email_prefix}] Nová verzia Discourse, k dispozícii je aktualizácia" - text_body_template: | - Hurá, nová verzia [Discourse](https://www.discourse.org) je k dispozícii! - - Vaša verzia: %{installed_version} - Nová verzia: **%{new_version}** - - - Aktualizujte pomocou nášho jednoduchého **[jednoklikového aktualizátora v prehliadači](%{base_url}/admin/update)** - - - Zistite, čo je nové v [poznámkach k vydaniu](https://meta.discourse.org/tag/release-notes) alebo si pozrite [surový GitHub changelog](https://github.com/discourse/discourse/commits/main) - - - Navštívte [meta.discourse.org](https://meta.discourse.org) pre novinky, diskusiu a podporu pre Discourse new_version_mailer_with_notes: title: "Nová verzia Mailer s poznámkami" subject_template: "[%{email_prefix}] k dispozícii je aktualizácia" - text_body_template: | - Hurá, nová verzia [Discourse](https://www.discourse.org) je k dispozícii! - - Vaša verzia: %{installed_version} - Nová verzia: **%{new_version}** - - - Aktualizujte pomocou nášho jednoduchého **[jednoklikového aktualizátora v prehliadači](%{base_url}/admin/update)** - - - Zistite, čo je nové v [poznámkach k vydaniu](https://meta.discourse.org/tag/release-notes) alebo si pozrite [surový GitHub changelog](https://github.com/discourse/discourse/commits/main) - - - Navštívte [meta.discourse.org](https://meta.discourse.org) pre novinky, diskusiu a podporu pre Discourse - - ### Poznámky k vydaniu - - %{notes} flag_reasons: off_topic: "Váš príspevok bol označený ako \"mimo-témy\": komunita cíti, že nie je vhodný do témy tak, ako je definovaná nadpisom a prvým príspevkom" inappropriate: "Váš príspevok bol označený ako **nevhodný**: komunita ho považuje za urážlivý, hanlivý, nenávistný alebo za porušenie [našich pravidiel komunity](%{base_path}/pravidlá)." diff --git a/config/locales/server.sl.yml b/config/locales/server.sl.yml index ea91739c68369..364559c36942f 100644 --- a/config/locales/server.sl.yml +++ b/config/locales/server.sl.yml @@ -591,6 +591,10 @@ sl: labels: flag: Tip poster: Odgovarja + visits: + xaxis: + desktop: "Namizno" + mobile: "Mobilno" consolidated_page_views: labels: post: Prispevek diff --git a/config/locales/server.sq.yml b/config/locales/server.sq.yml index 47b2282926f7d..ee04678a3fdee 100644 --- a/config/locales/server.sq.yml +++ b/config/locales/server.sq.yml @@ -442,7 +442,8 @@ sq: flag: Lloji visits: title: "Vizitat e përdoruesit" - xaxis: "Ditë" + xaxis: + mobile: "Mobile" yaxis: "Numri i vizitave" signups: xaxis: "Ditë" diff --git a/config/locales/server.sr.yml b/config/locales/server.sr.yml index df5e2e3cfad11..0a2fc15815a3b 100644 --- a/config/locales/server.sr.yml +++ b/config/locales/server.sr.yml @@ -406,7 +406,6 @@ sr: digest_other_topics: "Maksimalan broj tema za prikazivanje u sekciji \"Novo u temama i kategorijama koje pratite\" rezimea email poruke." digest_min_excerpt_length: "Minimalna dužina isečka poruke u email rezimeu, u karakterima." email_link_color: "Boja linkova u HTML email porukama. Unesite ime boje ('blue') ili heksadecimalnu vrednost ('#0000FF'). " - hide_user_profiles_from_public: "Onemogući korisničke kartice, profile i direktorijume za anonimne korisnike." read_time_word_count: "Broj reči po minutu za računanje procenjenog vremena čitanja" display_name_on_posts: "Prikaži puno ime korisnika na njihovim porukama kao dodatak na @korisnicko_ime" show_time_gap_days: "Ako su dve poruke poslate sa ovoliko dana razmaka, prikaži vremensku razliku u temi." diff --git a/config/locales/server.sv.yml b/config/locales/server.sv.yml index a5c3f9bfea23a..674b242b13edb 100644 --- a/config/locales/server.sv.yml +++ b/config/locales/server.sv.yml @@ -1039,7 +1039,9 @@ sv: description: "Lista över flaggornas status, med typ av flagga, skribent, flaggare och tid för lösning." visits: title: "Användarbesök" - xaxis: "Dag" + xaxis: + desktop: "Skrivbord" + mobile: "Mobil" yaxis: "Antal besök" signups: title: "Registreringar" @@ -1086,10 +1088,8 @@ sv: yaxis: "Dag" description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "DAA/MAA" xaxis: "Dag" yaxis: "DAA/MAA" - description: "Antal medlemmar som loggade in den senaste dagen dividerat med antalet medlemmar som loggade in den senaste månaden - returnerar ett procenttal som indikerar forumets 'dragningskraft'. Sikta på > 20 %." daily_engaged_users: title: "Dagligen engagerade användare" xaxis: "Dag" @@ -1874,7 +1874,6 @@ sv: enable_category_group_moderation: "Tillåt att grupper modererar innehåll i specifika kategorier" group_in_subject: "Ställ in %%{optional_pm} i e-postämnet till namnet på den första gruppen i PM, se: Anpassa ämnesformat för standardmeddelanden" anonymous_account_duration_minutes: "Skapa ett nytt anonymt konto var N:e minut för varje användare för att skydda anonymiteten. Exempel: om detta ställs in till 600, så skapas ett nytt anonymt konto så snart som 600 minuter har gått sedan senaste inlägget OCH användaren väljer anon." - hide_user_profiles_from_public: "Inaktivera användarkort, användarprofiler och användarkataloger för anonyma användare." allow_users_to_hide_profile: "Tillåt att användare döljer sin profil och närvaro" hide_user_activity_tab: "Dölj aktivitetsfliken på användarprofiler utom för administratörer och användaren själv." allow_featured_topic_on_user_profiles: "Tillåt att användarna visar en länk till ett ämne från sitt användarkort och profil." diff --git a/config/locales/server.sw.yml b/config/locales/server.sw.yml index 08115ae99a124..d0bfaad249b75 100644 --- a/config/locales/server.sw.yml +++ b/config/locales/server.sw.yml @@ -530,7 +530,9 @@ sw: assigned: Imekabidhiwa visits: title: "Mtumiaji Ametembelea" - xaxis: "Siku" + xaxis: + desktop: "Eneo kazi la Kompyuta" + mobile: "Kifaa cha kiganjani" yaxis: "Idadi ya utembeleaji" signups: xaxis: "Siku" diff --git a/config/locales/server.te.yml b/config/locales/server.te.yml index d1e3ffe941a78..fa5f6842c3f02 100644 --- a/config/locales/server.te.yml +++ b/config/locales/server.te.yml @@ -689,7 +689,9 @@ te: time_to_resolution: రిజల్యూషన్ సమయం visits: title: "సభ్యుని గణాంకాలు" - xaxis: "రోజు" + xaxis: + desktop: "డెస్క్‌టాప్" + mobile: "మొబైల్" yaxis: "దర్శనాల సంఖ్య" signups: title: "సైన్అప్‌లు" @@ -732,7 +734,6 @@ te: site_traffic: yaxis: "రోజు" dau_by_mau: - title: "డిఏయూ/ఎంఏయూ" xaxis: "రోజు" yaxis: "డిఏయూ/ఎంఏయూ" daily_engaged_users: @@ -1459,7 +1460,6 @@ te: enable_category_group_moderation: "నిర్దిష్ట వర్గాలలోని కంటెంట్‌ను మోడరేట్ చేయడానికి సమూహాలను అనుమతించండి" group_in_subject: "PMలో మొదటి సమూహం పేరుకు లోబడి ఇమెయిల్‌లో %%{optional_pm} ని సెట్ చేయండి, చూడండి: ప్రామాణిక ఇమెయిల్‌ల కోసం సబ్జెక్ట్ ఆకృతిని అనుకూలీకరించండి" anonymous_account_duration_minutes: "అనామకతను రక్షించడానికి ప్రతి వినియోగదారు కోసం ప్రతి N నిమిషాలకు కొత్త అనామక ఖాతాను సృష్టించండి. ఉదాహరణ: 600కి సెట్ చేస్తే, చివరి పోస్ట్ నుండి 600 నిమిషాలు గడిచిన వెంటనే మరియు వినియోగదారు anonకి మారిన వెంటనే, కొత్త అనామక ఖాతా సృష్టించబడుతుంది." - hide_user_profiles_from_public: "అనామక వినియోగదారుల కోసం వినియోగదారు కార్డ్‌లు, వినియోగదారు ప్రొఫైల్‌లు మరియు వినియోగదారు డైరెక్టరీని నిలిపివేయండి." allow_users_to_hide_profile: "వారి ప్రొఫైల్ మరియు ఉనికిని దాచడానికి సభ్యులను అనుమతించండి" hide_user_activity_tab: "అడ్మిన్ మరియు స్వీయ మినహా వినియోగదారు ప్రొఫైల్‌లలో కార్యాచరణ ట్యాబ్‌ను దాచండి." allow_featured_topic_on_user_profiles: "వినియోగదారులు వారి వినియోగదారు కార్డ్ మరియు ప్రొఫైల్‌లో ఒక అంశానికి లింక్‌ను ఫీచర్ చేయడానికి అనుమతించండి." diff --git a/config/locales/server.th.yml b/config/locales/server.th.yml index 19a2c0098844e..64662ddd89868 100644 --- a/config/locales/server.th.yml +++ b/config/locales/server.th.yml @@ -215,6 +215,9 @@ th: flags_status: labels: flag: ชนิด + visits: + xaxis: + mobile: "โทรศัพท์" consolidated_page_views: labels: post: โพส diff --git a/config/locales/server.tr_TR.yml b/config/locales/server.tr_TR.yml index b2c49d9aad2e0..0be5fb32ef13f 100644 --- a/config/locales/server.tr_TR.yml +++ b/config/locales/server.tr_TR.yml @@ -60,6 +60,8 @@ tr_TR: inline_oneboxer: topic_page_title_post_number: "#%{post_number}" topic_page_title_post_number_by_user: "%{username} tarafından #%{post_number}" + too_many_urls: "Tek bir istekte 10'dan fazla URL'yi satır içi tek kutulara dönüştüremezsiniz." + concurrency_not_allowed: "URL'leri satır içi tek kutulara dönüştürmek için eşzamanlı istekler kabul edilmez. Lütfen her seferinde tek bir istek gönderin." components: enabled_filter: "Etkin" disabled_filter: "Devre Dışı" @@ -142,6 +144,8 @@ tr_TR: invalid_type: "%{type} geçerli bir tür değil" humanize_not_valid_string_value: "JSON İşaretçisindeki \"%{property_json_pointer}\" özelliği bir dize olmalıdır." not_valid_string_value: "bir dize olmalıdır" + humanize_not_valid_datetime_value: "JSON Pointer '%{property_json_pointer}' konumundaki özellik geçerli bir tarih ve saat olmalıdır." + not_valid_datetime_value: "geçerli bir tarih ve saat olmalıdır" humanize_not_valid_integer_value: "JSON İşaretçisindeki \"%{property_json_pointer}\" özelliği bir tam sayı olmalıdır." not_valid_integer_value: "bir tam sayı olmalıdır" humanize_not_valid_float_value: "JSON İşaretçisindeki \"%{property_json_pointer}\" özelliği kayan noktalı sayı olmalıdır." @@ -256,6 +260,7 @@ tr_TR: errors: &errors format: ! "%{attribute} %{message}" format_with_full_message: "%{attribute}: %{message}" + diff_too_complex: "Fark çok karmaşık olduğundan güvenli bir şekilde hesaplanamıyor. Lütfen daha küçük düzenlemeler yapmayı deneyin." messages: invalid_locale: "%{invalid_locale} geçerli bir yerel ayar değil" too_long_validation: @@ -275,6 +280,7 @@ tr_TR: greater_than: '%{count} değerinden büyük olmalı' greater_than_or_equal_to: '%{count} değerine eşit veya bu değerden büyük olmalı' has_already_been_used: "zaten kullanılmış" + in: '%{count} içinde olmalıdır' inclusion: listeye dahil edilmemiş invalid: geçersiz is_invalid: "belirsiz görünüyor, bu tam bir cümle mi?" @@ -342,6 +348,7 @@ tr_TR: slow_down_crawler_user_agent_must_be_at_least_3_characters: "Kullanıcı aracıları, geçerli kullanıcıların yanlışlıkla sınırlandırılmasını önlemek için en az 3 karakter uzunluğunda olmalıdır." slow_down_crawler_user_agent_cannot_be_popular_browsers: "Ayara şu değerlerden herhangi birini ekleyemezsiniz: %{values}." strip_image_metadata_cannot_be_disabled_if_composer_media_optimization_image_enabled: "\"Besteci medya optimizasyonu görüntüsü etkin\" etkinleştirilmişse şerit görüntü meta verilerini devre dışı bırakamazsınız. Şerit görüntü meta verilerini devre dışı bırakmadan önce \"besteci medya optimizasyonu görüntüsü etkin\" seçeneğini devre dışı bırakın." + x_summary_large_image_no_svg: "Twitter için kullanılan X özet görüntüsü: görüntü meta verisi .svg görüntüsü olamaz." tl0_and_anonymous_flag: "Anonim kullanıcılar için ya \"site contact email\" ya da \"email address to report illegal content\" sağlanmalıdır." allow_likes_in_anonymous_mode_without_anonymous_mode_enabled: "Bu ayar öncelikle \"anonim moduna izin ver\" ayarının etkinleştirilmesini gerektiriyor." conflicting_google_user_id: 'Bu hesabın Google Hesap Kimliği değişti; güvenlik nedeniyle personelin müdahalesi gerekiyor. Lütfen personelle iletişime geçin ve onları
https://meta.discourse.org/t/76575adresine yönlendirin.' @@ -391,6 +398,7 @@ tr_TR: redemption_count_less_than_max: "%{max_redemptions_allowed} değerinden küçük olmalı." email_xor_domain: "E-posta ve alan adı alanlarına aynı anda izin verilmez" existing_user_success: "Davet başarıyla kullanıldı" + email_invites_disabled: "Davet e-postaları gönderme özelliği devre dışıdır" bulk_invite: file_should_be_csv: "Yüklenen dosya csv formatında olmalı." max_rows: "İlk %{max_bulk_invites} davet gönderildi. Dosyayı daha küçük parçalara bölmeyi deneyin." @@ -593,6 +601,7 @@ tr_TR: other: "Aynı anda en fazla %{count} e-posta alan adı sayılabilir" no_invites_with_discourse_connect: "DiscourseConnect etkinleştirildiğinde yalnızca kayıtlı kullanıcıları davet edebilirsiniz" no_invites_without_local_logins: "Yerel girişler devre dışı bırakıldığında yalnızca kayıtlı kullanıcıları davet edebilirsiniz" + update_existing_users_required: "Bu değişiklik %{count} mevcut grup üyesini etkiler. Yeni bildirim varsayılanlarını mevcut üyelere uygulayıp uygulamayacağınızı belirtmek için 'update_existing_users' parametresini (true veya false) belirtmeniz gerekir." default_names: everyone: "herkes" admins: "yöneticiler" @@ -791,6 +800,9 @@ tr_TR: email_already_used_in_group: "\"%{email}\" zaten \"%{group_name}\" grubu tarafından kullanılıyor." email_already_used_in_category: "\"%{email}\" zaten \"%{category_name}\" kategorisi tarafından kullanılıyor." description_incomplete: "Kategori açıklama yazısında en az bir paragraf bulunmalıdır." + description_too_long: + one: "Açıklama çok uzun (maksimum %{count} karakter)." + other: "Açıklama çok uzun (maksimum %{count} karakter)." permission_conflict: "Bir alt kategoriye erişmesine izin verilen herhangi bir grubun üst kategoriye erişmesine de izin verilmelidir. Aşağıdaki grupların alt kategorilerden birine erişimi bulunur, ancak üst kategoriye erişimi yoktur: %{group_names}." disallowed_topic_tags: "Bu konu, bu kategori tarafından izin verilmeyen etiketlere sahip: \"%{tags}\"" disallowed_tags_generic: "Bu konu izin verilmeyen etiketlere sahip." @@ -805,6 +817,12 @@ tr_TR: other: "Bu kategori silinemiyor çünkü %{count} konusu var. En eski konu: %{topic_link}." topic_exists_no_oldest: "Konu sayısı %{count} olduğu için bu kategori silinemiyor." uncategorized_description: "Kategoriye ihtiyaç duymayan veya mevcut başka bir kategoriye uymayan konular." + category_types: + not_available: "'%{type_name}' kategori türü mevcut değil" + discussion: + name: "Tartışma" + title: "tartışma" + description: "Konuşma için gerekli tüm unsurları içeren standart bir kategori." trust_levels: admin: "Yönetici" staff: "Personel" @@ -1030,6 +1048,7 @@ tr_TR: too_many_drafts: title: "Çok fazla taslak" description: "İzin verilen maksimum taslak sayısına ulaştınız. Lütfen [taslaklarınızdan] (%{base_url}/my/activity/drafts) bazılarını silin ve tekrar deneyin." + bulk_destroy_limit: "Bir seferde en fazla %{limit} taslak silebilirsiniz." draft_backup: pm_title: "Açık konulardaki Taslakları yedekle" pm_body: "Yedek taslak içeren konu" @@ -1127,11 +1146,17 @@ tr_TR: weekly: "haftalık" every_month: "her ay" every_six_months: "altı ayda bir" + calendar_subscriptions: + application_name: "Takvim Abonelikleri" user_api_key: + title: '"%{application_name}" için yetkilendirme' authorize: "Yetkilendir" deny: "İptal et" read: "oku" read_write: "oku/yaz" + logged_in_as: "olarak oturum açıldı" + permissions_header: 'Bu, "%{application_name}"in şunları yapmasına olanak tanıyacaktır:' + redirect_warning: "Yetkilendirme sizi şu adrese yönlendirecektir:" instructions: '"%{application_name}" ile kullanmanız için yeni bir kullanıcı API anahtarı oluşturduk, lütfen aşağıdaki anahtarı uygulamanıza yapıştırın:' otp_description: '"%{application_name}" uygulamasının bu siteye erişmesine izin vermek ister misiniz?' otp_confirmation: @@ -1211,9 +1236,11 @@ tr_TR: description: "Bayrak türü, gönderi sahibi, bayrak ekleyen kişi ve çözüme kadar geçen süre dahil olmak üzere bayrakların durumlarının listesi." visits: title: "Kullanıcı Ziyaretleri" - xaxis: "Gün" + xaxis: + desktop: "Masaüstü" + mobile: "Mobil" yaxis: "Ziyaret sayısı" - description: "Oturum açmış kullanıcı ziyaretlerinin sayısı." + description: "Cihaz türüne göre oturum açmış kullanıcı ziyaret sayısı." signups: title: "Kayıtlar" xaxis: "Gün" @@ -1256,6 +1283,8 @@ tr_TR: yaxis: "Gün" description: "Normal API anahtarları ve kullanıcı API anahtarları için API istekleri." consolidated_page_views_browser_detection: + title: "Tarayıcı Algılama ile Birleştirilmiş Sayfa Görüntülemeleri (Önerilen)" + title_legacy: "Tarayıcı Algılama ile Birleştirilmiş Sayfa Görüntülemeleri (Önerilen)" xaxis: page_view_anon_browser: "Anonim Tarayıcı" page_view_logged_in_browser: "Giriş Yapılmış Tarayıcı" @@ -1278,7 +1307,7 @@ tr_TR: title: "Günlük Aktif Kullanıcı/Aylık Aktif Kullanıcı" xaxis: "Gün" yaxis: "Günlük Aktif Kullanıcı/Aylık Aktif Kullanıcı" - description: "Son gün giriş yapan üye sayısı, son ay giriş yapan üye sayısına bölündüğünde topluluk \"yapışkanlığını\" gösteren bir % elde edilir. Hedefiniz >%20 olsun." + description: "Son gün geri dönen aylık aktif üyelerin oranı. Bu yüzde, kullanıcıların ne kadar düzenli olarak geri döndüklerini gösterir; topluluğun \"bağlılığı\" olarak da adlandırılır. Hedef > %20 olmalıdır." daily_engaged_users: title: "Günlük Etkileşimli Kullanıcılar" xaxis: "Gün" @@ -1563,11 +1592,15 @@ tr_TR: labels: provider: Giriş sağlayıcısı no_accounts: "İlişkili hesap yok" + discourse_connect: "Discourse Connect üzerinden SSO" + no_sso_accounts: "SSO kaydı olmayan hesaplar" + total_users: "Toplam aktif kullanıcı hesabı" description: "Giriş sağlayıcısına göre gruplandırılmış ilişkili hesap sayısını gösterin. Yalnızca sosyal giriş yöntemleri etkinleştirildiğinde geçerlidir." dashboard: problem: twitter_login: 'Twitter ile giriş şu anda çalışmıyor gibi görünüyor. Site Ayarları bölümünden giriş bilgilerini kontrol edin.' group_email_credentials: '%{group_full_name}grubu için e-posta giriş bilgileriyle ilgili bir sorun vardı. Bu sorun giderilene kadar grup gelen kutusundan hiçbir e-posta gönderilmeyecek. %{error}' + upcoming_change_stable_opted_out: 'Siteniz "%{upcoming_change}" yaklaşan değişiklikten vazgeçmiştir. Bu değişiklik artık "Kararlı" durumuna ulaşmıştır ve yakında kaldırılabilir veya kalıcı hale getirilebilir. Bu değişiklikle ilgili ayrıntıları incelemek için yaklaşan değişiklikler sayfasını ziyaret edin.' rails_env: "Sunucunuz %{env} modunda çalışıyor." host_names: "config/database.yml dosyanız varsayılan localhost sunucu adını kullanıyor. Sitenizin sunucu adını kullanmak için bunu güncelleyin." sidekiq: 'Sidekiq çalışmıyor. E-posta göndermek gibi birçok görev Sidekiq tarafından eş zamansız olarak yürütülür. Lütfen en az bir Sidekiq işleminin çalıştığından emin olun. Sidekiq hakkında buradan bilgi edinin.' @@ -1588,6 +1621,7 @@ tr_TR: one: "E-posta yoklaması son 24 saat içinde bir hata oluşturdu. Daha fazla ayrıntı için günlüklere bakın." other: "E-posta yoklaması son 24 saat içinde %{count} hata oluşturdu. Daha fazla ayrıntı için günlüklere bakın." missing_mailgun_api_key: "Sunucu Mailgun aracılığıyla e-posta gönderecek şekilde yapılandırılmış ancak web kancası mesajlarını doğrulamak için kullanılan bir API anahtarı sağlamadınız." + qq_mail_smtp: "SMTP sunucunuz (%{smtp_address}) Discourse ile yinelenen e-postalara neden olduğu bilinmektedir. QQ Mail doğru onayları geri göndermediğinden, Discourse zaten başarılı olan gönderimleri yeniden dener. Önerilen alternatiflere bakın." bad_favicon_url: "Favicon yüklenemiyor. Site Ayarları bölümünden favicon ayarınızı kontrol edin." poll_pop3_timeout: "POP3 sunucusuna bağlantı zaman aşımına uğruyor. Gelen e-posta alınamadı. Lütfen POP3 ayarlarınızı ve hizmet sağlayıcınızı kontrol edin." poll_pop3_auth_error: "POP3 sunucusuna bağlantı bir kimlik doğrulama hatasıyla başarısız oluyor. Lütfen POP3 ayarlarınızı kontrol edin." @@ -1599,6 +1633,7 @@ tr_TR: category_style_deprecated: "Discourse'unuz şu anda Discourse 3.2'nin son beta sürümünden önce kaldırılacak olan kullanımdan kaldırılmış bir kategori stili kullanıyor. Seçtiğiniz kategori stilini nasıl koruyacağınıza ilişkin talimatlar için lütfen Tek Kategori Stili Site Ayarına Geçme bölümüne bakın." maxmind_db_configuration: 'Sunucu, ters IP aramaları için MaxMind veri tabanlarını kullanacak şekilde yapılandırıldı ancak geçerli bir MaxMind hesap kimliği yapılandırılmadı, bu da MaxMind veri tabanlarının gelecekte indirilememesine neden olabilir. Daha fazla bilgi için bu kılavuza bakın.' admin_sidebar_deprecation: "Eski yönetici düzeni, yeni kenar çubuğu düzeni lehine kullanımdan kaldırıldı ve bir sonraki sürümde kaldırılacak. Bundan önce katılmak için şimdi yeni kenar çubuğu düzenini yapılandırabilirsiniz." + starttls_disabled: "Giden e-posta yapılandırmasında STARTTLS devre dışı bırakılmıştır. Bu neredeyse hiçbir zaman gerekli değildir. Ortamınızdan
DISCOURSE_SMTP_ENABLE_START_TLS=false
öğesini kaldırmayı düşünün. Daha fazla ayrıntı için lütfen bu konuya bakın." back_from_logster_text: "Siteye geri dön" site_settings: allow_bulk_invite: "Bir CSV dosyası yükleyerek toplu davetlere izin verin" @@ -1643,6 +1678,7 @@ tr_TR: allow_duplicate_topic_titles_category: "Kategori farklıysa aynı, yinelenen başlıklara sahip konulara izin verin. allow_duplicate_topic_titles devre dışı bırakılmalıdır." unique_posts_mins: "Bir kullanıcının aynı içeriğe sahip bir gönderiyi tekrar yapabilmesi için kaç dakika geçmesi gerektiği" educate_until_posts: "Kullanıcı ilk (n) yeni gönderisini yazmaya başladığında, oluşturucuda açılır yeni kullanıcı eğitim panelini gösterin." + title: "Bu sitenin adı. Anonim kullanıcılar dahil tüm ziyaretçiler tarafından görülebilir. Bu başlığı değiştirdiğinizde, PWA kullanıcılarına uygulamayı güncellemeleri veya kaldırmaları istenen bir uyarı gönderilebileceğini unutmayın." site_description: "Bu siteyi bir cümleyle tanımlayın. Anonim kullanıcılar dahil tüm ziyaretçiler tarafından görülebilir." short_site_description: "Birkaç kelimelik kısa açıklama. Anonim kullanıcılar dahil tüm ziyaretçiler tarafından görülebilir." contact_email: "Bu siteden sorumlu kilit kişinin e-posta adresi. Kritik bildirimler için kullanılır ve ayrıca acil konular için /about adresinde gösterilir. Herkese açık sitelerdeki anonim kullanıcılara görünür." @@ -1650,6 +1686,7 @@ tr_TR: crawl_images: "Doğru genişlik ve yükseklik boyutlarını eklemek için uzak URL'lerden görüntüleri alın." download_remote_images_to_local: "Uzak (hotlink'li) görüntüleri indirerek yerel görüntülere dönüştürün; Bu işlem, görüntüler gelecekte uzak siteden kaldırılsa bile içeriği korur." download_remote_images_threshold: "Uzak görüntüleri yerel olarak indirmek için gereken minimum disk alanı (yüzde olarak)" + disabled_image_download_domains: "Bu alan adlarından uzaktaki görüntüler asla indirilmeyecektir." block_hotlinked_media: "Kullanıcıların gönderilerine uzak (hotlink'li) medya eklemesini engelleyin. \"download_remote_images_to_local\" aracılığıyla indirilmeyen uzak medya, bir yer tutucu bağlantıyla değiştirilir." block_hotlinked_media_exceptions: "block_hotlinked_media ayarından muaf olan temel URL'lerin bir listesi. Protokolü dahil edin (örn. https://example.com)." editing_grace_period: "Gönderdikten sonra (n) saniye boyunca düzenleme, gönderi geçmişinde yeni bir sürüm oluşturmaz." @@ -1685,9 +1722,12 @@ tr_TR: max_oneboxes_per_post: "Tek bir gönderiye dâhil edilebilecek maksimum onebox sayısını ayarlayın. Onebox'lar gönderi içindeki bağlantılı içeriğin ön izlemesini sağlar." facebook_app_access_token: "Facebook uygulama kimliğinizden ve gizli dizinizden oluşturulan bir belirteç. Instagram onebox'ları oluşturmak için kullanılır." github_onebox_access_tokens: "Bir GitHub kuruluşunun veya kullanıcısının, özel depolar, taahhütler, çekme istekleri, sorunlar ve dosya içerikleri için GitHub onebox'ları oluşturma amacıyla kullanılan bir GitHub erişim belirteciyle eşleştirilmesi. Bu olmadan, yalnızca genel GitHub URL'leri onebox'lanır." + reddit_onebox_client_id: "Kimlik doğrulaması yapılmış Reddit onebox'lar için kullanılan Reddit API OAuth istemci kimliği. Kimlik bilgilerini almak için reddit.com/prefs/apps adresinde 'script' türünde bir uygulama oluşturun." + reddit_onebox_client_secret: "Reddit API OAuth istemci gizli anahtarı, kimliği doğrulanmış Reddit onebox'lar için kullanılır. reddit.com/prefs/apps adresinde oluşturulan 'script' türü uygulama altında bulunur." logo: "Sitenizin sol üst köşesindeki logo görüntüsü. Yüksekliği 120 ve en boy oranı 3:1'den büyük olan geniş dikdörtgen bir görüntü kullanın. Boş bırakılırsa site başlığı metni gösterilecektir." logo_small: "Sitenizin sol üst köşesinde, aşağı kaydırırken görülen küçük logo görüntüsü. 120 × 120 boyutlarında kare bir görüntü kullanın. Boş bırakılırsa bir ana sayfa glifi gösterilecektir." digest_logo: "Sitenizin e-posta özetinin üst kısmında kullanılan alternatif logo görüntüsü. Geniş bir dikdörtgen görüntü kullanın. SVG görüntüsü kullanmayın. Boş bırakılırsa \"logo\" ayarındaki görüntü kullanılır." + mobile_logo: "Sitenizin mobil sürümünde kullanılan logo. Başlığı kalabalıklaştırmamak için kare bir simge kullanmanızı öneririz, ancak yüksekliği 120 ve en boy oranı 3:1'den büyük olan geniş bir dikdörtgen resim de kullanabilirsiniz. Boş bırakılırsa, logo ayarındaki resim kullanılır." logo_dark: "\"Logo\" site ayarı için koyu şema alternatifi." logo_small_dark: "\"Küçük logo\" site ayarı için koyu şema alternatifi." mobile_logo_dark: "\"Mobil logo\" site ayarı için koyu şema alternatifi." @@ -1695,11 +1735,15 @@ tr_TR: manifest_icon: "Android'de logo/splash görüntüsü olarak kullanılan görüntü. Otomatik olarak 512 × 512 olarak yeniden boyutlandırılır. Boş bırakılırsa large_icon kullanılır." manifest_screenshots: "Kurulum istemi sayfasında örneğinizin özelliklerini ve işlevselliğini gösteren ekran görüntüleri. Tüm görüntüler yerel yüklemeler olmalı ve aynı boyutlarda olmalıdır." favicon: "Siteniz için bir favicon, bkz. https://en.wikipedia.org/wiki/Favicon. CDN üzerinden düzgün çalışması için png olmalıdır. 32x32 olarak yeniden boyutlandırılır. Boş bırakılırsa large_icon kullanılır." + apple_touch_icon: "Apple dokunmatik cihazlar için kullanılan simge. Şeffaf arka plan kullanılması önerilmez. Otomatik olarak 180x180 boyutuna yeniden boyutlandırılır. Boş bırakılırsa, large_icon kullanılır." opengraph_image: "Varsayılan opengraph görüntüsü, sayfada başka uygun görüntü olmadığında kullanılır. Boş bırakılırsa large_icon kullanılır" x_summary_large_image: "Twitter kartı \"özet büyük görüntü\" (en az 280 genişliğinde ve en az 150 yüksekliğinde olmalıdır, .svg olamaz). Boş bırakılırsa .svg olmadığı sürece opengraph_image kullanılarak normal kart meta verileri oluşturulur" notification_email: "Tüm temel sistem e-postalarını gönderirken kullanılan kimden: e-posta adresi. Burada belirtilen alan adının, e-postanın ulaşması için SPF, DKIM ve ters PTR kayıtlarının doğru şekilde ayarlanmış olması gerekir." + email_custom_headers: "Özel e-posta başlıklarının listesi" email_subject: "Standart e-postalar için özelleştirilebilir konu formatı. Bkz. https://meta.discourse.org/t/customizing-specific-system-email-templates/88323" detailed_404: "Kullanıcılara belirli bir konuya neden erişemedikleri hakkında daha fazla ayrıntı sağlar. Not: Bu daha az güvenlidir çünkü kullanıcılar bir URL'nin geçerli bir konuya bağlanıp bağlanmadığını bilir." + enforce_second_factor: "Kullanıcıların Discourse kullanıcı arayüzüne erişmeden önce iki faktörlü kimlik doğrulamayı (2FA) etkinleştirmelerini zorunlu kılın. Bu ayar, API veya 'DiscourseConnect sağlayıcı' kimlik doğrulamasını etkilemez. enforce_second_factor_on_external_auth etkinleştirilirse, kullanıcılar 2FA'yı kurduktan sonra harici kimlik doğrulama sağlayıcılarıyla oturum açamazlar." + enforce_second_factor_on_external_auth: "Kullanıcıların her zaman iki faktörlü kimlik doğrulama (2FA) kullanmasını zorunlu kılın. Etkinleştirildiğinde, bu özellik, 2FA'yı etkinleştirmiş olan kullanıcıların sosyal medya hesapları gibi harici kimlik doğrulama yöntemleriyle oturum açmasını engeller. Devre dışı bırakıldığında, kullanıcılar yalnızca kullanıcı adı ve şifre ile oturum açarken 2FA'yı onaylamaları gerekir. Ayrıca `enforce_second_factor` ayarına da bakın." force_https: "Sitenizi yalnızca HTTPS kullanmaya zorlayın. UYARI: HTTPS'nin tamamen kurulduğunu ve kesinlikle her yerde çalıştığını doğrulayana kadar bunu etkinleştirmeyin! CDN'nizi, tüm sosyal girişlerinizi ve tüm harici logoları / bağımlılıkları da HTTPS uyumlu olduklarından emin olmak için kontrol ettiniz mi?" summary_score_threshold: "Bir gönderinin \"Bu Konuyu Özetleyin\" bölümüne dahil edilmesi için gereken minimum puan" summary_posts_required: "\"Bu Konuyu Özetle\" etkinleştirilmeden önce bir konudaki minimum gönderi sayısı. Bu ayarda yapılan değişiklikler bir hafta içinde geriye dönük olarak uygulanır." @@ -1757,8 +1801,12 @@ tr_TR: ga_universal_domain_name: "Google Universal Analytics alan adı, ör.: mysite.com; bkz. https://google.com/analytics" ga_universal_auto_link_domains: "Google Universal Analytics çapraz alan izleme özelliğini etkinleştirin. Bu alan adlarına giden bağlantılara müşteri kimliği eklenecektir. Bkz. Google'ın Alan Adları Arası İzleme kılavuzu." gtm_container_id: "Google Etiket Yöneticisi kapsayıcı kimliği. ör: GTM-ABCD12E.
Not: İçerik Güvenliği Politikası (CSP) etkinleştirildiğinde GTM'yi kullanmak için meta ile ilgili belgelere bakın: Google Etiket Yöneticisi komut dosyalarında nonces kullanın." + google_site_verification_token: Google arama konsolu doğrulama jetonu. HTML başlığında meta etiketi olarak dahil edilecektir. enable_escaped_fragments: "Herhangi bir web veri gezgini algılanmazsa Google'ın Ajax Veri Gezgini API'sine geri dönün. Bkz. https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" + moderators_manage_categories: "Moderatörlerin kategori oluşturmasına ve yönetmesine izin ver" + moderators_manage_groups: "Moderatörlerin gruplar oluşturmasına ve yönetmesine izin ver" moderators_change_post_ownership: "Moderatörlerin gönderi sahipliğini değiştirmesine izin verin" + change_post_ownership_allowed_groups: "Bu gruplardaki kullanıcıların gönderi sahipliğini değiştirmesine izin ver" cors_origins: "Kökenler arası talepler (CORS) için izin verilen kökenler. Her köken http:// veya https:// içermelidir. CORS'u etkinleştirmek için DISCOURSE_ENABLE_CORS env değişkeni true olarak ayarlanmalıdır." use_admin_ip_allowlist: "Yöneticiler yalnızca Taranan IP'ler listesinde tanımlanan bir IP adresindelerse oturum açabilirler (Yönetici > Günlükler > Taranan IP'ler)." blocked_ip_blocks: "Discourse tarafından asla taranmaması gereken özel IP bloklarının bir listesi" @@ -1769,6 +1817,7 @@ tr_TR: blocked_crawler_user_agents: "Siteye erişmesine izin verilmemesi gereken web veri gezginlerini tanımlayan kullanıcı aracısı dizesinde büyük/küçük harfe duyarlı olmayan benzersiz kelime. İzin verilenler listesi tanımlanmışsa geçerli değildir." slow_down_crawler_user_agents: '"Tarayıcı hızını yavaşlat" ayarında yapılandırıldığı gibi hız sınırlandırılması gereken web veri gezginlerinin kullanıcı aracıları. Her değer en az 3 karakter uzunluğunda olmalıdır.' slow_down_crawler_rate: "slow_down_crawler_user_agents belirtilirse bu oran tüm veri gezginleri için geçerli olur (istekler arasındaki saniye gecikme sayısı)" + llms_txt: "LLM tarayıcıları için /llms.txt adresinde sunulacak bir metin dosyası yükleyin. Daha fazla bilgi için llmstxt.org adresini ziyaret edin." content_security_policy: "İçerik Güvenliği Politikasını (CSP) etkinleştirin. CSP, Siteler Arası Komut Dosyası Çalıştırma (XSS) ve veri enjeksiyonu da dâhil olmak üzere belirli saldırı türlerini önlemeye yardımcı olan ek bir güvenlik katmanıdır." content_security_policy_report_only: "Sadece-Raporla-İçerik-Güvenlik-Politikasını (CSP) Etkinleştir" content_security_policy_frame_ancestors: "CSP aracılığıyla bu siteyi iframe'lere kimlerin yerleştirebileceğini kısıtlayın. Gömme bölümünde izin verilen sunucuları kontrol edin" @@ -1798,6 +1847,7 @@ tr_TR: top_page_default_timeframe: "Anonim kullanıcılar için varsayılan üst sayfa zaman aralığı (oturum açmış kullanıcılar için son ziyaretlerine göre otomatik olarak ayarlanır)." moderators_view_emails: "Moderatörlerin kullanıcı e-posta adreslerini görüntülemelerine izin verin." moderators_view_ips: "Moderatörlerin kullanıcı IP adreslerini görüntülemelerine izin verin." + moderators_change_trust_levels: "Moderatörlerin kullanıcı güven düzeylerini değiştirmesine izin ver." prioritize_username_in_ux: "Kullanıcı sayfasında, kullanıcı kartında ve gönderilerde önce kullanıcı adını göster (devre dışı bırakıldığında önce ad gösterilir)" enable_rich_text_paste: "Besteciye metin yapıştırırken otomatik HTML'den Markdown'a dönüştürmeyi etkinleştirin." send_old_credential_reminder_days: "Günler sonra eski giriş bilgilerini hatırlatın" @@ -1808,6 +1858,8 @@ tr_TR: whispers_allowed_groups: "Belirli grupların üyeleri için konular dahilinde özel iletişime izin verin." hidden_post_visible_groups: "Bu grupların üyelerinin gizli gönderileri görmesine izin verin. Personel olan kullanıcılar, gizli gönderileri her zaman görüntüleyebilir." allow_index_in_robots_txt: "Robots.txt dosyasında bu sitenin web arama motorları tarafından dizine eklenmesine izin verildiğini belirtin. Robots.txt dosyanızı buradan geçersiz kılabilirsiniz. UYARI: Yanlış yapılandırılmış kurallar sitenizde beklendiği gibi gezinilmesini engelleyebilir." + blocked_email_domains: "Kullanıcıların hesap açmasına izin verilmeyen e-posta alan adlarının listesi. Alt alan adları, belirtilen alan adları için otomatik olarak işlenir. Joker karakterler * ve ? desteklenmez. Örnek: mailinator.com" + allowed_email_domains: "Kullanıcıların hesaplarını KAYDETMESİ GEREKEN e-posta alan adlarının listesi. Alt alan adları, belirtilen alan adları için otomatik olarak işlenir. Joker karakterler * ve ? desteklenmez. UYARI: Listede yer almayan e-posta alan adlarına sahip kullanıcılar kabul edilmeyecektir!" normalize_emails: "Normalleştirilmiş e-postanın benzersiz olup olmadığını kontrol edin. Normalleştirilmiş e-posta, kullanıcı adındaki tüm noktaları ve + ve @ sembolleri arasındaki her şeyi kaldırır." auto_approve_email_domains: "Bu alan adları listesinden e-posta adresleri olan kullanıcılar otomatik olarak onaylanır. Belirtilen alan adları için alt alan adları otomatik olarak işlenir. Joker karakter sembolleri olan * ve ? desteklenmez." hide_email_address_taken: "Kayıt sırasında veya şifremi unuttum akışı sırasında kullanıcıları belirli bir e-posta adresiyle bir hesabın var olduğu konusunda bilgilendirmeyin. \"Şifremi unuttum\" talepleri için tam e-postayı gerekli kılın." @@ -1841,6 +1893,7 @@ tr_TR: auth_overrides_email: "Her girişte yerel e-postayı harici site e-postasıyla geçersiz kılar ve yerel değişiklikleri önler. Tüm kimlik doğrulama sağlayıcıları için geçerlidir. (UYARI: yerel e-postaların normalleştirilmesi nedeniyle tutarsızlıklar oluşabilir)" auth_overrides_username: "Her girişte yerel kullanıcı adını harici site kullanıcı adıyla geçersiz kılar ve yerel değişiklikleri önler. Tüm kimlik doğrulama sağlayıcıları için geçerlidir. (UYARI: kullanıcı adı uzunluğu/gerekliliklerindeki farklılıklar nedeniyle tutarsızlıklar oluşabilir)" auth_overrides_name: "Her girişte yerel tam adı harici site tam adıyla geçersiz kılar ve yerel değişiklikleri önler. Tüm kimlik doğrulama sağlayıcıları için geçerlidir." + auth_overrides_avatar: "Her oturum açılışında yerel avatarı harici site avatarıyla geçersiz kılar ve yerel değişiklikleri engeller. Tüm kimlik doğrulama sağlayıcıları için geçerlidir." discourse_connect_overrides_avatar: "DiscourseConnect yükünden gelen değerle kullanıcı avatarını geçersiz kılar. Etkinleştirilirse kullanıcıların Discourse'a avatar yüklemelerine izin verilmez." discourse_connect_overrides_location: "Kullanıcı konumunu DiscourseConnect yükünden gelen değerle geçersiz kılar ve yerel değişiklikleri önler." discourse_connect_overrides_website: "DiscourseConnect yükünden gelen değer ile kullanıcı web sitesini geçersiz kılar ve yerel değişiklikleri önler." @@ -1852,6 +1905,7 @@ tr_TR: enable_local_logins_via_email: "Kullanıcıların kendilerine e-posta yoluyla gönderilecek tek tıklamayla giriş bağlantısını talep etmelerine izin verin." allow_new_registrations: "Yeni kullanıcı kayıtlarına izin verin. Herhangi birinin yeni bir hesap oluşturmasını önlemek için bunun işaretini kaldırın." enable_signup_cta: "Geri dönen anonim kullanıcılara bir hesap için kaydolmalarını isteyen bir bildirim gösterin." + enable_discourse_id: "Kullanıcıların tek bir hesapla birden fazla Discourse sitesine giriş yapabilmelerini sağlayan tek oturum açma hizmeti olan Discourse ID aracılığıyla kimlik doğrulamayı etkinleştirin. Google, Facebook, Apple ve GitHub gibi yaygın sosyal oturum açma sağlayıcıları ek yapılandırma gerektirmeden desteklenir. Daha fazla bilgi için id.discourse.com adresini ziyaret edin." enable_google_oauth2_logins: "Google Oauth2 kimlik doğrulamasını etkinleştirin. Bu, Google'ın şu anda desteklediği kimlik doğrulama yöntemidir. Anahtar ve gizli dizi gerektirir. Bkz. Discourse için Google girişini yapılandırma." google_oauth2_client_id: "Google uygulamanız tarafından sağlanan ve kimlik doğrulama işlemi için kullanılan benzersiz istemci kimliği." google_oauth2_client_secret: "Google uygulamanızın istemci gizli dizisi." @@ -1920,6 +1974,7 @@ tr_TR: invite_link_max_redemptions_limit_users: "Normal kullanıcılar tarafından oluşturulan davet bağlantıları için izin verilen maksimum kullanım sayısı bu değerden fazla olamaz." alert_admins_if_errors_per_minute: "Bir yönetici uyarısını tetiklemek için dakika başına hata sayısı. 0 değeri bu özelliği devre dışı bırakır. NOT: Yeniden başlatma gerektirir." alert_admins_if_errors_per_hour: "Bir yönetici uyarısını tetiklemek için saat başına hata sayısı. 0 değeri bu özelliği devre dışı bırakır. NOT: Yeniden başlatma gerektirir." + categories_topics: '/categories sayfasında gösterilecek konu sayısı. 0 olarak ayarlanırsa, iki sütunu simetrik tutmak için otomatik olarak bir değer ayarlanır. Yalnızca “kategoriler ve en son/en popüler konular” kategori sayfası stilleri için geçerlidir.' suggested_topics: "Bir konunun altında gösterilen önerilen konu sayısı." limit_suggested_to_category: "Önerilen konularda yalnızca geçerli kategorideki konuları gösterin." suggested_topics_max_days_old: "Önerilen konular n günden daha eski olmamalıdır." @@ -1946,6 +2001,7 @@ tr_TR: selectable_avatars_mode: "Kullanıcıların selectable_avatars listesinden bir avatar seçmesine izin verin ve özel avatar yüklemelerini seçilen güven seviyesiyle sınırlayın." selectable_avatars: "Kullanıcıların profil resimlerini seçebilecekleri bir avatar koleksiyonu belirtin. Seçim, kullanıcı profili oluşturma sırasında veya profil avatarı güncellenirken görünür." allow_all_attachments_for_group_messages: "Grup mesajları için tüm e-posta eklerine izin verin." + image_quality: "Sitenize yüklenen görüntülerin kalite düzeyini ayarlayın. Daha düşük kalite, daha küçük dosya boyutları ile sonuçlanır." png_to_jpg_quality: "Dönüştürülen JPG dosyasının kalitesi (1 en düşük kalite, 99 en iyi kalite, devre dışı bırakmak için 100)." recompress_original_jpg_quality: "Yüklenen görüntü dosyalarının kalitesi (1 en düşük kalite, 99 en iyi kalite, devre dışı bırakmak için 100)." image_preview_jpg_quality: "Yeniden boyutlandırılan görüntü dosyalarının kalitesi (1 en düşük kalite, 99 en iyi kalite, devre dışı bırakmak için 100)." @@ -1959,6 +2015,7 @@ tr_TR: video_conversion_enabled: "Yüklenen video dosyaları için video dönüştürmeyi etkinleştirin. Bu, videoların web uyumlu formatlara dönüştürülmesini sağlar." video_conversion_service: "Yüklenen videoların işlenmesi için kullanılacak video dönüştürme hizmeti." mediaconvert_role_arn: "AWS IAM rolü MediaConvert hizmeti için ARN. Video dönüştürme için AWS MediaConvert kullanıldığında gereklidir." + mediaconvert_output_subdirectory: "MediaConvert'in dönüştürülen videoları nihai yükleme konumuna taşınmadan önce geçici olarak yazacağı S3 kovasındaki alt dizin." min_ratio_to_crop: "Uzun görüntüleri kırpmak için kullanılan oran. Genişlik / yükseklik sonucunu girin." simultaneous_uploads: "Besteciye sürüklenip bırakılabilecek maksimum dosya sayısı" default_invitee_trust_level: "Davet edilen kullanıcılar için varsayılan güven seviyesi (0-4)." @@ -2071,9 +2128,12 @@ tr_TR: num_flaggers_to_close_topic: "Bir konuyu müdahale için otomatik olarak duraklatmak üzere gereken minimum benzersiz bayrak ekleyen kişi sayısı" num_hours_to_close_topic: "Müdahale amacıyla bir konuyu duraklatmak için saat sayısı." auto_respond_to_flag_actions: "Bir bayrağı kaldırırken otomatik yanıtı etkinleştirin." + min_first_post_typing_time: "Kullanıcının ilk gönderide yazması gereken minimum süre. Eşik değeri karşılanmazsa, gönderi otomatik olarak onay bekleyen kuyruğa girer. Devre dışı bırakmak için 0 olarak ayarlayın (önerilmez)." + fast_typing_threshold: "Bir kullanıcının ilk gönderisi için yazması gereken minimum süre. Eşik değeri karşılanmazsa, gönderi otomatik olarak inceleme kuyruğuna girer. Düşük değer 1 saniye, standart değer 3 saniye, yüksek değer 5 saniyedir." auto_silence_fast_typers_on_first_post: "`fast typing threshold`u karşılamayan kullanıcıları otomatik olarak susturun" auto_silence_fast_typers_max_trust_level: "Hızlı yazanları otomatik olarak susturmak için maksimum güven seviyesi" auto_silence_first_post_regex: "Büyük/küçük harfe duyarlı olmayan regex, geçilirse kullanıcının ilk gönderisinin susturulmasına ve onay kuyruğuna gönderilmesine neden olur. Örnek: raging|a[bc]a , raging veya aba veya aca içeren tüm gönderilerin ilk önce susturulmasına neden olur. Sadece ilk gönderi için geçerlidir. DEVRE DIŞI BIRAKILDI: Bunun yerine İzlenen Kelimeleri Sessize Al'ı kullanın." + moderator_guide_topic: "Topluluğunuzu nasıl yönettiğinizi özetleyen konu. Bağlantı, moderatörler ve yöneticiler için inceleme kuyruğunda görünecektir." reviewable_claiming: "İncelenebilir içeriğin üzerinde işlem yapılabilmesi için talep edilmesi gerekir mi?" reviewable_default_topics: "İncelenebilir içeriği varsayılan olarak konuya göre gruplandırılmış şekilde gösterin" reviewable_default_visibility: "Bu önceliği karşılamadıkları sürece incelenebilir ögeleri göstermeyin" @@ -2082,11 +2142,14 @@ tr_TR: allow_all_users_to_flag_illegal_content: "Anonim kullanıcılar, yasa dışı içeriği bildirmek için yöneticilere e-posta göndermeleri gerektiğini belirten bilgileri görürler. Bu ayar, \"Gönderi yayınlamaya izin verilen grupları işaretle\" ayarından önceliklidir." email_address_to_report_illegal_content: "Boş bırakılırsa varsayılan site yöneticisi e-postası kullanılır." cooldown_hours_until_reflag: "Kullanıcıların bir gönderiye yeniden bayrak ekleyebilmeleri için ne kadar süre beklemeleri gerektiği" + slow_mode_prevents_editing: "“Yavaş mod”, “düzenleme süresi”nden sonra düzenlemeyi engeller mi?" reply_by_email_enabled: "Kullanıcıların web sitesine giriş yapmalarını gerektirmek yerine konulara doğrudan e-posta yoluyla yanıt vermelerini sağlayan özelliği etkinleştirin. Daha fazla bilgi için Meta kılavuzu bölümüne bakın." reply_by_email_address: "E-posta ile yanıt için şablon gelen e-posta adresi, örneğin: %%{reply_key}@reply.example.com veya replies+%%{reply_key}@example.com" alternative_reply_by_email_addresses: "Gelen e-posta adreslerini e-posta ile yanıtlamak için alternatif şablonların listesi. Örnek: %%{reply_key}@reply.example.com|replies+%%{reply_key}@example.com" incoming_email_prefer_html: "Gelen e-postalar için metin yerine HTML kullanın." strip_incoming_email_lines: "Gelen e-postaların her satırından baştaki ve sondaki boşlukları kaldırın." + disable_emails: "Discourse'un herhangi bir tür e-posta göndermesini engelleyin. Tüm kullanıcılar için giden e-postaları devre dışı bırakmak için “evet”i seçin. Yalnızca personel dışı kullanıcılar için e-postaları devre dışı bırakmak için “personel dışı”yı seçin." + allow_email_invites: "Devre dışı bırakıldığında, kullanıcılar Discourse üzerinden davet e-postaları gönderemeyecekler." strip_images_from_short_emails: "Boyutu 2800 Bayt'tan küçük olan e-postalardaki görüntüleri soyun" short_email_length: "Bir e-postanın görüntü bastırma için \"kısa\" olarak sınıflandırılacağı maksimum uzunluğu bayt cinsinden tanımlayın. Bir e-postanın boyutu bu ayarı aşmazsa e-postadaki tüm görüntüler (avatarlar ve emoji'ler gibi) çıkarılır." display_name_on_email_from: "Alanlardan gelen e-postalarda tam adları gösterin" @@ -2147,6 +2210,7 @@ tr_TR: relative_date_duration: "Gönderi tarihlerinin mutlak (20 Şubat) yerine göreli (7 g) olarak gösterileceği gönderiden sonraki gün sayısı." delete_user_max_post_age: "İlk gönderisi (x) günden daha eski olan kullanıcıların silinmesine izin vermeyin." delete_all_posts_max: "Tüm Gönderileri Sil düğmesi ile tek seferde silinebilecek maksimum gönderi sayısı. Bir kullanıcının bu sayıdan fazla gönderisi varsa gönderilerin tümü aynı anda silinemez ve kullanıcı silinemez." + delete_all_posts_background_threshold: "Arka planda silme işlemi gerçekleştirilmeden önce Tüm Gönderileri Sil düğmesi ile bir seferde silinebilecek maksimum gönderi sayısı." delete_user_self_max_post_count: "Bir kullanıcının self servis hesap silme işlemine izin verirken sahip olabileceği maksimum gönderi sayısı. Self servis hesap silmeyi devre dışı bırakmak için -1 olarak ayarlayın." username_change_period: "Kayıttan sonra hesapların kullanıcı adlarını değiştirebilecekleri maksimum gün sayısı (kullanıcı adı değişikliğine izin vermemek için 0)." email_editable: "Kullanıcıların kayıt olduktan sonra e-posta adreslerini değiştirmelerine izin verin." @@ -2175,14 +2239,18 @@ tr_TR: enable_category_group_moderation: "Grupların belirli kategorilerdeki içeriği denetlemesine izin verin" group_in_subject: "Kişisel mesajdaki ilk grubun adına e-posta konusunda %%{optional_pm} olarak ayarlayın, bkz.: Standart e-postalar için konu formatını özelleştirme" allow_anonymous_mode: "Kullanıcıların gönderi paylaşmak için anonim moda geçme seçeneğini etkinleştirin. Etkinleştirildiğinde, kullanıcılar site genelinde gönderi veya konu oluştururken kimliklerinin gizlenmesini tercih edebilirler. Ayrıca \"anonim beğenilere izin ver\" bölümüne bakın." + allow_likes_in_anonymous_mode: "Sitenizi anonim olarak gezen kullanıcıların gönderileri beğenmesine izin vermek için bu ayarı etkinleştirin. Etkinleştirildiğinde, kullanıcılar site genelinde gönderileri veya konuları beğenirken kimliklerinin gizli kalmasını seçebilirler. Bu ayar, `anonim moduna izin ver` ayarının etkinleştirilmesini gerektirir." + anonymous_posting_allowed_groups: "Anonim gönderim yapmasına izin verilen gruplar. Bu ayar, `anonim moduna izin ver` ayarının etkinleştirilmesini gerektirir." anonymous_account_duration_minutes: "Anonimliği korumak için her kullanıcı için her N dakikada bir yeni bir anonim hesap oluşturun. Örnek: 600 olarak ayarlanırsa son gönderiden itibaren 600 dakika geçer geçmez VE kullanıcı anonime geçerse yeni bir anonim hesap oluşturulur." - hide_user_profiles_from_public: "Anonim kullanıcılar için kullanıcı kartlarını, kullanıcı profillerini ve kullanıcı dizinini devre dışı bırakın." + hide_user_profiles_from_public: "Anonim kullanıcılar için kullanıcı kartlarını ve kullanıcı profillerini devre dışı bırakın. Toplu istatistikler kullanıcı dizininde hala kullanılabilir olacaktır." hide_new_user_profiles: "Güven seviyesi 1 veya daha düşük kullanıcı profillerini herkesten gizleyin ve güven seviyesi 1 olan kullanıcıları ilk kez gönderi yapana kadar koruyun. Bu özellik must_approve_users ve invite_only sitelerinde koşulsuz olarak devre dışıdır." allow_users_to_hide_profile: "Kullanıcıların profillerini ve varlıklarını gizlemelerine izin verin" hide_user_activity_tab: "Yönetici ve kişisel profiller dışındaki kullanıcı profillerindeki aktivite sekmesini gizleyin." delete_associated_accounts_on_password_reset: "Kullanıcı şifreyi değiştirdiğinde kullanıcı ilişkili hesabı silin." allow_featured_topic_on_user_profiles: "Kullanıcıların, kullanıcı kartlarında ve profillerinde bir konuya bağlantı vermelerine izin verin." show_inactive_accounts: "Giriş yapan kullanıcıların etkin olmayan hesapların profillerine göz atmasına izin verin." + hide_silencing_reasons: "Kullanıcı profillerinde susturma nedenlerini herkese açık olarak göstermeyin." + hide_suspension_reasons: "Kullanıcı profillerinde askıya alma nedenlerini kamuya açık olarak göstermeyin." log_personal_messages_views: "Yönetici tarafından diğer kullanıcılar/gruplar için kişisel mesaj görüntülemelerini günlüğe kaydedin." ignored_users_count_message_threshold: "Belirli bir kullanıcı şu kadar diğer kullanıcı tarafından göz ardı edilirse moderatörleri bilgilendirin." ignored_users_message_gap_days: "Diğerleri tarafından görmezden gelinen bir kullanıcı hakkında moderatörleri tekrar bilgilendirmeden önce ne kadar bekleneceği." @@ -2190,11 +2258,13 @@ tr_TR: clean_up_unused_staged_users_after_days: "Kullanılmayan bir aşamalı kullanıcı (herhangi bir gönderisi olmayan) kaldırılmadan önceki gün sayısı. Temizlemeyi devre dışı bırakmak için 0 olarak ayarlayın." user_selected_primary_groups: "Kullanıcıların kendi birincil gruplarını belirlemelerine izin verin" max_notifications_per_user: "Kullanıcı başına maksimum bildirim miktarı, bu sayı aşılırsa eski bildirimler silinir. Haftalık olarak uygulanır. Devre dışı bırakmak için 0 olarak ayarlayın" + allowed_user_website_domains: "Kullanıcı web sitesi bu alan adlarına göre doğrulanacaktır." allow_profile_backgrounds: "Kullanıcıların profil arka planları yüklemesine izin verin." get_a_room_threshold: "Bir kullanıcının uyarılmadan önce aynı konuda aynı kişiye yapması gereken gönderi sayısı." dont_feed_the_trolls_threshold: "Uyarılmadan önce diğer kullanıcılardan gelen bayrak sayısı." enable_mobile_theme: "Mobil cihazlar, sitenin tamamına geçebilme özelliğine sahip mobil uyumlu bir tema kullanır. Tamamen duyarlı özel bir stil sayfası kullanmak istiyorsanız bunu devre dışı bırakın." dominating_topic_minimum_percent: "Bir kullanıcının bir konuda aşırı baskınlık kurduğu hatırlatılmadan önce bir konuda yüzde kaç gönderi yapması gerektiği." + pm_warn_user_last_seen_months_ago: "Yeni bir PM oluştururken, hedef alıcı n aydan fazla süredir görülmemişse kullanıcıları uyarın." suppress_uncategorized_badge: "Konu listelerinde kategorize edilmemiş konular için rozet göstermeyin." header_dropdown_category_count: "Başlık açılır menüsünde kaç kategori görüntülenebileceği." permalink_normalizations: "Kalıcı bağlantıları eşleştirmeden önce aşağıdaki regex'i uygulayın, örneğin: /(topic.*)\\?.*/\\1 sorgu dizelerini konu rotalarından söker. Format, regex+string ve yakalamalara erişmek için \\1 vb. kullanın" @@ -2268,6 +2338,7 @@ tr_TR: disable_watched_word_checking_in_user_fields: "kullanıcı alanlarında izlenen kelime kontrolünü devre dışı bırak" watched_words_regular_expressions: "Kelimeleri filtrelemek için düzenli ifadelerin kullanılmasına izin verir. Etkinleştirilirse bu özellik hassas sözcükleri büyük/küçük harf duyarlılıklarına göre gruplar. Ardından, seçilen tüm kelimeleri tek bir düzenli ifadede derler ve düzenli olarak izlenen kelimeler için kelime sınırları ekler. Sonuç olarak, bu regex tabanlı filtreleme yöntemi, daha karmaşık kelime kalıplarını destekleyerek içerik denetimi üzerinde ekstra bir kontrol katmanı ekler. Bu ayar aynı zamanda orijinal metnin yerine tercih edilen metnin kolayca yerleştirilmesine de olanak tanır." enable_fast_edit: "Satır içi küçük bir seçimi düzenlemek için yazı seçimi menüsüne bir düğme ekler." + old_post_notice_days: "Yeni kullanıcı ve geri dönen kullanıcıların gönderdiği bildirimlerin gizleneceği gün sayısı. Resmi gönderim bildirimi her zaman görünür kalacaktır." new_user_notice_tl: "Yeni kullanıcı gönderi bildirimlerini görmek için gereken minimum güven seviyesi." returning_user_notice_tl: "Geri dönen kullanıcı gönderisi bildirimlerini görmek için gereken minimum güven seviyesi." returning_users_days: "Bir kullanıcının geri döndüğünün kabul edilmesi için kaç gün geçmesi gerektiği." @@ -2349,6 +2420,7 @@ tr_TR: force_lowercase_tags: "Tüm yeni etiketleri tamamen küçük harf olmaya zorlayın." create_post_for_category_and_tag_changes: "Bir konunun kategorisi veya etiketleri değiştiğinde bir fısıltı gönderisi oluşturun, fısıltı gönderilerinin etkinleştirilmesini gerektirir." automatically_clean_unused_tags: "Herhangi bir konuda veya kişisel mesajda kullanılmayan etiketleri günlük olarak otomatik olarak silin." + default_watched_precedence_over_muted: "Kullanıcılara, izledikleri kategoriler veya etiketlerdeki, sessize aldıkları kategorilere de ait olan konular hakkında bildirimde bulunun." company_name: "Şirketinizin veya kuruluşunuzun adı. Boş bırakılırsa Hizmet Şartları veya Gizlilik Bildirimine ilişkin ortak metin sağlanmaz." governing_law: "Hizmet Koşulları ve Gizlilik Politikası da dâhil olmak üzere sitenin hukuki yönlerini düzenleyen yargı bölgesini belirtin. Bu genellikle siteyi işleten şirketin kayıtlı olduğu veya faaliyet gösterdiği ülke veya eyalettir." city_for_disputes: "Bu forumun kullanımıyla ilgili herhangi bir anlaşmazlığın çözümünde yargı yetkisi olarak kullanılacak şehri belirtin. Bu bilgi genellikle forumun Hizmet Koşulları gibi yasal belgelerde yer alır." @@ -2364,9 +2436,11 @@ tr_TR: sitemap_page_size: "Her site haritası sayfasına eklenecek URL sayısı. Maksimum 50.000" enable_user_status: "Kullanıcıların özel durum mesajı (emoji + açıklama) ayarlamalarına izin verin." enable_user_tips: "Kullanıcılara temel özellikleri açıklayan yeni kullanıcı ipuçlarını etkinleştirin" + short_title: "Kısa başlık, kullanıcının ana ekranında, başlatıcıda veya alanın sınırlı olabileceği diğer yerlerde kullanılacaktır. 12 karakterle sınırlı olmalıdır. Bu başlığı değiştirmek, PWA kullanıcılarına uygulamayı güncellemeleri veya kaldırmaları için bir uyarı gönderebilir." dashboard_hidden_reports: "Belirtilen raporların panodan gizlenmesine izin verin." dashboard_visible_tabs: "Hangi pano sekmelerinin görünür olacağını seçin." dashboard_general_tab_activity_metrics: "Genel sekmesinde aktivite metrikleri olarak görüntülenecek raporları seçin." + gravatar_enabled: "Kullanıcı avatarları için Gravatar hizmetini kullanın. Bu özelliği devre dışı bırakmak, kullanıcıların avatarları için Gravatar'a geçmelerini engeller, ancak halihazırda bu hizmeti kullanan kullanıcıları etkilemez." gravatar_name: "Gravatar hizmet sağlayıcısının adını belirtin. Bu ad genellikle siteye Gravatar avatarları sağlayan kaynağı tanımlamak için kullanılır." gravatar_base_url: "Gravatar sağlayıcısının API'sine erişmek için URL'yi belirtin. Bu ayar, e-posta adreslerini avatar görüntülerinin depolandığı Gravatar URL'lerine dönüştürmek için kritik öneme sahiptir." gravatar_login_url: "Kullanıcıya Gravatar hizmetine giriş yapmasını sağlayan `gravatar_base_url` ögesine göre URL." @@ -2379,18 +2453,24 @@ tr_TR: suggest_weekends_in_date_pickers: "Tarih seçici önerilerine hafta sonlarını (cumartesi ve pazar) dahil edin (Discourse'u yalnızca hafta içi, pazartesiden cumaya kadar kullanıyorsanız bunu devre dışı bırakın)." show_bottom_topic_map: "Konuya 10 veya daha fazla yanıt geldiğinde konu haritasını konunun altında gösterir." show_topic_map_in_topics_without_replies: "Konuya yanıt gelmese bile konu haritasını gösterir." + enable_site_owner_onboarding: "Yeni yöneticilere başlangıçta yardımcı olmak için ana sayfada bir panel gösterir. Bu ayarı yeniden etkinleştirerek başlangıç adımlarını tekrar görebilirsiniz." enable_welcome_banner: "Üyeleri karşılamak ve site içeriğinde arama yapmalarına olanak sağlamak için ana konu listenizin sayfalarında bir başlık gösterin" welcome_banner_image: "Hoş geldiniz banner'ının arka planında gösterilecek bir görüntü ayarlayın." welcome_banner_location: "Hoş geldiniz banner'ının sayfada nerede görüneceğini belirler." welcome_banner_page_visibility: "Hoş geldiniz banner'ının hangi sayfalarda görüneceğini belirler." + welcome_banner_text_color: "'Hoş geldiniz banner görüntüsü' ayarı yapılandırıldığında, banner metin rengini okunabilir olmasını sağlamak için bu ayarı kullanın. Boş bırakıldığında veya görüntü yüklenmediğinde, aktif tema rengi kontrol eder." splash_screen: "Site varlıkları yüklenirken geçici bir yükleme ekranı gösterir" + splash_screen_image: "Site yüklenirken açılış ekranında görüntülenecek bir SVG görüntüsü. Animasyonlu SVG'ler yalnızca CSS dönüşümü veya opaklık animasyonları kullanmalıdır. CSS sınıfları ve anahtar kareler için benzersiz adlar kullanın. Tema renklerini belirtmek için var(--primary), var(--secondary) ve var(--tertiary) kullanabilirsiniz." navigation_menu: "Siteniz için ana gezinme menüsü olarak kenar çubuğunu veya başlık açılır menüsünü belirleyin. Kenar çubuğu önerilir." default_navigation_menu_categories: "Seçilen kategoriler, varsayılan olarak Navigasyon Menüsü'nün Kategoriler bölümünde gösterilir." default_navigation_menu_tags: "Seçilen etiketler, varsayılan olarak Navigasyon Menüsü'nün Etiketler bölümünde gösterilir." experimental_new_new_view_groups: 'Okunmamış ve yeni konuları birleştiren bir yeni konular listesi etkinleştirin ve kenar çubuğundaki "Her şey" bağlantısını buna bağlayın.' + enable_form_templates: "Form şablonları özelliğini etkinleştirin. Bu özellik sayesinde, konu oluşturma akışının bir parçası olarak veri doğrulamalı yapılandırılmış bir form uygulayabilirsiniz." show_preview_for_form_templates: "Form şablonları özelliği için ön izlemeyi etkinleştirin" lazy_load_categories_groups: "Kategori bilgilerini yalnızca bu gruplardaki kullanıcılar için tembel olarak yükleyin. Bu, çok sayıda kategoriye sahip sitelerde performansı artırır." enable_auto_grid_images: "Bestecide 3 veya daha fazla görüntü yüklendiğinde görüntüleri otomatik olarak [grid] etiketlerine sarar." + impersonate_without_logout: "Yöneticilerin, yönetici hesaplarından çıkış yapmadan bir kullanıcıyı taklit etmelerine izin verin." + experimental_impersonation_time_limit_minutes: "Taklit oturumu otomatik olarak sonlandırılmadan önce geçen süre." page_loading_indicator: "Discourse içinde sayfa geçişleri sırasında görünen yükleme göstergesini yapılandırın. \"Spinner\" bir tam sayfa göstergesidir. \"Slider\" ekranın üst kısmındaki dar bir çubuğu gösterir." show_user_menu_avatars: "Kullanıcı menüsünde kullanıcı avatarlarını göster" about_page_hidden_groups: "Belirli grupların üyelerini /about (hakkında) sayfasında göstermeyin." @@ -2403,14 +2483,32 @@ tr_TR: rich_editor: "Besteci için zengin düzenleyiciyi etkinleştirin, böylece tüm kullanıcılar mevcut Markdown modu ile daha sezgisel ve kullanıcı dostu kompozisyonlar için yeni zengin metin düzenleyicisi arasında geçiş yapabilirler." default_composition_mode: "Topluluğunuzun bestecisi için varsayılan modu ayarlayın. Zengin metin modu çoğu kullanıcı için daha modern ve tanıdık bir yazma deneyimi sağlarken, Markdown modu daha teknik kitleler için uygun olabilir. Üyeler, besteci araç çubuğundaki geçiş düğmesini kullanarak modlar arasında geçiş yapabilirler." reviewable_ui_refresh: "İnceleme kuyruğunda deneysel yeni kullanıcı arayüzünü kullanabilen gruplar." + viewport_based_mobile_mode: "Mobil/masaüstü modlarını belirlemek için görüntü alanı genişliğini kullanın. Bu ayar yakında kaldırılacaktır. Kapatmanız gerektiğini düşünüyorsanız, lütfen Meta'da bize bildirin." content_localization_enabled: "Kullanıcılara tarayıcı veya kullanıcı dil tercihlerine göre yerelleştirilmiş içerik görüntüler. Bu içerik kategoriler, etiketler, gönderiler ve konular içerebilir. Desteklenen yerel ayarlar, \"İçerik yerelleştirmesi tarafından desteklenen yerel ayarlar\" bölümünde belirtilmiştir." + content_localization_supported_locales: "Kullanıcı içeriğinin çevrilebileceği desteklenen yerel ayarların listesi. Sitenin varsayılan yerel ayarı her zaman dahil edilir. ‘İçerik yerelleştirme etkin’ seçeneği gerekir." content_localization_allowed_groups: "Grupların yerelleştirilmiş içeriği güncellemesine izin verildi. \"İçerik yerelleştirmesinin etkinleştirilmesini\" gerektirir." + content_localization_language_switcher: "Başlıkta bir dil değiştirici göstererek, ziyaretçilerin Discourse'un çevrilmiş sürümleri ile kullanıcıların katkıda bulunduğu içerikler arasında geçiş yapabilmelerini sağlar. 'İçerik yerelleştirme destekli yerel ayarlar'da tanımlanan dilleri kullanır." + content_localization_crawler_param: "'İçerik yerelleştirme etkin' ve ‘parametreden yerel ayarları belirle’ seçenekleri etkinleştirildiğinde, web tarayıcılarına yerelleştirilmiş içerik sunun. Desteklenen yerel ayarların listesi ‘içerik yerelleştirme desteklenen yerel ayarlar’ bölümünde tanımlanmıştır." + content_localization_use_default_locale_when_unsupported: "Tercih edilen dili “içerik yerelleştirme desteklenen yerel ayarlar” listesinde bulunmayan kullanıcılara, sitenin varsayılan yerel ayarlarında yerelleştirilmiş içerik sunun." + content_localization_allow_author_localization: "Yazarların, yazı menüsü aracılığıyla kendi konularının ve yazılarının yerelleştirmelerini güncellemesine izin verin." + fake_upcoming_change: "Bu, test amaçlı sahte bir değişikliktir. Bu dizeyi çevirmenize gerek yoktur." + floating_dismiss_topics_on_mobile: "Daha kolay erişim ve konu listesinin üst kısmında yer açmak için mobil cihazlarda konu listesi üzerinde yüzen bir “Kapat...” düğmesi gösterir." + rename_faq_to_guidelines: "Bu değişiklikle SSS sayfası, Kılavuzlar olarak yeniden adlandırılmıştır. SSS sayfası hala /faq adresinde erişilebilir olacaktır. ‘faq url’ ayarı eskisi gibi çalışmaya devam edecektir." + experimental_tag_settings_page: "/tag/:slug/:id/edit adresinde etiketler için özel bir ayarlar sayfası etkinleştirin." + enable_simplified_category_creation: "Daha az seçenek ve daha temiz bir arayüz ile basitleştirilmiş kategori oluşturma akışını etkinleştirir." + enable_custom_splash_screen: "Yükleme açılış ekranını kendi SVG görüntünüzle özelleştirmenize olanak tanır. ‘Açılış ekranı görüntüsü’ ayarı üzerinden bir görüntü yükleyin. Uyarı: Bu, LCP puanlarını ve Google indekslemesini olumsuz etkileyebilir." + modernize_foundation_theme: "Bu değişiklik, Discourse'daki Foundation temasına tasarım değişiklikleri getiriyor." + reporting_improvements: "Discourse'un yönetici raporlarının gezinme, tasarım ve kullanılabilirlik özelliklerinde iyileştirmeler." errors: invalid_css_color: "Geçersiz renk. Bir renk adı veya hex değeri girin." + invalid_datetime: "Geçersiz tarih ve saat biçimi. Lütfen geçerli bir tarih ve saat girdiğinizden emin olun." invalid_email: "Geçersiz e-posta adresi." invalid_username: "Bu kullanıcı adına sahip bir kullanıcı yok." valid_username: "Bu kullanıcı adına sahip bir kullanıcı var." invalid_group: "Bu ada sahip bir grup yok." + invalid_svg: "SVG görüntüsü geçersiz. SVG öğesi içermeli ve komut dosyası veya olay işleyicisi içermemelidir." + invalid_upload: "Yükleme geçersiz veya mevcut değil." + invalid_topic: "Bu kimlik numarasıyla ilgili konu yok." invalid_integer_min_max: "Değer %{min} ila %{max} arasında olmalıdır." invalid_integer_min: "Değer %{min} veya üstünde olmalıdır." invalid_integer_max: "Değer en fazla %{max} olabilir." @@ -2447,6 +2545,12 @@ tr_TR: reply_by_email_disabled: "Bu ayarı etkinleştirmeden önce \"e-posta ile yanıtla\" özelliğini etkinleştirmeniz gerekiyor." discourse_connect_url_is_empty: "Bu ayarı etkinleştirmeden önce bir \"discourse bağlantı URL'si\" ayarlamanız gerekiyor." enable_local_logins_disabled: "Bu ayarı etkinleştirmeden önce \"yerel girişleri etkinleştir\" seçeneğini etkinleştirmeniz gerekiyor." + min_username_length_exists: "En kısa kullanıcı adı (%{username}) üzerinde ‘minimum kullanıcı adı uzunluğu’ ayarı yapamazsınız." + min_group_name_length_exists: "En kısa grup adı (%{group_name}) üzerinde 'minimum kullanıcı adı uzunluğu' ayarı yapamazsınız." + min_username_length_range: "'Minimum kullanıcı adı uzunluğu'nu 'maksimum kullanıcı adı uzunluğu'nun üzerine ayarlayamazsınız." + max_username_length_exists: "En uzun kullanıcı adı (%{username}) değerinden daha kısa bir 'maksimum kullanıcı adı uzunluğu' ayarlayamazsınız." + max_group_name_length_exists: "En uzun grup adı (%{group_name}) değerinden daha kısa bir 'maksimum kullanıcı adı uzunluğu' ayarlayamazsınız." + max_username_length_range: "'Maksimum kullanıcı adı uzunluğu'nu 'minimum kullanıcı adı uzunluğu'nun altına ayarlayamazsınız." invalid_hex_value: "Renk değerleri 6 haneli onaltılık kodlar olmalıdır." empty_selectable_avatars: "Bu ayarı etkinleştirmeden önce en az iki seçilebilir avatar yüklemeniz gerekiyor." category_search_priority: @@ -2461,6 +2565,7 @@ tr_TR: other: "Liste tam olarak %{count} değer içermelidir." markdown_linkify_tlds: "\"*\" değerini dahil edemezsiniz." google_oauth2_hd_groups: "Bu ayarı etkinleştirmeden önce tüm \"google oauth2 hd\" ayarlarını yapılandırmanız gerekiyor." + discourse_id_registration: "Discourse ID ile otomatik olarak kayıt yapılamadı. Bunun nedeni ağ bağlantısı sorunları, güvenlik duvarı kısıtlamaları veya Discourse ID hizmetine erişilememesi olabilir. Daha fazla bilgi için lütfen sunucu günlüklerini kontrol edin veya destek ekibiyle iletişime geçin." linkedin_oidc_credentials: "Bu ayarı etkinleştirmeden önce LinkedIn OIDC giriş bilgilerini ('linkedin_oidc_client_id' ve 'linkedin_oidc_client_secret') yapılandırmanız gerekiyor." search_tokenize_chinese_enabled: "Bu ayarı etkinleştirmeden önce \"search_tokenize_chinese\" özelliğini devre dışı bırakmalısınız." search_tokenize_japanese_enabled: "Bu ayarı etkinleştirmeden önce \"search_tokenize_japanese\" özelliğini devre dışı bırakmalısınız." @@ -2469,7 +2574,9 @@ tr_TR: invalid_uncategorized_category_setting: '"Kategorize edilmemiş konulara izin ver" etkinleştirilmemişse "Kategorize edilmemiş" kategorisi seçilemez.' invalid_search_ranking_weights: "Değer, search_ranking_weights site ayarı için geçersiz. Örnek: \"{0.1,0.2,0.3,1.0}\". Her ağırlık için maksimum değerin 1,0 olduğunu unutmayın." content_localization_locale_limit: "Desteklenen yerel ayar sayısı en fazla %{max} olabilir." + content_localization_language_switcher_requirements: "Dil değiştirici, 'çerezden yerel ayarları belirle' ve 'kullanıcı yerel ayarlarına izin ver' site ayarlarının etkinleştirilmesini ve 'içerik yerelleştirme desteklenen yerel ayarlar'ın en az bir dil içermesini gerektirir." mediaconvert_role_arn_required: "Video dönüştürme için AWS MediaConvert kullanıldığında AWS IAM rolü ARN'si gereklidir." + mediaconvert_output_subdirectory_required: "MediaConvert çıktı alt dizini gereklidir." s3_credentials_required_for_video_conversion: "Video dönüştürme için S3 giriş bilgileri gereklidir. Lütfen S3 erişim anahtarlarını yapılandırın veya IAM profilini etkinleştirin." keywords: clean_up_inactive_users_after_days: "devre dışı|etkin değil|etkinliği kaldırıldı" @@ -2493,6 +2600,7 @@ tr_TR: filter: description: status: "Konuları durumlarına göre filtreleyin" + in: "Kişisel listelerdeki konuları filtrele" order: "Konuları belirli bir alana göre sıralayın" category: "Belirli bir kategorideki konuları gösterin" category_any: "Belirtilen kategorilerden herhangi birindeki konuları gösterin (virgülle ayrılmış)" @@ -2511,6 +2619,9 @@ tr_TR: activity_after: "Belirli bir tarihten sonra (YYYY-AA-GG veya günler önce) son aktiviteye sahip konuları gösterin" created_before: "Belirli bir tarihten önce (YYYY-AA-GG veya günler önce) oluşturulan konuları gösterin" created_after: "Belirli bir tarihten sonra (YYYY-AA-GG veya günler önce) oluşturulan konuları gösterin" + created_by: "Belirli bir kullanıcı veya grup tarafından oluşturulan konuları göster" + created_by_user: "Kullanıcı adı veya grup tarafından oluşturulan konuları göster (@ işareti olmadan)" + created_by_multiple: "Belirtilen kullanıcılar veya gruplar (virgülle ayrılmış) tarafından oluşturulan konuları göster" latest_post_before: "Son gönderisi belirli bir tarihten önce (YYYY-AA-GG veya günler önce) olan konuları gösterin" latest_post_after: "Son gönderisi belirli bir tarihten sonra (YYYY-AA-GG veya günler önce) olan konuları gösterin" likes_min: "En az bu kadar beğeniye sahip konuları gösterin" @@ -2540,6 +2651,7 @@ tr_TR: in_new: "Yeni veya yeni yanıtları olan konuları göster" in_new_replies: "Yeni yanıtları olan konuları göster" in_new_topics: "Yeni konuları göster" + in_unseen: "Henüz görmediğiniz konuları göster" order_activity: "Son aktiviteye göre sırala (ilk başta en yeni)" order_activity_asc: "Son aktiviteye göre sırala (ilk başta en eski)" order_category: "Kategori adına göre sırala (Z-A)" @@ -2560,6 +2672,18 @@ tr_TR: order_views_asc: "Görüntüleme sayısına göre sırala (en az önce)" order_read: "En son ne zaman okuduğunuza göre sırala (en yenisi önce)" order_read_asc: "En son ne zaman okuduğunuza göre sırala (en eskisi önce)" + order_hot: "Popülerliğe göre sıralama (en popülerden başla)" + order_hot_asc: "Popülerliğe göre sıralama (en azdan başla)" + users: "Katılımcılara göre konuları filtrele" + users_any: "Belirtilen kullanıcılardan herhangi biriyle ilgili konuları göster (virgülle ayrılmış)" + users_all: "Belirtilen tüm kullanıcıları içeren konuları göster (artı işaretiyle ayrılmış)" + exclude_users: "Belirli kullanıcıların konularını hariç tut" + group: "Konuları gruplara göre filtrele" + groups_any: "Belirtilen gruplardan herhangi birine ait konuları göster (virgülle ayrılmış)" + groups_all: "Belirtilen tüm grupları içeren konuları göster (artı işaretiyle ayrılmış)" + locale: "Konuları orijinal dile göre filtrele" + locale_any: "Belirtilen dillerden herhangi birinde yazılmış konuları göster (virgülle ayrılmış)" + exclude_locale: "Belirli bir dilde yazılmış konuları hariç tutun" discourse_connect: login_error: "Giriş Hatası" not_found: "Hesabınız bulunamadı. Lütfen site yöneticisi ile iletişime geçin." @@ -2689,6 +2813,7 @@ tr_TR: csrf_detected: "Üzgünüz, yetkilendirme süresi doldu veya tarayıcınızı değiştirdiniz. Lütfen tekrar deneyin." request_error: "Üzgünüz, yetkilendirme başlatılırken bir hata oluştu. Lütfen tekrar deneyin." invalid_iat: "Üzgünüz, sunucu saati farklılıkları nedeniyle yetkilendirme token'ını doğrulayamıyoruz. Lütfen tekrar deneyin." + unauthorized: "Üzgünüz, oturum açma sağlayıcısı isteğinizi onaylamadı. Lütfen tekrar deneyin veya bir yöneticiyle iletişime geçin." omniauth_error_unknown: "Girişiniz işlenirken bir sorun oluştu, lütfen tekrar deneyin." omniauth_confirm_title: "%{provider} kullanarak giriş yapın" omniauth_confirm_button: "Devam et" @@ -2742,6 +2867,7 @@ tr_TR: updating_user_ids: "Kullanıcı kimlikleri güncelleniyor…" deleting_source_user: "Kaynak kullanıcı siliniyor…" user: + anonymized: "[kullanıcı anonimleştirme nedeniyle kaldırıldı]" deactivated: "\"%{email}\" adresine çok fazla geri dönen e-posta nedeniyle devre dışı bırakıldı." deactivated_by_staff: "Personel tarafından devre dışı bırakıldı" deactivated_by_inactivity: @@ -2906,30 +3032,30 @@ tr_TR: title: "Yeni Sürüm Posta Göndericisi" subject_template: "[%{email_prefix}] Yeni Discourse sürümü, güncelleme mevcut" text_body_template: | - Yaşasın, [Discourse]'un (https://www.discourse.org) yeni bir sürümü çıktı! + Yaşasın, [Discourse](https://www.discourse.org) için yeni bir sürüm çıktı! - Sizin sürümünüz: %{installed_version} + Mevcut sürümünüz: %{installed_version} Yeni sürüm: **%{new_version}** - - Kolay **[tek tıklamayla tarayıcı güncellemesi](%{base_url}/admin/update)** kullanarak güncelleyin + - Kolay **[tek tıklamayla tarayıcı güncellemesi](%{base_url}/admin/update)** özelliğimizi kullanarak güncelleyin - - [Sürüm notlarından] (https://meta.discourse.org/tag/release-notes) yeniliklere bakın veya [ham GitHub değişiklik günlüğünü](https://github.com/discourse/discourse/commits/main) görüntüleyin + - [Sürüm notlarında](https://releases.discourse.org/changelog/%{new_version}) yenilikleri inceleyin - - Discourse ile ilgili haberler, tartışmalar ve Discourse'a destek için [meta.discourse.org] (https://meta.discourse.org) adresini ziyaret edin + - Discourse ile ilgili haberler, tartışmalar ve destek için [meta.discourse.org](https://meta.discourse.org) adresini ziyaret edin new_version_mailer_with_notes: title: "Notlarla Yeni Sürüm Posta Göndericisi" subject_template: "[%{email_prefix}] güncelleme mevcut" text_body_template: | - Yaşasın, [Discourse]'un (https://www.discourse.org) yeni sürümü çıktı! + Yaşasın, [Discourse](https://www.discourse.org) için yeni bir sürüm çıktı! - Sizin sürümünüz: %{installed_version} + Mevcut sürümünüz: %{installed_version} Yeni sürüm: **%{new_version}** - - Kolay **[tek tıklamayla tarayıcı güncellemesini](%{base_url}/admin/update)** kullanarak güncelleyin + - Kolay **[tek tıklamayla tarayıcı güncellemesi](%{base_url}/admin/update)** özelliğimizi kullanarak güncelleyin - - [Sürüm notlarından] (https://meta.discourse.org/tag/release-notes) yenilikleri görün veya [ham GitHub değişiklik günlüğünü](https://github.com/discourse/discourse/commits/main) görüntüleyin + - [Sürüm notlarında](https://releases.discourse.org/changelog/%{new_version}) yenilikleri inceleyin - - Discourse ile ilgili haberler, tartışmalar ve destek için [meta.discourse.org] (https://meta.discourse.org) adresini ziyaret edin + - Discourse ile ilgili haberler, tartışmalar ve destek için [meta.discourse.org](https://meta.discourse.org) adresini ziyaret edin ### Sürüm notları @@ -2940,11 +3066,13 @@ tr_TR: illegal: "Gönderiniz **yasa dışı** olarak işaretlendi: Topluluk bunun yasayı ihlal ediyor olabileceğini düşünüyor." spam: "Gönderinize **istenmeyen içerik** bayrağı eklendi: Topluluk, bunun bir reklam olduğunu düşünüyor, beklendiği gibi yararlı veya konuyla ilgili olmak yerine doğası gereği aşırı tanıtım amaçlı." notify_moderators: "Gönderinize **moderatörün dikkatine** bayrağı eklendi: Topluluk, gönderi hakkında bir personelin manuel müdahalesini gerektiren bir şey olduğunu düşünüyor." + needs_approval: "Gönderiniz **onay için** işaretlendi: [topluluk kurallarımıza](%{base_path}/guidelines) uygunluğunu sağlamak için bir personel tarafından incelenmek üzere otomatik olarak sıraya alındı." responder: off_topic: "Gönderiye **konu dışı** bayrağı eklendi: Topluluk, şu anda başlık ve ilk gönderi tarafından tanımlandığı şekliyle bunun konuya uygun olmadığını düşünüyor." inappropriate: "Gönderiye **uygunsuz** bayrağı eklendi: Topluluk, bunun saldırganca, taciz içerikli, nefret söylemli olduğunu veya [topluluk kılavuzumuzu] (%{base_path}/guidelines) ihlal ettiğini düşünüyor." spam: "Gönderiye **istenmeyen içerik** bayrağı eklendi: Topluluk, bunun bir reklam olduğunu düşünüyor, beklendiği gibi yararlı veya konuyla ilgili olmak yerine doğası gereği aşırı tanıtım amaçlı." notify_moderators: "Gönderiye **moderatörün dikkatine** bayrağı eklendi: Topluluk, gönderi hakkında bir personelin manuel müdahalesini gerektiren bir şey olduğunu düşünüyor." + needs_approval: "Gönderi **onay için** işaretlendi: [topluluk kurallarımıza](%{base_path}/guidelines) uygunluğunu sağlamak için bir personel tarafından incelenmek üzere otomatik olarak sıraya alındı." flags_dispositions: agreed: "Bize bildirdiğiniz için teşekkür ederiz. Bir sorun olduğuna katılıyoruz ve sorunu araştırıyoruz." agreed_and_deleted: "Bize bildirdiğiniz için teşekkür ederiz. Bir sorun olduğuna katılıyoruz ve gönderiyi kaldırdık." @@ -2964,6 +3092,7 @@ tr_TR: contents_hidden: "İçeriğini görmek için lütfen gönderiyi ziyaret edin." post_hidden: title: "Gönderi Gizlendi" + preview: "Topluluk üyeleri tarafından bildirildiği için gizlenmiş gönderi." subject_template: "Gönderi topluluk bayrakları tarafından gizlendi" text_body_template: | Merhaba, @@ -3025,6 +3154,7 @@ tr_TR: %{site_name} Moderatörleri post_hidden_again: title: "Gönderi Tekrar Gizlendi" + preview: "Topluluk üyeleri tarafından tekrar gizlendi." subject_template: "Gönderi topluluk bayrakları tarafından gizlendi, personel bilgilendirildi" text_body_template: | Merhaba, @@ -3509,6 +3639,7 @@ tr_TR: Daha fazla bilgi için lütfen [topluluk kılavuzumuzu](%{base_url}/guidelines) inceleyin. too_many_spam_flags: title: "Çok Fazla İstenmeyen İçerik Bayrağı" + preview: "Spam işaretleri nedeniyle geçici olarak gizlenen gönderiler." subject_template: "Yeni hesap askıda" text_body_template: | Merhaba, @@ -3531,6 +3662,7 @@ tr_TR: Daha fazla bilgi için lütfen [topluluk kılavuzumuzu](%{base_url}/guidelines) inceleyin. silenced_by_staff: title: "Personel Tarafından Susturuldu" + preview: "Hesap geçici olarak askıya alındı." subject_template: "Hesap geçici olarak beklemede" text_body_template: | Merhaba, @@ -3543,9 +3675,27 @@ tr_TR: user_automatically_silenced: title: "Kullanıcı Otomatik Olarak Susturuldu" subject_template: "Yeni kullanıcı %{username} topluluk bayraklarıyla susturuldu" + text_body_template: | + Bu otomatik bir mesajdır. + + Yeni kullanıcı [%{username}](%{user_url}) otomatik olarak susturulmuştur. + + Lütfen [bayrakları inceleyin](%{base_url}/review). %{username} yanlışlıkla susturulmuşsa, [bu kullanıcının yönetici sayfasında](%{user_url}) susturmayı kaldır düğmesine tıklayın. + + Bu eşik, `silence_new_user` site ayarları aracılığıyla değiştirilebilir. user_automatically_silenced_with_reason: title: "Kullanıcı Otomatik Olarak Susturuldu" subject_template: "Yeni kullanıcı %{username} topluluk bayraklarıyla susturuldu" + text_body_template: | + Bu otomatik bir mesajdır. + + Yeni kullanıcı [%{username}](%{user_url}) otomatik olarak susturuldu. + + Nedeni - %{reason} + + Lütfen [bayrakları inceleyin](%{base_url}/review). %{username} yanlışlıkla sessizleştirilmişse, [bu kullanıcının yönetici sayfasında](%{user_url}) sessizleştirmeyi kaldır düğmesine tıklayın. + + Bu eşik, `silence_new_user` site ayarları üzerinden değiştirilebilir. spam_post_blocked: title: "İstenmeyen Gönderi Engellendi" subject_template: "%{username} adlı yeni kullanıcının gönderileri tekrarlanan bağlantılar nedeniyle engellendi" @@ -3598,6 +3748,12 @@ tr_TR: Merhaba, Yeni kullanıcılardan gelen gönderiler moderasyon için bekletildi ve şu anda incelenmeyi bekliyor. [Onları buradan onaylayın veya reddedin](%{base_url}/review?type=ReviewableQueuedPost). + user_posts_deleted: + title: "Kullanıcı Gönderileri Silindi" + subject_template: "%{user}'ın tüm gönderileri silinmiştir." + text_body_template: + one: "@%{user} tarafından gönderilen %{count} gönderi @%{staff_user} tarafından silinmiştir." + other: "@%{user} tarafından gönderilen %{count} gönderi @%{staff_user} tarafından silinmiştir." unsubscribe_link: | Bu e-posta aboneliğinden çıkmak için [buraya tıklayın](%{unsubscribe_url}). unsubscribe_link_and_mail: | @@ -3711,6 +3867,7 @@ tr_TR: %{respond_instructions} user_replied: title: "Kullanıcı Yanıtladı" + preview: "Birisi gönderinize yanıt verdi." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3733,6 +3890,7 @@ tr_TR: %{respond_instructions} user_quoted: title: "Kullanıcı Alıntı yaptı" + preview: "Birisi bir gönderide sizi alıntıladı." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3744,6 +3902,7 @@ tr_TR: %{respond_instructions} user_linked: title: "Kullanıcı Bağlantı Verdi" + preview: "Başka bir konuda bağlantısı paylaşılmış gönderi." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3755,6 +3914,7 @@ tr_TR: %{respond_instructions} user_mentioned: title: "Kullanıcı Bahsetti" + preview: "Birisi bir gönderide senden bahsetmiş." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3810,6 +3970,7 @@ tr_TR: %{respond_instructions} user_posted: title: "Kullanıcı Gönderi Yaptı" + preview: "Birisi izlediğiniz bir konuya yanıt verdi." subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -3843,6 +4004,7 @@ tr_TR: %{respond_instructions} user_posted_pm: title: "Kullanıcı Kişisel Mesaj Gönderdi" + preview: "Birisi size özel mesaj gönderdi." subject_template: "[%{email_prefix}] [Kişisel Mesaj] %{topic_title}" text_body_template: | %{header_instructions} @@ -3911,6 +4073,12 @@ tr_TR: account_second_factor_disabled: title: "İki Adımlı Kimlik Doğrulama devre dışı" subject_template: "[%{email_prefix}] İki Adımlı Kimlik Doğrulama devre dışı" + text_body_template: | + %{site_name} adresindeki hesabınızda iki faktörlü kimlik doğrulama devre dışı bırakılmıştır. Artık yalnızca şifrenizle oturum açabilirsiniz; ek kimlik doğrulama kodu artık gerekli değildir. + + İki faktörlü kimlik doğrulamayı (2FA) devre dışı bırakmayı seçmediyseniz, hesabınız birisi tarafından ele geçirilmiş olabilir. + + Herhangi bir sorunuz varsa, [güler yüzlü personelimizle iletişime geçin](%{base_url}/about). digest: why: "%{since} tarihinden bu yana %{site_link} adresinin kısa bir özeti" since_last_visit: "Son ziyaretinizden bu yana" @@ -3931,6 +4099,7 @@ tr_TR: preheader: "%{since} tarihinden bu yana kısa bir özet" forgot_password: title: "Şifremi Unuttum" + preview: "Şifrenizi sıfırlayın." subject_template: "[%{email_prefix}] Şifre sıfırlama" text_body_template: | Biri [%{site_name}](%{base_url}) şifrenizi sıfırlamak istedi. @@ -3952,6 +4121,7 @@ tr_TR: %{base_url}/session/email-login/%{email_token} set_password: title: "Şifre Belirle" + preview: "Hesap şifresini ayarlayın." subject_template: "[%{email_prefix}] Şifre Belirle" text_body_template: | Biri [%{site_name}](%{base_url}) hesabınıza şifre eklemek istedi. Alternatif olarak, bu doğrulanmış e-posta adresiyle ilişkili desteklenen herhangi bir çevrimiçi hizmeti (Google, Facebook, vb.) kullanarak giriş yapabilirsiniz. @@ -3962,6 +4132,7 @@ tr_TR: %{base_url}/u/password-reset/%{email_token} admin_login: title: "Yönetici Girişi" + preview: "Yönetici girişi isteniyor." subject_template: "[%{email_prefix}] Giriş" text_body_template: | Biri [%{site_name}](%{base_url}) hesabınıza giriş yapmak istedi. @@ -3972,6 +4143,7 @@ tr_TR: %{base_url}/session/email-login/%{email_token} account_created: title: "Hesap Oluşturuldu" + preview: "Sizin için yeni bir hesap oluşturuldu." subject_template: "[%{email_prefix}] Yeni Hesabınız" text_body_template: | Sizin için %{site_name}'ta yeni bir hesap oluşturuldu @@ -4011,6 +4183,7 @@ tr_TR: text_body_template: "Yeni bir e-posta adresi ekleyebilmemiz için mevcut e-posta hesabını kontrol ettiğinizi onaylamanız gerekiyor. Bu adımı tamamladıktan sonra yeni e-posta adresini onaylamanızı isteyeceğiz. \n\nAşağıdaki bağlantıya tıklayarak %{site_name} için mevcut e-posta adresinizi onaylayın: \n\n%{base_url}/u/confirm-old-email/%{email_token}\n" notify_old_email: title: "Eski E-postaya Bildirim Gönder" + preview: "E-posta adresi güncellendi." subject_template: "[%{email_prefix}] E-posta adresiniz değiştirildi" text_body_template: | Bu, %{site_name} için e-posta adresinizin değiştirildiğini bildiren otomatik bir mesajdır. Bu işlem yanlışlıkla yapıldıysa lütfen @@ -4030,6 +4203,7 @@ tr_TR: %{new_email} signup_after_approval: title: "Onaydan Sonra Kayıt" + preview: "Yeni hesap onaylandı." subject_template: "%{site_name}'ta onaylandınız!" text_body_template: "%{site_name}'a hoş geldiniz!\n\nBir personel, %{site_name}'daki hesabınızı onayladı.\n\nArtık yeni hesabınıza %{base_url} adresinden giriş yaparak erişebilirsiniz\n\nYukarıdaki bağlantı tıklanabilir değilse kopyalayıp web tarayıcınızın adres çubuğuna yapıştırmayı deneyin. \n\n%{new_user_tips} \n\nHer zaman [medeni topluluk davranışına](%{base_url}/guidelines) inanıyoruz. \n\nKeyfini çıkarın!\n" signup_after_reject: @@ -4041,6 +4215,7 @@ tr_TR: %{reject_reason} signup: title: "Kaydol" + preview: "Hesabınızı onaylayın." subject_template: "[%{email_prefix}] Yeni hesabınızı onaylayın" text_body_template: "%{site_name}'a hoş geldiniz! \n\nYeni hesabınızı onaylamak ve etkinleştirmek için aşağıdaki bağlantıya tıklayın: \n%{base_url}/u/activate-account/%{email_token}\n\nYukarıdaki bağlantı tıklanabilir değilse kopyalayıp web tarayıcınızın adres çubuğuna yapıştırmayı deneyin.\n" activation_reminder: @@ -4057,6 +4232,7 @@ tr_TR: Yukarıdaki bağlantı tıklanabilir değilse kopyalayıp web tarayıcınızın adres çubuğuna yapıştırmayı deneyin. suspicious_login: title: "Yeni Giriş Uyarısı" + preview: "Cihazınızı doğrulayın." subject_template: "[%{site_name}] %{location} Konumundan Yeni Giriş" text_body_template: | Merhaba, @@ -4083,8 +4259,14 @@ tr_TR: page_not_found: page_title: "Sayfa Bulunamadı" title: "Hay aksi! Bu sayfa mevcut değil ya da gizli." + subtitle: "Her yere baktık ama aradığınız sayfayı bulamadık." + popular_topics: "Popüler konular" + recent_topics: "Son konular" see_more: "Daha fazla" + search_title: "Bunun yerine arama yapmayı denemek ister misiniz?" search_button: "Ara" + home: "Beni eve götür" + placeholder: "Başlığa veya anahtar kelimelere göre konu ara…" offline: title: "Uygulama yüklenemiyor" offline_page_message: "Görünüşe göre çevrimdışısınız! Lütfen ağ bağlantınızı kontrol edip tekrar deneyin." @@ -4093,6 +4275,7 @@ tr_TR: upload: edit_reason: "görüntülerin yerel kopyaları indirildi" unauthorized: "Üzgünüz, yüklemeye çalıştığınız dosyaya izin verilmiyor (izin verilen uzantılar: %{authorized_extensions})." + images_only: "Üzgünüz, bu ayar için yalnızca resim yükleyebilirsiniz." pasted_image_filename: "Yapıştırılan görüntü" store_failure: "#%{user_id} adlı kullanıcı için yükleme #%{upload_id} depolanamadı." file_missing: "Üzgünüz, yüklenecek bir dosya sağlamalısınız." @@ -4180,6 +4363,8 @@ tr_TR: latte_theme_name: "Latte" summer_theme_name: "Yaz" dark_rose_theme_name: "Kara Gül" + errors: + cannot_edit_remote_copies: "Renk paletlerinin uzak kopyalarında düzenleme yapılamaz." edit_this_page: "Bu sayfayı düzenle" csv_export: boolean_yes: "Evet" @@ -4632,12 +4817,18 @@ tr_TR: nice_share: name: Hoş Paylaşım description: 25 benzersiz ziyaretçili bir gönderi paylaştı + long_description: | + Bu rozet, 25 farklı dış ziyaretçi tarafından tıklanan bir bağlantıyı paylaştığınız için verilir. Tartışmalarımızı ve bu topluluğu duyurduğunuz için teşekkür ederiz. good_share: name: İyi Paylaşım description: 300 benzersiz ziyaretçili bir gönderi paylaştı + long_description: | + Bu rozet, 300 farklı dış ziyaretçi tarafından tıklanan bir bağlantıyı paylaştığınız için verilir. Aferin! Bir grup yeni insana harika bir tartışma sergilediniz ve bu topluluğun büyümesine katkıda bulundunuz. great_share: name: Harika Paylaşım description: 1000 benzersiz ziyaretçili bir gönderi paylaştı + long_description: | + Bu rozet, 1000 farklı dış ziyaretçi tarafından tıklanan bir bağlantıyı paylaştığınız için verilir. Vay canına! İlginç bir tartışmayı büyük bir yeni kitleye tanıttınız ve topluluğumuzun büyük ölçüde büyümesine yardımcı oldunuz! first_like: name: İlk Beğeni description: Bir gönderiyi beğendi @@ -4805,6 +4996,15 @@ tr_TR: one: "En az %{count} etiket seçmelisiniz." other: "En az %{count} etiket seçmelisiniz." upload_row_too_long: "CSV dosyasında her satırda bir etiket bulunmalıdır. İsteğe bağlı olarak etiketten sonra bir virgül ve ardından etiket grubu adı gelebilir." + bulk_create: + invalid_params: "Geçersiz parametreler. Lütfen bir dizi etiket adı girin." + invalid_name: "Geçersiz etiket adı." + tag_too_long: + one: "Etiket çok uzun (maksimum %{count} karakter)." + other: "Etiket çok uzun (maksimum %{count} karakter)." + too_many_tags: + one: "Çok fazla etiket var. Bir seferde en fazla %{count} etiket oluşturabilirsiniz. Daha büyük içe aktarmalar için CSV yükleme özelliğini kullanın." + other: "Çok fazla etiket var. Bir seferde en fazla %{count} etiket oluşturabilirsiniz. Daha büyük içe aktarmalar için CSV yükleme özelliğini kullanın." forbidden: invalid: one: "Seçtiğiniz etiket kullanılamaz" @@ -4831,6 +5031,9 @@ tr_TR: rss_by_tag: "%{tag} etiketli konular" finish_installation: congratulations: "Tebrikler, Discourse'u yüklediniz!" + login_with_discourse_id: "Discourse ID ile giriş yapın" + discourse_id_help: "Lütfen aşağıdaki düğmeyi kullanarak Discourse ID ile giriş yapın.

`DISCOURSE_DEVELOPER_EMAILS` ortam değişkeniyle eşleşen birincil e-posta adresine sahip bir Discourse ID hesabı kullandığınızdan emin olun." + discourse_id_error_help: "Şu anda e-posta kurulumunu atlamayı seçtiniz. Ne yazık ki, yukarıdaki hata mesajı nedeniyle kurulum devam edemiyor. Lütfen bu sorunu meta.discourse.org adresinde bildirin." register: button: "Kayıt Ol" title: "Yönetici Hesabı Aç" @@ -4842,6 +5045,10 @@ tr_TR: resend_email: title: "Etkinleştirme E-postasını Yeniden Gönder" message: "

%{email} adresine etkinleştirme e-postasını yeniden gönderdik" + discourse_id: + help: "Şu anda sizin için Discourse ID'yi kuruyoruz." + no_allowed_emails: "DISCOURSE_DEVELOPER_EMAILS'de izin verilen e-posta adresi yapılandırılmamış. Site kurulumu devam ettirilemiyor." + global_notice: "Henüz hiçbir yönetici oturum açmadı. Kurulumu tamamlamak için, `DISCOURSE_DEVELOPER_EMAILS` ortam değişkeniyle eşleşen bir e-posta adresiyle Discourse ID hesabını kullanarak oturum açın." safe_mode: title: "Güvenli moda gir" description: "Güvenli mod, temaları veya istemci tarafı eklenti özelleştirmelerini yüklemeden sitenizi test etmenize olanak tanır. Sunucu tarafı eklenti özelleştirmeleri etkin durumda kalır." @@ -4852,14 +5059,20 @@ tr_TR: deprecation_error_label: Javascript kullanımdan kaldırmaları hata oluştursun enter: "Güvenli Moda Gir" must_select: "Güvenli moda girmek için en az bir seçenek belirlemelisiniz." + dev_mode: + title: "Geliştirici Modu" + enable_rack_mini_profiler: "Rack Mini Profiler'ın oturum değişiklikleri arasında 1 saat boyunca kalıcı olmasını etkinleştirin" + enter: "Geliştirici Moduna Gir" wizard: title: "Discourse Kurulumu" step: setup: title: "Başlarken" + description: "Topluluğunuzu temel özelliklerle kurmaya başlayalım. Bunları daha sonra istediğiniz zaman değiştirebilirsiniz." fields: title: label: "Topluluk adı" + placeholder: "Jane'in Takılma Yeri" default_locale: label: "Dil" login_required: @@ -4907,9 +5120,20 @@ tr_TR: review_by: "İnceleyen:" pr_summary: "%{commits} işlem %{changed_files} dosyalarını %{additions} eklemeler ve %{deletions} silmelerle değiştirdi" no_description: "GitHub'da bir hesap oluşturarak %{repo} geliştirmesine katkıda bulunun." + pr_title: + default: "Çekme İsteği" + draft: "Taslak Çekme İsteği" + open: "Çekme isteği aç" + approved: "Onaylanmış Çekme İsteği" + changes_requested: "Değişiklik talep edildi" + merged: "Birleştirilmiş Çekme İsteği" + closed: "Kapalı Çekme İsteği" status_date: open: "açıldı" + draft: "taslağı hazırlanmış" approved: "onaylanmış mı" + changes_requested: "değişiklikler talep edildi" + merged: "birleştirildi" closed: "kapatıldı" discourse_push_notifications: popup: @@ -4925,9 +5149,12 @@ tr_TR: confirm_body: "Başarılı! Bildirimler etkinleştirildi." custom: "%{site_title}'da %{username} adlı kullanıcıdan bildirim" staff_action_logs: + redacted: "[içerik görünmüyor]" json_too_long: "Sütun uzunluğu sınırlarını aştığından değerler günlüğe kaydedilmiyor" not_found: "bulunamadı" unknown: "bilinmeyen" + site_setting: + update_existing_users: "mevcut kullanıcıları güncelle? %{value}" user_merged: "%{username} bu hesapla birleştirildi" user_delete_self: "%{url} adresinden kendisi tarafından silindi" webhook_deactivation_reason: "Web kancanız otomatik olarak devre dışı bırakıldı. Birden fazla \"%{status}\" HTTP durum hatası yanıtı aldık." @@ -4948,9 +5175,14 @@ tr_TR: auto_deleted_hidden_posts: "Gizli gönderiler otomatik olarak yok edildi" seed_data_topic_updated: "Tohum veri konusu güncellendi" seed_data_topic_deleted: "Tohum veri konusu silindi" + upcoming_changes: + log_manually_toggled: "Kullanıcı tarafından manuel olarak açılıp kapatılır." + log_promoted: > + Bu yaklaşan değişiklik ‘%{change_status}’ durumuna ulaştı, bu nedenle sitenizde otomatik olarak etkinleştirildi. Daha fazla ayrıntı için yaklaşan değişiklikler sayfasına bakın. reviewables: already_handled: "Teşekkürler, ancak bu gönderiyi zaten inceledik ve tekrar bayrak eklenmesine gerek olmadığına karar verdik." already_handled_and_user_not_exist: "Teşekkürler, ancak biri zaten incelemiş ve o kullanıcı artık mevcut değil." + post_restored_by_author: "Gönderi yazar tarafından geri yüklendi" priorities: low: "Düşük" medium: "Orta" @@ -5016,14 +5248,19 @@ tr_TR: description: "Bayrağı kabul edin ve bu gönderiyi gizleyin + otomatik olarak kullanıcıya bu gönderiyi düzenlemesini isteyen bir mesaj gönderin" complete: "Gönderi gizlendi, kullanıcı bilgilendirildi." agree_and_edit: + title: "Yazıyı düzenle" description: "Bayrağı kabul edin ve gönderiyi düzenlemek için bir besteci penceresi açın." complete: "Bayrak onaylandı, artık gönderiyi düzenleyebilirsiniz." delete: title: "Sil" complete: "Gönderi silindi." delete_and_ignore: + title: "Gönderiyi sil ve bayrağı yok say" + description: "Gönderiyi silin ve kuyruktan kaldırarak bildirimi yok sayın; ilk gönderiyse, konuyu da silin. " complete: "Gönderi silindi." delete_and_ignore_replies: + title: "Gönderiyi ve yanıtları sil, bayrağı yok say" + description: "Gönderiyi ve tüm yanıtlarını silin, ardından kuyruktan kaldırarak bildirimi yok sayın; ilk gönderi ise konuyu da silin." confirm: "Gönderiye verilen yanıtları da silmek istediğinizden emin misiniz?" complete: "Gönderi ve yanıtlar silindi." delete_and_agree: @@ -5037,19 +5274,23 @@ tr_TR: complete: "Gönderi ve yanıtlar silindi." disagree_and_restore: title: "Gönderiyi geri yükle" + description: "Bayrağa onay verme ve gönderiyi geri yükle" complete: "Gönderi geri yüklendi." disagree_bundle: title: "Hayır" disagree: title: "Gönderiyi tut" + description: "Bayrağa katılmıyorum" complete: "Bayrak yok sayıldı." discard_post: title: "Gönderiyi sil" complete: "Gönderi silindi." revise_and_reject_post: + title: "Revizyon isteği..." complete: "Gönderi reddedildi ve revizyon bekleniyor." ignore: title: "Yok say" + description: "Herhangi bir işlem yapmadan kuyruktan kaldırın." complete: "Bayrak yok sayıldı." ignore_and_do_nothing: title: "Hiçbir şey yapma" @@ -5077,6 +5318,7 @@ tr_TR: title: "Hayır" delete: title: "Kullanıcıyı Sil" + description: "Engellemeden kullanıcıyı sil" complete: "Kullanıcı silindi." block: title: "Kullanıcıyı Sil ve Engelle" @@ -5086,6 +5328,7 @@ tr_TR: title: "Evet" not_spam: title: "Hayır" + description: "Spam değil, kullanıcıyı onayla" reject: title: "Reddet" bundle_title: "Reddet…" @@ -5098,9 +5341,13 @@ tr_TR: reject_and_delete: title: "Reddet ve Gönderiyi Sil" complete: "Gönderi reddedildi ve silindi." + reject_and_delete_standalone: + title: "Hayır, gönderiyi sil" reject_and_keep_deleted: title: "Gönderiyi silinmiş olarak tut" complete: "Gönderi reddedildi ve silinmiş olarak kaldı." + reject_and_keep_deleted_standalone: + title: "Hayır, silinen gönderiyi sakla" scrub: title: Temizleme kaydı approve_and_restore: @@ -5109,27 +5356,52 @@ tr_TR: approve_and_unhide: title: "Evet" complete: "Gönderi onaylandı ve gizlemesi kaldırıldı" + post_actions: + bundle_title: "Bu gönderiyle ne yapmak istiyorsunuz?" delete_post: title: "Gönderiyi sil" + description: "Bu gönderiyi sil" complete: "Gönderi silindi" hide_post: title: "Gönderiyi gizle" + description: "Bu gönderiyi herkesten gizle" + complete: "Gizli gönderi" + unhide_post: + title: "Gönderiyi göster" + description: "Bu gönderiyi tüm kullanıcılar için görünür hale getir" + complete: "Gönderi gizlilikten çıkarıldı" restore_post: title: "Gönderiyi geri yükle" + description: "Silinen bu gönderiyi geri yükle" complete: "Gönderi geri yüklendi" + edit_post: + title: "Yazıyı düzenle" + description: "Bu gönderinin içeriğini düzenle" + complete: "Gönderi düzenlendi" + user_actions: + bundle_title: "Kullanıcıyla ne yapmak istiyorsunuz?" silence_user: title: "Kullanıcıyı sustur" + description: "Kullanıcının gönderi yapmasını engelle" complete: "Kullanıcı susturuldu" + reason: "Kullanıcı inceleme kuyruğu aracılığıyla susturuldu" suspend_user: title: "Kullanıcıyı askıya al" + description: "Kullanıcı hesabını askıya al" complete: "Kullanıcı askıya alındı" + reason: "İnceleme kuyruğu aracılığıyla askıya alınan kullanıcı" delete_user: title: "Kullanıcı sil" + description: "Bu kullanıcıyı forumdan sil" complete: "Kullanıcı silindi" reason: "İnceleme kuyruğu aracılığıyla silindi" delete_and_block_user: + title: "Sil ve engelle" + description: "Kullanıcıyı silin ve IP adresini/e-posta adresini engelleyin." complete: "Kullanıcı silindi ve engellendi" delete_user_block: + title: "Sil ve engelle" + description: "Kullanıcıyı silin ve IP adresini/e-posta adresini engelleyin." complete: "Kullanıcı silindi ve engellendi" email_style: html_missing_placeholder: "Html şablonu %{placeholder} içermeli" @@ -5174,6 +5446,11 @@ tr_TR: reserved_id: "kimlik olarak ayrılmış bir anahtar kelimeye sahip: %{id}" unsafe_description: "güvenli olmayan bir HTML açıklaması var" invalid_tag_group: "geçersiz etiket grubuna sahip: %{tag_group_name}" + discourse_id: + already_registered: "Bu site Discourse ID'ye zaten kayıtlıdır." + errors: + not_configured: "Discourse ID yapılandırılmamıştır. Lütfen önce Discourse ID'yi etkinleştirin." + regenerate_failed: "Kimlik bilgilerini yeniden oluşturulamadı. Lütfen daha sonra tekrar deneyin." activemodel: errors: <<: *errors diff --git a/config/locales/server.ug.yml b/config/locales/server.ug.yml index dfd0e6688e219..de536f62dddce 100644 --- a/config/locales/server.ug.yml +++ b/config/locales/server.ug.yml @@ -1209,9 +1209,10 @@ ug: description: "پاش قىلىشنىڭ تىپى، يوللىغۇچى، پاش قىلغۇچى ۋە ھەل قىلىش ۋاقتىنى ئۆز ئىچىگە ئالغان پاش قىلىش ھالىتى تىزىمى." visits: title: "ئىشلەتكۈچى زىيارەت" - xaxis: "كۈن" + xaxis: + desktop: "ئۈستەل يۈزى" + mobile: "كۆچمە" yaxis: "زىيارەت قېتىم سانى" - description: "تىزىمغا كىرگەن ئىشلەتكۈچىنىڭ زىيارەت سانى." signups: title: "تىزىملىتىش" xaxis: "كۈن" @@ -1273,10 +1274,8 @@ ug: description: "تىزىمغا كىرگەن ئىشلەتكۈچى، نامسىز ئىشلەتكۈچى ۋە تونۇش ئۆمىلىگۈچى ۋە باشقا ئېقىمنىڭ بەت كۆرۈلۈشى." description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "كۈندىلىك ئاكتىپ ئىشلەتكۈچى/ئايلىق ئاكتىپ ئىشلەتكۈچى" xaxis: "كۈن" yaxis: "كۈندىلىك ئاكتىپ ئىشلەتكۈچى/ئايلىق ئاكتىپ ئىشلەتكۈچى" - description: "ئۆتكەن بىر كۈندە تىزىمغا كىرگەن ئەزا سانىنى ئۆتكەن بىر ئايدا تىزىمغا كىرگەن ئىشلەتكۈچىگە بۆلگەندىكى سان - قايتۇرغان قىممىتى جامائەتنىڭ يېپىشقاقلىقىنى ئەكس ئەتتۈرىدۇ، نىشان >%20" daily_engaged_users: title: "كۈندىلىك قاتناشقۇچىلار" xaxis: "كۈن" @@ -2173,7 +2172,6 @@ ug: group_in_subject: "ئېلخەت ماۋزۇسىدا %%{optional_pm} نى شەخسىي ئۇچۇردىكى تۇنجى گۇرۇپپا ئىسمىغا تەڭشەيدۇ، ئۆلچەملىك ئېلخەتنىڭ ماۋزۇ پىچىمىنى خاسلاشتۇرۇشتىن كۆرۈڭ" allow_anonymous_mode: "ئىشلەتكۈچىنىڭ نامسىز ھالەتكە ئالمىشىپ يازما يوللاش تاللانمىسىنى قوزغىتىدۇ. ئاكتىپلانغاندىن كېيىن، ئىشلەتكۈچى تور بېكەتتە يازما ياكى تېما قۇرسا سالاھىيىتىنى يوشۇرالايدۇ. ئۇنىڭدىن باشقا «نامسىز ياقتۇرۇشقا يول قويىدۇ» نى كۆرۈڭ." anonymous_account_duration_minutes: "نامسىز ئىشلەتكۈچىنى قوغداش ئۈچۈن، ھەر N مىنۇتتا ھەر بىر ئىشلەتكۈچى ئۈچۈن بىر يېڭى نامسىز ھېسابات قۇرىدۇ. مىسال: ئەگەر 600 گە تەڭشەلسە، ئالدىنقى قېتىم يازما يوللىغانغا 600 مىنۇت بولۇپ نامسىز ئىشلەتكۈچى ھالىتىگە ئالماشقاندا، يېڭى بىر نامسىز ئىشلەتكۈچى قۇرىدۇ." - hide_user_profiles_from_public: "نامسىز ئىشلەتكۈچىنىڭ ئىشلەتكۈچى كارتىسى، ئىشلەتكۈچى تەرجىمىھالى ۋە ئىشلەتكۈچى مۇندەرىجىسىنى چەكلەيدۇ." hide_new_user_profiles: "ئىشەنچ دەرىجىسى 1 ياكى ئۇنىڭدىن تۆۋەن ئىشلەتكۈچىلەرنىڭ تەرجىمىھالىنى ئاممىغا يوشۇرىدۇ ھەمدە ئىشەنچ دەرىجىسى 1 بولغان ئىشلەتكۈچى تۇنجى يازمىسىنى يوللىمىغۇچە ئۇنى يوشۇرىدۇ. بۇ ئىقتىدار must_approve_users ۋە invite_only sites تور بېكىتىدە شەرتسىز چەكلىنىدۇ." allow_users_to_hide_profile: "ئىشلەتكۈچىنىڭ تەرجىمىھالى ۋە ھالىتىنى يوشۇرۇشقا يول قويىدۇ" hide_user_activity_tab: "ئىشلەتكۈچى تەرجىمىھالىدىكى پائالىيەت بەتكۈچىنى يوشۇرىدۇ، باشقۇرغۇچى ۋە ئۆزى بۇنىڭ سىرتىدا." @@ -2895,35 +2893,9 @@ ug: new_version_mailer: title: "يېڭى نەشرىدىكى خەت" subject_template: "[%{email_prefix}] يېڭى Discourse نەشرى، يېڭىلانما بار" - text_body_template: | - ھۇررا، يېڭى نەشرىدىكى [Discourse](https://www.discourse.org) ئېلان قىلىندى! - - نەشرىڭىز: %{installed_version} - يېڭى نەشرى: **%{new_version}** - - - يېڭىلاشتا بىزنىڭ **[بىر چېكىپلا توركۆرگۈدە يېڭىلاش](%{base_url}/admin/update) نى ئىشلىتىڭ** - - - [تارقىتىش ئۇقتۇرۇشى](https://meta.discourse.org/tag/release-notes) دىكى يېڭىلىق ياكى [ئەسلى GitHub ئۆزگىرىش خاتىرىسى] (https://github.com/discourse/discourse/commits/main) نى كۆرۈشتە - - - Discourse ھەققىدىكى خەۋەر، سۆھبەت ۋە قوللاش ئۇچۇرىنى كۆرۈشتە [meta.discourse.org](https://meta.discourse.org) نى زىيارەت قىلىڭ new_version_mailer_with_notes: title: "نەشر ئىزاھاتى بار يېڭى نەشرىدىكى خەت" subject_template: "[%{email_prefix}] يېڭىلانما بار" - text_body_template: | - ھۇررا، يېڭى نەشرىدىكى [Discourse](https://www.discourse.org) ئېلان قىلىندى! - - نەشرىڭىز: %{installed_version} - يېڭى نەشرى: **%{new_version}** - - - يېڭىلاشتا بىزنىڭ **[بىر چېكىپلا توركۆرگۈدە يېڭىلاش](%{base_url}/admin/update) نى ئىشلىتىڭ** - - - [تارقىتىش ئۇقتۇرۇشى](https://meta.discourse.org/tag/release-notes) دىكى يېڭىلىق ياكى [ئەسلى GitHub ئۆزگىرىش خاتىرىسى] (https://github.com/discourse/discourse/commits/main) نى كۆرۈشتە - - - Discourse ھەققىدىكى خەۋەر، سۆھبەت ۋە قوللاش ئۇچۇرىنى كۆرۈشتە [meta.discourse.org](https://meta.discourse.org) نى زىيارەت قىلىڭ - - ###تارقىتىش ئىزاھاتى - - %{notes} flag_reasons: off_topic: "يازمىڭىز **تېمىدىن چەتنىگەن** دەپ پاش قىلىنغان: تېمىنىڭ ماۋزۇسى ۋە تۇنجى يازمىغا ئاساسەن جامائەت بۇ تېمىغا ماس كەلمەيدۇ دەپ قارايدۇ." inappropriate: "يازمىڭىز **مۇۋاپىق بولمىغان** دەپ پاش قىلىنغان: جامائەت ئۇنى كىشىنى بىزار قىلىدىغان، ھاقارەتلەيدىغان، ئۆچمەنلىككە تەۋە قىلمىش ياكى [جامائەت مىزانىمىز](%{base_path}/guidelines) غا خىلاپ دەپ قارايدۇ." diff --git a/config/locales/server.uk.yml b/config/locales/server.uk.yml index 396af5886cc51..88613d83d4174 100644 --- a/config/locales/server.uk.yml +++ b/config/locales/server.uk.yml @@ -300,6 +300,7 @@ uk: errors: &errors format: ! "%{attribute} %{message}" format_with_full_message: "%{attribute}: %{message}" + diff_too_complex: "Різниця занадто складна для безпечного обчислення. Будь ласка, спробуйте менші зміни." messages: invalid_locale: "%{invalid_locale} не є дійсною локаллю" too_long_validation: @@ -918,6 +919,12 @@ uk: other: "Неможливо видалити цей розділ, тому що в ньому міститься %{count} тем. Найстаріша тема %{topic_link}." topic_exists_no_oldest: "Неможливо видалити цей розділ, тому що кількість тем у ньому дорівнює %{count}." uncategorized_description: "Теми, які не потребують розділів або не підходять до жодного іншого наявного розділу." + category_types: + not_available: "Тип категорії '%{type_name}' недоступний" + discussion: + name: "Обговорення" + title: "обговорення" + description: "Стандартна категорія з усіма аспектами розмови." trust_levels: admin: "Адміністратор" staff: "Команда обслуговування" @@ -1291,6 +1298,8 @@ uk: weekly: "щотижня" every_month: "щомісяця" every_six_months: "кожні півроку" + calendar_subscriptions: + application_name: "Підписки на календар" user_api_key: title: 'Авторизувати "%{application_name}"' authorize: "Авторизувати" @@ -1379,9 +1388,11 @@ uk: description: "Список статусів скарг, включаючи тип скарги, дописувачі, доповідачі та час розвʼязання." visits: title: "Візити користувачів" - xaxis: "День" + xaxis: + desktop: "Десктоп" + mobile: "Мобільний" yaxis: "Кількість візитів" - description: "Кількість відвідувань зареєстрованих користувачів." + description: "Кількість відвідувань користувачів, що пройшли авторизацію за типом пристрою." signups: title: "Реєстрації" xaxis: "Дата" @@ -1445,10 +1456,10 @@ uk: description: "Перегляди сторінок для зареєстрованих користувачів, анонімних користувачів, відомих сканерів та іншого трафіку." description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "DAU/MAU" + title: "DAU / MAU" xaxis: "День" yaxis: "DAU/MAU" - description: "Кількість учасників, які увійшли в систему в останній день, поділене на кількість учасників, які увійшли в систему минулого місяця, повертає %, який вказує на 'привабливість' спільноти. Мета >20%." + description: "Частка активних учасників щомісяця, які повернулися за останній день. Цей відсоток показує, як регулярно люди повертаються; також називається «прив’язаністю» спільноти. Прагніть до > 20%." daily_engaged_users: title: "Щоденно Залучені Користувачі" xaxis: "День" @@ -1865,6 +1876,8 @@ uk: max_oneboxes_per_post: "Встановіть максимальну кількість ящиків, які можна включити в одну публікацію. Oneboxes забезпечує попередній перегляд пов’язаного вмісту в публікації." facebook_app_access_token: "Токен, згенерований з ідентифікатора додатка Facebook і секрету. Використовується для генерації розумних вставок Instagram." github_onebox_access_tokens: "Зіставлення організації GitHub або користувача з токеном доступу до GitHub, який використовується для створення GitHub однобоксів для приватного репозиторію, коміти, запити, задачі та вміст файлу. Без цього будуть лише публічні GitHub URL-адреси." + reddit_onebox_client_id: "Ідентифікатор клієнта OAuth API Reddit, який використовується для автентифікованих OneBox на Reddit. Створіть програму типу «скрипт» на сайті reddit.com/prefs/apps, щоб отримати облікові дані." + reddit_onebox_client_secret: "Секретний ключ клієнта Reddit API OAuth, який використовується для автентифікованих OneBox на Reddit. Знаходиться в додатку типу «скрипт», створеному на reddit.com/prefs/apps." logo: "Зображення логотипа в лівому верхньому кутку вашого сайту. Використовуйте широке прямокутне зображення висотою 120 і співвідношенням сторін більше 3:1. Якщо залишити поле порожнім, буде показаний текст заголовка сайту." logo_small: "Невелике зображення логотипа в лівому верхньому кутку вашого сайту, видно при прокручуванні вниз. Використовуйте квадратне зображення 120×120. Якщо залишити порожнім, буде показаний домашній гліф." digest_logo: "Альтернативне зображення логотипа, що використовується у верхній частині e-mail пошти вашого сайту. Використовуйте зображення широкого прямокутника. Не використовуйте SVG-зображення. Якщо залишити порожнім, буде використовуватися зображення з налаштування `logo `." @@ -1947,6 +1960,7 @@ uk: moderators_manage_categories: "Дозволити модераторам створювати категорії та керувати ними" moderators_manage_groups: "Дозволити модераторам створювати групи та керувати ними" moderators_change_post_ownership: "Дозволити модераторам змінювати власника допису" + change_post_ownership_allowed_groups: "Дозволити користувачам у цих групах змінювати власника публікацій" cors_origins: "Дозволити origins для запитів CORS. Кожне origin повинне містити http:// або https://. Змінна DISCOURSE_ENABLE_CORS env повинна бути true, щоб увімкнути CORS." use_admin_ip_allowlist: "Адміністратори можуть увійти в систему тільки в тому випадку, якщо їх IP-адреса вказана в білому списку (Адміністратор > Журнали > IP-адреси)." blocked_ip_blocks: "Список приватних діапазонів IP-адрес, які ніколи не повинні скануватися Discurse" @@ -2382,7 +2396,7 @@ uk: allow_likes_in_anonymous_mode: "Увімкніть цей параметр, щоб дозволити користувачам, які анонімно переглядають ваш сайт, ставити лайки публікаціям. Після активації користувачі можуть приховувати свої ідентифікаційні дані під час позначення лайками публікацій чи тем на сайті. Для цього параметра потрібно ввімкнути параметр «дозволити анонімний режим»." anonymous_posting_allowed_groups: "Групи, яким дозволено анонімні публікації. Для цього параметра потрібно увімкнути параметр «дозволити анонімний режим»." anonymous_account_duration_minutes: "Щоб захистити анонімність, створюйте новий анонімний обліковий запис кожні N хвилин для кожного користувача. Приклад: якщо встановлено значення 600, щойно мине 600 хвилин після останньої публікації ТА користувач перейде в anon, буде створено новий анонімний обліковий запис." - hide_user_profiles_from_public: "Вимкнути картки, профілі та розділ користувачів для анонімних користувачів." + hide_user_profiles_from_public: "Вимкнути картки користувачів та профілі користувачів для анонімних користувачів. Зведена статистика все ще буде доступна в каталозі користувачів." hide_new_user_profiles: "Приховати профілі користувачів рівня довіри 1 або нижчого рівня та користувачів рівня довіри 1 від публіки, доки вони не опублікують перше повідомлення. Ця функція безумовно вимкнена на сайтах, де must_approve_users і invite_only." allow_users_to_hide_profile: "Дозволити користувачам приховувати свій профіль та присутність на форумі" hide_user_activity_tab: "Приховати вкладку активності у профілях користувачів, окрім Адміна та себе." @@ -2580,6 +2594,7 @@ uk: dashboard_hidden_reports: "Дозволити приховати вказані звіти з панелі інструментів." dashboard_visible_tabs: "Виберіть, які вкладки інформаційної панелі будуть видимі." dashboard_general_tab_activity_metrics: "Виберіть звіти, які показуватимуться як показники активності на загальній вкладці." + gravatar_enabled: "Використовуйте сервіс Gravatar для аватарів користувачів. Вимкнення цього сервісу не дозволить користувачам переходити на Gravatar для своїх аватарів, але це не вплине на користувачів, які вже його використовують." gravatar_name: "Вкажіть назву постачальника послуг Gravatar. Ця назва зазвичай використовується для ідентифікації джерела, яке надає аватари Gravatar на сайт." gravatar_base_url: "Вкажіть URL-адресу для доступу до API постачальника Gravatar. Цей параметр є критичним для перетворення адрес електронної пошти на URL-адреси Gravatar, де зберігаються зображення аватарів." gravatar_login_url: "URL-адреса відносно `gravatar_base_url`, яка надає користувачеві можливість входу до служби Gravatar." @@ -2630,7 +2645,6 @@ uk: content_localization_crawler_param: "Надавати локалізований контент веб-сканерам, коли ввімкнено опцію «локалізація контенту ввімкнена» та «встановити локалізацію з параметра». Список підтримуваних локалізацій визначено в розділі «підтримувані локалізації контенту»." content_localization_use_default_locale_when_unsupported: "Надавати локалізований контент у стандартній локалізації сайту користувачам, чия бажана мова не вказана у списку «локалізацій, що підтримуються локалізацією контенту»." content_localization_allow_author_localization: "Дозволити авторам оновлювати локалізації власних тем і публікацій через меню публікацій." - enable_upcoming_changes: "Увімкнути майбутні зміни" fake_upcoming_change: "Це фальшива майбутня зміна для тестових цілей. Немає потреби перекладати цей рядок." floating_dismiss_topics_on_mobile: "Відображає плаваючу кнопку «Закрити...» на мобільному пристрої для списку тем для легшого доступу та звільнення місця у верхній частині списку тем." rename_faq_to_guidelines: "Ця зміна перейменовує сторінку поширених запитань на «Правила». Сторінка поширених запитань все ще буде доступна за адресою /faq. Налаштування «faq url» працює як і раніше." @@ -2638,6 +2652,7 @@ uk: enable_simplified_category_creation: "Забезпечує спрощений процес створення категорій з меншою кількістю опцій та зрозумілішим інтерфейсом." enable_custom_splash_screen: "Дозволяє налаштувати заставку завантаження за допомогою власного зображення SVG. Завантажте зображення за допомогою налаштування «зображення заставки». Попередження: це може негативно вплинути на оцінки LCP та індексацію Google." modernize_foundation_theme: "Ця зміна запроваджує проектні перетворення на тему Foundation на Discourse." + reporting_improvements: "Покращення навігації, дизайну та зручності використання адміністративних звітів Discourse." errors: invalid_css_color: "Недійсний колір. Введіть назву кольору або шістнадцяткове значення." invalid_datetime: "Неправильний формат дати і часу. Будь ласка, переконайтеся, що ви ввели правильну дату та час." @@ -2688,6 +2703,12 @@ uk: reply_by_email_disabled: "Перш ніж активувати це налаштування, потрібно спочатку увімкнути 'відповідь електронною поштою'." discourse_connect_url_is_empty: "Ви повинні встановити 'discourse connect url' перед увімкненням цього параметра." enable_local_logins_disabled: "Перш ніж активувати цей параметр, спочатку потрібно ввімкнути функцію 'enable local logins'." + min_username_length_exists: "Ви не можете встановити 'min length of username' вище найкоротшого імені користувача (%{username})." + min_group_name_length_exists: "Ви не можете встановити 'min length of username' вище найкоротшої назви групи (%{group_name})." + min_username_length_range: "Ви не можете встановити «мінімальну довжину імені користувача» вище «максимальної довжини імені користувача»." + max_username_length_exists: "Ви не можете встановити \"максимальну довжину імені користувача\" нижче найдовшого імені користувача (%{username})." + max_group_name_length_exists: "Ви не можете встановити «максимальну довжину імені користувача» меншою за найдовшу назву групи (%{group_name})." + max_username_length_range: "Ви не можете встановити «максимальну довжину імені користувача» нижче за «мінімальну довжину імені користувача»." invalid_hex_value: "Значення кольорів мають бути шестизначними шістнадцятковими hex кодами." empty_selectable_avatars: "Ви повинні спочатку завантажити принаймні два доступні для вибору аватари, перш ніж увімкнути цей параметр." category_search_priority: @@ -3215,35 +3236,9 @@ uk: new_version_mailer: title: "Нова версія Mailer" subject_template: "[%{email_prefix}] Нова версія Discourse, доступно оновлення" - text_body_template: | - Ура, доступна нова версія [Discourse](https://www.discourse.org)! - - Ваша версія: %{installed_version} - Нова версія: **%{new_version}** - - - Оновіть за допомогою нашого легкого **[оновлення в оглядачі в один клік](%{base_url}/admin/upgrade)** - - - Подивіться, що нового в [примітках до випуску](https://meta.discourse.org/tag/release-notes) або перегляньте [журнал змін GitHub](https://github.com/discourse/discourse/commits/main) - - - Відвідайте [meta.discourse.org](https:// meta.discourse.org) для новин, обговорень і підтримки для Discourse new_version_mailer_with_notes: title: "Нова версія Mailer з примітками" subject_template: "[%{email_prefix}] доступне оновлення" - text_body_template: | - Ура, доступна нова версія [Discourse](https://www.discourse.org)! - - Ваша версія: %{installed_version} - Нова версія: **%{new_version}** - - - Оновіть за допомогою нашого легкого **[оновлення в оглядачі в один клік](%{base_url}/admin/upgrade)** - - - Подивіться, що нового в [примітках до випуску](https://meta.discourse.org/tag/release-notes) або перегляньте [журнал змін GitHub](https://github.com/discourse/discourse/commits/main) - - - Відвідайте [meta.discourse.org](https:// meta.discourse.org) для новин, обговорень і підтримки для Discourse - - ### Примітки до випуску - - %{notes} flag_reasons: off_topic: "Ваш допис було відмічено спам-прапорцем **Цей допис не по темі**: учасники спільноти вважають, що допис не дуже добре підходить до цієї дискусії (відповідно до її назви та першого повідомлення)." inappropriate: "Ваш допис було позначено як **невідповідний**: спільнота вважає його образливим, таким, що розпалює ненависть, або таким, що порушує [наші правила спільноти] (%{base_path}/guidelines)." diff --git a/config/locales/server.ur.yml b/config/locales/server.ur.yml index b0440ee173a83..44ba43898e3a5 100644 --- a/config/locales/server.ur.yml +++ b/config/locales/server.ur.yml @@ -996,7 +996,9 @@ ur: description: "فلَیگز سٹیٹس کی فہرست بشمول فلَیگ کی قسم، پوسٹ کرنے والا، فلَیگ کرنے والا، اور نمٹائے جانے تک کا وقت۔" visits: title: "صارف وِزِٹس" - xaxis: "دن" + xaxis: + desktop: "ڈیسک ٹاپ" + mobile: "موبائل" yaxis: "وِزِٹس کی تعداد" signups: title: "سائن اَپ" @@ -1040,10 +1042,8 @@ ur: site_traffic: yaxis: "دن" dau_by_mau: - title: "DAU/MAU" xaxis: "دن" yaxis: "DAU/MAU" - description: "گزشتہ دن لاگ ان ہونے والے اراکین کی تعداد گزشتہ ماہ میں لاگ ان ہونے والے اراکین کی تعداد سے تقسیم کرنا – ایک ٪ کا حساب لگاتا ہے جس سے کمیونٹی سے 'جوڈے رہنے' کا اندازہ لگتا ہے۔ کوشش کریں >20٪ کیلئے۔" daily_engaged_users: title: "روزانہ کے مشغول صارفین" xaxis: "دن" @@ -1750,7 +1750,6 @@ ur: enable_group_directory: "براؤزِنگ کیلئے گروپوں کی ایک ڈائرِکٹری فراہم کریں" group_in_subject: "ایمیل کے موضوع میں %%{optional_pm} کو ذاتی پیغام میں پہلے گروپ کے نام پر سَیٹ کریں، دیکھیے: سٹینڈرڈ ایمیلز کیلئے موضوع فارمَیٹ کو حسب ضرورت تبدیل کریں" anonymous_account_duration_minutes: "صارف کی گمنامی کی حفاظت کیلئے ہر صارف کیلئے ہر ن منٹ بعد ایک نیا گمنام اکاؤنٹ بنائیں۔ مثال: اگر 600 پر سَیٹ کیا جائے، تو جیسے ہی آخری پوسٹ سے 600 منٹ گزر چکے ہوں گے اور صارف گمنام مَوڈ پر تبدیل ہو گا، تو ایک نیا گمنام اکاؤنٹ پیدا کر دیا جائے گا۔" - hide_user_profiles_from_public: "گمنام صارفین کیلئے صارف کارڈ، صارف پروفائلز اور صارف ڈائرِکٹری غیر فعال کریں۔" show_inactive_accounts: "لاگ اِن ہوے صارفین کو غیر فعال اکاؤنٹس کی پروفائلز کو براؤز کرنے کی اجازت دیں۔" log_personal_messages_views: "دیگر صارفین/گروپوں کیلئے ایڈمن کی طرف سے ذاتی پیغام وِیوز کو لاگ کریں۔" ignored_users_count_message_threshold: "اتنے اراکین کی طرف سے کسی خاص رکن کو نظر انداز کیے جانے پر نگرانوں کو مطلع کریں۔" @@ -2181,35 +2180,9 @@ ur: new_version_mailer: title: "نیا ورژن مَیلر" subject_template: "[%{email_prefix}] نیا ڈِسکورس ورژن، اَپ ڈیٹ دستیاب ہے" - text_body_template: | - واہ، [ڈسکورس] (https://www.discourse.org) کا ایک نیا ورژن دستیاب ہے! - - آپ کا ورژن: %{installed_version} - نیا ورژن: **%{new_version}** - - - ہمارے آسان ** [ایک کلک براؤزر اپ ڈیٹ] کا استعمال کرتے ہوئے اپ ڈیٹ کریں (%{base_url}/admin/update) ** - - - دیکھیں [ریلیز نوٹس] میں کیا نیا ہے (https://meta.discourse.org/tag/release-notes) یا [خام GitHub چینج لاگ] دیکھیں (https://github.com/discourse/discourse/commits/main) - - - خبروں، بحث، اور گفتگو کے لئے معاونت کے لئے [meta.discourse.org] (https://meta.discourse.org) ملاحظہ کریں new_version_mailer_with_notes: title: "نوٹس کے ساتھ نیا ورژن مَیلر" subject_template: "[%{email_prefix}] اَپ ڈیٹ دستیاب ہے" - text_body_template: | - واہ، [ڈسکورس] (https://www.discourse.org) کا ایک نیا ورژن دستیاب ہے! - - آپ کا ورژن: %{installed_version} - نیا ورژن: **%{new_version}** - - - ہمارے آسان ** [ایک کلک براؤزر اپ ڈیٹ] کا استعمال کرتے ہوئے اپ ڈیٹ کریں (%{base_url}/admin/update) ** - - - دیکھیں [ریلیز نوٹس] میں کیا نیا ہے (https://meta.discourse.org/tag/release-notes) یا [خام GitHub چینج لاگ] دیکھیں (https://github.com/discourse/discourse/commits/main) - - - خبروں، بحث، اور گفتگو کے لیے حمایت کے لیے [meta.discourse.org] (https://meta.discourse.org) ملاحظہ کریں - - ### ریلیز نوٹ - - %{notes} flag_reasons: off_topic: "آپ کی پوسٹ کو **موضوع سے ہٹ کر** کے طور پر فلَیگ کیا گیا تھا: کمیونٹی سمجھتی ہے کہ یہ ٹاپک کیلئے اچھی فِٹ نہیں ہے، جیسا کہ عنوان اور پہلی پوسٹ کی طرف سے فی الحال بیان کیا گیا ہے۔" spam: "آپ کی پوسٹ کو **سپَیم** کے طور پر فلَیگ کیا گیا تھا: کمیونٹی سمجھتی ہے کہ یہ ایک اشتہار ہے، ایسی چیز جو کہ بجائے توقع کے مطابق مفید یا موضوع سے متعلقہ ہونے، کے فطرت میں زیادہ تر پرَومَوشنل ہے۔" diff --git a/config/locales/server.vi.yml b/config/locales/server.vi.yml index b6fc8cbec310a..923dad939494a 100644 --- a/config/locales/server.vi.yml +++ b/config/locales/server.vi.yml @@ -767,7 +767,9 @@ vi: description: "Danh sách các trạng thái của cờ bao gồm loại cờ, người đăng, người gắn cờ và thời gian giải quyết." visits: title: "Các thành viên truy cập" - xaxis: "Ngày" + xaxis: + desktop: "Máy tính để bàn" + mobile: "Điện thoại" yaxis: "Số lần truy cập" signups: xaxis: "Ngày" @@ -1270,7 +1272,6 @@ vi: max_daily_gravatar_crawls: "Giới hạn số lần Discourse sẽ kiểm tra Gravatar mới trong một ngày" enable_user_directory: "Cung cấp một chỉ mục thành viên để duyệt xem" anonymous_account_duration_minutes: "Để bảo vệ danh tính tạo ra một tài khoản ẩn danh mới mỗi N phút cho mỗi người dùng. Ví dụ: nếu đặt là 600, ngay sau khi 600 phút trôi qua kể từ bài viết cuối cùng VÀ lập tức tạo ra một tài khoản ẩn danh mới cho thành viên." - hide_user_profiles_from_public: "Vô hiệu hóa thẻ thành viên, hồ sơ và chỉ mục người dùng với các thành viên ẩn danh." log_personal_messages_views: "Ghi nhật ký lượt xem tin nhắn cá nhân của Admin cho người dùng / nhóm khác." ignored_users_count_message_threshold: "Thông báo cho người kiểm duyệt nếu một người dùng cụ thể bị bỏ qua bởi nhiều người dùng khác này." ignored_users_message_gap_days: "Phải đợi bao lâu trước khi thông báo lại cho người kiểm duyệt về một người dùng đã bị nhiều người khác bỏ qua." diff --git a/config/locales/server.zh_CN.yml b/config/locales/server.zh_CN.yml index feb599ce0cdef..f3ee5f1d079ff 100644 --- a/config/locales/server.zh_CN.yml +++ b/config/locales/server.zh_CN.yml @@ -19,7 +19,7 @@ zh_CN: calendar_ics: "%Y%m%dT%H%M%SZ" date: month_names: - - null + - - 1 月 - 2 月 - 3 月 @@ -60,8 +60,8 @@ zh_CN: inline_oneboxer: topic_page_title_post_number: "#%{post_number}" topic_page_title_post_number_by_user: "#%{post_number},来自 %{username}" - too_many_urls: "单次请求中无法将超过 10 个 URL 转换为内联单选框。" - concurrency_not_allowed: "不允许同时请求将 URL 转换为内联单选框。请一次只发送一个请求。" + too_many_urls: "单次请求中无法将超过 10 个 URL 转换为行内 Onebox。" + concurrency_not_allowed: "不允许将 URL 转换为行内 Onebox 的并发请求。每次请只发送一个请求。" components: enabled_filter: "已启用" disabled_filter: "已禁用" @@ -240,7 +240,7 @@ zh_CN: errors: &errors format: ! "%{attribute} %{message}" format_with_full_message: "%{attribute}:%{message}" - diff_too_complex: "差异过于复杂,无法安全计算。请尝试进行较小的修改。" + diff_too_complex: "差异过于复杂,无法安全计算。请尝试进行较小的编辑。" messages: invalid_locale: "%{invalid_locale} 不是一个有效的语言区域" too_long_validation: @@ -259,7 +259,7 @@ zh_CN: greater_than: 必须大于 %{count} greater_than_or_equal_to: 必须大于或等于 %{count} has_already_been_used: "已被使用" - in: 必须在 %{count} 以内 + in: 必须在 %{count} 内 inclusion: 不包括在列表中 invalid: 无效 is_invalid: "似乎不清楚,这是一个完整的句子?" @@ -321,7 +321,7 @@ zh_CN: slow_down_crawler_user_agent_must_be_at_least_3_characters: "用户代理的长度必须至少为 3 个字符,以避免意外限制合法用户的速率。" slow_down_crawler_user_agent_cannot_be_popular_browsers: "您不能将以下任何值添加到设置中:%{values}。" strip_image_metadata_cannot_be_disabled_if_composer_media_optimization_image_enabled: "如果启用了 'composer media optimization image enabled',则无法禁用带状图片元数据。在禁用带状图片元数据之前,禁用 'composer media optimization image enabled'。" - x_summary_large_image_no_svg: "用于 twitter:image 元数据的 Twitter 总结图片不能是 .svg 图片。" + x_summary_large_image_no_svg: "用于 twitter:image 元数据的 Twitter 摘要图片不能是 .svg 图片。" tl0_and_anonymous_flag: "对于匿名用户,必须提供 'site contact email' 或 'email address to report illegal content'。" allow_likes_in_anonymous_mode_without_anonymous_mode_enabled: "此设置需要先启用 'allow anonymous mode' 设置。" conflicting_google_user_id: '此帐户的 Google 帐号 ID 已更改;出于安全原因,需要管理人员干预。请联系管理人员并将他们指向
https://meta.discourse.org/t/76575' @@ -766,6 +766,12 @@ zh_CN: other: "无法删除此类别,因为它有 %{count} 个话题。时间最久的话题是 %{topic_link}。" topic_exists_no_oldest: "无法删除此类别,因为话题数量为 %{count}。" uncategorized_description: "不需要类别或不适合任何其他现有类别的话题。" + category_types: + not_available: "类别类型 '%{type_name}' 不可用" + discussion: + name: "讨论" + title: "讨论" + description: "一个包含所有对话元素的标准类别。" trust_levels: admin: "管理员" staff: "管理人员" @@ -1064,6 +1070,8 @@ zh_CN: weekly: "每周" every_month: "每月" every_six_months: "每六个月" + calendar_subscriptions: + application_name: "日历订阅" user_api_key: title: '授权“%{application_name}”' authorize: "授权" @@ -1152,9 +1160,11 @@ zh_CN: description: "举报状态列表,包括举报类型、发帖人、举报人和解决时间。" visits: title: "用户访问" - xaxis: "天" + xaxis: + desktop: "桌面" + mobile: "移动" yaxis: "访问次数" - description: "登录用户访问的次数。" + description: "按设备类型登录的用户访问次数。" signups: title: "注册" xaxis: "天" @@ -1218,10 +1228,10 @@ zh_CN: description: "登录用户、匿名用户、已知抓取工具和其他流量的页面浏览量。" description_link: "https://meta.discourse.org/t/understanding-pageviews-and-the-site-traffic-report/324062" dau_by_mau: - title: "DAU/MAU" + title: "DAU / MAU" xaxis: "天" yaxis: "DAU/MAU" - description: "在过去一天内登录的成员数除以过去一个月内登录的成员数 – 返回表示社区“粘性”的 %。目标为 >20%。" + description: "最后一天返回的月活跃会员比例。该百分比反映了用户回归的频率,也称为社区“粘性”。目标是高于 20%。" daily_engaged_users: title: "每日参与用户" xaxis: "天" @@ -1534,7 +1544,7 @@ zh_CN: email_polling_errored_recently: other: "电子邮件轮询在过去 24 小时内产生了 %{count} 个错误。查看日志了解更多详细信息。" missing_mailgun_api_key: "服务器被配置为通过 Mailgun 发送电子邮件,但是您尚未提供用于验证网络钩子消息的 API 密钥。" - qq_mail_smtp: "您的 SMTP 服务器 (%{smtp_address}) 已知会导致 Discourse 发送重复邮件。QQ 邮件无法返回正确的确认信息,导致 Discourse 重试已成功发送的邮件。 请参阅推荐的替代方案。" + qq_mail_smtp: "您的 SMTP 服务器 (%{smtp_address}) 已知会导致 Discourse 发送重复电子邮件。QQ 邮件无法返回正确的确认信息,导致 Discourse 重试已成功发送的邮件。 请参阅推荐的替代方案。" bad_favicon_url: "网站图标无法加载。检查网站设置中的网站图标设置。" poll_pop3_timeout: "连接到 POP3 服务器超时。无法检索收到的电子邮件。请检查您的 POP3 设置和服务提供商。" poll_pop3_auth_error: "连接到 POP3 服务器失败,出现身份验证错误。请检查您的 POP3 设置。" @@ -1635,8 +1645,8 @@ zh_CN: max_oneboxes_per_post: "设置单个帖子中可以包含的最大 onebox 数量。onebox 提供了帖子中链接内容的预览。" facebook_app_access_token: "从您的 Facebook 应用 ID 和密钥生成的令牌。用于生成 Instagram Onebox。" github_onebox_access_tokens: "GitHub 组织或用户与 GitHub 访问令牌之间的映射,用于为私有仓库、提交、拉取请求、议题和文件内容生成 GitHub onebox。如果没有此映射,将只为公开 GitHub URL 创建 onebox。" - reddit_onebox_client_id: "Reddit API OAuth 客户端 ID,用于认证 Reddit onebox。在 reddit.com/prefs/apps 上创建 \"脚本 \"类型的应用程序,以获取凭证。" - reddit_onebox_client_secret: "用于已认证 Reddit OneBox 的 Reddit API OAuth 客户端密钥。可在 reddit.com/prefs/apps 创建的“脚本”类型应用下找到。" + reddit_onebox_client_id: "Reddit API OAuth 客户端 ID,用于已通过身份验证的 Reddit Onebox。在 reddit.com/prefs/apps 上创建 'script' 类型的应用,以获取凭据。" + reddit_onebox_client_secret: "用于已通过身份验证的 Reddit OneBox 的 Reddit API OAuth 客户端密钥。可在 reddit.com/prefs/apps 创建的 'script' 类型应用下找到。" logo: "您的网站左上角的徽标图片。使用高度为 120 且宽高比大于 3:1 的宽矩形图片。如果留空,将显示网站标题文本。" logo_small: "您的网站左上角的小徽标图片,向下滚动后可见。使用 120×120 的方形图片。如果留空,将显示首页标志符号。" digest_logo: "在您网站的电子邮件总结顶部使用的备用徽标图片。使用宽矩形图片。不要使用 SVG 图片。如果留空,则使用 `logo` 设置中的图片。" @@ -1648,7 +1658,7 @@ zh_CN: manifest_icon: "在 Android 上用作徽标/初始屏幕图片的图片。将自动调整为 512 × 512。如果留空,将使用 large_icon。" manifest_screenshots: "在安装提示页面上展示您的实例特色和功能的屏幕截图。所有图片均应为本地上传且尺寸相同。" favicon: "您的网站的网站图标,请参阅 https://zh.wikipedia.org/wiki/Favicon。如果要正确地通过 CDN 分发,它必须是 png 图片。将调整为 32x32。如果留空,将使用 large_icon。" - apple_touch_icon: "用于 Apple 触摸设备的图标。不推荐透明背景。将自动调整为 180x180。如果留空,将使用 large_icon。" + apple_touch_icon: "用于 Apple 触控设备的图标。不推荐透明背景。将自动调整为 180x180。如果留空,将使用 large_icon。" opengraph_image: "默认 OpenGraph 图片,当页面没有其他合适的图片时使用。如果留空,将使用 large_icon。" x_summary_large_image: "Twitter 卡片 'summary large image'(宽度至少应为 280,高度至少为 150,不能为 .svg)。如果留空,则使用 opengraph_image(前提是也不能为 .svg)生成常规卡片元数据。" notification_email: "发送所有重要系统电子邮件时使用的 from: 电子邮件地址。此处指定的网域必须正确设置 SPF、DKIM 和反向 PTR 记录才能收到电子邮件。" @@ -1719,6 +1729,7 @@ zh_CN: moderators_manage_categories: "允许版主创建和管理类别" moderators_manage_groups: "允许版主创建和管理群组" moderators_change_post_ownership: "允许版主更改帖子所有权" + change_post_ownership_allowed_groups: "允许这些群组中的用户更改帖子所有权" cors_origins: "允许跨源请求(CORS)。每个来源必须包括 http:// 或 https://。环境变量 DISCOURSE_ENABLE_CORS 必须设置为 true 才能启用 CORS。" use_admin_ip_allowlist: "只有使用“屏蔽的 IP 列表”(管理 > 日志 > 屏蔽的 IP)中的 IP 地址时,管理员才能登录。" blocked_ip_blocks: "Discourse 不应抓取的私有 IP 地址段列表" @@ -2040,8 +2051,8 @@ zh_CN: num_flaggers_to_close_topic: "自动暂停话题以进行干预所需的最小唯一举报次数" num_hours_to_close_topic: "暂停话题以进行干预的小时数。" auto_respond_to_flag_actions: "处理举报时启用自动回复。" - min_first_post_typing_time: "用户在第一次发帖时必须输入的最短时间,如果未达到阈值,发布将自动进入需求审批队列。设置为 0 将禁用(不推荐)" - fast_typing_threshold: "发布第一个帖子时,用户必须输入的最短时间。如果未达到该阈值,帖子将自动进入审核队列。最短时间为 1 秒,标准时间为 3 秒,最长时间为 5 秒。" + min_first_post_typing_time: "用户在第一次发帖时必须输入的最短时间,如果未达到阈值,帖子将自动进入需求审批队列。设置为 0 将禁用(不推荐)" + fast_typing_threshold: "用户在第一次发帖时必须输入的最短时间。如果未达到阈值,帖子将自动进入审核队列。最短时间为 1 秒,标准时间为 3 秒,最长时间为 5 秒。" auto_silence_fast_typers_on_first_post: "自动禁言未达到 `fast typing threshold` 的用户" auto_silence_fast_typers_max_trust_level: "自动禁言输入过快的用户的最高信任级别" auto_silence_first_post_regex: "检查用户第一个帖子的大小写不相关的正则表达式。如匹配,用户将被禁言并送至审核队列。示例:raging|a[bc]a 将匹配包含 raging、aba 或者 aca 的所有帖子,因此该用户将被禁言。只对第一个帖子有效。已弃用:改用“禁言关注词”。" @@ -2060,7 +2071,7 @@ zh_CN: alternative_reply_by_email_addresses: "通过传入电子邮件地址回复的备用模板列表。示例:%%{reply_key}@reply.example.com|replies+%%{reply_key}@example.com" incoming_email_prefer_html: "对传入电子邮件使用 HTML 而不是文本。" strip_incoming_email_lines: "从传入电子邮件的每一行中移除前导和尾随空格。" - disable_emails: "禁止 Discourse 发送任何类型的电子邮件。选择“是”将对所有用户禁用电子邮件。选择“非管理人员”将仅对非管理人员用户禁用电子邮件。" + disable_emails: "阻止 Discourse 发送任何类型的电子邮件。选择 'yes' 将对所有用户禁用外发电子邮件。选择 'non-staff' 将仅对非管理人员用户禁用电子邮件。" allow_email_invites: "禁用后,用户将无法通过 Discourse 发送邀请电子邮件。" strip_images_from_short_emails: "从大小小于 2800 字节的电子邮件中去除图片" short_email_length: "定义电子邮件被归类为“短”以禁止图片的最大长度(以字节为单位)。如果电子邮件的大小未超过此设置,则电子邮件中的任何图片(例如头像和表情符号)都将被删除。" @@ -2079,7 +2090,7 @@ zh_CN: mailgun_api_key: "用于验证网络钩子消息的 Mailgun Secret API 密钥。" sendgrid_verification_key: "用于验证网络钩子消息的 Sendgrid 验证密钥。" mailjet_webhook_token: "用于验证网络钩子负载的令牌。它必须作为网络钩子的 't' 查询参数传递,例如:https://example.com/webhook/mailjet?t=supersecret" - mailpace_webhook_token: "用于验证网络钩子负载的令牌。它必须作为网络钩子的 't' 查询参数传递,例如:https://example.com/webhook/mailpace?t=supersecret" + mailpace_webhook_token: "用于验证网络钩子有效负载的令牌。它必须作为网络钩子的 't' 查询参数传递,例如:https://example.com/webhook/mailpace?t=supersecret" mandrill_authentication_key: "用于验证网络钩子消息的 Mandrill 身份验证密钥。" postmark_webhook_token: "用于验证网络钩子负载的令牌。它必须作为网络钩子的 't' 查询参数传递,例如:https://example.com/webhook/postmark?t=supersecret" sparkpost_webhook_token: "用于验证网络钩子负载的令牌。它必须作为网络钩子的 't' 查询参数传递,例如:https://example.com/webhook/sparkpost?t=supersecret" @@ -2154,7 +2165,7 @@ zh_CN: allow_likes_in_anonymous_mode: "启用此设置,允许匿名浏览您的站点的用户为帖子点赞。激活后,用户在为帖子或话题点赞时可以选择隐藏其身份。此设置需要先启用 `allow anonymous mode`。" anonymous_posting_allowed_groups: "可以启用匿名发帖的群组。此设置需要启用 `allow anonymous mode` 设置。" anonymous_account_duration_minutes: "为了保护匿名性,每 N 分钟为每个用户创建一个新的匿名帐户。示例:如果设置为 600,则在距离上次发帖 600 分钟且用户切换到匿名时,将创建一个新的匿名帐户。" - hide_user_profiles_from_public: "禁用匿名用户的用户卡片、用户个人资料和用户目录。" + hide_user_profiles_from_public: "禁用匿名用户的用户卡和用户配置文件。用户目录中仍将提供汇总的统计数据。" hide_new_user_profiles: "向公众隐藏信任级别 1 或更低的用户个人资料,并隐藏信任级别 1 的用户,直到他们首次发帖。此功能在 must_approve_users 和 invite_only 网站上无条件禁用。" allow_users_to_hide_profile: "允许用户隐藏他们的个人资料和状态" hide_user_activity_tab: "隐藏用户个人资料中的活动标签页,管理员和自己除外。" @@ -2176,7 +2187,7 @@ zh_CN: dont_feed_the_trolls_threshold: "被警告前来自其他用户的举报数量。" enable_mobile_theme: "移动设备使用适合移动设备的主题,并且可以切换到完整网站。如果您想使用完全自适应的自定义样式表,请禁用此选项。" dominating_topic_minimum_percent: "在被提醒过度主导某个话题之前,用户必须在某个话题中发布的帖子所占的百分比。" - pm_warn_user_last_seen_months_ago: "在创建新的私信时,如果目标接收者已经超过 n 个月前无活动,则警告用户。" + pm_warn_user_last_seen_months_ago: "创建新私信时,如果目标接收者自超过 n 个月前无活动,则警告用户。" suppress_uncategorized_badge: "不在话题列表中显示未分类话题的徽章。" header_dropdown_category_count: "标题下拉菜单中可以显示的类别数量。" permalink_normalizations: "在匹配永久链接之前应用以下正则表达式,例如:/(topic.*)\\?.*/\\1 将从话题路由中去除查询字符串。格式为正则表达式+字符串。使用 \\1 等访问捕获" @@ -2352,7 +2363,7 @@ zh_CN: dashboard_hidden_reports: "允许从信息中心隐藏指定报告。" dashboard_visible_tabs: "选择可见的信息中心标签页。" dashboard_general_tab_activity_metrics: "选择要在“常规”标签页上显示为活动指标的报告。" - gravatar_enabled: "使用 Gravatar 服务制作用户头像。这将阻止用户改用 Gravatar 制作头像,但不会影响已使用 Gravatar 的用户。" + gravatar_enabled: "使用 Gravatar 服务制作用户头像。禁用将阻止用户改用 Gravatar 制作头像,但不会影响已使用 Gravatar 的用户。" gravatar_name: "指定 Gravatar 服务提供商的名称。此名称通常用于标识向网站提供 Gravatar 头像的来源。" gravatar_base_url: "指定用于访问 Gravatar 提供商的 API 的 URL。此设置对于将电子邮件地址转换为存储头像图片的 Gravatar URL 至关重要。" gravatar_login_url: "相对于 `gravatar_base_url` 的 URL,它为用户提供了登录 Gravatar 服务的途径。" @@ -2365,23 +2376,23 @@ zh_CN: suggest_weekends_in_date_pickers: "在日期选择器建议中包括周末(周六和周日)(如果您仅在工作日(周一至周五)使用 Discourse,请禁用此选项)。" show_bottom_topic_map: "当话题有 10 条或更多回复时,在话题底部显示话题地图。" show_topic_map_in_topics_without_replies: "即使话题没有回复也显示话题地图。" - enable_site_owner_onboarding: "在主页上向新管理员显示面板以帮助他们开始。重新启用此设置以再次查看登临步骤。" + enable_site_owner_onboarding: "在首页上向新管理员显示面板以帮助他们开始。重新启用此设置以再次查看入门步骤。" enable_welcome_banner: "在主要话题列表页面上显示横幅,以欢迎成员并允许他们搜索站点内容" welcome_banner_image: "设置在欢迎横幅背景中显示的图片。" welcome_banner_location: "确定欢迎横幅在页面上的显示位置。" welcome_banner_page_visibility: "确定哪些页面会显示欢迎横幅。" welcome_banner_text_color: "配置 'Welcome banner image' 设置后,使用此设置更改横幅文本颜色,以确保其清晰可读。如果留空或未上传任何图片,有效主题将控制颜色。" splash_screen: "在加载网站资源时显示临时加载屏幕" - splash_screen_image: "网站加载时在启动画面上显示的 SVG 图像。动画 SVG 只能使用 CSS 变换或不透明动画。为 CSS 类和关键帧使用唯一的名称。你可以使用 var (--primary)、var (--secondary) 和 var (--terriary) 来引用主题颜色。" + splash_screen_image: "站点加载时在启动画面上显示的 SVG 图片。动画 SVG 只应使用 CSS 变换或不透明动画。为 CSS 类和关键帧使用独一无二的名称。您可以使用 var (--primary)、var (--secondary) 和 var (--terriary) 引用主题颜色。" navigation_menu: "指定边栏或标题下拉菜单作为网站的主导航菜单。推荐使用边栏。" default_navigation_menu_categories: "所选类别默认将显示在导航菜单的“类别”版块下。" default_navigation_menu_tags: "所选标签默认将显示在导航菜单的“标签”版块下。" experimental_new_new_view_groups: '启用新的话题列表,将未读话题与新话题合并,并使边栏中的“一切”链接指向该列表。' - enable_form_templates: "表单模板允许您在主题创建流程中强制执行结构化表单和数据验证。" + enable_form_templates: "启用表单模板功能。借助此功能,您可以在话题创建流程中强制执行结构化表单和数据验证。" show_preview_for_form_templates: "启用表单模板预览功能" lazy_load_categories_groups: "只为这些群组的用户延迟加载类别信息。这可以提升有许多类别的网站的性能。" - enable_auto_grid_images: "在编辑器中上传 3 张或更多图片后,自动将图像包装在 [grid] 标记中。" - impersonate_without_logout: "无需注销管理员帐户即可模拟用户。" + enable_auto_grid_images: "在编辑器中上传 3 张或更多图片后,自动将图片包装在 [grid] 标记中。" + impersonate_without_logout: "允许管理员在不退出其管理员帐户的情况下模拟用户。" experimental_impersonation_time_limit_minutes: "模拟会话需要多长时间才能自动结束。" page_loading_indicator: "配置在 Discourse 中进行页面导航时出现的加载指示器。“旋转的图标”是整页指示器。“滑块”会在屏幕顶部显示一个窄条。" show_user_menu_avatars: "在用户菜单中显示用户头像" @@ -2403,15 +2414,14 @@ zh_CN: content_localization_crawler_param: "启用 'content localization enabled' 和 'set locale from param' 后,向网络爬虫提供本地化内容。支持的语言区域列表在 'content localization supported locales' 中定义。" content_localization_use_default_locale_when_unsupported: "向首选语言未列在 'content localization supported locales' 中的用户提供站点的默认语言区域的本地化内容。" content_localization_allow_author_localization: "允许作者通过帖子菜单更新自己话题和帖子的本地化。" - enable_upcoming_changes: "启用即将推出的更改" fake_upcoming_change: "这是用于测试目的虚假即将推出的更改。无需翻译此字符串。" floating_dismiss_topics_on_mobile: "在移动设备上为话题列表显示一个浮动式 'Dismiss...' 按钮,以方便用户访问,并腾出话题列表顶部的空间" - rename_faq_to_guidelines: "此更改将常见问题页面重命名为指南。常见问题页面仍可通过 /faq 访问。 'faq url' 的设置与以前一样有效。" - experimental_tag_settings_page: "在 /tag/:slug/:id/edit 启用标签专用设置页面。" + rename_faq_to_guidelines: "此次更改将常见问题解答页面重命名为准则。常见问题解答页面仍可通过 /faq 访问。'faq url' 设置与以前一样有效。" + experimental_tag_settings_page: "在 /tag/:slug/:id/edit 下为标签启用专用设置页面。" enable_simplified_category_creation: "使用更少的选项和更简洁的界面简化类别创建流程。" - enable_custom_splash_screen: "允许您使用自己的 SVG 图片自定义加载启动画面。通过“启动画面图片”设置上传图片。警告:这可能会对 LCP 分数和 Google 索引产生负面影响。" - modernize_foundation_theme: "此次更改对 Discourse 中的 Foundation 主题进行了设计修改。" - reporting_improvements: "改进了 Discourse 管理报告的导航、设计和可用性。" + enable_custom_splash_screen: "允许您使用自己的 SVG 图片自定义加载启动画面。通过 'splash screen image' 设置上传图片。警告:这可能会对 LCP 分数和 Google 索引产生负面影响。" + modernize_foundation_theme: "此次更改对 Discourse 中的 Foundation 主题引入了设计修改。" + reporting_improvements: "改进了 Discourse 管理员报告的导航、设计和实用性。" errors: invalid_css_color: "颜色无效。输入颜色名称或十六进制值。" invalid_datetime: "日期时间格式无效。请确保输入有效的日期和时间。" @@ -2419,7 +2429,7 @@ zh_CN: invalid_username: "没有使用该用户名的用户。" valid_username: "存在一个使用该用户名的用户。" invalid_group: "没有使用该名称的群组。" - invalid_svg: "SVG图像无效。它必须包含SVG元素,且不能包含任何脚本或事件处理程序。" + invalid_svg: "SVG 图片无效。它必须包含 SVG 元素,且不能包含任何脚本或事件处理程序。" invalid_upload: "上传内容无效或不存在。" invalid_topic: "没有与该 ID 匹配的话题。" invalid_integer_min_max: "值必须介于 %{min} 和 %{max}之间。" @@ -2456,12 +2466,12 @@ zh_CN: reply_by_email_disabled: "在启用此设置之前,您必须先启用 'reply by email'。" discourse_connect_url_is_empty: "在启用此设置之前,您必须先设置 'discourse connect url'。" enable_local_logins_disabled: "在启用此设置之前,您必须先启用 'enable local logins'。" - min_username_length_exists: "您不能将最小用户名长度设置为高于最短用户名 (%{username})。" - min_group_name_length_exists: "您不能将最小用户名长度设置为大于最短群组名称 (%{group_name})。" - min_username_length_range: "用户名最小长度不能设置得高于用户名最大长度。" - max_username_length_exists: "您不能将最大用户名长度设置为低于最长用户名 (%{username})。" - max_group_name_length_exists: "您不能将最大用户名长度设置为小于最长群组名称 (%{group_name})。" - max_username_length_range: "您不能将“最大用户名长度”设置为低于“最小用户名长度”。" + min_username_length_exists: "'min username length' 不能大于最短用户名 (%{username})。" + min_group_name_length_exists: "'min username length' 不能大于最短群组名称 (%{group_name})。" + min_username_length_range: "'min username length' 不能大于 'max username length'。" + max_username_length_exists: "'max username length' 不能小于最长用户名 (%{username})。" + max_group_name_length_exists: "'max username length' 不能小于最长群组名称 (%{group_name})。" + max_username_length_range: "'max username length' 不能小于 'min username length'。" invalid_hex_value: "颜色值必须是 6 位十六进制代码。" empty_selectable_avatars: "在启用此设置之前,您必须先上传至少两个可选择的头像。" category_search_priority: @@ -2704,7 +2714,7 @@ zh_CN: csrf_detected: "抱歉,授权超时,或者您已切换浏览器。请重试。" request_error: "抱歉,启动授权时发生错误。请重试。" invalid_iat: "抱歉,由于服务器时钟差异,无法验证授权令牌。请重试。" - unauthorized: "抱歉,登录提供商未批准您的请求。请重试或联系管理员。" + unauthorized: "抱歉,登录提供商未授权您的请求。请重试或联系管理员。" omniauth_error_unknown: "处理您的登录时出错,请重试。" omniauth_confirm_title: "使用 %{provider} 登录" omniauth_confirm_button: "继续" @@ -2930,32 +2940,32 @@ zh_CN: title: "新版本邮件" subject_template: "[%{email_prefix}] 新 Discourse 版本,有可用更新" text_body_template: | - 太好了,新版本的 [Discourse](https://www.discourse.org) 现已发布! + 太好了![Discourse](https://www.discourse.org) 新版本已发布! - 您的版本:%{installed_version} + 您的版本: %{installed_version} 新版本:**%{new_version}** - - 使用我们的**[一键式浏览器更新](%{base_url}/admin/update)**进行更新 + - 使用我们便捷的 **一键浏览器更新](%{base_url}/admin/update)** 进行更新 - - 查看[版本说明](https://meta.discourse.org/tag/release-notes)中的最新变化,或查看[原始 GitHub 更改日志](https://github.com/discourse/discourse/commits/main) + - 查看[发行说明](https://releases.discourse.org/changelog/%{new_version})了解新增功能 - - 访问 [meta.discourse.org](https://meta.discourse.org) 了解 Discourse 的新闻、讨论和支持。 + - 访问[meta.discourse.org](https://meta.discourse.org)获取Discourse的新闻、讨论和支持 new_version_mailer_with_notes: title: "带版本说明的新版本邮件" subject_template: "[%{email_prefix}] 有可用更新" text_body_template: | - 太好了,新版本的 [Discourse](https://www.discourse.org) 现已发布! + 太好了![Discourse](https://www.discourse.org) 新版本上线啦! - 您的版本:%{installed_version} + 您的版本: %{installed_version} 新版本:**%{new_version}** - - 使用我们简单的**[一键式浏览器更新](%{base_url}/admin/update)**进行更新 + - 使用我们便捷的 **[一键浏览器更新](%{base_url}/admin/update)** 进行更新 - - 查看[版本说明](https://meta.discourse.org/tag/release-notes)中的最新变化,或查看[原始 GitHub 更改日志](https://github.com/discourse/discourse/commits/main) + - 查看[发行说明](https://releases.discourse.org/changelog/%{new_version})中的新增功能 - - 访问 [meta.discourse.org](https://meta.discourse.org) 了解 Discourse 的新闻、讨论和支持 + - 访问[meta.discourse.org](https://meta.discourse.org) 获取 Discourse 的新闻、讨论和支持 - ### 版本说明 + ### 发行说明 %{notes} flag_reasons: diff --git a/config/locales/server.zh_TW.yml b/config/locales/server.zh_TW.yml index 641728a87bef0..9164bc4a08a89 100644 --- a/config/locales/server.zh_TW.yml +++ b/config/locales/server.zh_TW.yml @@ -724,7 +724,9 @@ zh_TW: description: "標記狀態清單,包括標記類型、張貼者、標記者與解决時間。" visits: title: "使用者瀏覽量" - xaxis: "天" + xaxis: + desktop: "電腦" + mobile: "行動裝置" yaxis: "瀏覽量" signups: title: "註冊" @@ -766,10 +768,8 @@ zh_TW: site_traffic: yaxis: "天" dau_by_mau: - title: "DAU/MAU" xaxis: "天" yaxis: "\\bDAU/MAU" - description: "在最後一天登入的會員數除以上個月登入會員數,返回的%數表示社群黏著度。目標為>20%。" daily_engaged_users: title: "每日活躍的使用者" xaxis: "天" @@ -1350,7 +1350,6 @@ zh_TW: enable_group_directory: "提供可供瀏覽的群組目錄" group_in_subject: "在電子郵件中設定%%{optional_pm} ,取決於私訊中第一個群組的名稱,請參閱:客製化標準電子郵件的格式" anonymous_account_duration_minutes: "為了匿名性,為每個使用者每 N 分鐘創建一個匿名帳號。例如:如果設置為 600,只要發帖後 600 分鐘到了,並且使用者切換至了匿名模式,就會創建一個新的匿名帳號。" - hide_user_profiles_from_public: "不對來訪使用者顯示使用者信息卡、使用者資料和使用者目錄。" show_inactive_accounts: "允許登入使用者瀏覽未啟用帳戶的使用者個人檔案。" log_personal_messages_views: "管理員記錄其他使用者或群組的個人資訊畫面" ignored_users_count_message_threshold: "如果特定使用者被這麽多的其他使用者忽略,則通知版主。" diff --git a/config/pitchfork.conf.rb b/config/pitchfork.conf.rb index df324daf6e797..f4ee053c1b341 100644 --- a/config/pitchfork.conf.rb +++ b/config/pitchfork.conf.rb @@ -110,7 +110,7 @@ # The cause is currently unknown but we suspect that it is related to the Unicorn master process and # Sidekiq demon processes reopening logs at the same time as we noticed that Unicorn worker processes only # reopen logs after the Unicorn master process is done. To workaround the problem, we are adding an arbitrary - # delay of 1 second to Sidekiq's log reopeing procedure. The 1 second delay should be + # delay of 1 second to Sidekiq's log reopening procedure. The 1 second delay should be # more than enough for the Unicorn master process to finish reopening logs. Demon::Sidekiq.kill("USR2") end @@ -122,6 +122,10 @@ demon_class.start(1, logger: server.logger) end + if Rails.env.development? && ENV["ROLLUP_PLUGIN_COMPILER"] != "0" + Demon::PluginJsWatcher.start(verbose: true) + end + Thread.new do while true begin diff --git a/config/puma.rb b/config/puma.rb deleted file mode 100644 index c349148f57bd7..0000000000000 --- a/config/puma.rb +++ /dev/null @@ -1,18 +0,0 @@ -# frozen_string_literal: true - -if ENV["RAILS_ENV"] == "production" - # First, you need to change these below to your situation. - APP_ROOT = ENV["APP_ROOT"] || "/home/discourse/discourse" - num_workers = ENV["NUM_WEBS"].to_i > 0 ? ENV["NUM_WEBS"].to_i : 4 - - # Second, you can choose how many threads that you are going to run at same time. - workers "#{num_workers}" - threads 8, 32 - - # Unless you know what you are changing, do not change them. - bind "unix://#{APP_ROOT}/tmp/sockets/puma.sock" - stdout_redirect "#{APP_ROOT}/log/puma.log", "#{APP_ROOT}/log/puma.err.log" - pidfile "#{APP_ROOT}/tmp/pids/puma.pid" - state_path "#{APP_ROOT}/tmp/pids/puma.state" - preload_app! -end diff --git a/config/routes.rb b/config/routes.rb index efe597dd28af1..22f9529f3193d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -342,7 +342,7 @@ def patch(*) post "/toggle-feature" => "dashboard#toggle_feature" resources :dashboard, only: [:index] do - collection { get "problems" } + collection { post "problems" } end resources :api, only: [:index], constraints: AdminConstraint.new do @@ -827,6 +827,10 @@ def patch(*) :constraints => { username: RouteFormat.username, } + get "#{root_path}/:username/preferences/calendar-subscriptions" => "users#preferences", + :constraints => { + username: RouteFormat.username, + } post "#{root_path}/:username/preferences/email" => "users_email#create", :constraints => { username: RouteFormat.username, @@ -1078,6 +1082,7 @@ def patch(*) get "color-scheme-stylesheet/:id(/:theme_id)" => "stylesheets#color_scheme", :constraints => { format: :json, + theme_id: /-?\d+/, } get "theme-javascripts/:digest" => "theme_javascripts#show", :constraints => { @@ -1859,6 +1864,10 @@ def patch(*) get "/user-api-key-client" => "user_api_key_clients#show" post "/user-api-key-client" => "user_api_key_clients#create" + get "/calendar-subscriptions" => "calendar_subscriptions#show" + post "/calendar-subscriptions" => "calendar_subscriptions#create" + delete "/calendar-subscriptions" => "calendar_subscriptions#destroy" + get "/safe-mode" => "safe_mode#index" post "/safe-mode" => "safe_mode#enter", :as => "safe_mode_enter" diff --git a/config/site_settings.yml b/config/site_settings.yml index ec744b6dddcbe..b95d2ebfebde7 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -2680,6 +2680,10 @@ security: moderators_change_post_ownership: client: true default: false + change_post_ownership_allowed_groups: + type: group_list + list_type: compact + default: "" moderators_view_emails: client: true default: false @@ -4223,13 +4227,14 @@ experimental: status: "experimental" impact: "feature,staff" learn_more_url: "https://meta.discourse.org/t/-/395768" + disallow_enabled_for_groups: true enable_auto_grid_images: default: false client: true hidden: true area: "experimental" upcoming_change: - status: "experimental" + status: "beta" impact: "feature,all_members" learn_more_url: "https://meta.discourse.org/t/-/394784" rename_faq_to_guidelines: @@ -4239,7 +4244,7 @@ experimental: area: "experimental" upcoming_change: impact: "feature,all_members" - status: "experimental" + status: "beta" learn_more_url: "https://meta.discourse.org/t/-/395099" experimental_tag_settings_page: default: false @@ -4251,7 +4256,7 @@ experimental: hidden: true area: "experimental" upcoming_change: - status: "experimental" + status: "beta" impact: "feature,all_members" learn_more_url: "https://meta.discourse.org/t/-/278631" impersonate_without_logout: @@ -4259,7 +4264,7 @@ experimental: hidden: true area: "experimental" upcoming_change: - status: "experimental" + status: "beta" impact: "feature,staff" learn_more_url: "https://meta.discourse.org/t/-/119683" experimental_impersonation_time_limit_minutes: @@ -4288,10 +4293,6 @@ experimental: default: true hidden: true client: true - enable_upcoming_changes: - default: false - hidden: true - client: true floating_dismiss_topics_on_mobile: default: false hidden: true @@ -4305,10 +4306,13 @@ experimental: hidden: true client: true upcoming_change: - status: "experimental" + status: "alpha" impact: "feature,staff" learn_more_url: "https://meta.discourse.org/t/-/394971" - enable_category_type_setup: + experimental_topic_category_change_notification: default: false hidden: true - client: true \ No newline at end of file + enable_upcoming_changes: + default: true + hidden: true + client: true diff --git a/config/unicorn.conf.rb b/config/unicorn.conf.rb index 00535621ce2d0..8c60874280839 100644 --- a/config/unicorn.conf.rb +++ b/config/unicorn.conf.rb @@ -102,7 +102,7 @@ # The cause is currently unknown but we suspect that it is related to the Unicorn master process and # Sidekiq demon processes reopening logs at the same time as we noticed that Unicorn worker processes only # reopen logs after the Unicorn master process is done. To workaround the problem, we are adding an arbitrary - # delay of 1 second to Sidekiq's log reopeing procedure. The 1 second delay should be + # delay of 1 second to Sidekiq's log reopening procedure. The 1 second delay should be # more than enough for the Unicorn master process to finish reopening logs. Demon::Sidekiq.kill("USR2") end diff --git a/db/fixtures/007_web_hook_event_types.rb b/db/fixtures/007_web_hook_event_types.rb index d2959d556245a..fd9d14b8c58b5 100644 --- a/db/fixtures/007_web_hook_event_types.rb +++ b/db/fixtures/007_web_hook_event_types.rb @@ -235,3 +235,18 @@ b.name = "chat_message_restored" b.group = WebHookEventType.groups[:chat] end +WebHookEventType.seed do |b| + b.id = WebHookEventType::TYPES[:calendar_event_created] + b.name = "calendar_event_created" + b.group = WebHookEventType.groups[:calendar] +end +WebHookEventType.seed do |b| + b.id = WebHookEventType::TYPES[:calendar_event_updated] + b.name = "calendar_event_updated" + b.group = WebHookEventType.groups[:calendar] +end +WebHookEventType.seed do |b| + b.id = WebHookEventType::TYPES[:calendar_event_destroyed] + b.name = "calendar_event_destroyed" + b.group = WebHookEventType.groups[:calendar] +end diff --git a/db/post_migrate/20250304074934_backfill_api_key_scope_modes.rb b/db/migrate/20250304074934_backfill_api_key_scope_modes.rb similarity index 100% rename from db/post_migrate/20250304074934_backfill_api_key_scope_modes.rb rename to db/migrate/20250304074934_backfill_api_key_scope_modes.rb diff --git a/db/post_migrate/20250305233449_populate_type_source_in_reviewable.rb b/db/migrate/20250305233449_populate_type_source_in_reviewable.rb similarity index 100% rename from db/post_migrate/20250305233449_populate_type_source_in_reviewable.rb rename to db/migrate/20250305233449_populate_type_source_in_reviewable.rb diff --git a/db/post_migrate/20250513161753_rename_by_id_group.rb b/db/migrate/20250513161753_rename_by_id_group.rb similarity index 100% rename from db/post_migrate/20250513161753_rename_by_id_group.rb rename to db/migrate/20250513161753_rename_by_id_group.rb diff --git a/db/post_migrate/20250526063633_copy_add_groups_to_about_component_settings.rb b/db/migrate/20250526063633_copy_add_groups_to_about_component_settings.rb similarity index 100% rename from db/post_migrate/20250526063633_copy_add_groups_to_about_component_settings.rb rename to db/migrate/20250526063633_copy_add_groups_to_about_component_settings.rb diff --git a/db/post_migrate/20250702082232_deprecate_external_system_avatars_enabled.rb b/db/migrate/20250702082232_deprecate_external_system_avatars_enabled.rb similarity index 100% rename from db/post_migrate/20250702082232_deprecate_external_system_avatars_enabled.rb rename to db/migrate/20250702082232_deprecate_external_system_avatars_enabled.rb diff --git a/db/post_migrate/20250708031631_remove_flush_timings_secs_setting.rb b/db/migrate/20250708031631_remove_flush_timings_secs_setting.rb similarity index 100% rename from db/post_migrate/20250708031631_remove_flush_timings_secs_setting.rb rename to db/migrate/20250708031631_remove_flush_timings_secs_setting.rb diff --git a/db/post_migrate/20250709051949_disable_gravatar_enabled_if_unconfigured.rb b/db/migrate/20250709051949_disable_gravatar_enabled_if_unconfigured.rb similarity index 100% rename from db/post_migrate/20250709051949_disable_gravatar_enabled_if_unconfigured.rb rename to db/migrate/20250709051949_disable_gravatar_enabled_if_unconfigured.rb diff --git a/db/post_migrate/20250710074447_clear_backup_frequency_if_disabled.rb b/db/migrate/20250710074447_clear_backup_frequency_if_disabled.rb similarity index 100% rename from db/post_migrate/20250710074447_clear_backup_frequency_if_disabled.rb rename to db/migrate/20250710074447_clear_backup_frequency_if_disabled.rb diff --git a/db/post_migrate/20250804021210_drop_enable_experimental_sidebar_user_option.rb b/db/migrate/20250804021210_drop_enable_experimental_sidebar_user_option.rb similarity index 100% rename from db/post_migrate/20250804021210_drop_enable_experimental_sidebar_user_option.rb rename to db/migrate/20250804021210_drop_enable_experimental_sidebar_user_option.rb diff --git a/db/post_migrate/20250812033430_replace_null_with_zero_in_backup_frequency.rb b/db/migrate/20250812033430_replace_null_with_zero_in_backup_frequency.rb similarity index 100% rename from db/post_migrate/20250812033430_replace_null_with_zero_in_backup_frequency.rb rename to db/migrate/20250812033430_replace_null_with_zero_in_backup_frequency.rb diff --git a/db/post_migrate/20250821150220_remove_use_overhauled_theme_color_palette_setting.rb b/db/migrate/20250821150220_remove_use_overhauled_theme_color_palette_setting.rb similarity index 100% rename from db/post_migrate/20250821150220_remove_use_overhauled_theme_color_palette_setting.rb rename to db/migrate/20250821150220_remove_use_overhauled_theme_color_palette_setting.rb diff --git a/db/post_migrate/20250821155127_drop_dark_hex_from_color_scheme_color.rb b/db/migrate/20250821155127_drop_dark_hex_from_color_scheme_color.rb similarity index 100% rename from db/post_migrate/20250821155127_drop_dark_hex_from_color_scheme_color.rb rename to db/migrate/20250821155127_drop_dark_hex_from_color_scheme_color.rb diff --git a/db/post_migrate/20250821155615_drop_theme_color_scheme.rb b/db/migrate/20250821155615_drop_theme_color_scheme.rb similarity index 100% rename from db/post_migrate/20250821155615_drop_theme_color_scheme.rb rename to db/migrate/20250821155615_drop_theme_color_scheme.rb diff --git a/db/post_migrate/20251029072625_delete_old_watched_precedence_setting.rb b/db/migrate/20251029072625_delete_old_watched_precedence_setting.rb similarity index 100% rename from db/post_migrate/20251029072625_delete_old_watched_precedence_setting.rb rename to db/migrate/20251029072625_delete_old_watched_precedence_setting.rb diff --git a/db/post_migrate/20251127001422_remove_orphaned_reviewable_claimed_topics.rb b/db/migrate/20251127001422_remove_orphaned_reviewable_claimed_topics.rb similarity index 100% rename from db/post_migrate/20251127001422_remove_orphaned_reviewable_claimed_topics.rb rename to db/migrate/20251127001422_remove_orphaned_reviewable_claimed_topics.rb diff --git a/db/post_migrate/20260108044513_drop_imap_sync_logs.rb b/db/migrate/20260108044513_drop_imap_sync_logs.rb similarity index 100% rename from db/post_migrate/20260108044513_drop_imap_sync_logs.rb rename to db/migrate/20260108044513_drop_imap_sync_logs.rb diff --git a/db/migrate/20260306183220_add_topic_title_placeholder_to_categories.rb b/db/migrate/20260306183220_add_topic_title_placeholder_to_categories.rb new file mode 100644 index 0000000000000..d45d2835f698c --- /dev/null +++ b/db/migrate/20260306183220_add_topic_title_placeholder_to_categories.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddTopicTitlePlaceholderToCategories < ActiveRecord::Migration[8.0] + def change + add_column :categories, :topic_title_placeholder, :string, null: true + end +end diff --git a/db/migrate/20260309032553_remove_enable_upcoming_changes_site_setting.rb b/db/migrate/20260309032553_remove_enable_upcoming_changes_site_setting.rb new file mode 100644 index 0000000000000..00d45c2edc18a --- /dev/null +++ b/db/migrate/20260309032553_remove_enable_upcoming_changes_site_setting.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class RemoveEnableUpcomingChangesSiteSetting < ActiveRecord::Migration[8.0] + def up + execute "DELETE FROM site_settings WHERE name = 'enable_upcoming_changes'" + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20260310001245_remove_enable_category_type_setup_site_setting.rb b/db/migrate/20260310001245_remove_enable_category_type_setup_site_setting.rb new file mode 100644 index 0000000000000..9a994084cfe60 --- /dev/null +++ b/db/migrate/20260310001245_remove_enable_category_type_setup_site_setting.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class RemoveEnableCategoryTypeSetupSiteSetting < ActiveRecord::Migration[8.0] + def up + execute "DELETE FROM site_settings WHERE name = 'enable_category_type_setup'" + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20260310072550_mark_category_approval_booleans_readonly.rb b/db/migrate/20260310072550_mark_category_approval_booleans_readonly.rb new file mode 100644 index 0000000000000..49bb0a0c2f4ec --- /dev/null +++ b/db/migrate/20260310072550_mark_category_approval_booleans_readonly.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +class MarkCategoryApprovalBooleansReadonly < ActiveRecord::Migration[8.0] + def up + change_column_default :category_settings, :require_topic_approval, nil + change_column_default :category_settings, :require_reply_approval, nil + + Migration::ColumnDropper.mark_readonly(:category_settings, :require_topic_approval) + Migration::ColumnDropper.mark_readonly(:category_settings, :require_reply_approval) + end + + def down + Migration::ColumnDropper.drop_readonly(:category_settings, :require_topic_approval) + Migration::ColumnDropper.drop_readonly(:category_settings, :require_reply_approval) + end +end diff --git a/db/migrate/20260310072759_create_category_approval_groups.rb b/db/migrate/20260310072759_create_category_approval_groups.rb new file mode 100644 index 0000000000000..dcdc78856fafb --- /dev/null +++ b/db/migrate/20260310072759_create_category_approval_groups.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +class CreateCategoryApprovalGroups < ActiveRecord::Migration[8.0] + def up + create_table :category_posting_review_groups do |t| + t.integer :post_type, null: false + t.integer :permission, null: false + t.integer :category_id, null: false + t.integer :group_id, null: false + t.timestamps null: false + end + + add_index :category_posting_review_groups, + %i[category_id group_id post_type], + unique: true, + name: "idx_category_posting_review_groups_unique" + + # Backfill: for each category with require_topic_approval = true, + # insert a "required" row for the everyone group (id 0) with post_type topic (0). + execute(<<~SQL) + INSERT INTO category_posting_review_groups (post_type, permission, category_id, group_id, created_at, updated_at) + SELECT 0, 1, cs.category_id, 0, NOW(), NOW() + FROM category_settings cs + WHERE cs.require_topic_approval = true + SQL + + # Same for reply approval: post_type reply (1). + execute(<<~SQL) + INSERT INTO category_posting_review_groups (post_type, permission, category_id, group_id, created_at, updated_at) + SELECT 1, 1, cs.category_id, 0, NOW(), NOW() + FROM category_settings cs + WHERE cs.require_reply_approval = true + SQL + end + + def down + drop_table :category_posting_review_groups + end +end diff --git a/db/post_migrate/20260311064518_clean_existing_tag_localization_names.rb b/db/post_migrate/20260311064518_clean_existing_tag_localization_names.rb new file mode 100644 index 0000000000000..b511acd9a71ff --- /dev/null +++ b/db/post_migrate/20260311064518_clean_existing_tag_localization_names.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +class CleanExistingTagLocalizationNames < ActiveRecord::Migration[7.2] + # matches DiscourseTagging::TAGS_FILTER_REGEXP plus whitespace and consecutive dashes + VIOLATING_PATTERN = %q{[/:?#\[\]@!$&'()*+,;=.%\\`^\s|{}"<>]|--} + + def up + conditions = ["name ~ :pattern OR name != TRIM(name)"] + params = { pattern: VIOLATING_PATTERN } + + conditions << "name != LOWER(name)" if SiteSetting.force_lowercase_tags + + max_length = SiteSetting.max_tag_length + conditions << "LENGTH(name) > :max_length" + params[:max_length] = max_length + + query = <<~SQL + SELECT id, name FROM tag_localizations + WHERE #{conditions.join(" OR ")} + SQL + + DB + .query(query, **params) + .each do |row| + cleaned = DiscourseTagging.clean_tag(row.name) + next if cleaned == row.name + next if cleaned.blank? + + DB.exec( + "UPDATE tag_localizations SET name = :name WHERE id = :id", + name: cleaned, + id: row.id, + ) + end + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/docs/developer-guides/.prettierrc.cjs b/docs/developer-guides/.prettierrc.cjs new file mode 100644 index 0000000000000..57f647bc84c84 --- /dev/null +++ b/docs/developer-guides/.prettierrc.cjs @@ -0,0 +1 @@ +module.exports = require("@discourse/lint-configs/prettier"); diff --git a/docs/developer-guides/.prettierrc.mjs b/docs/developer-guides/.prettierrc.mjs deleted file mode 100644 index 2056370c4c5ad..0000000000000 --- a/docs/developer-guides/.prettierrc.mjs +++ /dev/null @@ -1,6 +0,0 @@ -export default { - tabWidth: 2, - useTabs: false, - trailingComma: "es5", - plugins: ["prettier-plugin-ember-template-tag"], -}; diff --git a/docs/developer-guides/Gemfile.lock b/docs/developer-guides/Gemfile.lock index 1c3b5d5799965..6379bb3665889 100644 --- a/docs/developer-guides/Gemfile.lock +++ b/docs/developer-guides/Gemfile.lock @@ -1,28 +1,30 @@ GEM remote: https://rubygems.org/ specs: - faraday (2.10.1) - faraday-net_http (>= 2.0, < 3.2) + faraday (2.14.1) + faraday-net_http (>= 2.0, < 3.5) + json logger faraday-multipart (1.0.4) multipart-post (~> 2) - faraday-net_http (3.1.1) - net-http + faraday-net_http (3.4.2) + net-http (~> 0.5) faraday-retry (2.2.1) faraday (~> 2.0) ffi (1.17.0) ffi (1.17.0-arm64-darwin) + json (2.19.2) listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - logger (1.6.0) + logger (1.7.0) multipart-post (2.4.1) - net-http (0.4.1) - uri + net-http (0.9.1) + uri (>= 0.11.1) rb-fsevent (0.11.2) rb-inotify (0.11.1) ffi (~> 1.0) - uri (0.13.0) + uri (1.1.1) PLATFORMS arm64-darwin-23 diff --git a/docs/developer-guides/README.md b/docs/developer-guides/README.md index f92ed9fa1550d..cbeba8c13720a 100644 --- a/docs/developer-guides/README.md +++ b/docs/developer-guides/README.md @@ -77,7 +77,6 @@ Avoid hotlinking images from other sources. If you do, Discourse may download th When working on substantial changes, you may like to set up a staging environment to preview your changes. 1. Prepare a Discourse instance (could be a local development environment, or a production site) - 1. Create a category for the docs 2. Install [discourse-doc-categories](https://github.com/discourse/discourse-doc-categories), and configure fully by adding the category & assigning an index topic 3. Enable [DiscoTOC](https://meta.discourse.org/t/111143) for the category diff --git a/docs/developer-guides/docs/03-code-internals/02-lint-and-format.md b/docs/developer-guides/docs/03-code-internals/02-lint-and-format.md index 70a8878ff85f7..581e91e3010a5 100644 --- a/docs/developer-guides/docs/03-code-internals/02-lint-and-format.md +++ b/docs/developer-guides/docs/03-code-internals/02-lint-and-format.md @@ -4,11 +4,172 @@ short_title: Lint and format id: lint-and-format --- -The discourse repository includes configuration for [lefthook](https://github.com/Arkweid/lefthook). This will automatically check any code before it's committed to git, and alert about any issues. To get set up, simply enter your discourse development directory and run +Discourse uses [lefthook](https://github.com/evilmartians/lefthook) for git hooks, and `bin/lint` as the main CLI entry point for running the same checks manually. + +If you are working in a local clone, install the hooks once: ```sh pnpm install -pnpm run lefthook install +pnpm lefthook install +``` + +After that, staged files will be checked automatically on `git commit`. + +## The main command: `bin/lint` + +Use `bin/lint` when you want to run the repo's configured linters yourself instead of waiting for the pre-commit hook. + +Common examples: + +```sh +bin/lint +bin/lint path/to/file.rb path/to/file.gjs +bin/lint --recent +bin/lint --staged +bin/lint --unstaged +bin/lint --wip +bin/lint --fix path/to/file.rb +bin/lint --fix --recent +bin/lint --fix ``` -Files will now be automatically checked before committing. If there are any issues, the commit will be cancelled, and you will be shown a list of errors. +### What each mode does + +- `bin/lint`: lint all supported files in the repository +- `bin/lint path/to/file ...`: lint only the given files +- `bin/lint --recent`: lint files changed in the last 50 commits, plus untracked files +- `bin/lint --staged`: lint only staged files +- `bin/lint --unstaged`: lint only unstaged files +- `bin/lint --wip`: lint staged files, unstaged files, and files changed since `main` +- `bin/lint --fix ...`: run the auto-fixers for the selected files +- `bin/lint --fix`: run all available auto-fixers across the repository +- `bin/lint --verbose`: print the underlying lefthook commands + +When you pass explicit files, `bin/lint` filters them to supported lintable file types before invoking lefthook. + +> :information_source: Markdown documentation files are not currently part of `bin/lint`, so running `bin/lint path/to/doc.md` will report that there are no matching files to lint. + +## What gets linted + +The exact configuration lives in [`lefthook.yml`](https://github.com/discourse/discourse/blob/main/lefthook.yml). At the time of writing, `bin/lint` covers: + +### Ruby + +- `**/*.{rb,rake,thor}` +- Ruby scripts under `bin/**/*` +- `Gemfile` + +Checks: + +- `rubocop` +- `syntax_tree` (`stree check`) + +### JavaScript, GJS, CSS, and SCSS formatting + +- `app/assets/stylesheets/**/*.{css,scss}` +- `frontend/**/*.{js,gjs,scss,css,cjs,mjs}` +- matching plugin and theme asset files + +Checks: + +- `prettier`/`pprettier` + +### JavaScript and GJS linting + +- `frontend/**/*.{js,gjs}` +- matching plugin and theme JS files + +Checks: + +- `eslint` + +### GJS template linting + +- `frontend/**/*.gjs` +- matching plugin and theme `.gjs` files + +Checks: + +- `ember-template-lint` + +### SCSS linting + +- `app/assets/stylesheets/**/*.scss` +- matching plugin and theme SCSS files + +Checks: + +- `stylelint` + +### YAML and locale checks + +- `**/*.{yaml,yml}` except `config/database.yml` +- `**/{client,server}.en.yml` + +Checks: + +- `yaml-lint` +- `script/i18n_lint.rb` + +### Type checking + +When you run `bin/lint` with no file arguments, the full-repo lint also runs: + +- `pnpm lint:types` + +This is the Glint/TypeScript-style check for Discourse's JavaScript type information. + +> :information_source: `bin/lint path/to/file` and the pre-commit hook do **not** run the full type check. Use plain `bin/lint` when you want the complete repo-wide lint pass. + +## What can be auto-fixed + +`bin/lint --fix` can automatically fix a lot of issues, but not all of them. + +Auto-fix is configured for: + +- `prettier --write` +- `eslint --fix` +- `ember-template-lint --fix` +- `stylelint --fix` +- `rubocop -A` +- `syntax_tree` (`stree write`) + +In practice, that means `--fix` can reformat and rewrite: + +- Ruby +- JavaScript / GJS +- CSS / SCSS + +These checks are **not** auto-fixed by `bin/lint --fix`: + +- YAML syntax validation +- i18n linting for `client.en.yml` / `server.en.yml` +- Glint/type checking + +## Relationship to git hooks + +The pre-commit hook uses the same lefthook configuration as `bin/lint`, but it runs only against staged files. + +That means: + +- a commit can fail because staged files do not pass linting +- `bin/lint --staged` is the closest manual equivalent to the pre-commit hook +- `bin/lint --fix --staged` is a good way to repair exactly what you are about to commit + +## Practical workflow + +For day-to-day development, these are the most useful commands: + +```sh +# Before committing a couple of changed files +bin/lint --fix path/to/file1.rb path/to/file2.gjs + +# Check exactly what the pre-commit hook will check +bin/lint --staged + +# Clean up all current in-progress work +bin/lint --fix --wip + +# Run the full repo lint suite, including type checks +bin/lint +``` diff --git a/docs/developer-guides/docs/03-code-internals/06-ember-object-ownership.md b/docs/developer-guides/docs/03-code-internals/06-ember-object-ownership.md index 1637debfd6b01..afc11614da5ae 100644 --- a/docs/developer-guides/docs/03-code-internals/06-ember-object-ownership.md +++ b/docs/developer-guides/docs/03-code-internals/06-ember-object-ownership.md @@ -29,7 +29,7 @@ To access e.g. services there a couple of methods at your disposal. - In API initializers you have the access to `api.container` ```js - apiInitializer("1.0", (api) => { + apiInitializer((api) => { const router = api.container.lookup("service:router"); ``` diff --git a/docs/developer-guides/docs/03-code-internals/14-modifyclass.md b/docs/developer-guides/docs/03-code-internals/14-modifyclass.md index 5bb27751c20a4..225343e755629 100644 --- a/docs/developer-guides/docs/03-code-internals/14-modifyclass.md +++ b/docs/developer-guides/docs/03-code-internals/14-modifyclass.md @@ -122,7 +122,7 @@ In theme/plugin development, there are two ways this error is normally introduce ```js // Lookup service in initializer, then use it at runtime (bad!) - export default apiInitializer("0.8", (api) => { + export default apiInitializer((api) => { const composerService = api.container.lookup("service:composer"); api.composerBeforeSave(async () => { composerService.doSomething(); @@ -134,7 +134,7 @@ In theme/plugin development, there are two ways this error is normally introduce ```js // 'Just in time' lookup of service (good!) - export default apiInitializer("0.8", (api) => { + export default apiInitializer((api) => { api.composerBeforeSave(async () => { const composerService = api.container.lookup("service:composer"); composerService.doSomething(); diff --git a/docs/developer-guides/docs/03-code-internals/21-form-kit.md b/docs/developer-guides/docs/03-code-internals/21-form-kit.md index 40c8e7f21a63d..4264773bb008b 100644 --- a/docs/developer-guides/docs/03-code-internals/21-form-kit.md +++ b/docs/developer-guides/docs/03-code-internals/21-form-kit.md @@ -10,7 +10,7 @@ id: form-kit FormKit exposes a single component as its public API: `
`. All other elements are yielded as contextual components, modifiers, or plain data. -Every form is composed of one or multiple fields, representing the value, validation, and metadata of a control. Each field encapsulates a control, which is the form element the user interacts with to enter data, such as an input or select. Other utilities, like submit or alert, are also provided. +Every form is composed of one or multiple fields, representing the value, validation, and metadata of a control. Each field encapsulates a control, which is the form element the user interacts with to enter data, such as an input or select. The control type is specified via `@type` on the field. Other utilities, like submit or alert, are also provided. Here is the most basic example of a form: @@ -31,13 +31,14 @@ export default class MyForm extends Component { @name="username" @title="Username" @validation="required" + @type="input" as |field| > - + - - + + @@ -52,7 +53,14 @@ export default class MyForm extends Component { ### form -The `Form` component yields a `form` object containing components and helpers. +The `Form` component yields a `form` object containing contextual components and helper functions. + +Common members include: + +- `Field`, `Object`, `Collection`, `Fieldset`, `Row`, `Section`, `Container` +- `Submit`, `Reset`, `Button`, `Alert`, `Actions` +- `CheckboxGroup`, `InputGroup`, `ConditionalContent` +- `set(name, value)`, `setProperties(object)`, `addItemToCollection(name, value)` **Example** @@ -66,7 +74,7 @@ The `Form` component yields a `form` object containing components and helpers. ### transientData -`transientData` represents the state of the data at a given time as it's represented in the form, and not yet propagated to `@data`. +`transientData` is the form's current draft state. It starts as a clone of `@data`, updates as the user edits fields, and does not mutate the original `@data` object. > :information_source: This is useful if you want to have conditionals in your form based on other fields. @@ -74,29 +82,31 @@ The `Form` component yields a `form` object containing components and helpers. ```hbs - - + + {{#if (gt transientData.amount 200)}} - - I know what I'm doing + + I know what I'm doing {{/if}} ``` -## Properties +## Arguments ### @data -Initial state of the data you give to the form. +Initial state of the form data. -**The keys matching the `@name`s of the form's fields will be prepopulated.** +**FormKit expects a plain JavaScript object (POJO).** Internally it clones that object into draft state, tracks patches, and only mutates its own internal copy. -> :information_source: `@data` is treated as an immutable object, following Ember's DDAU pattern. This means when the user enters new data for any of the fields, it will not cause a mutation of `@data`! You can mutate your initial object using `@onSet`. +Keys matching field `@name`s are prepopulated automatically, including nested object and collection paths. -When working with an object object we recommend to setup your form data object like this: +> :information_source: `@data` is treated as immutable. Edits do not mutate the original object you pass in. If you need to keep some external state in sync while editing, do that explicitly in `@onSet`. + +When deriving a form object from a model, prefer a cached getter: ```js @cached @@ -113,34 +123,40 @@ get formData() { ```hbs
- + - + ``` ### @onRegisterApi -Callback called when the form is inserted. It allows the developer to interact with the form through JavaScript. +Callback called when the form instance is created. It allows the developer to interact with the form through JavaScript. **Parameters** - `callback` (Object): The object containing callback functions. - - `callback.submit` (Function): Function to submit the form. - - `callback.reset` (Function): Function to reset the form. - - `callback.set` (Function): Function to set a key/value on the form data object. - - `callback.setProperties` (Function): Function to set an object on the form data object. - - `callback.isDirty` (boolean): Tracked property return the state of the form. It will be true once changes have been done on the form. Resetting the changes will bring it back to false. +- `callback.get` (Function): Returns the current value for a field name. +- `callback.submit` (Function): Function to submit the form. +- `callback.reset` (Function): Function to reset the form. +- `callback.set` (Function): Function to set a key/value on the form data object. +- `callback.setProperties` (Function): Function to set an object on the form data object. +- `callback.addError` (Function): Function to add an error programmatically. +- `callback.removeError` (Function): Function to remove a single field error. +- `callback.removeErrors` (Function): Function to clear all errors. +- `callback.isDirty` (boolean): Tracked property exposing the dirty state of the form. It becomes `true` after changes are made and returns to `false` after reset. **Example** ```js -registerAPI({ submit, reset, set }) { +registerAPI({ get, submit, reset, set, addError }) { // Interact with the form API + get("foo"); submit(); reset(); set("foo", 1); + addError("foo", { title: "Foo", message: "Something went wrong" }); } ``` @@ -154,7 +170,7 @@ Callback called when the form is submitted **and valid**. **Parameters** -- `data` (Object): The object containing the form data. +- `data` (Object): The current draft data for the form. **Example** @@ -166,19 +182,45 @@ handleSubmit({ username, age }) { ```hbs
- - + + - - + + ``` +### @onReset + +Callback called after FormKit rolls the draft data back to its initial state and clears errors. + +**Parameters** + +- `data` (Object): The rolled-back draft data. + +**Example** + +```js +handleReset(data) { + console.log("reset to", data); +} +``` + +```hbs +
+ + + + + + +``` + ### @validate -A custom validation callback added directly to the form. +A custom validation callback added directly to the form. This runs once per validation pass, after field-level validation. **Example** @@ -211,16 +253,53 @@ async myValidation(data, { addError }) { } ``` +### @validateOn + +Controls when FormKit should validate. + +- Accepted values: `submit` (default), `change`, `focusout`, and `input`. + +**Example** + +```hbs +
+``` + +### @onDirtyCheck + +Callback used during route transitions when the form is dirty. Return a truthy value to show the built-in "dirty form" confirmation dialog, or a falsy value to skip it. + +**Parameters** + +- `transition` (Transition): The Ember route transition being processed. + +**Example** + +```js +@action +onDirtyCheck(transition) { + return transition.to?.name !== "wizard.step"; +} +``` + +```hbs + +``` + # Field ## @name -A field must have a unique name. This name is used to set the value on the data object and is also used for validation. +A field must have a unique name. This name is used to read/write the value on the form data object and is also used for validation. + +Names cannot contain `.` or `-`. Dots are reserved for nested paths such as `profile.location.city`. **Example** ```hbs - + + + ``` ## @title @@ -230,7 +309,24 @@ A field must have a title. It will be displayed above the control and is also us **Example** ```hbs - + + + +``` + +## @type + +A field must have a type. This determines which control component is rendered. The available types are: + +- **Input types**: `input` (defaults to text), `input-text`, `input-number`, `input-email`, `input-password`, `input-url`, `input-tel`, `input-date`, `input-time`, `input-datetime-local`, `input-color`, `input-month`, `input-week`, `input-range`, `input-search`, `input-hidden` +- **Other controls**: `checkbox`, `code`, `calendar`, `color`, `composer`, `custom`, `emoji`, `icon`, `image`, `menu`, `password`, `question`, `radio-group`, `select`, `tag-chooser`, `textarea`, `toggle` + +**Example** + +```hbs + + + ``` ## @description @@ -240,7 +336,15 @@ The description is optional and will be shown under the title when set. **Example** ```hbs - + + + ``` ## @helpText @@ -250,7 +354,9 @@ The help text is optional and will be shown under the field when set. **Example** ```hbs - + + + ``` ## @showTitle @@ -260,7 +366,15 @@ By default, the title will be shown on top of the control. You can choose not to **Example** ```hbs - + + + ``` ## @disabled @@ -270,20 +384,34 @@ A field can be disabled to prevent any changes to it. **Example** ```hbs - + + + ``` ## @tooltip -Allows to display a tooltip next to the field’s title. Won't display if title is not shown. +Allows to display a tooltip next to the field's title. Won't display if title is not shown. You can pass a string or a `` component. **Example** ```hbs - - + + ``` @@ -293,10 +421,11 @@ You can pass a string or a `` component. - + ``` @@ -317,19 +446,32 @@ By default, when changing the value of a field, this value will be set on the fo ```js @action -handleFooChange(value, { set }) { +handleFooChange(value, { set, name, parentName, index }) { set("foo", value + "-bar"); } ``` ```hbs - - + + ``` > :information_source: You can use `@onSet` to also mutate the initial data object if you need more reactivity for a specific case. +The second argument passed to `@onSet` contains: + +- `set(name, value)`: update form draft state +- `name`: the field's full name +- `parentName`: the parent path for nested fields +- `index`: the current collection index when inside a collection + **Example** ```js @@ -342,15 +484,50 @@ handleFooChange(value, { set }) { ```hbs
- - + + ``` +## Yielded Parameters + +The field yields a single field object. The control component determined by `@type` is available as `field.Control`. + +```hbs + + + +``` + +### field.Control + +`field.Control` is the control component determined by `@type`. You can pass control-specific attributes directly to it (e.g., `@height`, `@lang`, `placeholder`). + +> :information_source: `field.Control` is the supported API. Older yielded names such as `field.Input` are deprecated. + +### field + +The yielded `field` object provides access to the field's data and helpers: + +| Name | Description | +| --------- | --------------------------------------------------- | +| `Control` | Contextual component for the control set by `@type` | +| `id` | ID to be used on the control for accessibility | +| `errorId` | ID of the field error container | +| `name` | Full field name, including nested path prefixes | +| `value` | Current value from draft data | +| `set` | Function to set the field's value | + # Controls -Controls, as we use the term here, refer to the UI widgets that allow a user to enter data. In its most basic form, this would be an input. +Controls, as we use the term here, refer to the UI widgets that allow a user to enter data. In its most basic form, this would be an input. The control type is specified via `@type` on the field. > :information_source: You can pass down HTML attributes to the underlying control. @@ -361,10 +538,11 @@ Controls, as we use the term here, refer to the UI widgets that allow a user to - + ``` @@ -399,68 +577,94 @@ Allows to override `@format` for the description. See `@format` for details. Renders an `` element. > :information_source: When to use a single checkbox -> There are only 2 options: yes/no. It feels like agreeing to something. Checking the box doesn’t save; there is a submit button further down. +> There are only 2 options: yes/no. It feels like agreeing to something. Checking the box doesn't save; there is a submit button further down. **Example** ```hbs
- - + + ``` -## Code +## Calendar -Renders an `` component. +Renders a datepicker and a time input. On mobile the datepicker will be replaced by a date input. -### @height +### @includeTime + +Displays the time input or not. Defaults to true. -Sets the height of the editor. +**Example** -### @lang +```hbs +
+ + + + +``` -Sets the language of the editor. +### @expandedDatePickerOnDesktop + +Displays date picker expanded on desktop. Defaults to true. **Example** ```hbs
- - + + ``` -## Calendar +## Code -Renders a datepicker and a time input. On mobile the datepicker will be replaced by a date input. +Renders an `` component. -### @includeTime +### @height -Displays the time input or not. Defaults to true. +Sets the height of the editor in pixels. + +### @lang + +Sets the editor mode. **Example** ```hbs
- - + + ``` -### @expandedDatePickerOnDesktop +## Color -Displays date picker expanded on desktop. Defaults to true. +Renders a color input with optional preset swatches. + +Common control arguments: + +- `@colors`: array of preset colors +- `@usedColors`: array of already-used colors +- `@collapseSwatches`: collapse swatches into a menu +- `@collapseSwatchesLabel`: label for the collapsed swatches button +- `@allowNamedColors`: allow named colors instead of only hex values +- `@fallbackValue`: value to restore on blur when left blank **Example** ```hbs
- - + + ``` @@ -477,8 +681,8 @@ Sets the height of the composer. ```hbs
- - + + ``` @@ -491,8 +695,46 @@ Controls the display the composer preview. Defaults to `false`. ```hbs
- - + + + + +``` + +## Custom + +Renders a wrapper for custom content. This is the right choice when you want to provide your own control markup but still use FormKit field metadata and state. + +**Example** + +```hbs +
+ + + + + + +``` + +## Emoji + +Renders an `` component. + +### @context + +Passes the picker context through to ``. + +**Example** + +```hbs +
+ + ``` @@ -505,8 +747,8 @@ Renders an `` component. ```hbs
- - + + ``` @@ -515,6 +757,11 @@ Renders an `` component. Renders an `` component. +Common control arguments: + +- `@type`: uploader context passed to `` +- `@placeholderUrl`: optional placeholder image + ### Upload Handling By default, the component will set an upload object. It's common to only want the URL and the ID of the upload. To achieve this, you can use the `@onSet` property on the field: @@ -532,10 +779,11 @@ handleUpload(upload, { set }) { - + ``` @@ -544,8 +792,8 @@ handleUpload(upload, { set }) { ```hbs
- - + + ``` @@ -556,41 +804,42 @@ Renders an `` element. ### @type -Optional property which will default to `text`. Maps to `` types. +The input variant is specified as part of the field's `@type` using the `input-` prefix. For example, `@type="input"`, `@type="input-number"`, or `@type="input-email"`. `@type="input"` defaults to text. ### Allowed Types -- `color` -- `date` -- `datetime-local` -- `email` -- `hidden` -- `month` -- `number` -- `password` -- `range` -- `search` -- `tel` -- `text` -- `time` -- `url` -- `week` +- `input` (defaults to text) +- `input-color` +- `input-date` +- `input-datetime-local` +- `input-email` +- `input-hidden` +- `input-month` +- `input-number` +- `input-password` +- `input-range` +- `input-search` +- `input-tel` +- `input-text` +- `input-time` +- `input-url` +- `input-week` ### Special Cases -- `file` is supported only for images through image -- checkbox +- `checkbox` and `radio` have dedicated controls +- file uploads should use `@type="image"` **Examples** ```hbs
- - + + - - + + ``` @@ -603,8 +852,8 @@ Renders text before the input ```hbs
- - + + ``` @@ -617,15 +866,15 @@ Renders text after the input ```hbs
- - + + ``` ## Menu -Renders a component. +Renders a `` trigger with yielded menu content. ### @selection @@ -655,29 +904,31 @@ Renders a div which will have for content the yielded content. ```hbs
- - + + Edit Bar Something - +
``` ## Password -Renders an `` of type password. This control also includes a button which will allow to toggle the visibility of the text. When toggle the type of the input will be switched to text. +Renders a password input with a visibility toggle. + +> :information_source: This is different from `@type="input-password"`. The dedicated `password` control adds the show/hide button. **Example** ```hbs
- - + + ``` @@ -698,8 +949,8 @@ Allows to customize the negative label. ```hbs
- - + + ``` @@ -712,12 +963,12 @@ Renders a list of radio buttons sharing a common name. ```hbs
- - + + One Two Three - + ``` @@ -732,12 +983,12 @@ Allows to render a title. ```hbs
- - + + One title - + ``` @@ -750,35 +1001,63 @@ Allows to render a description. ```hbs
- - + + One description - + ``` ## Select -Renders a `

- <%=raw(t 'user_notifications.digest.unsubscribe', - site_link: html_site_link, - email_preferences_link: link_to(t('user_notifications.digest.your_email_settings'), Discourse.base_url + '/my/preferences/emails'), - unsubscribe_link: link_to(t('user_notifications.digest.click_here'), "#{Discourse.base_url}/email/unsubscribe/#{@unsubscribe_key}")) %> + <% if @unsubscribe_key %> + <%=raw(t 'user_notifications.digest.unsubscribe', + site_link: html_site_link, + email_preferences_link: link_to(t('user_notifications.digest.your_email_settings'), Discourse.base_url + '/my/preferences/emails'), + unsubscribe_link: link_to(t('user_notifications.digest.click_here'), "#{Discourse.base_url}/email/unsubscribe/#{@unsubscribe_key}")) %> + <% end %>