<%= link_to import_path(@pending_import), class: "flex items-center justify-between p-4 group cursor-pointer", data: { turbo: false } do %>
diff --git a/config/locales/views/imports/en.yml b/config/locales/views/imports/en.yml
index a45792793..f6d5c1523 100644
--- a/config/locales/views/imports/en.yml
+++ b/config/locales/views/imports/en.yml
@@ -112,6 +112,20 @@ en:
instructions: Select continue to parse your CSV and move on to the clean step.
mint_import:
date_format_label: Date format
+ actual_import:
+ preconfigured_notice: We have pre-configured your Actual Budget import for you. Please proceed to the next step.
+ leave_empty: Leave empty
+ date_label: Date
+ date_format_label: Date format
+ amount_label: Amount
+ signage_convention_label: Signage convention
+ incomes_are_negative: Incomes are negative
+ incomes_are_positive: Incomes are positive
+ account_label: Account (optional)
+ name_label: Payee (optional)
+ category_label: Category (optional)
+ notes_label: Notes (optional)
+ apply_configuration: Apply configuration
rule_import:
description: Configure your rule import. Rules will be created or updated based
on the CSV data.
@@ -261,6 +275,7 @@ en:
trade_import: "Trade import"
account_import: "Account import"
mint_import: "Mint import"
+ actual_import: "Actual import"
qif_import: "QIF import"
category_import: "Category import"
rule_import: "Rule import"
@@ -293,6 +308,7 @@ en:
trade_import: "Trade"
account_import: "Account"
mint_import: "Mint"
+ actual_import: "Actual"
qif_import: "QIF"
category_import: "Category"
rule_import: "Rule"
@@ -321,6 +337,7 @@ en:
import_accounts: Import accounts
import_categories: Import categories
import_mint: Import from Mint
+ import_actual: Import from Actual Budget
import_portfolio: Import investments
import_rules: Import rules
import_transactions: Import transactions
diff --git a/docs/api/openapi.yaml b/docs/api/openapi.yaml
index ebc4c4425..a26146ef5 100644
--- a/docs/api/openapi.yaml
+++ b/docs/api/openapi.yaml
@@ -1802,6 +1802,7 @@ components:
- TradeImport
- AccountImport
- MintImport
+ - ActualImport
- CategoryImport
- RuleImport
- SureImport
@@ -1889,6 +1890,7 @@ components:
- TradeImport
- AccountImport
- MintImport
+ - ActualImport
- CategoryImport
- RuleImport
- SureImport
@@ -1941,6 +1943,7 @@ components:
- TradeImport
- AccountImport
- MintImport
+ - ActualImport
- CategoryImport
- RuleImport
- SureImport
@@ -4482,6 +4485,7 @@ paths:
- TradeImport
- AccountImport
- MintImport
+ - ActualImport
- CategoryImport
- RuleImport
- SureImport
@@ -4540,6 +4544,7 @@ paths:
- TradeImport
- AccountImport
- MintImport
+ - ActualImport
- CategoryImport
- RuleImport
- SureImport
@@ -4646,6 +4651,7 @@ paths:
- TradeImport
- AccountImport
- MintImport
+ - ActualImport
- CategoryImport
- RuleImport
- SureImport
@@ -4883,6 +4889,7 @@ paths:
- TradeImport
- AccountImport
- MintImport
+ - ActualImport
- CategoryImport
- RuleImport
- SureImport
@@ -4993,6 +5000,7 @@ paths:
- TradeImport
- AccountImport
- MintImport
+ - ActualImport
- CategoryImport
- RuleImport
- SureImport
diff --git a/spec/requests/api/v1/imports_spec.rb b/spec/requests/api/v1/imports_spec.rb
index a12cb7a8c..cd48a35ae 100644
--- a/spec/requests/api/v1/imports_spec.rb
+++ b/spec/requests/api/v1/imports_spec.rb
@@ -97,7 +97,7 @@ RSpec.describe 'API V1 Imports', type: :request do
schema: { type: :string, enum: %w[pending complete importing reverting revert_failed failed] }
parameter name: :type, in: :query, required: false,
description: 'Filter by import type',
- schema: { type: :string, enum: %w[TransactionImport TradeImport AccountImport MintImport CategoryImport RuleImport SureImport] }
+ schema: { type: :string, enum: %w[TransactionImport TradeImport AccountImport MintImport ActualImport CategoryImport RuleImport SureImport] }
response '200', 'imports listed' do
schema '$ref' => '#/components/schemas/ImportCollection'
@@ -138,7 +138,7 @@ RSpec.describe 'API V1 Imports', type: :request do
},
type: {
type: :string,
- enum: %w[TransactionImport TradeImport AccountImport MintImport CategoryImport RuleImport SureImport],
+ enum: %w[TransactionImport TradeImport AccountImport MintImport ActualImport CategoryImport RuleImport SureImport],
description: 'Import type (defaults to TransactionImport)'
},
account_id: {
@@ -388,7 +388,7 @@ RSpec.describe 'API V1 Imports', type: :request do
},
type: {
type: :string,
- enum: %w[TransactionImport TradeImport AccountImport MintImport CategoryImport RuleImport SureImport],
+ enum: %w[TransactionImport TradeImport AccountImport MintImport ActualImport CategoryImport RuleImport SureImport],
description: 'Import type to validate (defaults to TransactionImport)'
},
account_id: {
diff --git a/spec/swagger_helper.rb b/spec/swagger_helper.rb
index d27ad818f..ab8ee9783 100644
--- a/spec/swagger_helper.rb
+++ b/spec/swagger_helper.rb
@@ -999,7 +999,7 @@ RSpec.configure do |config|
type: :object,
required: %w[type valid content stats errors warnings],
properties: {
- type: { type: :string, enum: %w[TransactionImport TradeImport AccountImport MintImport CategoryImport RuleImport SureImport] },
+ type: { type: :string, enum: %w[TransactionImport TradeImport AccountImport MintImport ActualImport CategoryImport RuleImport SureImport] },
valid: { type: :boolean },
content: { '$ref' => '#/components/schemas/ImportPreflightContent' },
stats: { '$ref' => '#/components/schemas/ImportPreflightStats' },
@@ -1063,7 +1063,7 @@ RSpec.configure do |config|
required: %w[id type status created_at updated_at status_detail],
properties: {
id: { type: :string, format: :uuid },
- type: { type: :string, enum: %w[TransactionImport TradeImport AccountImport MintImport CategoryImport RuleImport SureImport] },
+ type: { type: :string, enum: %w[TransactionImport TradeImport AccountImport MintImport ActualImport CategoryImport RuleImport SureImport] },
status: { type: :string, enum: %w[pending complete importing reverting revert_failed failed] },
created_at: { type: :string, format: :'date-time' },
updated_at: { type: :string, format: :'date-time' },
@@ -1078,7 +1078,7 @@ RSpec.configure do |config|
required: %w[id type status created_at updated_at status_detail configuration stats],
properties: {
id: { type: :string, format: :uuid },
- type: { type: :string, enum: %w[TransactionImport TradeImport AccountImport MintImport CategoryImport RuleImport SureImport] },
+ type: { type: :string, enum: %w[TransactionImport TradeImport AccountImport MintImport ActualImport CategoryImport RuleImport SureImport] },
status: { type: :string, enum: %w[pending complete importing reverting revert_failed failed] },
created_at: { type: :string, format: :'date-time' },
updated_at: { type: :string, format: :'date-time' },
diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb
index 770b6256e..57f01828c 100644
--- a/test/application_system_test_case.rb
+++ b/test/application_system_test_case.rb
@@ -36,7 +36,40 @@ class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
driven_by :selenium_remote_chrome, screen_size: [ 1400, 1400 ]
else
- driven_by :selenium, using: ENV["CI"].present? ? :headless_chrome : ENV.fetch("E2E_BROWSER", :chrome).to_sym, screen_size: [ 1400, 1400 ]
+ requested_browser = ENV["E2E_BROWSER"].presence&.to_sym
+ local_browser = case requested_browser
+ when :headless_chrome then :chrome
+ when :headless_firefox then :firefox
+ else requested_browser || :chrome
+ end
+
+ headless = ENV["CI"].present? || requested_browser.in?([ :headless_chrome, :headless_firefox ]) || ENV["DISPLAY"].blank?
+
+ Capybara.register_driver :selenium_local_chrome do |app|
+ options = case local_browser
+ when :firefox
+ Selenium::WebDriver::Firefox::Options.new.tap do |firefox_options|
+ firefox_options.add_argument("--width=1400")
+ firefox_options.add_argument("--height=1400")
+ firefox_options.add_argument("-headless") if headless
+ end
+ else
+ Selenium::WebDriver::Chrome::Options.new.tap do |chrome_options|
+ chrome_options.add_argument("--window-size=1400,1400")
+ chrome_options.add_argument("--headless=new") if headless
+ chrome_options.add_argument("--no-sandbox")
+ chrome_options.add_argument("--disable-dev-shm-usage")
+ end
+ end
+
+ Capybara::Selenium::Driver.new(
+ app,
+ browser: local_browser,
+ options: options
+ )
+ end
+
+ driven_by :selenium_local_chrome, screen_size: [ 1400, 1400 ]
end
def teardown
diff --git a/test/controllers/api/v1/imports_controller_test.rb b/test/controllers/api/v1/imports_controller_test.rb
index d414e7e1b..dcf83ab44 100644
--- a/test/controllers/api/v1/imports_controller_test.rb
+++ b/test/controllers/api/v1/imports_controller_test.rb
@@ -988,6 +988,56 @@ class Api::V1::ImportsControllerTest < ActionDispatch::IntegrationTest
assert_includes data["required_headers"], "Amount"
end
+ test "should apply Actual defaults before preflight header validation" do
+ actual_content = [
+ "Account,Date,Payee,Notes,Category_Group,Category,Amount,Split_Amount,Cleared",
+ "Checking Account,2024-01-01,Coffee Shop,Morning coffee,Food,Coffee,-4.25,0,Cleared"
+ ].join("\n")
+
+ assert_no_difference("Import.count") do
+ post preflight_api_v1_imports_url,
+ params: {
+ type: "ActualImport",
+ raw_file_content: actual_content
+ },
+ headers: api_headers(@read_only_api_key)
+ end
+
+ assert_response :success
+ data = JSON.parse(response.body)["data"]
+
+ assert_equal "ActualImport", data["type"]
+ assert_equal true, data["valid"]
+ assert_empty data["missing_required_headers"]
+ assert_includes data["required_headers"], "Date"
+ assert_includes data["required_headers"], "Amount"
+ end
+
+ test "should not overwrite explicit Actual preflight column mappings with defaults" do
+ actual_content = [
+ "Booked On,Value,Payee",
+ "2024-01-01,-4.25,Coffee Shop"
+ ].join("\n")
+
+ assert_no_difference("Import.count") do
+ post preflight_api_v1_imports_url,
+ params: {
+ type: "ActualImport",
+ raw_file_content: actual_content,
+ date_col_label: "Booked On",
+ amount_col_label: "Value"
+ },
+ headers: api_headers(@read_only_api_key)
+ end
+
+ assert_response :success
+ data = JSON.parse(response.body)["data"]
+
+ assert_equal true, data["valid"]
+ assert_equal [ "Booked On", "Value" ], data["required_headers"]
+ assert_empty data["missing_required_headers"]
+ end
+
test "should not overwrite explicit Mint preflight column mappings with defaults" do
mint_content = [
"Posted On,Value,Description",
diff --git a/test/controllers/imports_controller_test.rb b/test/controllers/imports_controller_test.rb
index dbea78d2d..eea32693a 100644
--- a/test/controllers/imports_controller_test.rb
+++ b/test/controllers/imports_controller_test.rb
@@ -3,6 +3,7 @@ require "test_helper"
class ImportsControllerTest < ActionDispatch::IntegrationTest
setup do
sign_in @user = users(:family_admin)
+ ensure_tailwind_build
end
test "gets index" do
@@ -33,6 +34,7 @@ class ImportsControllerTest < ActionDispatch::IntegrationTest
assert_select "button", text: "Import transactions", count: 0
assert_select "button", text: "Import investments", count: 0
assert_select "button", text: "Import from Mint", count: 1
+ assert_select "button", text: "Import from Actual Budget", count: 1
assert_select "button", text: "Import from Quicken (QIF)", count: 1
assert_select "span", text: "Import accounts first to unlock this option.", count: 2
assert_select "div[aria-disabled=true]", count: 3
diff --git a/test/fixtures/files/imports/actual.csv b/test/fixtures/files/imports/actual.csv
new file mode 100644
index 000000000..03c504d5d
--- /dev/null
+++ b/test/fixtures/files/imports/actual.csv
@@ -0,0 +1,5 @@
+Account,Date,Payee,Notes,Category_Group,Category,Amount,Split_Amount,Cleared
+Checking Account,2024-01-01,Landlord,January rent,Housing,Rent,-1500.00,0,Reconciled
+Credit Card,2024-01-02,Coffee Shop,Morning coffee,Food,Coffee,-4.25,0,Cleared
+Checking Account,2024-01-05,Employer,Monthly salary,Income,Paycheck,2500.00,0,Reconciled
+Checking Account,2024-01-06,Internal Transfer,Move to savings,,Transfer,-250.00,0,Not cleared
diff --git a/test/models/actual_import_test.rb b/test/models/actual_import_test.rb
new file mode 100644
index 000000000..7cc0b3470
--- /dev/null
+++ b/test/models/actual_import_test.rb
@@ -0,0 +1,53 @@
+require "test_helper"
+
+class ActualImportTest < ActiveSupport::TestCase
+ setup do
+ @family = families(:dylan_family)
+ end
+
+ test "default column mappings are applied after create" do
+ import = @family.imports.create!(type: "ActualImport")
+
+ ActualImport.default_column_mappings.each do |attribute, value|
+ assert_equal value, import.public_send(attribute)
+ end
+ end
+
+ test "generated rows preserve stable source row numbers" do
+ import = @family.imports.create!(
+ type: "ActualImport",
+ raw_file_str: file_fixture("imports/actual.csv").read,
+ col_sep: ","
+ )
+
+ import.generate_rows_from_csv
+
+ assert_equal (1..4).to_a, import.rows.order(:source_row_number).pluck(:source_row_number)
+ end
+
+ test "generated rows combine category group and category" do
+ import = @family.imports.create!(
+ type: "ActualImport",
+ raw_file_str: file_fixture("imports/actual.csv").read,
+ col_sep: ","
+ )
+
+ import.generate_rows_from_csv
+
+ assert_equal "Food: Coffee", import.rows.order(:source_row_number).second.category
+ assert_equal "Income: Paycheck", import.rows.order(:source_row_number).third.category
+ assert_equal "Transfer", import.rows.order(:source_row_number).fourth.category
+ end
+
+ test "generated rows fall back to category group when category is blank" do
+ import = @family.imports.create!(
+ type: "ActualImport",
+ raw_file_str: file_fixture("imports/actual.csv").read.sub("Housing,Rent", "Housing,"),
+ col_sep: ","
+ )
+
+ import.generate_rows_from_csv
+
+ assert_equal "Housing", import.rows.order(:source_row_number).first.category
+ end
+end
diff --git a/test/system/imports_test.rb b/test/system/imports_test.rb
index 15b146e24..e5667817e 100644
--- a/test/system/imports_test.rb
+++ b/test/system/imports_test.rb
@@ -22,9 +22,7 @@ class ImportsTest < ApplicationSystemTestCase
fill_in "import[raw_file_str]", with: file_fixture("imports/transactions.csv").read
- within "form" do
- click_on "Upload CSV"
- end
+ find_field("import[raw_file_str]").find(:xpath, "./ancestor::form").click_button("Upload CSV")
select "Date", from: "import[date_col_label]"
select "YYYY-MM-DD", from: "import[date_format]"
@@ -73,9 +71,7 @@ class ImportsTest < ApplicationSystemTestCase
fill_in "import[raw_file_str]", with: file_fixture("imports/trades.csv").read
- within "form" do
- click_on "Upload CSV"
- end
+ find_field("import[raw_file_str]").find(:xpath, "./ancestor::form").click_button("Upload CSV")
select "date", from: "import[date_col_label]"
select "YYYY-MM-DD", from: "import[date_format]"
@@ -116,9 +112,7 @@ class ImportsTest < ApplicationSystemTestCase
fill_in "import[raw_file_str]", with: file_fixture("imports/accounts.csv").read
- within "form" do
- click_on "Upload CSV"
- end
+ find_field("import[raw_file_str]").find(:xpath, "./ancestor::form").click_button("Upload CSV")
select "type", from: "import[entity_type_col_label]"
select "name", from: "import[name_col_label]"
@@ -166,9 +160,7 @@ class ImportsTest < ApplicationSystemTestCase
fill_in "import[raw_file_str]", with: file_fixture("imports/mint.csv").read
- within "form" do
- click_on "Upload CSV"
- end
+ find_field("import[raw_file_str]").find(:xpath, "./ancestor::form").click_button("Upload CSV")
click_on "Apply configuration"
@@ -195,4 +187,42 @@ class ImportsTest < ApplicationSystemTestCase
click_on "Back to dashboard"
end
+
+ test "actual import" do
+ visit new_import_path
+
+ # Pending CSV-style imports default the dialog to the Raw Data tab; Actual lives under Financial Tools.
+ click_on "Financial Tools"
+ click_on "Import from Actual Budget"
+
+ within_testid("import-tabs") do
+ click_on "Copy & Paste"
+ end
+
+ fill_in "import[raw_file_str]", with: file_fixture("imports/actual.csv").read
+
+ find_field("import[raw_file_str]").find(:xpath, "./ancestor::form").click_button("Upload CSV")
+
+ click_on "Apply configuration"
+
+ click_on "Next step"
+
+ assert_selector "h1", text: "Assign your categories"
+ click_on "Next"
+
+ assert_selector "h1", text: "Assign your accounts"
+ click_on "Next"
+
+ click_on "Publish import"
+
+ assert_text "Import in progress"
+
+ perform_enqueued_jobs
+
+ click_on "Check status"
+
+ assert_text "Import successful"
+
+ click_on "Back to dashboard"
+ end
end
From b73da38f49f4ed9433873e7e013809ebc694c2f4 Mon Sep 17 00:00:00 2001
From: "Sure Admin (bot)"
Date: Mon, 18 May 2026 19:10:01 +0200
Subject: [PATCH 04/33] fix(pwa): serve manifest for html accept headers
(#1828)
* fix(pwa): serve manifest for html accept headers
* style: add trailing newline to pwa controller
---
app/controllers/pwa_controller.rb | 15 +++++++++++++++
config/routes.rb | 4 ++--
test/controllers/pwa_controller_test.rb | 11 +++++++++++
3 files changed, 28 insertions(+), 2 deletions(-)
create mode 100644 app/controllers/pwa_controller.rb
create mode 100644 test/controllers/pwa_controller_test.rb
diff --git a/app/controllers/pwa_controller.rb b/app/controllers/pwa_controller.rb
new file mode 100644
index 000000000..dd3f1a65f
--- /dev/null
+++ b/app/controllers/pwa_controller.rb
@@ -0,0 +1,15 @@
+class PwaController < ApplicationController
+ skip_authentication
+
+ def manifest
+ # Force JSON format to avoid MissingTemplate errors when browsers request /manifest
+ # with HTML Accept headers (Safari Mobile does this for PWA manifest discovery)
+ render "pwa/manifest", content_type: "application/manifest+json"
+ end
+
+ def service_worker
+ # Explicitly render JS template to avoid format negotiation issues
+ render "pwa/service-worker", content_type: "application/javascript"
+ end
+ # Renders app/views/pwa/service-worker.js with content type application/javascript
+end
diff --git a/config/routes.rb b/config/routes.rb
index 9ff1b4a79..e7c5af0a7 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -641,8 +641,8 @@ Rails.application.routes.draw do
get "up" => "rails/health#show", as: :rails_health_check
# Render dynamic PWA files from app/views/pwa/*
- get "service-worker" => "rails/pwa#service_worker", as: :pwa_service_worker
- get "manifest" => "rails/pwa#manifest", as: :pwa_manifest
+ get "service-worker" => "pwa#service_worker", as: :pwa_service_worker, defaults: { format: :js }
+ get "manifest" => "pwa#manifest", as: :pwa_manifest, defaults: { format: :json }
get "imports/:import_id/upload/sample_csv", to: "import/uploads#sample_csv", as: :import_upload_sample_csv
diff --git a/test/controllers/pwa_controller_test.rb b/test/controllers/pwa_controller_test.rb
new file mode 100644
index 000000000..b7b18ce5a
--- /dev/null
+++ b/test/controllers/pwa_controller_test.rb
@@ -0,0 +1,11 @@
+require "test_helper"
+
+class PwaControllerTest < ActionDispatch::IntegrationTest
+ test "manifest responds successfully for html accept headers" do
+ get "/manifest", headers: { "Accept" => "text/html" }
+
+ assert_response :success
+ assert_equal "application/manifest+json", response.media_type
+ assert_includes response.body, '"start_url": "/"'
+ end
+end
From 5249842c76a257943dcdb8c2b625dfeea17032dc Mon Sep 17 00:00:00 2001
From: Guillem Arias Fauste
Date: Mon, 18 May 2026 20:07:55 +0200
Subject: [PATCH 05/33] feat: beta features toggle + Beta pill primitive
(#1829)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat: beta features toggle + Beta pill primitive
Adds the infrastructure for self-service beta opt-in. No call sites yet:
this PR is meant to land first so feature PRs (Goals, etc.) can ship
behind the gate incrementally.
User opts in via a single toggle at the bottom of Settings → Preferences.
The flag persists in the existing `users.preferences` JSONB column under
`beta_features_enabled` — same shape as `dashboard_two_column` and
`show_split_grouped`, so no migration is needed.
Controllers gate a beta feature by adding `before_action
:require_beta_features!` from the new `BetaGateable` concern (included in
ApplicationController). Views use the `beta_features_enabled?` helper to
hide / show nav items, banners, etc. Logged-out callers always return
false.
Ships `DS::BetaPill`, a small inline marker for tagging features as
Beta / Canary in nav, headers, and lists. Five tones (violet by default,
indigo, fuchsia, amber, gray) map to existing Sure color tokens — no raw
hex. Three styles (soft / filled / outline) and two sizes (sm / md) cover
the surfaces in the design handoff. The `dot_only:` mode renders just
the colored dot for use on a collapsed sidebar.
* review: rename to DS::Pill, fix CR/Codex nits, add tests
CodeRabbit + Codex review feedback:
- Rename DS::BetaPill → DS::Pill. The component was already generic in
shape (tones, styles, sizes); the name was misleading scope. "Beta"
becomes the default label (still i18n-driven). Goals' StatusPill can
later refactor onto this primitive without a third pill.
- Localize the default pill label via i18n (`ds.pill.default_label`)
instead of hard-coding English.
- Add role="img" to the dot-only span so the aria-label is consistently
exposed to assistive tech.
- Wrap the Preferences toggle row in
<% end %>
<% end %>
+
+<%# Beta features toggle — visible to all users, not just admins. Lives at the
+ bottom of Preferences as a standalone card (no section header) so the toggle
+ row is the entire surface. Posts directly to settings#preferences#update via
+ the Settings::PreferencesController, matching the auto-submit pattern used
+ on the Appearance page. %>
+
+ <%= form_with url: settings_preferences_path, method: :patch,
+ data: { controller: "auto-submit-form" } do |f| %>
+ <%# Wrapping the row in
diff --git a/config/locales/views/beta/en.yml b/config/locales/views/beta/en.yml
new file mode 100644
index 000000000..bb9bcb8d3
--- /dev/null
+++ b/config/locales/views/beta/en.yml
@@ -0,0 +1,4 @@
+---
+en:
+ beta:
+ not_enabled: This feature is in beta. Enable beta features in Settings → Preferences to try it.
diff --git a/config/locales/views/components/en.yml b/config/locales/views/components/en.yml
index 1f3bff829..fcfa566bd 100644
--- a/config/locales/views/components/en.yml
+++ b/config/locales/views/components/en.yml
@@ -17,6 +17,9 @@ en:
warning: Warning
error: Error
destructive: Error
+ pill:
+ aria_label: "%{label}"
+ default_label: Beta
dialog:
close: Close
provider_sync_summary:
diff --git a/config/locales/views/settings/en.yml b/config/locales/views/settings/en.yml
index 85a25e193..2c4435988 100644
--- a/config/locales/views/settings/en.yml
+++ b/config/locales/views/settings/en.yml
@@ -153,6 +153,9 @@ en:
sharing_default_label: Default sharing for new accounts
sharing_shared: Share with all members
sharing_private: Keep private by default
+ beta:
+ title: Enable beta features
+ description: Opt in to in-progress features tagged beta or canary.
profiles:
destroy:
cannot_remove_self: You cannot remove yourself from the account.
diff --git a/config/routes.rb b/config/routes.rb
index e7c5af0a7..c88e38c53 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -236,7 +236,7 @@ Rails.application.routes.draw do
namespace :settings do
resource :profile, only: [ :show, :destroy ]
- resource :preferences, only: :show
+ resource :preferences, only: %i[show update]
resource :appearance, only: %i[show update]
resource :debug, only: :show
resource :hosting, only: %i[show update] do
diff --git a/docs/llm-guides/gating-a-beta-feature.md b/docs/llm-guides/gating-a-beta-feature.md
new file mode 100644
index 000000000..dc6c90979
--- /dev/null
+++ b/docs/llm-guides/gating-a-beta-feature.md
@@ -0,0 +1,128 @@
+# Gating a beta feature
+
+Sure ships beta features behind a single per-user toggle. Users opt in via Settings → Preferences. Opted-in users see your feature; everyone else doesn't. This guide is for hooking a new feature into the gate.
+
+The intent is to ship in-progress work without blocking smaller PRs on a "feels finished" bar. You gate the entry points (routes, nav, anything that links into your feature) and iterate behind them. Once stable, you remove the gate in a small follow-up PR.
+
+## How the gate works
+
+The state lives on `users.preferences["beta_features_enabled"]`, a key inside the existing JSONB column. It defaults to `false`. Reading it goes through `User#beta_features_enabled?`.
+
+`ApplicationController` includes the `BetaGateable` concern, which exposes two methods to every controller:
+
+- `beta_features_enabled?`. Returns a boolean. `false` for logged-out callers.
+- `require_beta_features!`. A `before_action` helper. Redirects non-beta users to `/` with a flash that points them at Settings → Preferences.
+
+The concern also registers `beta_features_enabled?` as a helper method, so views can call it directly.
+
+Key files:
+
+- `app/controllers/concerns/beta_gateable.rb`. The concern.
+- `app/models/user.rb`. The `beta_features_enabled?` predicate.
+- `app/views/settings/preferences/show.html.erb`. The toggle UI users see.
+- `app/components/DS/pill.rb`. The `Beta` / `Canary` marker pill.
+- `config/locales/views/beta/en.yml`. The redirect flash copy.
+
+## Gating a controller
+
+Add `require_beta_features!` as a `before_action`. That's it.
+
+```ruby
+class GoalsController < ApplicationController
+ before_action :require_beta_features!
+end
+```
+
+Routes stay defined; the gate runs per-request. Non-beta users hitting `/goals` get redirected with a flash. Beta users pass through.
+
+If only some actions are gated, scope the `before_action`:
+
+```ruby
+class TransactionsController < ApplicationController
+ before_action :require_beta_features!, only: %i[forecast scenarios]
+end
+```
+
+## Gating a view
+
+Wrap the relevant fragment in the helper:
+
+```erb
+<% if beta_features_enabled? %>
+
+ <%= link_to t(".nav.goals"), goals_path %>
+
+<% end %>
+```
+
+Same pattern works for dashboard widgets, scoreboard cards, anything that surfaces beta data alongside non-beta data. The helper resolves on every request and reflects the current user's preference.
+
+## Marking the feature in the UI
+
+When a beta surface renders for an opted-in user, mark it. The pill component lives in the design system:
+
+```erb
+<%# Next to a page header. The md size pairs with h1 / h2. %>
+<%= render DS::Pill.new(label: "Beta", size: :md) %>
+
+<%# Next to a sidebar nav label or section title. sm is the default. %>
+<%= render DS::Pill.new(label: "Beta") %>
+
+<%# Same shape, fuchsia tone, for canary / experimental surfaces. %>
+<%= render DS::Pill.new(label: "Canary", tone: :fuchsia) %>
+
+<%# Sidebar icon rail has no room for a label. The dot-only mode keeps the tone semantics without the text. %>
+<%= render DS::Pill.new(tone: :violet, dot_only: true, title: "Beta") %>
+```
+
+Default tone is violet. Tones available: `violet`, `indigo`, `fuchsia`, `amber`, `gray`. Styles: `soft` (default), `filled`, `outline`. Sizes: `sm` (default), `md`. The Lookbook preview at `/design-system` (look for `PillComponentPreview#default`) flips every option, so you can see what your call site renders without a round trip to Rails.
+
+## Tests
+
+Gated controllers should test both states. The pattern:
+
+```ruby
+class GoalsControllerTest < ActionDispatch::IntegrationTest
+ setup do
+ sign_in @user = users(:family_admin)
+ end
+
+ test "redirects users without beta access" do
+ @user.update!(preferences: (@user.preferences || {}).merge("beta_features_enabled" => false))
+
+ get goals_url
+
+ assert_redirected_to root_path
+ assert_match(/beta/i, flash[:alert])
+ end
+
+ test "renders for users with beta access" do
+ @user.update!(preferences: (@user.preferences || {}).merge("beta_features_enabled" => true))
+
+ get goals_url
+
+ assert_response :success
+ end
+end
+```
+
+If you write a system test, flip the preference in setup the same way before the visit.
+
+## Removing the gate when the feature ships GA
+
+When a feature moves from beta to general availability, removing the gate is a small mechanical PR:
+
+1. Drop the `before_action :require_beta_features!` line from the controller.
+2. Unwrap the `if beta_features_enabled?` blocks in views.
+3. Drop the `DS::Pill` markers from headers, nav, and section titles.
+4. Delete the controller / view tests that exercise the redirect.
+
+Grep for `require_beta_features!` and `beta_features_enabled?` near your feature to confirm nothing's left behind.
+
+## Notes
+
+The flag is per-user, not per-family. Two users in the same family can see different versions of the product if one opts in and the other doesn't. That's intentional. Data is family-scoped, but visibility is a personal preference. If you write a feature that creates family-shared data (goals, budgets, etc.), the data persists when a user toggles beta off. The UI just disappears from their view while still showing up for opted-in family members.
+
+The gate does nothing for background jobs. If your feature has a Sidekiq cron job, it runs regardless of who has beta enabled. That's usually correct (data should keep flowing), but if the job sends notifications or emails, gate those at the send site too.
+
+The redirect target is `/`. If you want gated controllers to land somewhere else (a docs page, an opt-in nudge), override `require_beta_features!` in the controller, or write a thin custom `before_action` that calls `beta_features_enabled?` directly.
diff --git a/test/components/previews/pill_component_preview.rb b/test/components/previews/pill_component_preview.rb
new file mode 100644
index 000000000..05c1258a0
--- /dev/null
+++ b/test/components/previews/pill_component_preview.rb
@@ -0,0 +1,26 @@
+class PillComponentPreview < ViewComponent::Preview
+ # @param tone select ["violet", "indigo", "fuchsia", "amber", "gray"]
+ # @param style select ["soft", "filled", "outline"]
+ # @param size select ["sm", "md"]
+ # @param label text
+ # @param show_dot toggle
+ # @param dot_only toggle
+ def default(tone: "violet", style: "soft", size: "sm", label: "Beta", show_dot: true, dot_only: false)
+ render DS::Pill.new(
+ label: label,
+ tone: tone.to_sym,
+ style: style.to_sym,
+ size: size.to_sym,
+ show_dot: show_dot,
+ dot_only: dot_only
+ )
+ end
+
+ def canary
+ render DS::Pill.new(label: "Canary", tone: :fuchsia)
+ end
+
+ def dot_only_collapsed_sidebar
+ render DS::Pill.new(dot_only: true, tone: :violet)
+ end
+end
diff --git a/test/controllers/settings/preferences_controller_test.rb b/test/controllers/settings/preferences_controller_test.rb
index d2f5142fc..8f300d914 100644
--- a/test/controllers/settings/preferences_controller_test.rb
+++ b/test/controllers/settings/preferences_controller_test.rb
@@ -21,4 +21,33 @@ class Settings::PreferencesControllerTest < ActionDispatch::IntegrationTest
assert_includes response.body, "your group"
assert_select "select[name='user[family_attributes][currency]']", count: 0
end
+
+ test "renders beta features toggle for non-admin users too" do
+ sign_in users(:family_member)
+ get settings_preferences_url
+
+ assert_response :success
+ assert_includes response.body, "Enable beta features"
+ end
+
+ test "update toggles beta_features_enabled on" do
+ user = users(:family_admin)
+ assert_not user.beta_features_enabled?
+
+ patch settings_preferences_url, params: { user: { beta_features_enabled: "1" } }
+
+ assert_redirected_to settings_preferences_url
+ assert user.reload.beta_features_enabled?
+ end
+
+ test "update toggles beta_features_enabled off" do
+ user = users(:family_admin)
+ user.update!(preferences: (user.preferences || {}).merge("beta_features_enabled" => true))
+ assert user.beta_features_enabled?
+
+ patch settings_preferences_url, params: { user: { beta_features_enabled: "0" } }
+
+ assert_redirected_to settings_preferences_url
+ assert_not user.reload.beta_features_enabled?
+ end
end
diff --git a/test/models/user_test.rb b/test/models/user_test.rb
index 9912e5a9e..600cbb72f 100644
--- a/test/models/user_test.rb
+++ b/test/models/user_test.rb
@@ -660,6 +660,23 @@ class UserTest < ActiveSupport::TestCase
assert_equal "custom_role", User.role_for_new_family_creator(fallback_role: "custom_role")
end
+ # Beta features preference tests
+ test "beta_features_enabled? defaults to false" do
+ @user.update!(preferences: {})
+ assert_not @user.beta_features_enabled?
+ end
+
+ test "beta_features_enabled? true only when explicitly true" do
+ @user.update!(preferences: { "beta_features_enabled" => true })
+ assert @user.beta_features_enabled?
+
+ @user.update!(preferences: { "beta_features_enabled" => false })
+ assert_not @user.beta_features_enabled?
+
+ @user.update!(preferences: { "beta_features_enabled" => "yes" })
+ assert_not @user.beta_features_enabled?, "truthy non-boolean should not enable"
+ end
+
# ActiveStorage attachment cleanup tests
test "purging a user removes attached profile image" do
user = users(:family_admin)
diff --git a/workers/preview/src/index.ts b/workers/preview/src/index.ts
index 872cf1a99..5e60a8757 100644
--- a/workers/preview/src/index.ts
+++ b/workers/preview/src/index.ts
@@ -62,7 +62,7 @@ const WAITING_MESSAGES: Record = {
export class RailsContainer extends Container {
defaultPort = 3000;
- pingEndpoint = "container/up";
+ pingEndpoint = "localhost/up";
entrypoint = ["/rails/bin/preview-entrypoint", "bundle", "exec", "puma", "-C", "config/puma.rb"];
envVars = {
RAILS_ENV: "production",
diff --git a/workers/preview/wrangler.toml b/workers/preview/wrangler.toml
index e180a62b7..17e95b899 100644
--- a/workers/preview/wrangler.toml
+++ b/workers/preview/wrangler.toml
@@ -17,6 +17,7 @@ enabled = true
[[containers]]
class_name = "RailsContainer"
image = "../../Dockerfile.preview"
+instance_type = "basic"
max_instances = 1
# Durable Object binding for the container
From 7411db568998fb503c9e75bff17d9269d3e6d3f0 Mon Sep 17 00:00:00 2001
From: Brendon Scheiber <62311356+brandonvers@users.noreply.github.com>
Date: Mon, 18 May 2026 20:49:28 +0200
Subject: [PATCH 06/33] feat(i18n): add Hungarian translations for strings
extracted in #1806 (#1817)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* add missing Hungarian translations for newly extracted strings
Replace hard-coded UI strings with I18n lookups across controllers, models and views (breadcrumbs, dashboard, reports, settings, transactions, balance sheet, MFA status). Update models to use translations for category defaults, account/display names, classification group and period labels; remove a few hardcoded display_name methods. Add and update numerous locale files (English and extensive Hungarian translations, plus model/view/doorkeeper entries) to provide the required keys. These changes centralize copy for localization and prepare the app for Hungarian/English UI text.
* Pluralize account type labels; tidy Crypto model
Update English locale account type labels to use plural forms for consistency (Investment(s), Properties, Vehicles, Other Assets, Credit Cards, Loans, Other Liabilities). Also remove an extra blank line in app/models/crypto.rb to tidy up formatting.
* Back to singular
* fix(i18n): separate singular and group account labels
* Update _accountable_group.html.erb
* Use I18n plural names for account types
Change Accountable#display_name to look up pluralized account type names via I18n (accounts.types_plural.) with a fallback to the legacy display logic. Add legacy_display_name helper to preserve previous behavior (singular for Depository and Crypto, pluralized otherwise). Add corresponding types_plural entries in English and Hungarian locale files for various account types.
---------
Co-authored-by: Juan José Mata
Co-authored-by: sure-admin
---
app/controllers/budgets_controller.rb | 1 +
app/controllers/concerns/breadcrumbable.rb | 2 +-
.../family_merchants_controller.rb | 2 +-
app/controllers/pages_controller.rb | 4 +-
app/controllers/reports_controller.rb | 2 +-
.../settings/ai_prompts_controller.rb | 4 +-
.../settings/api_keys_controller.rb | 4 +-
app/controllers/settings/guides_controller.rb | 4 +-
.../settings/hostings_controller.rb | 4 +-
.../settings/llm_usages_controller.rb | 4 +-
.../settings/profiles_controller.rb | 4 +-
.../settings/providers_controller.rb | 4 +-
.../settings/securities_controller.rb | 4 +-
app/controllers/transactions_controller.rb | 2 +
.../controllers/bulk_select_controller.js | 6 +-
.../balance_sheet/classification_group.rb | 4 +-
app/models/category.rb | 44 +--
app/models/concerns/accountable.rb | 27 +-
app/models/crypto.rb | 4 -
app/models/depository.rb | 4 -
app/models/period.rb | 16 +-
app/views/accounts/_account_type.html.erb | 2 +-
.../accounts/_accountable_group.html.erb | 2 +-
.../pages/dashboard/_balance_sheet.html.erb | 4 +-
app/views/settings/securities/show.html.erb | 8 +-
app/views/transactions/_list.html.erb | 4 +-
.../transactions/bulk_updates/new.html.erb | 22 +-
app/views/transactions/new.html.erb | 2 +-
config/locales/breadcrumbs/en.yml | 13 +
config/locales/breadcrumbs/hu.yml | 13 +
config/locales/doorkeeper.hu.yml | 3 +
config/locales/models/account/hu.yml | 2 +-
.../locales/models/account_statement/hu.yml | 30 ++
config/locales/models/api_key/hu.yml | 7 +
config/locales/models/brex_item/hu.yml | 14 +
config/locales/models/category/en.yml | 22 ++
config/locales/models/category/hu.yml | 22 ++
config/locales/models/category_import/hu.yml | 8 +
config/locales/models/import/hu.yml | 1 +
.../locales/models/indexa_capital_item/hu.yml | 7 +
config/locales/models/period/en.yml | 54 ++++
config/locales/models/period/hu.yml | 54 ++++
config/locales/models/plaid_account/hu.yml | 7 +
.../models/recurring_transaction/hu.yml | 7 +
config/locales/models/rule/hu.yml | 9 +
config/locales/models/rule_import/hu.yml | 9 +
.../locales/models/simplefin_account/hu.yml | 7 +
config/locales/models/sophtron_account/hu.yml | 7 +
config/locales/models/sso_provider/hu.yml | 12 +
config/locales/models/transfer/hu.yml | 4 +
.../locales/views/account_statements/hu.yml | 116 ++++++++
config/locales/views/accounts/en.yml | 10 +
config/locales/views/accounts/hu.yml | 37 ++-
.../locales/views/admin/sso_providers/hu.yml | 21 ++
config/locales/views/brex_items/hu.yml | 277 ++++++++++++++++++
config/locales/views/budgets/hu.yml | 52 ++++
config/locales/views/categories/hu.yml | 17 ++
config/locales/views/chats/hu.yml | 38 +++
config/locales/views/components/hu.yml | 19 ++
config/locales/views/credit_cards/hu.yml | 1 +
.../locales/views/enable_banking_items/hu.yml | 56 ++++
config/locales/views/family_exports/hu.yml | 12 +
config/locales/views/holdings/hu.yml | 2 +
config/locales/views/ibkr_items/hu.yml | 92 ++++++
.../views/impersonation_sessions/hu.yml | 10 +
config/locales/views/imports/hu.yml | 162 +++++++++-
.../locales/views/indexa_capital_items/hu.yml | 4 +-
config/locales/views/investments/hu.yml | 69 +++++
config/locales/views/invite_codes/hu.yml | 4 +
config/locales/views/kraken_items/hu.yml | 85 ++++++
config/locales/views/layout/hu.yml | 4 +
config/locales/views/loans/hu.yml | 12 +
config/locales/views/lunchflow_items/hu.yml | 27 +-
config/locales/views/merchants/hu.yml | 3 +
config/locales/views/mercury_items/hu.yml | 34 ++-
config/locales/views/messages/hu.yml | 6 +
config/locales/views/oidc_accounts/hu.yml | 8 +
config/locales/views/other_assets/hu.yml | 6 +-
config/locales/views/pages/en.yml | 7 +
config/locales/views/pages/hu.yml | 37 ++-
.../views/pending_duplicate_merges/hu.yml | 7 +
config/locales/views/plaid_items/hu.yml | 5 +
config/locales/views/properties/hu.yml | 57 ++++
.../views/recurring_transactions/hu.yml | 4 +
config/locales/views/reports/hu.yml | 26 +-
config/locales/views/rules/hu.yml | 63 ++++
config/locales/views/sessions/hu.yml | 2 +
config/locales/views/settings/api_keys/hu.yml | 50 +++-
config/locales/views/settings/hostings/hu.yml | 9 +
config/locales/views/settings/hu.yml | 244 +++++++++++++++
.../locales/views/settings/securities/en.yml | 4 +
.../locales/views/settings/securities/hu.yml | 4 +
config/locales/views/shared/hu.yml | 15 +
config/locales/views/simplefin_items/hu.yml | 27 ++
config/locales/views/snaptrade_items/hu.yml | 5 +
config/locales/views/sophtron_items/hu.yml | 72 ++++-
config/locales/views/subscriptions/hu.yml | 10 +
config/locales/views/tag/deletions/hu.yml | 1 +
config/locales/views/tags/hu.yml | 3 +
config/locales/views/transactions/en.yml | 15 +
config/locales/views/transactions/hu.yml | 51 ++++
config/locales/views/transfer_matches/hu.yml | 17 ++
config/locales/views/transfers/hu.yml | 9 +
config/locales/views/users/hu.yml | 7 +
config/locales/views/valuations/hu.yml | 30 ++
config/locales/views/vehicles/hu.yml | 10 +
test/models/account_test.rb | 7 +
test/models/balance_sheet_test.rb | 10 +-
test/system/accounts_test.rb | 4 +-
109 files changed, 2379 insertions(+), 123 deletions(-)
create mode 100644 config/locales/models/account_statement/hu.yml
create mode 100644 config/locales/models/api_key/hu.yml
create mode 100644 config/locales/models/brex_item/hu.yml
create mode 100644 config/locales/models/category_import/hu.yml
create mode 100644 config/locales/models/indexa_capital_item/hu.yml
create mode 100644 config/locales/models/period/en.yml
create mode 100644 config/locales/models/period/hu.yml
create mode 100644 config/locales/models/plaid_account/hu.yml
create mode 100644 config/locales/models/recurring_transaction/hu.yml
create mode 100644 config/locales/models/rule/hu.yml
create mode 100644 config/locales/models/rule_import/hu.yml
create mode 100644 config/locales/models/simplefin_account/hu.yml
create mode 100644 config/locales/models/sophtron_account/hu.yml
create mode 100644 config/locales/models/sso_provider/hu.yml
create mode 100644 config/locales/views/account_statements/hu.yml
create mode 100644 config/locales/views/brex_items/hu.yml
create mode 100644 config/locales/views/ibkr_items/hu.yml
create mode 100644 config/locales/views/kraken_items/hu.yml
create mode 100644 config/locales/views/messages/hu.yml
diff --git a/app/controllers/budgets_controller.rb b/app/controllers/budgets_controller.rb
index db04a4720..af4178411 100644
--- a/app/controllers/budgets_controller.rb
+++ b/app/controllers/budgets_controller.rb
@@ -7,6 +7,7 @@ class BudgetsController < ApplicationController
def show
@source_budget = @budget.most_recent_initialized_budget unless @budget.initialized?
+ @breadcrumbs = [ [ t("breadcrumbs.home"), root_path ], [ t("breadcrumbs.budgets"), nil ] ]
end
def edit
diff --git a/app/controllers/concerns/breadcrumbable.rb b/app/controllers/concerns/breadcrumbable.rb
index 38ebd8895..23410cb70 100644
--- a/app/controllers/concerns/breadcrumbable.rb
+++ b/app/controllers/concerns/breadcrumbable.rb
@@ -8,6 +8,6 @@ module Breadcrumbable
private
# The default, unless specific controller or action explicitly overrides
def set_breadcrumbs
- @breadcrumbs = [ [ "Home", root_path ], [ controller_name.titleize, nil ] ]
+ @breadcrumbs = [ [ t("breadcrumbs.home"), root_path ], [ t("breadcrumbs.#{controller_name}", default: controller_name.titleize), nil ] ]
end
end
diff --git a/app/controllers/family_merchants_controller.rb b/app/controllers/family_merchants_controller.rb
index 04e8fc15d..db77ee413 100644
--- a/app/controllers/family_merchants_controller.rb
+++ b/app/controllers/family_merchants_controller.rb
@@ -2,7 +2,7 @@ class FamilyMerchantsController < ApplicationController
before_action :set_merchant, only: %i[edit update destroy]
def index
- @breadcrumbs = [ [ "Home", root_path ], [ "Merchants", nil ] ]
+ @breadcrumbs = [ [ t("breadcrumbs.home"), root_path ], [ t("breadcrumbs.merchants"), nil ] ]
# Show all merchants for this family
@family_merchants = Current.family.merchants.alphabetically
diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb
index e0802c1c5..e48335595 100644
--- a/app/controllers/pages_controller.rb
+++ b/app/controllers/pages_controller.rb
@@ -26,11 +26,11 @@ class PagesController < ApplicationController
@dashboard_sections = build_dashboard_sections
- @breadcrumbs = [ [ "Home", root_path ], [ "Dashboard", nil ] ]
+ @breadcrumbs = [ [ t("breadcrumbs.home"), root_path ], [ t("breadcrumbs.dashboard"), nil ] ]
end
def intro
- @breadcrumbs = [ [ "Home", chats_path ], [ "Intro", nil ] ]
+ @breadcrumbs = [ [ t("breadcrumbs.home"), chats_path ], [ t("breadcrumbs.intro"), nil ] ]
end
def update_preferences
diff --git a/app/controllers/reports_controller.rb b/app/controllers/reports_controller.rb
index 55c58a458..26a03f23d 100644
--- a/app/controllers/reports_controller.rb
+++ b/app/controllers/reports_controller.rb
@@ -12,7 +12,7 @@ class ReportsController < ApplicationController
# Build reports sections for collapsible/reorderable UI
@reports_sections = build_reports_sections
- @breadcrumbs = [ [ "Home", root_path ], [ "Reports", nil ] ]
+ @breadcrumbs = [ [ t("breadcrumbs.home"), root_path ], [ t("breadcrumbs.reports"), nil ] ]
end
def print
diff --git a/app/controllers/settings/ai_prompts_controller.rb b/app/controllers/settings/ai_prompts_controller.rb
index ecd42b6f0..dddbc15df 100644
--- a/app/controllers/settings/ai_prompts_controller.rb
+++ b/app/controllers/settings/ai_prompts_controller.rb
@@ -3,8 +3,8 @@ class Settings::AiPromptsController < ApplicationController
def show
@breadcrumbs = [
- [ "Home", root_path ],
- [ "AI Prompts", nil ]
+ [ t("breadcrumbs.home"), root_path ],
+ [ t("breadcrumbs.ai_prompts"), nil ]
]
@family = Current.family
@assistant_config = Assistant.config_for(OpenStruct.new(user: Current.user))
diff --git a/app/controllers/settings/api_keys_controller.rb b/app/controllers/settings/api_keys_controller.rb
index d132e9a5f..cb8b2c3db 100644
--- a/app/controllers/settings/api_keys_controller.rb
+++ b/app/controllers/settings/api_keys_controller.rb
@@ -7,8 +7,8 @@ class Settings::ApiKeysController < ApplicationController
def show
@breadcrumbs = [
- [ "Home", root_path ],
- [ "API Key", nil ]
+ [ t("breadcrumbs.home"), root_path ],
+ [ t("breadcrumbs.api_key"), nil ]
]
@current_api_key = @api_key
end
diff --git a/app/controllers/settings/guides_controller.rb b/app/controllers/settings/guides_controller.rb
index a21840a91..c078d15dd 100644
--- a/app/controllers/settings/guides_controller.rb
+++ b/app/controllers/settings/guides_controller.rb
@@ -3,8 +3,8 @@ class Settings::GuidesController < ApplicationController
def show
@breadcrumbs = [
- [ "Home", root_path ],
- [ "Guides", nil ]
+ [ t("breadcrumbs.home"), root_path ],
+ [ t("breadcrumbs.guides"), nil ]
]
markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML,
autolink: true,
diff --git a/app/controllers/settings/hostings_controller.rb b/app/controllers/settings/hostings_controller.rb
index 063f2a6b0..e2a577bfc 100644
--- a/app/controllers/settings/hostings_controller.rb
+++ b/app/controllers/settings/hostings_controller.rb
@@ -17,8 +17,8 @@ class Settings::HostingsController < ApplicationController
def show
@breadcrumbs = [
- [ "Home", root_path ],
- [ "Self-Hosting", nil ]
+ [ t("breadcrumbs.home"), root_path ],
+ [ t("breadcrumbs.self_hosting"), nil ]
]
# Determine which providers are currently selected
diff --git a/app/controllers/settings/llm_usages_controller.rb b/app/controllers/settings/llm_usages_controller.rb
index 8013ecdff..73ec812b8 100644
--- a/app/controllers/settings/llm_usages_controller.rb
+++ b/app/controllers/settings/llm_usages_controller.rb
@@ -3,8 +3,8 @@ class Settings::LlmUsagesController < ApplicationController
def show
@breadcrumbs = [
- [ "Home", root_path ],
- [ "LLM Usage", nil ]
+ [ t("breadcrumbs.home"), root_path ],
+ [ t("breadcrumbs.llm_usage"), nil ]
]
@family = Current.family
diff --git a/app/controllers/settings/profiles_controller.rb b/app/controllers/settings/profiles_controller.rb
index 7015e55f4..e1f3b5db4 100644
--- a/app/controllers/settings/profiles_controller.rb
+++ b/app/controllers/settings/profiles_controller.rb
@@ -6,8 +6,8 @@ class Settings::ProfilesController < ApplicationController
@users = Current.family.users.order(:created_at)
@pending_invitations = Current.family.invitations.pending
@breadcrumbs = [
- [ "Home", root_path ],
- [ "Profile Info", nil ]
+ [ t("breadcrumbs.home"), root_path ],
+ [ t("breadcrumbs.profile"), nil ]
]
end
diff --git a/app/controllers/settings/providers_controller.rb b/app/controllers/settings/providers_controller.rb
index 014be3d74..2d123f2ab 100644
--- a/app/controllers/settings/providers_controller.rb
+++ b/app/controllers/settings/providers_controller.rb
@@ -5,8 +5,8 @@ class Settings::ProvidersController < ApplicationController
def show
@breadcrumbs = [
- [ "Home", root_path ],
- [ "Bank sync", nil ]
+ [ t("breadcrumbs.home"), root_path ],
+ [ t("breadcrumbs.bank_sync"), nil ]
]
prepare_show_context
diff --git a/app/controllers/settings/securities_controller.rb b/app/controllers/settings/securities_controller.rb
index e04c27e01..d53bddd77 100644
--- a/app/controllers/settings/securities_controller.rb
+++ b/app/controllers/settings/securities_controller.rb
@@ -3,8 +3,8 @@ class Settings::SecuritiesController < ApplicationController
def show
@breadcrumbs = [
- [ "Home", root_path ],
- [ "Security", nil ]
+ [ t("breadcrumbs.home"), root_path ],
+ [ t("breadcrumbs.security"), nil ]
]
@oidc_identities = Current.user.oidc_identities.order(:provider)
@webauthn_credentials = Current.user.webauthn_credentials.order(created_at: :asc)
diff --git a/app/controllers/transactions_controller.rb b/app/controllers/transactions_controller.rb
index a1932c555..fbcd89c18 100644
--- a/app/controllers/transactions_controller.rb
+++ b/app/controllers/transactions_controller.rb
@@ -63,6 +63,8 @@ class TransactionsController < ApplicationController
10.days.from_now.to_date,
Date.current)
.includes(:merchant)
+
+ @breadcrumbs = [ [ t("breadcrumbs.home"), root_path ], [ t("breadcrumbs.transactions"), nil ] ]
end
def clear_filter
diff --git a/app/javascript/controllers/bulk_select_controller.js b/app/javascript/controllers/bulk_select_controller.js
index 97b024a82..cac1867f5 100644
--- a/app/javascript/controllers/bulk_select_controller.js
+++ b/app/javascript/controllers/bulk_select_controller.js
@@ -13,6 +13,8 @@ export default class extends Controller {
static values = {
singularLabel: String,
pluralLabel: String,
+ selectedLabel: { type: String, default: "selected" },
+ editLabel: { type: String, default: "Edit" },
selectedIds: { type: Array, default: [] },
};
@@ -28,7 +30,7 @@ export default class extends Controller {
bulkEditDrawerHeaderTargetConnected(element) {
const headingTextEl = element.querySelector("h2");
- headingTextEl.innerText = `Edit ${
+ headingTextEl.innerText = `${this.editLabelValue} ${
this.selectedIdsValue.length
} ${this._pluralizedResourceName()}`;
}
@@ -132,7 +134,7 @@ export default class extends Controller {
_updateSelectionBar() {
const count = this.selectedIdsValue.length;
- this.selectionBarTextTarget.innerText = `${count} ${this._pluralizedResourceName()} selected`;
+ this.selectionBarTextTarget.innerText = `${count} ${this._pluralizedResourceName()} ${this.selectedLabelValue}`;
this.selectionBarTarget.classList.toggle("hidden", count === 0);
this.selectionBarTarget.querySelector("input[type='checkbox']").checked =
count > 0;
diff --git a/app/models/balance_sheet/classification_group.rb b/app/models/balance_sheet/classification_group.rb
index 968d4b6c0..2efced22d 100644
--- a/app/models/balance_sheet/classification_group.rb
+++ b/app/models/balance_sheet/classification_group.rb
@@ -13,7 +13,7 @@ class BalanceSheet::ClassificationGroup
end
def name
- classification.titleize.pluralize
+ I18n.t("pages.dashboard.balance_sheet.classifications.#{classification}", default: classification.titleize.pluralize)
end
def icon
@@ -34,7 +34,7 @@ class BalanceSheet::ClassificationGroup
.transform_keys { |at| Accountable.from_type(at) }
.map do |accountable, account_rows|
BalanceSheet::AccountGroup.new(
- name: I18n.t("accounts.types.#{accountable.name.underscore}", default: accountable.display_name),
+ name: accountable.display_name,
color: accountable.color,
accountable_type: accountable,
accounts: account_rows,
diff --git a/app/models/category.rb b/app/models/category.rb
index 39a740f7d..2eb9ed736 100644
--- a/app/models/category.rb
+++ b/app/models/category.rb
@@ -197,28 +197,28 @@ class Category < ApplicationRecord
private
def default_categories
[
- [ "Income", "#22c55e", "circle-dollar-sign" ],
- [ "Food & Drink", "#f97316", "utensils" ],
- [ "Groceries", "#407706", "shopping-bag" ],
- [ "Shopping", "#3b82f6", "shopping-cart" ],
- [ "Transportation", "#0ea5e9", "bus" ],
- [ "Travel", "#2563eb", "plane" ],
- [ "Entertainment", "#a855f7", "drama" ],
- [ "Healthcare", "#4da568", "pill" ],
- [ "Personal Care", "#14b8a6", "scissors" ],
- [ "Home Improvement", "#d97706", "hammer" ],
- [ "Mortgage / Rent", "#b45309", "home" ],
- [ "Utilities", "#eab308", "lightbulb" ],
- [ "Subscriptions", "#6366f1", "wifi" ],
- [ "Insurance", "#0284c7", "shield" ],
- [ "Sports & Fitness", "#10b981", "dumbbell" ],
- [ "Gifts & Donations", "#61c9ea", "hand-helping" ],
- [ "Taxes", "#dc2626", "landmark" ],
- [ "Loan Payments", "#e11d48", "credit-card" ],
- [ "Services", "#7c3aed", "briefcase" ],
- [ "Fees", "#6b7280", "receipt" ],
- [ "Savings & Investments", "#059669", "piggy-bank" ],
- [ investment_contributions_name, "#0d9488", "trending-up" ]
+ [ I18n.t("models.category.defaults.income"), "#22c55e", "circle-dollar-sign" ],
+ [ I18n.t("models.category.defaults.food_and_drink"), "#f97316", "utensils" ],
+ [ I18n.t("models.category.defaults.groceries"), "#407706", "shopping-bag" ],
+ [ I18n.t("models.category.defaults.shopping"), "#3b82f6", "shopping-cart" ],
+ [ I18n.t("models.category.defaults.transportation"), "#0ea5e9", "bus" ],
+ [ I18n.t("models.category.defaults.travel"), "#2563eb", "plane" ],
+ [ I18n.t("models.category.defaults.entertainment"), "#a855f7", "drama" ],
+ [ I18n.t("models.category.defaults.healthcare"), "#4da568", "pill" ],
+ [ I18n.t("models.category.defaults.personal_care"), "#14b8a6", "scissors" ],
+ [ I18n.t("models.category.defaults.home_improvement"), "#d97706", "hammer" ],
+ [ I18n.t("models.category.defaults.mortgage_rent"), "#b45309", "home" ],
+ [ I18n.t("models.category.defaults.utilities"), "#eab308", "lightbulb" ],
+ [ I18n.t("models.category.defaults.subscriptions"), "#6366f1", "wifi" ],
+ [ I18n.t("models.category.defaults.insurance"), "#0284c7", "shield" ],
+ [ I18n.t("models.category.defaults.sports_and_fitness"), "#10b981", "dumbbell" ],
+ [ I18n.t("models.category.defaults.gifts_and_donations"), "#61c9ea", "hand-helping" ],
+ [ I18n.t("models.category.defaults.taxes"), "#dc2626", "landmark" ],
+ [ I18n.t("models.category.defaults.loan_payments"), "#e11d48", "credit-card" ],
+ [ I18n.t("models.category.defaults.services"), "#7c3aed", "briefcase" ],
+ [ I18n.t("models.category.defaults.fees"), "#6b7280", "receipt" ],
+ [ I18n.t("models.category.defaults.savings_and_investments"), "#059669", "piggy-bank" ],
+ [ investment_contributions_name, "#0d9488", "trending-up" ]
]
end
end
diff --git a/app/models/concerns/accountable.rb b/app/models/concerns/accountable.rb
index 9324e34ab..f008fea5e 100644
--- a/app/models/concerns/accountable.rb
+++ b/app/models/concerns/accountable.rb
@@ -58,8 +58,29 @@ module Accountable
classification == "asset" ? "up" : "down"
end
+ def singular_display_name
+ I18n.t("accounts.types.#{name.underscore}", default: legacy_singular_display_name)
+ end
+
def display_name
- self.name.pluralize.titleize
+ I18n.t("accounts.types_plural.#{name.underscore}", default: -> { legacy_display_name })
+ end
+
+ def legacy_display_name
+ return singular_display_name if name.in?([ "Depository", "Crypto" ])
+
+ singular_display_name.pluralize
+ end
+
+ def legacy_singular_display_name
+ case name
+ when "Depository"
+ "Cash"
+ when "Crypto"
+ "Crypto"
+ else
+ name.underscore.humanize
+ end
end
# Sums the balances of all active accounts of this type, converting foreign currencies to the family's currency.
@@ -80,6 +101,10 @@ module Accountable
end
end
+ def singular_display_name
+ self.class.singular_display_name
+ end
+
def display_name
self.class.display_name
end
diff --git a/app/models/crypto.rb b/app/models/crypto.rb
index 6f3f5c0cd..fdff70c74 100644
--- a/app/models/crypto.rb
+++ b/app/models/crypto.rb
@@ -34,9 +34,5 @@ class Crypto < ApplicationRecord
def icon
"bitcoin"
end
-
- def display_name
- "Crypto"
- end
end
end
diff --git a/app/models/depository.rb b/app/models/depository.rb
index e78e70a8a..0ebeda390 100644
--- a/app/models/depository.rb
+++ b/app/models/depository.rb
@@ -12,10 +12,6 @@ class Depository < ApplicationRecord
}.freeze
class << self
- def display_name
- "Cash"
- end
-
def color
"#875BF7"
end
diff --git a/app/models/period.rb b/app/models/period.rb
index 2f4e8afdf..6d7a98d83 100644
--- a/app/models/period.rb
+++ b/app/models/period.rb
@@ -179,24 +179,24 @@ class Period
end
def label
- if key_metadata
- key_metadata.fetch(:label)
+ if key
+ I18n.t("period.#{key}.label", default: key_metadata&.fetch(:label) || "Custom Period")
else
- "Custom Period"
+ I18n.t("period.custom.label", default: "Custom Period")
end
end
def label_short
- if key_metadata
- key_metadata.fetch(:label_short)
+ if key
+ I18n.t("period.#{key}.label_short", default: key_metadata&.fetch(:label_short) || "Custom")
else
- "Custom"
+ I18n.t("period.custom.label_short", default: "Custom")
end
end
def comparison_label
- if key_metadata
- key_metadata.fetch(:comparison_label)
+ if key
+ I18n.t("period.#{key}.comparison_label", default: key_metadata&.fetch(:comparison_label) || "#{start_date.strftime(@date_format)} to #{end_date.strftime(@date_format)}")
else
"#{start_date.strftime(@date_format)} to #{end_date.strftime(@date_format)}"
end
diff --git a/app/views/accounts/_account_type.html.erb b/app/views/accounts/_account_type.html.erb
index 3605e48b4..d055156f1 100644
--- a/app/views/accounts/_account_type.html.erb
+++ b/app/views/accounts/_account_type.html.erb
@@ -7,5 +7,5 @@
hex_color: accountable.color,
) %>
- <%= accountable.display_name.singularize %>
+ <%= accountable.singular_display_name %>
<% end %>
diff --git a/app/views/accounts/_accountable_group.html.erb b/app/views/accounts/_accountable_group.html.erb
index 64f655797..28727dc85 100644
--- a/app/views/accounts/_accountable_group.html.erb
+++ b/app/views/accounts/_accountable_group.html.erb
@@ -56,7 +56,7 @@
<% end %>
<% end %>
diff --git a/app/views/transactions/new.html.erb b/app/views/transactions/new.html.erb
index b2273188b..3d612c0a8 100644
--- a/app/views/transactions/new.html.erb
+++ b/app/views/transactions/new.html.erb
@@ -1,5 +1,5 @@
<%= render DS::Dialog.new(scrollable: false, content_class: "lg:max-h-none lg:overflow-y-auto") do |dialog| %>
- <% dialog.with_header(title: "New transaction") %>
+ <% dialog.with_header(title: t(".new_transaction")) %>
<% dialog.with_body do %>
<%= render "form", entry: @entry, categories: @categories %>
<% end %>
diff --git a/config/locales/breadcrumbs/en.yml b/config/locales/breadcrumbs/en.yml
index 1c840acdc..53e8fef65 100644
--- a/config/locales/breadcrumbs/en.yml
+++ b/config/locales/breadcrumbs/en.yml
@@ -1,8 +1,21 @@
---
en:
breadcrumbs:
+ ai_prompts: AI Prompts
+ api_key: API Key
+ bank_sync: Bank Sync
+ budgets: Budgets
categorize: Categorize
+ dashboard: Dashboard
exports: Exports
+ guides: Guides
home: Home
imports: Imports
+ intro: Intro
+ llm_usage: LLM Usage
+ merchants: Merchants
+ profile: Profile Info
+ reports: Reports
+ security: Security
+ self_hosting: Self-Hosting
transactions: Transactions
diff --git a/config/locales/breadcrumbs/hu.yml b/config/locales/breadcrumbs/hu.yml
index 4210c7cc8..93dcdb312 100644
--- a/config/locales/breadcrumbs/hu.yml
+++ b/config/locales/breadcrumbs/hu.yml
@@ -1,8 +1,21 @@
---
hu:
breadcrumbs:
+ ai_prompts: AI promptok
+ api_key: API kulcs
+ bank_sync: Bankszinkronizáció
+ budgets: Költségvetések
categorize: Kategorizálás
+ dashboard: Irányítópult
exports: Exportálások
+ guides: Útmutatók
home: Kezdőlap
imports: Importálások
+ intro: Bemutató
+ llm_usage: LLM használat
+ merchants: Kereskedők
+ profile: Profil adatok
+ reports: Jelentések
+ security: Biztonság
+ self_hosting: Saját üzemeltetés
transactions: Tranzakciók
diff --git a/config/locales/doorkeeper.hu.yml b/config/locales/doorkeeper.hu.yml
index d3c382282..4038b4776 100644
--- a/config/locales/doorkeeper.hu.yml
+++ b/config/locales/doorkeeper.hu.yml
@@ -64,12 +64,15 @@ hu:
deny: 'Elutasítás'
error:
title: 'Hiba történt'
+ go_back: 'Vissza'
new:
title: 'Engedélyezés szükséges'
prompt: 'Engedélyezed, hogy %{client_name} hozzáférjen a fiókodhoz?'
able_to: 'Az alkalmazás a következőkre lesz jogosult'
show:
title: 'Engedélyezési kód'
+ authorization_code_label: 'Engedélyezési kód:'
+ copy_instructions: 'Másold ki ezt a kódot, és illeszd be az alkalmazásba.'
form_post:
title: 'Küldd el ezt az űrlapot'
authorized_applications:
diff --git a/config/locales/models/account/hu.yml b/config/locales/models/account/hu.yml
index c1fcbbd6f..7966b9b53 100644
--- a/config/locales/models/account/hu.yml
+++ b/config/locales/models/account/hu.yml
@@ -15,7 +15,7 @@ hu:
account/depository: Bankszámla
account/investment: Befektetés
account/loan: Kölcsön
- account/other_asset: Egyéb eszköz
+ account/other_asset: Egyéb vagyon
account/other_liability: Egyéb kötelezettség
account/property: Ingatlan
account/vehicle: Jármű
diff --git a/config/locales/models/account_statement/hu.yml b/config/locales/models/account_statement/hu.yml
new file mode 100644
index 000000000..6ae639f88
--- /dev/null
+++ b/config/locales/models/account_statement/hu.yml
@@ -0,0 +1,30 @@
+---
+hu:
+ activerecord:
+ attributes:
+ account_statement:
+ account: Számla
+ account_last4_hint: Számla utolsó négy számjegye
+ account_name_hint: Számlanév-tipp
+ closing_balance: Záró egyenleg
+ content_sha256: Tartalom-összefoglaló
+ currency: Pénznem
+ filename: Fájlnév
+ institution_name_hint: Intézménynév-tipp
+ opening_balance: Nyitóegyenleg
+ original_file: Kimutatásfájl
+ period_end_on: Időszak vége
+ period_start_on: Időszak kezdete
+ errors:
+ models:
+ account_statement:
+ attributes:
+ checksum:
+ duplicate_statement_file: már fel lett töltve ennél a háztartásnál
+ content_sha256:
+ duplicate_statement_file: már fel lett töltve ennél a háztartásnál
+ original_file:
+ invalid_format: csak PDF, CSV vagy XLSX fájl lehet
+ too_large: túl nagy. A maximális méret %{max_mb} MB
+ period_end_on:
+ on_or_after_start: nem lehet korábbi, mint az időszak kezdete
diff --git a/config/locales/models/api_key/hu.yml b/config/locales/models/api_key/hu.yml
new file mode 100644
index 000000000..78f98c066
--- /dev/null
+++ b/config/locales/models/api_key/hu.yml
@@ -0,0 +1,7 @@
+---
+hu:
+ activerecord:
+ errors:
+ models:
+ api_key:
+ cannot_destroy_demo_key: "A demo felügyeleti API-kulcs nem törölhető"
diff --git a/config/locales/models/brex_item/hu.yml b/config/locales/models/brex_item/hu.yml
new file mode 100644
index 000000000..0386c1a44
--- /dev/null
+++ b/config/locales/models/brex_item/hu.yml
@@ -0,0 +1,14 @@
+---
+hu:
+ activerecord:
+ attributes:
+ brex_item:
+ base_url: Alap URL
+ name: Kapcsolat neve
+ token: Token
+ errors:
+ models:
+ brex_item:
+ attributes:
+ base_url:
+ official_hosts_only: üres kell legyen, vagy https://api.brex.com, vagy https://api-staging.brex.com
diff --git a/config/locales/models/category/en.yml b/config/locales/models/category/en.yml
index 749f80860..7216b8a42 100644
--- a/config/locales/models/category/en.yml
+++ b/config/locales/models/category/en.yml
@@ -5,3 +5,25 @@ en:
uncategorized: Uncategorized
other_investments: Other Investments
investment_contributions: Investment Contributions
+ defaults:
+ income: Income
+ food_and_drink: Food & Drink
+ groceries: Groceries
+ shopping: Shopping
+ transportation: Transportation
+ travel: Travel
+ entertainment: Entertainment
+ healthcare: Healthcare
+ personal_care: Personal Care
+ home_improvement: Home Improvement
+ mortgage_rent: Mortgage / Rent
+ utilities: Utilities
+ subscriptions: Subscriptions
+ insurance: Insurance
+ sports_and_fitness: Sports & Fitness
+ gifts_and_donations: Gifts & Donations
+ taxes: Taxes
+ loan_payments: Loan Payments
+ services: Services
+ fees: Fees
+ savings_and_investments: Savings & Investments
diff --git a/config/locales/models/category/hu.yml b/config/locales/models/category/hu.yml
index 2a02c4149..605ead1cf 100644
--- a/config/locales/models/category/hu.yml
+++ b/config/locales/models/category/hu.yml
@@ -5,3 +5,25 @@ hu:
uncategorized: Kategorizálatlan
other_investments: Egyéb befektetések
investment_contributions: Befektetési befizetések
+ defaults:
+ income: Bevétel
+ food_and_drink: Étel és ital
+ groceries: Élelmiszer
+ shopping: Vásárlás
+ transportation: Közlekedés
+ travel: Utazás
+ entertainment: Szórakozás
+ healthcare: Egészségügy
+ personal_care: Személyes gondozás
+ home_improvement: Lakásfelújítás
+ mortgage_rent: Jelzálog / Bérleti díj
+ utilities: Rezsi
+ subscriptions: Előfizetések
+ insurance: Biztosítás
+ sports_and_fitness: Sport és fitnesz
+ gifts_and_donations: Ajándékok és adományok
+ taxes: Adók
+ loan_payments: Hitelrészletek
+ services: Szolgáltatások
+ fees: Díjak
+ savings_and_investments: Megtakarítások és befektetések
diff --git a/config/locales/models/category_import/hu.yml b/config/locales/models/category_import/hu.yml
new file mode 100644
index 000000000..474990177
--- /dev/null
+++ b/config/locales/models/category_import/hu.yml
@@ -0,0 +1,8 @@
+---
+hu:
+ activerecord:
+ errors:
+ models:
+ category_import:
+ own_parent: "A(z) '%{name}' kategória nem lehet saját maga szülője"
+ missing_columns: "Hiányzó kötelező oszlopok: %{columns}"
diff --git a/config/locales/models/import/hu.yml b/config/locales/models/import/hu.yml
index 051c6adc3..f56aa9371 100644
--- a/config/locales/models/import/hu.yml
+++ b/config/locales/models/import/hu.yml
@@ -8,6 +8,7 @@ hu:
errors:
models:
import:
+ duplicate_headers: "A CSV fejlécek duplikált oszlopokra normalizálódnak: %{columns}"
attributes:
raw_file_str:
invalid_csv_format: nem érvényes CSV formátum
diff --git a/config/locales/models/indexa_capital_item/hu.yml b/config/locales/models/indexa_capital_item/hu.yml
new file mode 100644
index 000000000..d416d4d39
--- /dev/null
+++ b/config/locales/models/indexa_capital_item/hu.yml
@@ -0,0 +1,7 @@
+---
+hu:
+ activerecord:
+ errors:
+ models:
+ indexa_capital_item:
+ credentials_required: "Az INDEXA_API_TOKEN környezeti változó vagy felhasználónév/dokumentum/jelszó hitelesítő adatok megadása kötelező"
diff --git a/config/locales/models/period/en.yml b/config/locales/models/period/en.yml
new file mode 100644
index 000000000..96e3bb21c
--- /dev/null
+++ b/config/locales/models/period/en.yml
@@ -0,0 +1,54 @@
+---
+en:
+ period:
+ last_day:
+ label_short: "1D"
+ label: "Last Day"
+ comparison_label: "vs. yesterday"
+ current_week:
+ label_short: "WTD"
+ label: "Current Week"
+ comparison_label: "vs. start of week"
+ last_7_days:
+ label_short: "7D"
+ label: "Last 7 Days"
+ comparison_label: "vs. last week"
+ current_month:
+ label_short: "MTD"
+ label: "Current Month"
+ comparison_label: "vs. start of month"
+ last_month:
+ label_short: "LM"
+ label: "Last Month"
+ comparison_label: "vs. last month"
+ last_30_days:
+ label_short: "30D"
+ label: "Last 30 Days"
+ comparison_label: "vs. last 30 days"
+ last_90_days:
+ label_short: "90D"
+ label: "Last 90 Days"
+ comparison_label: "vs. last quarter"
+ current_year:
+ label_short: "YTD"
+ label: "Current Year"
+ comparison_label: "vs. start of year"
+ last_365_days:
+ label_short: "365D"
+ label: "Last 365 Days"
+ comparison_label: "vs. 1 year ago"
+ last_5_years:
+ label_short: "5Y"
+ label: "Last 5 Years"
+ comparison_label: "vs. 5 years ago"
+ last_10_years:
+ label_short: "10Y"
+ label: "Last 10 Years"
+ comparison_label: "vs. 10 years ago"
+ all_time:
+ label_short: "All"
+ label: "All Time"
+ comparison_label: "vs. beginning"
+ custom:
+ label_short: "Custom"
+ label: "Custom Period"
diff --git a/config/locales/models/period/hu.yml b/config/locales/models/period/hu.yml
new file mode 100644
index 000000000..cbc946af0
--- /dev/null
+++ b/config/locales/models/period/hu.yml
@@ -0,0 +1,54 @@
+---
+hu:
+ period:
+ last_day:
+ label_short: "1N"
+ label: "Tegnap óta"
+ comparison_label: "vs. tegnap"
+ current_week:
+ label_short: "HE"
+ label: "Jelenlegi hét"
+ comparison_label: "vs. hét eleje"
+ last_7_days:
+ label_short: "7N"
+ label: "Utóbbi 7 nap"
+ comparison_label: "vs. előző hét"
+ current_month:
+ label_short: "HÓE"
+ label: "Jelenlegi hónap"
+ comparison_label: "vs. hónap eleje"
+ last_month:
+ label_short: "EHÓ"
+ label: "Előző hónap"
+ comparison_label: "vs. előző hónap"
+ last_30_days:
+ label_short: "30N"
+ label: "Utóbbi 30 nap"
+ comparison_label: "vs. utóbbi 30 nap"
+ last_90_days:
+ label_short: "90N"
+ label: "Utóbbi 90 nap"
+ comparison_label: "vs. előző negyedév"
+ current_year:
+ label_short: "ÉE"
+ label: "Jelenlegi év"
+ comparison_label: "vs. év eleje"
+ last_365_days:
+ label_short: "365N"
+ label: "Utóbbi 365 nap"
+ comparison_label: "vs. 1 évvel ezelőtt"
+ last_5_years:
+ label_short: "5É"
+ label: "Utóbbi 5 év"
+ comparison_label: "vs. 5 évvel ezelőtt"
+ last_10_years:
+ label_short: "10É"
+ label: "Utóbbi 10 év"
+ comparison_label: "vs. 10 évvel ezelőtt"
+ all_time:
+ label_short: "Mind"
+ label: "Teljes időszak"
+ comparison_label: "vs. kezdet"
+ custom:
+ label_short: "Egyéni"
+ label: "Egyéni időszak"
diff --git a/config/locales/models/plaid_account/hu.yml b/config/locales/models/plaid_account/hu.yml
new file mode 100644
index 000000000..ef9407c16
--- /dev/null
+++ b/config/locales/models/plaid_account/hu.yml
@@ -0,0 +1,7 @@
+---
+hu:
+ activerecord:
+ errors:
+ models:
+ plaid_account:
+ no_balance: "A Plaid-számlának rendelkeznie kell aktuális vagy elérhető egyenleggel"
diff --git a/config/locales/models/recurring_transaction/hu.yml b/config/locales/models/recurring_transaction/hu.yml
new file mode 100644
index 000000000..16e833a50
--- /dev/null
+++ b/config/locales/models/recurring_transaction/hu.yml
@@ -0,0 +1,7 @@
+---
+hu:
+ activerecord:
+ errors:
+ models:
+ recurring_transaction:
+ merchant_or_name_required: "Kereskedőt vagy nevet kötelező megadni"
diff --git a/config/locales/models/rule/hu.yml b/config/locales/models/rule/hu.yml
new file mode 100644
index 000000000..cb50ca38f
--- /dev/null
+++ b/config/locales/models/rule/hu.yml
@@ -0,0 +1,9 @@
+---
+hu:
+ activerecord:
+ errors:
+ models:
+ rule:
+ min_actions: "legalább egy műveletet kötelező megadni"
+ duplicate_actions: "A szabálynak nem lehetnek duplikált műveletei: %{types}"
+ nested_conditions: "Összetett feltételek nem ágyazhatók egymásba"
diff --git a/config/locales/models/rule_import/hu.yml b/config/locales/models/rule_import/hu.yml
new file mode 100644
index 000000000..a74c31546
--- /dev/null
+++ b/config/locales/models/rule_import/hu.yml
@@ -0,0 +1,9 @@
+---
+hu:
+ activerecord:
+ errors:
+ models:
+ rule_import:
+ unsupported_resource_type: "Nem támogatott erőforrástípus: %{resource_type}"
+ invalid_json: "Érvénytelen JSON a feltételekben vagy műveletekben: %{message}"
+ min_actions: "A szabálynak legalább egy művelete kell legyen"
diff --git a/config/locales/models/simplefin_account/hu.yml b/config/locales/models/simplefin_account/hu.yml
new file mode 100644
index 000000000..2e61ef2f1
--- /dev/null
+++ b/config/locales/models/simplefin_account/hu.yml
@@ -0,0 +1,7 @@
+---
+hu:
+ activerecord:
+ errors:
+ models:
+ simplefin_account:
+ no_balance: "A SimpleFin-számlának rendelkeznie kell aktuális vagy elérhető egyenleggel"
diff --git a/config/locales/models/sophtron_account/hu.yml b/config/locales/models/sophtron_account/hu.yml
new file mode 100644
index 000000000..62e97a274
--- /dev/null
+++ b/config/locales/models/sophtron_account/hu.yml
@@ -0,0 +1,7 @@
+---
+hu:
+ activerecord:
+ errors:
+ models:
+ sophtron_account:
+ no_balance: "A Sophtron-számlának rendelkeznie kell aktuális vagy elérhető egyenleggel"
diff --git a/config/locales/models/sso_provider/hu.yml b/config/locales/models/sso_provider/hu.yml
new file mode 100644
index 000000000..f66acd0f3
--- /dev/null
+++ b/config/locales/models/sso_provider/hu.yml
@@ -0,0 +1,12 @@
+---
+hu:
+ activerecord:
+ errors:
+ models:
+ sso_provider:
+ attributes:
+ settings:
+ saml_url_required: "SAML-szolgáltatókhoz kötelező megadni az IdP metaadat URL-jét vagy az IdP SSO URL-jét"
+ saml_cert_required: "Ha nem metaadat URL-t használsz, kötelező megadni az IdP tanúsítványt vagy a tanúsítvány ujjlenyomatát"
+ metadata_url_invalid: "Az IdP metaadat URL-nek érvényes URL-nek kell lennie"
+ sso_url_invalid: "Az IdP SSO URL-nek érvényes URL-nek kell lennie"
diff --git a/config/locales/models/transfer/hu.yml b/config/locales/models/transfer/hu.yml
index 9911b4615..e5677e476 100644
--- a/config/locales/models/transfer/hu.yml
+++ b/config/locales/models/transfer/hu.yml
@@ -4,6 +4,10 @@ hu:
errors:
models:
transfer:
+ different_accounts: "Különböző számlákról kell lennie"
+ same_family: "Ugyanazon a háztartáson belül kell lennie"
+ opposite_amounts: "Ellentétes összegekkel kell rendelkeznie"
+ within_days: "%{count} napon belül kell lennie"
attributes:
base:
inflow_cannot_be_in_multiple_transfers: A beérkező tranzakció nem szerepelhet több átutalásban
diff --git a/config/locales/views/account_statements/hu.yml b/config/locales/views/account_statements/hu.yml
new file mode 100644
index 000000000..0a3fc5966
--- /dev/null
+++ b/config/locales/views/account_statements/hu.yml
@@ -0,0 +1,116 @@
+---
+hu:
+ account_statements:
+ account_tab:
+ coverage_title: Kimutatás lefedettség
+ coverage_description: Feltöltött kimutatásokkal és egyenlegellenőrzésekkel lefedett korábbi hónapok.
+ coverage_range: "%{start} - %{end}"
+ empty: Még nincs ehhez a számlához kapcsolt kimutatás.
+ open_inbox: Beérkező
+ statements_title: Kimutatások
+ year_label: Lefedési év
+ balance:
+ unknown: Ismeretlen
+ coverage:
+ status:
+ ambiguous: Kétértelmű
+ covered: Lefedett
+ duplicate: Duplikált
+ mismatched: Eltérő
+ missing: Hiányzó
+ not_expected: Nem várt
+ create:
+ duplicates:
+ one: 1 duplikált kimutatás ki lett hagyva.
+ other: "%{count} duplikált kimutatás ki lett hagyva."
+ invalid_file_type: PDF, CSV vagy XLSX kimutatást tölts fel a méretkorláton belül.
+ no_files: Válassz legalább egy kimutatásfájlt.
+ success:
+ one: 1 kimutatás feltöltve.
+ other: "%{count} kimutatás feltöltve."
+ destroy:
+ failure: A kimutatást nem sikerült törölni.
+ success: Kimutatás törölve.
+ form:
+ account_upload: Kimutatás feltöltése
+ files_hint: PDF, CSV vagy XLSX. Maximum %{max_size} MB fájlonként.
+ files_label: Kimutatásfájlok
+ inbox_upload: Feltöltés
+ index:
+ account_label: Számla
+ confidence: "%{confidence} egyezés"
+ empty_linked: Még nincs kapcsolt kimutatás.
+ empty_unmatched: A kimutatás beérkező üres.
+ leave_unmatched: Hagyja párosítatlanul
+ linked_title: Kapcsolt kimutatások
+ no_suggestion: Nincs javaslat
+ storage_used: Felhasznált tárhely
+ title: Kimutatástár
+ unmatched_title: Párosítatlan beérkező
+ upload_description: Töltsd fel a kimutatásokat a beérkezőbe, vagy válassz számlát az azonnali összekapcsoláshoz.
+ upload_title: Kimutatások feltöltése
+ link:
+ no_account: Válassz számlát, mielőtt összekapcsolod ezt a kimutatást.
+ success: "Kimutatás összekapcsolva ezzel a számlával: %{account}."
+ period:
+ unknown: Az időszak ismeretlen
+ reconciliation:
+ checks:
+ closing_balance: Záró egyenleg
+ opening_balance: Nyitóegyenleg
+ period_movement: Időszaki mozgás
+ unknown_check: Ismeretlen ellenőrzés
+ matched: Egyezik
+ mismatched: Eltérő
+ unavailable: Nem ellenőrzött
+ reject:
+ success: Kimutatás-egyezési javaslat elutasítva.
+ show:
+ account_label: Számla
+ account_last4_hint: Számla utolsó négy számjegye
+ account_name_hint: Számlanév-tipp
+ closing_balance: Záró egyenleg
+ currency: Pénznem
+ delete: Törlés
+ difference: Különbség
+ download: Letöltés
+ institution_name_hint: Intézménynév-tipp
+ ledger_amount: Sure főkönyv
+ linked_to: "Összekapcsolva ezzel a számlával: %{account}."
+ linking_title: Számlakapcsolat
+ link_suggestion: Kapcsolati javaslat
+ metadata_title: Kimutatás metaadatok
+ no_suggestion: Még nincs számlajavaslat.
+ opening_balance: Nyitóegyenleg
+ period_end_on: Időszak vége
+ period_start_on: Időszak kezdete
+ reconciliation_title: Egyeztetés
+ reconciliation_unavailable: Adj meg egy kimutatási időszakot és nyitó- vagy záróegyenleget, majd győződj meg arról, hogy a Sure rendelkezik egyenlegelőzményekkel ezekre a dátumokra.
+ reject: Elutasítás
+ save: Kimutatás mentése
+ statement_amount: Kimutatás
+ suggested_account: A javasolt számla %{account} (%{confidence} bizonyossággal).
+ title: Kimutatás
+ unlink: Szétkapcsolás
+ unmatched_account: Párosítatlan beérkező
+ unknown_value: Ismeretlen
+ status:
+ linked: Összekapcsolt
+ rejected: Elutasított
+ unmatched: Párosítatlan
+ table:
+ account: Számla
+ actions: Műveletek
+ download: Letöltés
+ file: Fájl
+ link_suggestion: Kapcsolati javaslat
+ period: Időszak
+ reconciliation: Egyeztetés
+ reject: Javaslat elutasítása
+ suggestion: Javaslat
+ unlink: Szétkapcsolás
+ view: Megtekintés
+ unlink:
+ success: Kimutatás visszahelyezve a párosítatlan beérkezőbe.
+ update:
+ success: Kimutatás frissítve.
diff --git a/config/locales/views/accounts/en.yml b/config/locales/views/accounts/en.yml
index f927e3424..a18a3de41 100644
--- a/config/locales/views/accounts/en.yml
+++ b/config/locales/views/accounts/en.yml
@@ -142,6 +142,16 @@ en:
credit_card: Credit Card
loan: Loan
other_liability: Other Liability
+ types_plural:
+ depository: Cash
+ investment: Investments
+ crypto: Crypto
+ property: Properties
+ vehicle: Vehicles
+ other_asset: Other Assets
+ credit_card: Credit Cards
+ loan: Loans
+ other_liability: Other Liabilities
tax_treatments:
taxable: Taxable
tax_deferred: Tax-Deferred
diff --git a/config/locales/views/accounts/hu.yml b/config/locales/views/accounts/hu.yml
index 49d72fb98..6041d3d91 100644
--- a/config/locales/views/accounts/hu.yml
+++ b/config/locales/views/accounts/hu.yml
@@ -1,8 +1,13 @@
---
hu:
+ account:
+ entries:
+ destroy:
+ success: "Tétel sikeresen törölve."
accounts:
not_authorized: "Nincs jogosultságod ennek a számlának a kezeléséhez"
account:
+ complete_setup: Beállítás befejezése
edit: Szerkesztés
link_lunchflow: Összekapcsolás a Lunch Flow-val
link_provider: Összekapcsolás szolgáltatóval
@@ -52,6 +57,10 @@ hu:
syncing: "Számlák szinkronizálása..."
new:
import_accounts: Számlák importálása
+ container:
+ select: Kiválasztás
+ navigate: Navigálás
+ close: Bezárás
method_selector:
connected_entry: Számla összekapcsolása
connected_entry_eu: EU-s számla összekapcsolása
@@ -62,6 +71,11 @@ hu:
title: Mit szeretnél hozzáadni?
show:
limited_fx_history_warning: "Az árfolyam-előzmények csak %{date} dátumtól érhetők el. Az ezt megelőző tranzakciókhoz közelítő árfolyamok kerülnek alkalmazásra – ez akkor fordulhat elő, ha a devizaárfolyam-szolgáltató csak korlátozott előzményadatokat kínál."
+ tabs:
+ activity: Tevékenység
+ holdings: Portfólió
+ overview: Áttekintés
+ statements: Kimutatások
activity:
amount: Összeg
balance: Egyenleg
@@ -80,20 +94,26 @@ hu:
pending: Függőben lévő
search:
placeholder: Tételek keresése név alapján
+ search_placeholder: Tételek keresése név alapján
status: Állapot
title: Tevékenység
chart:
balance: Egyenleg
owed: Tartozás összege
+ header:
+ complete_setup: Beállítás befejezése
menu:
confirm_accept: '"%{name}" törlése'
confirm_body_html: "
A számla törlésével törlöd az értéktörténetét is, ami hatással van az összesített fiókodra. Ez közvetlenül befolyásolja a nettó vagyonszámítást és a számlagrafikonokat.
A törlés után a számla adatait nem lehet visszaállítani – ha szükséges, új számlaként kell hozzáadni.
"
confirm_title: Törlöd a számlát?
+ delete_account: Számla törlése
edit: Szerkesztés
import: Tranzakciók importálása
import_trades: Ügyletek importálása
import_transactions: Tranzakciók importálása
manage: Számlák kezelése
+ sharing: Megosztás
+ statements: Kimutatások
update:
success: "%{type} számla frissítve"
sidebar:
@@ -102,9 +122,9 @@ hu:
configure_providers: Konfiguráld itt a szolgáltatóidat.
tabs:
all: Összes
- assets: Eszközök
+ assets: Vagyon
debts: Kötelezettségek
- new_asset: Új eszköz
+ new_asset: Új vagyonelem
new_debt: Új kötelezettség
new_account: Új számla
new_account_group: "Új %{account_group}"
@@ -114,10 +134,20 @@ hu:
crypto: Kripto
property: Ingatlan
vehicle: Jármű
- other_asset: Egyéb eszköz
+ other_asset: Egyéb vagyon
credit_card: Hitelkártya
loan: Hitel
other_liability: Egyéb kötelezettség
+ types_plural:
+ depository: Készpénz
+ investment: Befektetések
+ crypto: Kripto
+ property: Ingatlanok
+ vehicle: Járművek
+ other_asset: Egyéb vagyon
+ credit_card: Hitelkártyák
+ loan: Hitelek
+ other_liability: Egyéb kötelezettségek
tax_treatments:
taxable: Adóköteles
tax_deferred: Halasztott adózású
@@ -134,6 +164,7 @@ hu:
ca: Kanada
au: Ausztrália
eu: Európa
+ in: India
generic: Általános
confirm_unlink:
title: Leválasztod a számlát a szolgáltatóról?
diff --git a/config/locales/views/admin/sso_providers/hu.yml b/config/locales/views/admin/sso_providers/hu.yml
index c3f0d3497..e08bfcb7b 100644
--- a/config/locales/views/admin/sso_providers/hu.yml
+++ b/config/locales/views/admin/sso_providers/hu.yml
@@ -4,12 +4,25 @@ hu:
unauthorized: "Nincs jogosultságod ehhez a területhez."
sso_providers:
index:
+ page_title: "SSO-szolgáltatók"
title: "SSO-szolgáltatók"
description: "Az egyszeri bejelentkezési hitelesítési szolgáltatók kezelése a példányodhoz"
+ restart_required: "A módosítások érvénybe lépéséhez szerver-újraindítás szükséges."
+ configured_providers: "Konfigurált szolgáltatók"
add_provider: "Szolgáltató hozzáadása"
no_providers_title: "Nincsenek SSO-szolgáltatók"
no_providers_message: "Kezdd az első SSO-szolgáltató hozzáadásával."
note: "Az SSO-szolgáltatók módosításaihoz szerver-újraindítás szükséges. Alternatívaként engedélyezd az AUTH_PROVIDERS_SOURCE=db feature flag-et, hogy a szolgáltatók dinamikusan töltődjenek be az adatbázisból."
+ enabled: "Engedélyezve"
+ disabled: "Letiltva"
+ edit: "Szerkesztés"
+ enable: "Engedélyezés"
+ disable: "Letiltás"
+ delete: "Törlés"
+ configuration_mode: "Konfigurációs mód"
+ db_backed_providers: "Adatbázis-alapú szolgáltatók"
+ db_backed_providers_description: "Szolgáltatók betöltése az adatbázisból YAML konfiguráció helyett"
+ db_backed_providers_help_html: "Állítsd be az AUTH_PROVIDERS_SOURCE=db értéket az adatbázis-alapú szolgáltatók engedélyezéséhez. Ez lehetővé teszi a módosításokat szerver-újraindítás nélkül."
table:
name: "Név"
strategy: "Stratégia"
@@ -44,6 +57,10 @@ hu:
oauth_configuration: "OAuth/OIDC konfiguráció"
strategy_label: "Stratégia"
strategy_help: "A használandó hitelesítési stratégia"
+ strategy_openid_connect: "OpenID Connect"
+ strategy_saml: "SAML 2.0"
+ strategy_google_oauth2: "Google OAuth2"
+ strategy_github: "GitHub"
name_label: "Név"
name_placeholder: "pl.: openid_connect, keycloak, authentik"
name_help: "Egyedi azonosító (csak kisbetűk, számok és aláhúzás)"
@@ -69,9 +86,13 @@ hu:
redirect_uri_label: "Átirányítási URI"
redirect_uri_placeholder: "https://a-te-domainedet.com/auth/openid_connect/callback"
redirect_uri_help: "Visszahívási URL, amelyet konfigurálni kell az identitásszolgáltatódban"
+ saml_sp_callback_url_label: "SP visszahívási URL (ACS URL)"
+ saml_sp_callback_url_help: "Ezt az URL-t kell megadni az Assertion Consumer Service URL-ként az IdP-ben"
copy_button: "Másolás"
cancel: "Mégse"
submit: "Szolgáltató mentése"
+ create_provider: "Szolgáltató létrehozása"
+ update_provider: "Szolgáltató frissítése"
errors_title: "%{count} hiba akadályozta meg a szolgáltató mentését:"
provisioning_title: "Felhasználói kiépítés"
default_role_label: "Alapértelmezett szerepkör az új felhasználókhoz"
diff --git a/config/locales/views/brex_items/hu.yml b/config/locales/views/brex_items/hu.yml
new file mode 100644
index 000000000..6d182321a
--- /dev/null
+++ b/config/locales/views/brex_items/hu.yml
@@ -0,0 +1,277 @@
+---
+hu:
+ brex_items:
+ default_connection_name: Brex kapcsolat
+ account_metadata:
+ provider: Brex
+ separator: " • "
+ kinds:
+ cash: Készpénz
+ card: Kártya
+ statuses:
+ ACTIVE: Aktív
+ active: Aktív
+ CLOSED: Lezárt
+ closed: Lezárt
+ frozen: Befagyasztott
+ FROZEN: Befagyasztott
+ create:
+ success: Brex kapcsolat sikeresen létrehozva
+ default_card_name: Brex kártya
+ default_cash_name: "Brex készpénz %{id}"
+ destroy:
+ success: Brex kapcsolat eltávolítva
+ index:
+ title: Brex kapcsolatok
+ institution_summary:
+ none: Nincs csatlakoztatott intézmény
+ one: "%{name}"
+ count:
+ one: "%{count} intézmény"
+ other: "%{count} intézmény"
+ sync_status:
+ no_accounts: Nem találhatók számlák
+ all_synced:
+ one: "%{count} számla szinkronizálva"
+ other: "%{count} számla szinkronizálva"
+ partial_setup: "%{synced} szinkronizálva, %{pending} beállítást igényel"
+ api_error:
+ common_issues: "Gyakori problémák:"
+ expired_credentials: Generálj új API-tokent a Brex-ből.
+ expired_credentials_label: "Lejárt hitelesítő adatok:"
+ heading: Nem sikerült csatlakozni a Brex-hez
+ invalid_token: Ellenőrizd az API-tokenedet a Szolgáltatói beállításokban.
+ invalid_token_label: "Érvénytelen API-token:"
+ network: Ellenőrizd az internetkapcsolatodat.
+ network_label: "Hálózati probléma:"
+ permissions: Győződj meg róla, hogy a token rendelkezik a szükséges csak olvasható fiók- és tranzakciós hatókörökkel.
+ permissions_label: "Elégtelen jogosultságok:"
+ service: A Brex API ideiglenesen nem elérhető.
+ service_label: "Szolgáltatás leállása:"
+ settings_link: Szolgáltatói beállítások ellenőrzése
+ title: Brex kapcsolódási hiba
+ errors:
+ unexpected_error: Váratlan hiba történt. Kérlek próbáld újra később.
+ entries:
+ default_name: Brex tranzakció
+ loading:
+ loading_message: Brex számlák betöltése...
+ loading_title: Betöltés
+ link_accounts:
+ all_already_linked:
+ one: "A kiválasztott számla (%{names}) már össze van kapcsolva"
+ other: "Mind a(z) %{count} kiválasztott számla már össze van kapcsolva: %{names}"
+ api_error: "API hiba: %{message}"
+ invalid_account_names:
+ one: "Nem lehet összekapcsolni üres nevű számlát"
+ other: "Nem lehet összekapcsolni %{count} üres nevű számlát"
+ invalid_account_type: Nem támogatott Brex számlatípus
+ link_failed: Nem sikerült összekapcsolni a számlákat
+ no_accounts_selected: Kérlek válassz legalább egy számlát
+ no_api_token: Brex API-token nem található. Kérlek állítsd be a Szolgáltatói beállításokban.
+ partial_invalid: "%{created_count} számla sikeresen összekapcsolva, %{already_linked_count} már össze volt kapcsolva, %{invalid_count} számla nevei érvénytelenek"
+ partial_success: "%{created_count} számla sikeresen összekapcsolva. %{already_linked_count} már össze volt kapcsolva: %{already_linked_names}"
+ select_connection: Válassz Brex kapcsolatot a számlák összekapcsolása előtt.
+ success:
+ one: "%{count} számla sikeresen összekapcsolva"
+ other: "%{count} számla sikeresen összekapcsolva"
+ brex_item:
+ accounts_need_setup: Számlák beállítást igényelnek
+ delete: Kapcsolat törlése
+ deletion_in_progress: törlés folyamatban...
+ error: Hiba
+ no_accounts_description: Ehhez a kapcsolathoz még nincsenek összekapcsolt számlák.
+ no_accounts_title: Nincsenek számlák
+ setup_action: Új számlák beállítása
+ setup_description: "%{linked} / %{total} számla összekapcsolva. Válaszd ki az újonnan importált Brex számlák típusait."
+ setup_needed: Új számlák beállításra várnak
+ status: "Szinkronizálva %{timestamp} ezelőtt"
+ status_never: Még nem szinkronizált
+ status_with_summary: "Utolsó szinkronizálás %{timestamp} ezelőtt - %{summary}"
+ syncing: Szinkronizálás...
+ total: Összesen
+ unlinked: Nincs összekapcsolva
+ provider_panel:
+ accounts_link: Számlák
+ add_connection: Brex kapcsolat hozzáadása
+ base_url_label: Alap URL (opcionális)
+ base_url_placeholder: https://api.brex.com
+ configured_html: "Konfigurálva és használatra kész. Látogass el a %{accounts_link} fülre a számlák kezeléséhez és beállításához."
+ connection_name_label: Kapcsolat neve
+ connection_name_placeholder: Üzleti folyószámla
+ default_connection_name: Brex kapcsolat
+ disconnect_label: "%{name} szétkapcsolása"
+ disconnect_confirm: "%{name} szétkapcsolása?"
+ encryption_warning:
+ title: Az adatbázis-titkosítás nincs konfigurálva
+ message: Állítsd be az Active Record titkosítási kulcsokat, mielőtt Brex tokeneket adsz hozzá az éles környezetben. Titkosítási kulcsok nélkül a Sure a Brex szolgáltatói hitelesítő adatokat és pillanatfelvételeket más szolgáltatói rekordokhoz hasonlóan titkosítatlanul tárolja.
+ instructions:
+ copy_token_html: "Másold ki a tokent és add hozzá alább megnevezett kapcsolatként. A Sure csak a token nevű szinkronizáláshoz tárolja azt ehhez a háztartáshoz."
+ create_token: "Hozz létre API-tokent ezekkel a csak olvasható hatókörökkel: accounts.cash.readonly, accounts.card.readonly, transactions.cash.readonly, transactions.card.readonly"
+ open_tokens: Menj a csatlakoztatni kívánt vállalat Brex fejlesztői/API-token beállításaiba
+ sign_in_html: "Látogass el ide: %{link}, és lépj be a csatlakoztatni kívánt fiókba"
+ keep_token_placeholder: Hagyd üresen az aktuális token megtartásához
+ not_configured: Nincs beállítva
+ sandbox_note_html: "Minden szinkronizálni kívánt Brex vállalathoz/API-tokenhez használj külön megnevezett kapcsolatot. Az Alap URL-t hagyd üresen az éles környezethez. A tesztkörnyezet csak a Brex által jóváhagyott tesztelésre korlátozódik, és nem működik ügyfél tokenekkel."
+ setup_accounts: Számlák beállítása
+ setup_title: "Beállítási utasítások:"
+ sync: Szinkronizálás
+ token_label: Token
+ token_placeholder: Illeszt be tokent ide
+ update_connection: Kapcsolat frissítése
+ provider_connection:
+ default_description: Csatlakozás Brex fiókhoz
+ default_name: Brex
+ description: "Csatlakozás ezzel: %{name}"
+ name: "Brex - %{name}"
+ select_accounts:
+ accounts_selected: kiválasztott számla
+ api_error: "API hiba: %{message}"
+ cancel: Mégse
+ configure_name_in_brex: Nem importálható — kérlek állítsd be a számla nevét a Brex-ben
+ description: "Válaszd ki azokat a számlákat, amelyeket össze szeretnél kapcsolni a(z) %{product_name} fiókkal."
+ link_accounts: Kiválasztott számlák összekapcsolása
+ no_accounts_found: Nem találhatók számlák. Kérlek ellenőrizd az API-token konfigurációdat.
+ no_api_token: Brex API-token nem található. Kérlek állítsd be a Szolgáltatói beállításokban.
+ no_credentials_configured: Kérlek előbb állítsd be a Brex API-tokenedet a Szolgáltatói beállításokban.
+ no_name_placeholder: "(Nincs név)"
+ select_connection: Válassz Brex kapcsolatot a Szolgáltatói beállításokban.
+ title: Brex számlák kiválasztása
+ unexpected_error: Váratlan hiba történt. Kérlek próbáld újra később.
+ select_existing_account:
+ account_already_linked: Ez a számla már össze van kapcsolva egy szolgáltatóval
+ all_accounts_already_linked: Minden Brex számla már össze van kapcsolva
+ api_error: "API hiba: %{message}"
+ cancel: Mégse
+ configure_name_in_brex: Nem importálható — kérlek állítsd be a számla nevét a Brex-ben
+ description: Válassz egy Brex számlát, amelyet ehhez a számlához szeretnél kapcsolni. A tranzakciók automatikusan szinkronizálásra és deduplikálásra kerülnek.
+ link_account: Számla összekapcsolása
+ no_account_specified: Nem lett megadva számla
+ no_accounts_found: Nem találhatók Brex számlák. Kérlek ellenőrizd az API-token konfigurációdat.
+ no_api_token: Brex API-token nem található. Kérlek állítsd be a Szolgáltatói beállításokban.
+ no_credentials_configured: Kérlek előbb állítsd be a Brex API-tokenedet a Szolgáltatói beállításokban.
+ no_name_placeholder: "(Nincs név)"
+ select_connection: Válassz Brex kapcsolatot a Szolgáltatói beállításokban.
+ title: "%{account_name} összekapcsolása a Brex-szel"
+ unexpected_error: Váratlan hiba történt. Kérlek próbáld újra később.
+ setup_required:
+ description: A Brex számlák összekapcsolása előtt be kell állítanod a Brex API-tokenedet.
+ heading: Az API-token nincs beállítva
+ settings_link: Szolgáltatói beállítások megnyitása
+ setup_steps: "Beállítási lépések:"
+ steps:
+ enter_token: Add meg a Brex API-tokenedet
+ find_section_html: "Keresd meg a Brex részt"
+ open_settings_html: "Menj a Beállítások > Szolgáltatók menübe"
+ return_to_link: Térj vissza ide a számlák összekapcsolásához
+ title: Brex beállítás szükséges
+ subtype_select:
+ placeholder:
+ subtype: Altípus kiválasztása
+ type: Típus kiválasztása
+ link_existing_account:
+ account_already_linked: Ez a számla már össze van kapcsolva egy szolgáltatóval
+ api_error: "API hiba: %{message}"
+ invalid_account_name: Nem lehet összekapcsolni üres nevű számlát
+ missing_parameters: Hiányzó kötelező paraméterek
+ no_account_specified: Nem lett megadva számla
+ no_api_token: Brex API-token nem található. Kérlek állítsd be a Szolgáltatói beállításokban.
+ provider_account_already_linked: Ez a Brex számla már össze van kapcsolva egy másik számlával
+ provider_account_not_found: Brex számla nem található
+ select_connection: Válassz Brex kapcsolatot a számlák összekapcsolása előtt.
+ success: "%{account_name} sikeresen összekapcsolva a Brex-szel"
+ setup_accounts:
+ account_type_label: "Számla típusa:"
+ all_accounts_linked: "Minden Brex számlád már be van állítva."
+ api_error: "API hiba: %{message}"
+ fetch_failed: "Nem sikerült lekérni a számlákat"
+ no_accounts_to_setup: "Nincs beállítandó számla"
+ no_api_token: Brex API-token nem található. Kérlek állítsd be a Szolgáltatói beállításokban.
+ account_types:
+ skip: Számla kihagyása
+ depository: Folyó- vagy megtakarítási számla
+ credit_card: Hitelkártya
+ investment: Befektetési számla
+ loan: Hitel vagy jelzálog
+ other_asset: Egyéb vagyon
+ subtype_labels:
+ depository: "Számla altípusa:"
+ credit_card: ""
+ investment: "Befektetés típusa:"
+ loan: "Hitel típusa:"
+ other_asset: ""
+ subtype_messages:
+ credit_card: "A hitelkártyák automatikusan hitelkártya számlákként lesznek beállítva."
+ other_asset: "Az egyéb vagyonelemekhez nincs szükség további beállításokra."
+ subtypes:
+ depository:
+ checking: Folyószámla
+ savings: Megtakarítási számla
+ hsa: Egészségügyi megtakarítási számla
+ cd: Lekötött betét
+ money_market: Pénzpiaci számla
+ investment:
+ brokerage: Brókeri számla
+ pension: Nyugdíjalap
+ retirement: Nyugdíj-megtakarítás
+ "401k": "401(k)"
+ roth_401k: "Roth 401(k)"
+ "403b": "403(b)"
+ tsp: Thrift Savings Plan
+ "529_plan": "529 Terv"
+ hsa: Egészségügyi megtakarítási számla
+ mutual_fund: Befektetési alap
+ ira: Hagyományos IRA
+ roth_ira: Roth IRA
+ angel: Angyal befektető
+ loan:
+ mortgage: Jelzálog
+ student: Diákhitel
+ auto: Autóhitel
+ other: Egyéb hitel
+ balance: Egyenleg
+ cancel: Mégse
+ choose_account_type: "Válaszd ki a megfelelő számlatípust minden Brex számlához:"
+ create_accounts: Számlák létrehozása
+ creating_accounts: Számlák létrehozása...
+ historical_data_range: "Előzmények időtartama:"
+ subtitle: Válaszd ki az importált számlák helyes típusait
+ sync_start_date_help: "Válaszd ki, milyen messzire szeretnél visszamenni a tranzakciós előzmények szinkronizálásában. Maximum 3 év előzmény érhető el."
+ sync_start_date_label: "Tranzakciók szinkronizálásának kezdete:"
+ title: Brex számlák beállítása
+ complete_account_setup:
+ all_skipped: "Minden számla ki lett hagyva. Nem jött létre számla."
+ creation_failed: "Nem sikerült létrehozni a számlákat: %{error}"
+ creation_failed_count: "%{count} számla létrehozása sikertelen."
+ no_accounts: "Nincs beállítandó számla."
+ partial_skipped: "%{created_count} számla sikeresen létrehozva; %{skipped_count} számla ki lett hagyva."
+ partial_success: "%{created_count} számla sikeresen létrehozva, de %{failed_count} számla sikertelen volt."
+ success: "%{count} számla sikeresen létrehozva."
+ unexpected_error: Váratlan hiba történt.
+ sync:
+ success: Szinkronizálás elindítva
+ syncer:
+ account_processing_failed:
+ one: "%{count} Brex számla feldolgozása sikertelen volt."
+ other: "%{count} Brex számla feldolgozása sikertelen volt."
+ account_sync_failed:
+ one: "%{count} Brex számla szinkronizálása nem ütemezható."
+ other: "%{count} Brex számla szinkronizálása nem ütemezható."
+ accounts_need_setup:
+ one: "%{count} számla beállítást igényel..."
+ other: "%{count} számla beállítást igényel..."
+ accounts_failed:
+ one: "%{count} Brex számla importálása sikertelen volt."
+ other: "%{count} Brex számla importálása sikertelen volt."
+ calculating_balances: Egyenlegek kiszámítása...
+ checking_account_configuration: Számlakonfiguráció ellenőrzése...
+ credentials_invalid: Érvénytelen Brex API-token vagy számlajogosultságok
+ failed: A szinkronizálás sikertelen volt. Kérlek próbáld újra, vagy lépj kapcsolatba a támogatással.
+ import_failed: Brex importálás sikertelen.
+ importing_accounts: Számlák importálása a Brex-ből...
+ processing_transactions: Tranzakciók feldolgozása...
+ transactions_failed:
+ one: "%{count} Brex számlánál tranzakciós importálási hibák léptek fel."
+ other: "%{count} Brex számlánál tranzakciós importálási hibák léptek fel."
+ update:
+ success: Brex kapcsolat frissítve
diff --git a/config/locales/views/budgets/hu.yml b/config/locales/views/budgets/hu.yml
index 109ca752a..0d0fc5312 100644
--- a/config/locales/views/budgets/hu.yml
+++ b/config/locales/views/budgets/hu.yml
@@ -1,6 +1,34 @@
---
hu:
budgets:
+ budget_donut:
+ spent: "Elköltve"
+ new_budget: "Új költségvetés"
+ of_budget: "%{amount}-ból/ből"
+ unused: "Felhasználatlan"
+ budget_header:
+ today: "Ma"
+ over_allocation_warning:
+ over_allocated_message: "Túllépted a költségvetési keretét. Kérjük, javítsd az elosztásokat."
+ fix_allocations: "Elosztások javítása"
+ actuals_summary:
+ income: "Bevétel"
+ expenses: "Kiadások"
+ budgeted_summary:
+ expected_income: "Várható bevétel"
+ budgeted: "Tervezett"
+ earned: "%{amount} megkeresve"
+ over: "%{amount} túllépve"
+ left: "%{amount} maradt"
+ spent: "%{amount} elköltve"
+ edit:
+ setup_title: "Állítsd be a költségvetésed"
+ setup_description: "Add meg a havi bevételeidet és tervezett kiadásaidat a költségvetés beállításához."
+ budgeted_spending: "Tervezett kiadások"
+ expected_income: "Várható bevétel"
+ autosuggest_title: "Bevételi és kiadási keret automatikus javaslata"
+ autosuggest_description: "Ez a tranzakcióelőzmények alapján készül. Az AI hibázhat, ellenőrizd folytatás előtt."
+ continue: "Folytatás"
name:
custom_range: "%{start} - %{end_date}"
month_year: "%{month}"
@@ -31,3 +59,27 @@ hu:
success: "Költségvetés átmásolva innen: %{source_name}"
no_source: "Nem található korábbi költségvetés a másoláshoz"
already_initialized: "Ez a költségvetés már be van állítva"
+ budget_categories:
+ confirm_button:
+ confirm: "Megerősítés"
+ no_categories:
+ oops: "Hoppá!"
+ no_categories_message: "Még nem hoztál létre kiadási kategóriákat, és nem rendeltél egyet sem a tranzakcióidhoz."
+ use_defaults: "Alapértelmezések használata (ajánlott)"
+ new_category: "Új kategória"
+ index:
+ title: "Kategóriakereteid szerkesztése"
+ description: "Állítsd be a kategóriakereteket a kiadási limitek meghatározásához. A fel nem osztott összegek automatikusan kategorizálatlanként kerülnek hozzárendelésre."
+ show:
+ category: "Kategória"
+ overview: "Áttekintés"
+ spending: "%{date} kiadásai"
+ status: "Állapot"
+ overspent: "túllépve"
+ left: "maradt"
+ budgeted: "Tervezett"
+ monthly_average_spending: "Havi átlagos kiadás"
+ monthly_median_spending: "Havi mediánkiadás"
+ recent_transactions: "Legutóbbi tranzakciók"
+ view_all_transactions: "Összes kategória tranzakció megtekintése"
+ no_transactions: "Nem találhatók tranzakciók erre a költségvetési időszakra."
diff --git a/config/locales/views/categories/hu.yml b/config/locales/views/categories/hu.yml
index bff8ce2d6..a10c00072 100644
--- a/config/locales/views/categories/hu.yml
+++ b/config/locales/views/categories/hu.yml
@@ -14,11 +14,20 @@ hu:
edit: Kategória szerkesztése
form:
placeholder: Kategória neve
+ name_label: Név
+ unassigned: "(nincs hozzárendelve)"
+ parent_category_label: "Szülőkategória (nem kötelező)"
+ color: Szín
+ icon: Ikon
+ poor_contrast: "Gyenge kontraszt, válassz sötétebb színt vagy"
+ destroy_all:
+ success: Összes kategória törölve
index:
bootstrap: Alapértelmezések használata (ajánlott)
categories: Kategóriák
categories_expenses: Kiadás kategóriák
categories_incomes: Bevétel kategóriák
+ delete_all: Összes törlése
empty: Nem található kategória
new: Új kategória
menu:
@@ -27,8 +36,16 @@ hu:
new_category: Új kategória
update:
success: Kategória sikeresen frissítve
+ virtual:
+ transfer: Átutalás
+ payment: Fizetés
+ trade: Ügylet
category:
dropdowns:
show:
bootstrap: Alapértelmezett kategóriák létrehozása
empty: Nem található kategória
+ match_transfer: "Átutalás/fizetés párosítása"
+ one_time: "Egyszeri %{type}"
+ income: "bevétel"
+ expense: "kiadás"
diff --git a/config/locales/views/chats/hu.yml b/config/locales/views/chats/hu.yml
index 3995ec692..6e4830ac1 100644
--- a/config/locales/views/chats/hu.yml
+++ b/config/locales/views/chats/hu.yml
@@ -4,3 +4,41 @@ hu:
demo_banner_title: "Demo mód aktív"
demo_banner_message: "LLM-eket használsz a Cloudflare Workers AI által biztosított krediteken keresztül. Az eredmények változhatnak, mivel a kódot `gpt-4.1`-en tesztelték, de a tokenjeid nem kerülnek sehova tanítás céljából! 🤖"
thinking: "Gondolkodás..."
+ ai_greeting:
+ greeting: "Szia, %{name}! Egy AI/nagy nyelvi modell vagyok, aki segíthet pénzügyeid kezelésében. Hozzáférhetek az internethez és a fiókadataidhoz."
+ there: "ott"
+ commands_hint_html: "Használd a / jelet a parancsok eléréséhez"
+ questions_intro: "Íme néhány kérdés, amit feltehetsz:"
+ evaluate_portfolio: "Befektetési portfólió értékelése"
+ spending_insights: "Kiadási statisztikák megtekintése"
+ unusual_patterns: "Szokatlan minták keresése"
+ chat:
+ edit_chat_title: "Csevegés nevének szerkesztése"
+ delete_chat: "Csevegés törlése"
+ chat_nav:
+ all_chats: "Összes csevegés"
+ start_new_chat: "Új csevegés indítása"
+ edit_chat_title: "Csevegés nevének szerkesztése"
+ delete_chat: "Csevegés törlése"
+ error:
+ retry: "Újrapróbálás"
+ destroy:
+ notice: "A csevegés sikeresen törölve"
+ index:
+ chats: "Csevegések"
+ new_chat: "Új csevegés"
+ update:
+ success: "Csevegés frissítve"
+ ai_consent:
+ title: "AI-csevegések engedélyezése"
+ available_description: "Az AI-csevegés pénzügyi kérdésekre tud válaszolni és az adataid alapján elemzéseket nyújtani. A funkció használatához explicit engedélyezés szükséges."
+ unavailable_description_html: "Az AI-asszisztens használatához be kell állítanod az OPENAI_ACCESS_TOKEN környezeti változót, vagy konfigurálnod kell az önálló üzemeltetési beállításokban."
+ enable_button: "AI-csevegések engedélyezése"
+ disable_note: "Bármikor letiltható. Az LLM-szolgáltatóknak küldött összes adat anonimizált."
+ assistant_messages:
+ assistant_message:
+ assistant_reasoning: "Asszisztens gondolkodása"
+ tool_calls:
+ tool_calls: "Eszközhívások"
+ function: "Függvény:"
+ arguments: "Argumentumok:"
diff --git a/config/locales/views/components/hu.yml b/config/locales/views/components/hu.yml
index c0145c036..7eaea51d6 100644
--- a/config/locales/views/components/hu.yml
+++ b/config/locales/views/components/hu.yml
@@ -1,5 +1,24 @@
---
hu:
+ UI:
+ account:
+ activity_feed:
+ toggle_selection_checkboxes: Kijelölés be-/kikapcsolása
+ chart:
+ no_data_available: "Nincs elérhető adat"
+ activity_date:
+ balance_tooltip: "A nap végi egyenleg, az összes tranzakció és korrekció után"
+ no_balance_data: "Erre a dátumra nincs elérhető egyenlegadat"
+ ds:
+ alert:
+ variants:
+ info: Információ
+ success: Siker
+ warning: Figyelmeztetés
+ error: Hiba
+ destructive: Hiba
+ dialog:
+ close: Bezárás
provider_sync_summary:
title: Szinkronizálás összegzése
last_sync: "Utolsó szinkronizálás: %{time_ago} ezelőtt"
diff --git a/config/locales/views/credit_cards/hu.yml b/config/locales/views/credit_cards/hu.yml
index e037fc0ee..be82b379d 100644
--- a/config/locales/views/credit_cards/hu.yml
+++ b/config/locales/views/credit_cards/hu.yml
@@ -20,6 +20,7 @@ hu:
annual_fee: Éves díj
apr: THM
available_credit: Rendelkezésre álló hitelkeret
+ edit_account_details: Számlaadatok szerkesztése
expiration_date: Lejárati dátum
minimum_payment: Minimális törlesztőrészlet
unknown: Ismeretlen
diff --git a/config/locales/views/enable_banking_items/hu.yml b/config/locales/views/enable_banking_items/hu.yml
index d96307af5..79a3282f0 100644
--- a/config/locales/views/enable_banking_items/hu.yml
+++ b/config/locales/views/enable_banking_items/hu.yml
@@ -39,8 +39,53 @@ hu:
errors:
only_manual: Csak manuális számlákat lehet összekapcsolni
invalid_enable_banking_account: Érvénytelen Enable Banking-számla választva
+ enable_banking_item:
+ deletion_in_progress: Törlés folyamatban
+ provider_name: Enable Banking
+ syncing: Szinkronizálás...
+ reconnect: Újracsatlakozás
+ last_synced: Utoljára szinkronizálva %{time} ezelőtt
+ never_synced: Még nem szinkronizált
+ update: Frissítés
+ delete: Törlés
+ setup_needed: Beállítás szükséges
+ setup_needed_description:
+ one: 1 Enable Banking-ből importált számla beállítása szükséges
+ other: "%{count} Enable Banking-ből importált számla beállítása szükséges"
+ set_up_accounts: Számlák beállítása
+ no_accounts_found: Nem található számla
+ no_accounts_found_description: Nem található számla az Enable Banking-ből. Próbálj újra szinkronizálni.
+ select_existing_account:
+ title: Enable Banking-számla összekapcsolása
+ all_linked: Úgy tűnik, minden Enable Banking-számla már össze van kapcsolva.
+ try_after_sync: Ha most csatlakoztál vagy szinkronizáltál, próbálj újra a szinkronizálás befejezése után.
+ unlink_to_move: Másik számla összekapcsolásához először válaszd le a számlán a műveletek menüből.
+ balance: Egyenleg
+ link: Összekapcsolás
+ cancel: Mégse
new:
link_enable_banking_title: Enable Banking összekapcsolása
+ session_expired: A munkamenet lejárt – újraengedélyezés szükséges
+ connected_bank: Csatlakoztatott bank
+ session_expires: "Munkamenet lejárata"
+ unknown: Ismeretlen
+ connection: Kapcsolat
+ configured: Konfigurálva
+ ready_to_connect: Kész egy bank csatlakoztatására
+ sync: Szinkronizálás
+ reconnect: Újracsatlakozás
+ connect_bank: Bank csatlakoztatása
+ remove_confirm: Biztosan el szeretnéd távolítani ezt a kapcsolatot?
+ remove: Eltávolítás
+ add_connection: Kapcsolat hozzáadása
+ not_configured: Az Enable Banking kapcsolat nincs konfigurálva
+ not_configured_description: Mielőtt Enable Banking-számlákat kapcsolnál össze, konfigurálnod kell az Enable Banking kapcsolatot.
+ setup_steps_title: "Beállítási lépések:"
+ setup_step_1_html: "Menj a Beállítások → Szolgáltatók menübe"
+ setup_step_2_html: "Keresd meg az Enable Banking részt"
+ setup_step_3: Add meg az Enable Banking hitelesítő adatait
+ setup_step_4: Térj vissza ide a számlák összekapcsolásához
+ go_to_provider_settings: Ugrás a szolgáltató beállításaihoz
reauthorize:
invalid_redirect: A kapott engedélyezési URL érvénytelen. Kérjük, próbáld újra.
reauthorization_failed: Az újraengedélyezés sikertelen
@@ -56,6 +101,17 @@ hu:
search_placeholder: Keresd meg a bankod...
title: Válaszd ki a bankod
setup_accounts:
+ title: Enable Banking-számlák beállítása
+ header_subtitle: Válaszd ki a megfelelő számlatípusokat az importált számlákhoz
+ choose_account_type: "Válaszd ki az egyes Enable Banking-számlák megfelelő számlatípusát:"
+ historical_data_range: "Historikus adatok tartománya:"
+ sync_start_date_label: "Tranzakciók szinkronizálásának kezdete:"
+ sync_start_date_help: Válaszd meg, milyen messzire nyúljon vissza a tranzakciótörténet szinkronizálása. Legfeljebb 2 év előzmény érhető el.
+ account_type_label: "Számlatípus:"
+ balance: Egyenleg
+ create_accounts: Számlák létrehozása
+ creating_accounts: Számlák létrehozása...
+ cancel: Mégse
psd2_savings_notice: "Megjegyzés: Egyes szabályozott francia megtakarítási számlákhoz (Livret A, PEL, LEP, LDDS) korlátozott vagy semmilyen hozzáférés nem áll rendelkezésre az Open Banking (PSD2) révén. Ha egy megtakarítási számla hiányzik, manuálisan is hozzáadhatod."
update:
success: Az Enable Banking konfiguráció frissítve.
diff --git a/config/locales/views/family_exports/hu.yml b/config/locales/views/family_exports/hu.yml
index 626a42e4e..35f49accb 100644
--- a/config/locales/views/family_exports/hu.yml
+++ b/config/locales/views/family_exports/hu.yml
@@ -10,6 +10,18 @@ hu:
success: Az export sikeresen törölve
export_not_ready: Az export még nem áll készen a letöltésre
exporting: Exportálás folyamatban...
+ new:
+ dialog_title: Adataid exportálása
+ dialog_subtitle: Töltsd le az összes pénzügyi adatodat
+ whats_included: "Mi kerül bele:"
+ accounts_and_balances: Összes számla és egyenleg
+ transaction_history: Tranzakciótörténet
+ investment_trades: Befektetési ügyletek
+ categories_tags_rules: Kategóriák, címkék és szabályok
+ note_label: Megjegyzés
+ note_description: Ez az export tartalmazza az összes adatodat, de csak egy részük importálható vissza a CSV importálás funkcióval. Számlák, tranzakciók (kategóriával és címkékkel) és kereskedések importálása támogatott. Más számlaadat nem importálható, csak nyilvántartás céljából szerepel.
+ cancel: Mégse
+ export_data: Adatok exportálása
index:
title: Exportok
new: Új export
diff --git a/config/locales/views/holdings/hu.yml b/config/locales/views/holdings/hu.yml
index d8b6067a4..c685e9803 100644
--- a/config/locales/views/holdings/hu.yml
+++ b/config/locales/views/holdings/hu.yml
@@ -5,6 +5,7 @@ hu:
brokerage_cash: Brókeri készpénz
destroy:
success: Pozíció törölve
+ cannot_delete: Ez a pozíció nem törölhető
update:
success: Bekerülési érték mentve.
error: Érvénytelen bekerülési érték.
@@ -27,6 +28,7 @@ hu:
provider: Szolgáltatótól
cost_basis_cell:
unknown: "--"
+ set: Megadás
set_cost_basis_header: "Bekerülési érték megadása: %{ticker} (%{qty} részvény)"
total_cost_basis_label: Teljes bekerülési érték
or_per_share_label: "Vagy add meg részvényenként:"
diff --git a/config/locales/views/ibkr_items/hu.yml b/config/locales/views/ibkr_items/hu.yml
new file mode 100644
index 000000000..d24742859
--- /dev/null
+++ b/config/locales/views/ibkr_items/hu.yml
@@ -0,0 +1,92 @@
+---
+hu:
+ providers:
+ ibkr:
+ name: Interactive Brokers
+ connection_description: Csatlakozás egy Interactive Brokers Flex Web Service jelentéshez
+ institution_name: Interactive Brokers
+ ibkr_items:
+ defaults:
+ name: Interactive Brokers
+ ibkr_item:
+ deletion_in_progress: Törlés folyamatban
+ flex_web_service: Flex Web Service
+ syncing: Szinkronizálás
+ requires_update: A hitelesítő adatok figyelmet igényelnek
+ error: Hiba
+ synced: Szinkronizálva %{time} ezelőtt. %{summary}.
+ never_synced: Még nem szinkronizált.
+ setup_accounts: Számlák beállítása
+ delete: Törlés
+ accounts_need_setup: A számlák beállítást igényelnek
+ accounts_need_setup_description: Az IBKR-ből importált néhány számlát össze kell kapcsolni a Sure-számlákkal.
+ no_accounts_discovered: Még nem találhatók IBKR-számlák.
+ no_accounts_discovered_description: Futtass egy szinkronizálást a Flex-lekérdezés konfigurálása után a számlák felderítéséhez.
+ setup_accounts:
+ page_title: Interactive Brokers-számlák beállítása
+ dialog_title: Interactive Brokers-számlák beállítása
+ subtitle: Válaszd ki, melyik IBKR brókerszámlákat szeretnéd összekapcsolni.
+ info_box:
+ title: IBKR Flex Query importálás
+ items:
+ item_1: Pozíciók aktuális árakkal és mennyiségekkel
+ item_2: Bekerülési érték pozíciónként
+ item_3: Ügyletek, osztalékok, jutalékok és készpénzbefizetések vagy -kifizetések
+ warning: A historikus tevékenység a Flex Query jelentési ablakára korlátozódik
+ status:
+ fetching_accounts: Számlák lekérése az Interactive Brokers-től...
+ no_accounts_found_title: Nem található számla.
+ no_accounts_found_description: A Sure nem talált IBKR-számlákat a legutóbbi Flex-jelentésben.
+ available_accounts:
+ title: Elérhető számlák
+ account_type_investment: Befektetés
+ account_summary: "%{account_type} • Egyenleg: %{balance}"
+ account_id: "Számlaazonosító: %{account_id}"
+ link_existing:
+ description: Vagy kapcsolj össze egy felderített IBKR-számlát egy meglévő manuális befektetési számlával.
+ manual_account_option: "%{name} (%{balance})"
+ select_prompt: Válassz számlát...
+ linked_accounts:
+ title: Már összekapcsolt
+ linked_to_html: "Összekapcsolva: %{account}"
+ buttons:
+ refresh: Frissítés
+ cancel: Mégse
+ back_to_settings: Vissza a beállításokhoz
+ create_selected_accounts: Kijelölt számlák létrehozása
+ link: Összekapcsolás
+ done: Kész
+ sync_status:
+ no_accounts: Még nem találhatók IBKR-számlák
+ all_linked:
+ one: 1 számla összekapcsolva
+ other: "%{count} számla összekapcsolva"
+ partial: "%{linked} összekapcsolt, %{unlinked} beállítást igényel"
+ select_existing_account:
+ title: Interactive Brokers-számla összekapcsolása
+ no_accounts_available: Még nem érhető el összekapcsolatlan Interactive Brokers-számla.
+ run_sync_hint: "Futtass szinkronizálást a Beállítások > Szolgáltatók menüből a Flex-lekérdezés frissítése után."
+ wait_for_sync: Várd meg, amíg a számlafelderítési szinkronizálás befejeződik.
+ balance: Egyenleg
+ link: Összekapcsolás
+ cancel: Mégse
+ create:
+ success: Az Interactive Brokers sikeresen konfigurálva.
+ update:
+ success: Az Interactive Brokers konfigurációja sikeresen frissítve.
+ destroy:
+ success: Az Interactive Brokers kapcsolat törlési sorba került.
+ select_accounts:
+ not_configured: Az Interactive Brokers nincs konfigurálva.
+ link_existing_account:
+ not_found: A számla vagy az Interactive Brokers konfiguráció nem található.
+ only_manual_investment: Csak manuális befektetési számlák kapcsolhatók össze az Interactive Brokers-szel.
+ already_linked: Ez az Interactive Brokers-számla már össze van kapcsolva.
+ success: Sikeresen összekapcsolva az Interactive Brokers-számlával.
+ failed: Nem sikerült összekapcsolni az Interactive Brokers-számlával.
+ complete_account_setup:
+ success:
+ one: Sikeresen létrehozva %{count} Interactive Brokers-számla.
+ other: Sikeresen létrehozva %{count} Interactive Brokers-számla.
+ none_selected: Nem lett számla kijelölve.
+ none_created: Nem lett számla létrehozva.
diff --git a/config/locales/views/impersonation_sessions/hu.yml b/config/locales/views/impersonation_sessions/hu.yml
index 17025d85f..d8a1a672d 100644
--- a/config/locales/views/impersonation_sessions/hu.yml
+++ b/config/locales/views/impersonation_sessions/hu.yml
@@ -13,3 +13,13 @@ hu:
success: Kilépés a munkamenetből megtörtént
reject:
success: Kérés elutasítva
+ super_admin_bar:
+ super_admin: Super Admin
+ jobs: Feladatok
+ impersonating: Megszemélyesítés
+ leave: Kilépés
+ terminate: Befejezés
+ join_a_session: Csatlakozás munkamenethez
+ join: Csatlakozás
+ uuid_placeholder: UUID
+ request_impersonation: Megszemélyesítés kérése
diff --git a/config/locales/views/imports/hu.yml b/config/locales/views/imports/hu.yml
index 4f0f11b7b..8221e18fe 100644
--- a/config/locales/views/imports/hu.yml
+++ b/config/locales/views/imports/hu.yml
@@ -2,6 +2,8 @@
hu:
import:
qif_category_selections:
+ update:
+ success: "Kategóriák és címkék mentve."
show:
title: "Konfigurálás és kiválasztás"
description: "Ellenőrizd az automatikusan felismert dátumformátumot, majd válaszd ki, mely kategóriákat és címkéket szeretnéd beimportálni a QIF fájlodból a %{product_name} alkalmazásba."
@@ -27,13 +29,80 @@ hu:
submit: Tovább az áttekintéshez
cleans:
show:
+ not_configured: "Kérjük, konfiguráld az importálást a folytatás előtt."
description: Szerkeszd az adatokat az alábbi táblázatban. A piros cellák érvénytelen adatokat tartalmaznak.
errors_notice: Hibák vannak az adataidban. Vidd az egeret a hiba fölé a részletekért.
errors_notice_mobile: Hibák vannak az adataidban. Koppints a hibajelzőre a részletekért.
title: Adatok megtisztítása
+ data_cleaned: Az adataid megtisztítva
+ next_step: Következő lépés
+ all_rows: Összes sor
+ error_rows: Hibasorok
configurations:
update:
success: Az importálás konfigurálása sikeresen megtörtént.
+ account_import:
+ leave_empty: Hagyd üresen
+ default: Alapértelmezett
+ entity_type: Entitástípus
+ name: Név
+ balance: Egyenleg
+ currency: Pénznem
+ balance_date: Egyenleg dátuma
+ date_format: Dátumformátum
+ select_format: Formátum kiválasztása
+ apply_configuration: Konfiguráció alkalmazása
+ transaction_import:
+ date_label: Dátum
+ select_column: Oszlop kiválasztása
+ select_format: Formátum kiválasztása
+ amount_label: Összeg
+ default: Alapértelmezett
+ currency_label: Pénznem
+ format_label: Formátum
+ amount_type_strategy_label: Összeg típusának stratégiája
+ select_strategy: Stratégia kiválasztása
+ set: Beállítás
+ as_amount_type_column: összeg típusa oszlopként
+ select_value: Érték kiválasztása
+ as_identifier_value: azonosítóértékként
+ treat_as_html: "Kezeld a \"%{value}\" értéket így:"
+ income_inflow: Bevétel (beérkező)
+ expense_outflow: Kiadás (kimenő)
+ select_type: Típus kiválasztása
+ leave_empty: Hagyd üresen
+ account_label: Számla
+ name_label: Név
+ category_label: Kategória
+ tags_label: Címkék
+ notes_label: Megjegyzések
+ apply_configuration: Konfiguráció alkalmazása
+ incomes_are_positive: A bevételek pozitívak
+ incomes_are_negative: A bevételek negatívak
+ amount_type_label: Összeg típusa
+ select_convention: Egyezmény kiválasztása
+ date_format_label: Dátumformátum
+ rows_to_skip_label: Első n sor kihagyása
+ trade_import:
+ select_column: Oszlop kiválasztása
+ date_label: Dátum
+ quantity_label: Mennyiség
+ buys_are_positive: A vételek pozitív mennyiségűek
+ buys_are_negative: A vételek negatív mennyiségűek
+ default: Alapértelmezett
+ currency_label: Pénznem
+ format_label: Formátum
+ select_format: Formátum kiválasztása
+ ticker_label: Tőzsdei szimbólum
+ leave_empty: Hagyd üresen
+ stock_exchange_code_label: Tőzsde kódja
+ price_label: Ár
+ account_label: Számla
+ name_label: Név
+ note_label: Megjegyzés
+ no_security_provider_warning: Az értékpapír-árszolgáltató nincs konfigurálva. Az ügyletek importálása működni fog, de a Sure nem tölti fel a korábbi árfolyamadatokat. Kérjük, menj a beállításokhoz és konfiguráld.
+ date_format_label: Dátumformátum
+ apply_configuration: Konfiguráció alkalmazása
category_import:
button_label: Folytatás
description: Tölts fel egy egyszerű CSV fájlt (például olyat, amit az adatexportáláskor generálunk). Az oszlopokat automatikusan leképezzük neked.
@@ -47,11 +116,6 @@ hu:
show:
description: Válaszd ki, melyik oszlopok felelnek meg a CSV egyes mezőinek.
title: Importálás konfigurálása
- trade_import:
- date_format_label: Dátumformátum
- transaction_import:
- date_format_label: Dátumformátum
- rows_to_skip_label: Első n sor kihagyása
confirms:
sure_import:
title: Importálás megerősítése
@@ -67,7 +131,9 @@ hu:
no_accounts: Még nincs egyetlen számlád sem. Kérjük, hozz létre egy számlát a CSV-ben nem hozzárendelt sorokhoz, vagy lépj vissza a Megtisztítás lépéshez, és adj meg egy használható számlanevet.
rows_label: Sorok
unassigned_account: Új számlát kell létrehoznod a nem hozzárendelt sorokhoz?
+ next: Tovább
show:
+ invalid_data: "Érvénytelen adatok találhatók, kérjük szerkeszd, amíg minden hibát ki nem javítasz"
account_mapping_description: Rendeld hozzá az importált fájl számláit a Maybe meglévő számláihoz. Új számlákat is hozzáadhatsz, vagy hagyhatod őket kategorizálatlanul.
account_mapping_title: Számlák hozzárendelése
account_type_mapping_description: Rendeld hozzá az importált fájl számlatípusait a Maybe típusaihoz.
@@ -77,7 +143,20 @@ hu:
tag_mapping_description: Rendeld hozzá az importált fájl címkéit a Maybe meglévő címkéihez. Új címkéket is hozzáadhatsz, vagy hagyhatod őket kategorizálatlanul.
tag_mapping_title: Címkék hozzárendelése
uploads:
+ update:
+ qif_uploaded: "QIF fájl sikeresen feltöltve."
show:
+ csv_invalid: "Érvényes CSV szükséges fejlécekkel és legalább egy adatsorral"
+ drop_csv_title: Húzd ide a CSV fájlt a feltöltéshez
+ drop_csv_subtitle: A fájl automatikusan feltöltődik
+ upload_csv_tab: CSV feltöltése
+ copy_paste_tab: Másolás és beillesztés
+ account_optional_label: Számla (nem kötelező)
+ multi_account_import: Több számlás importálás
+ upload_csv_button: CSV feltöltése
+ paste_csv_placeholder: Illeszd be ide a CSV fájl tartalmát
+ download_sample_csv: Minta CSV letöltése
+ to_see_format: a szükséges CSV formátum megtekintéséhez
qif_title: QIF fájl feltöltése
qif_description: Válaszd ki azt a számlát, amelyhez ez a QIF fájl tartozik, majd töltsd fel a Quickenből exportált .qif fájlodat.
qif_account_label: Számla
@@ -105,6 +184,58 @@ hu:
hint_html: Töltsd fel az all.ndjson fájlt az adatexport ZIP archívumból
ndjson_invalid: Érvényes NDJSON szükséges, legalább egy rekorddal
imports:
+ mapping_labels:
+ account_type: "Számlatípus"
+ account: "Számla"
+ category: "Kategória"
+ tag: "Címke"
+ column_labels:
+ date: "Dátum"
+ amount: "Összeg"
+ name: "Név"
+ currency: "Pénznem"
+ category: "Kategória"
+ tags: "Címkék"
+ account: "Számla"
+ notes: "Megjegyzések"
+ qty: "Mennyiség"
+ ticker: "Tőzsdei szimbólum"
+ exchange: "Tőzsde"
+ price: "Ár"
+ entity_type: "Típus"
+ category_parent: "Szülőkategória"
+ category_color: "Szín"
+ category_icon: "Lucide ikon"
+ update:
+ account_saved: "Számla mentve."
+ invalid_account: "Számla nem található."
+ publish:
+ started: "Az importálás a háttérben elindult."
+ max_rows_exceeded: "Az importálás meghaladja a maximális %{max} soros korlátot."
+ revert:
+ started: "Az importálás visszavonása a háttérben folyamatban van."
+ apply_template:
+ template_applied: "Sablon alkalmazva."
+ no_template_found: "Nem található sablon, kérjük konfiguráld manuálisan az importálást."
+ destroy:
+ deleted: "Az importálás törölve."
+ failure:
+ title: Az importálás sikertelen
+ description: Kérjük, ellenőrizd a fájlformátumot, az esetleges hibákat és hogy minden kötelező mező ki van töltve, majd próbáld újra.
+ try_again: Újrapróbálkozás
+ success:
+ title: Importálás sikeres
+ description: Az importált adatok sikeresen hozzáadásra kerültek az alkalmazáshoz, és most már használhatók.
+ back_to_dashboard: Vissza az irányítópultra
+ importing:
+ title: Importálás folyamatban
+ description: "Az importálás folyamatban van. Az állapotfrissítéseket az importálások menüben ellenőrizheted, vagy kattints az 'Állapot ellenőrzése' gombra az oldal frissítéséhez. Nyugodtan folytasd az alkalmazás használatát."
+ check_status: Állapot ellenőrzése
+ back_to_dashboard: Vissza az irányítópultra
+ revert_failure:
+ title: Az importálás visszavonása sikertelen
+ description: Kérjük, próbáld újra
+ try_again: Újrapróbálkozás
date_format:
heading: Dátumformátum
description: "A dátumformátum automatikusan lett felismerve a fájlból. Módosítsd, ha a dátumok helytelenül jelennek meg."
@@ -129,6 +260,9 @@ hu:
map: Leképezés
confirm: Megerősítés
select: Kiválasztás
+ progress: "%{step}. lépés / %{total}"
+ empty:
+ message: Nem található importálás.
index:
title: Importálások
new: Új importálás
@@ -239,3 +373,21 @@ hu:
unknown_state_description: Ez az importálás váratlan állapotban van. Kérjük, térj vissza az importálásokhoz.
processing_failed_with_message: "%{message}"
processing_failed_generic: "Feldolgozási hiba: %{error}"
+ ready_for_review_title: Felülvizsgálatra kész
+ ready_for_review_description: "%{count} tranzakciót vontunk ki a kimutatásodból. Ellenőrizd és tedd közzé, hogy hozzáadódjon a számládhoz."
+ transactions_extracted: Kinyert tranzakciók
+ transactions_extracted_count:
+ one: "%{count} tranzakció"
+ other: "%{count} tranzakció"
+ select_account: Importálás számlára
+ select_account_placeholder: Válassz számlát...
+ select_account_hint: Válaszd ki, melyik számlára szeretnéd importálni ezeket a tranzakciókat.
+ no_accounts: Nincs elérhető számla. Kérjük, először hozz létre egyet.
+ create_account: Számla létrehozása
+ save_account: Mentés
+ publish_transactions:
+ one: "%{count} tranzakció közzététele"
+ other: "%{count} tranzakció közzététele"
+ review_transactions: Tranzakciók áttekintése
+ select_account_to_continue: A folytatáshoz kérjük, válassz fentebb számlát.
+ unknown_document_type: Ismeretlen
diff --git a/config/locales/views/indexa_capital_items/hu.yml b/config/locales/views/indexa_capital_items/hu.yml
index be7bf5ff5..defbd74fe 100644
--- a/config/locales/views/indexa_capital_items/hu.yml
+++ b/config/locales/views/indexa_capital_items/hu.yml
@@ -180,7 +180,7 @@ hu:
investment: "Befektetési számla"
crypto: "Kriptovaluta számla"
loan: "Hitel vagy jelzálog"
- other_asset: "Egyéb eszköz"
+ other_asset: "Egyéb vagyon"
subtype_labels:
depository: "Számla altípusa:"
credit_card: ""
@@ -190,7 +190,7 @@ hu:
other_asset: ""
subtype_messages:
credit_card: "A hitelkártyák automatikusan hitelkártya számlákként lesznek beállítva."
- other_asset: "Az egyéb eszközökhöz nincs szükség további beállításokra."
+ other_asset: "Az egyéb vagyonelemekhez nincs szükség további beállításokra."
crypto: "A kriptovaluta számlák pozíciók és tranzakciók nyomon követésére lesznek beállítva."
subtypes:
depository:
diff --git a/config/locales/views/investments/hu.yml b/config/locales/views/investments/hu.yml
index 90b4c0e63..7bca28675 100644
--- a/config/locales/views/investments/hu.yml
+++ b/config/locales/views/investments/hu.yml
@@ -107,6 +107,75 @@ hu:
angel:
short: Angyal
long: Angyal-befektetés
+ nps:
+ short: NPS
+ long: Nemzeti Nyugdíjrendszer
+ apy:
+ short: APY
+ long: Atal Pension Yojana
+ indian_stocks:
+ short: Indiai részvények
+ long: Indiai részvények (Demat)
+ indian_equity:
+ short: Indiai tőke
+ long: Indiai tőke
+ indian_etf:
+ short: Indiai ETF
+ long: Indiai ETF
+ life_insurance:
+ short: Életbiztosítás
+ long: Életbiztosítás
+ ppf:
+ short: PPF
+ long: Közszféra megtakarítási alap
+ ssy:
+ short: SSY
+ long: Sukanya Samriddhi Yojana
+ nsc:
+ short: NSC
+ long: Nemzeti megtakarítási igazolás
+ scss:
+ short: SCSS
+ long: Idősek megtakarítási rendszere
+ fd:
+ short: FD
+ long: Lekötött betét
+ rd:
+ short: RD
+ long: Ismétlődő betét
+ pomis:
+ short: POMIS
+ long: Postai havi jövedelmi program
+ kvp:
+ short: KVP
+ long: Kisan Vikas Patra
+ gold_etf:
+ short: Arany ETF
+ long: Arany ETF
+ gold_mf:
+ short: Arany befektetési alap
+ long: Arany befektetési alap
+ sgb:
+ short: SGB
+ long: Szuverén aranykötvény
+ g_sec:
+ short: G-Sec
+ long: Állampapírok
+ sdl:
+ short: SDL
+ long: Állami fejlesztési kötvények
+ corporate_bond:
+ short: Vállalati kötvény
+ long: Vállalati kötvény
+ infrastructure_bond:
+ short: Infrastrukturális kötvény
+ long: Infrastrukturális kötvény
+ tax_free_bond:
+ short: Adómentes kötvény
+ long: Adómentes kötvény
+ gold:
+ short: Arany
+ long: Arany (fizikai vagy digitális)
trust:
short: Bizalmi alap
long: Bizalmi alap
diff --git a/config/locales/views/invite_codes/hu.yml b/config/locales/views/invite_codes/hu.yml
index 6f276d2a9..3474d5bd9 100644
--- a/config/locales/views/invite_codes/hu.yml
+++ b/config/locales/views/invite_codes/hu.yml
@@ -1,6 +1,10 @@
---
hu:
invite_codes:
+ create:
+ success: "Kód létrehozva"
+ destroy:
+ success: "Kód törölve"
index:
invite_code_description: Generálj új kódot, hogy az megjelenjen itt. A már felhasznált generált kódok nem jelennek meg tovább.
no_invite_codes: Nincs megjeleníthető kód
diff --git a/config/locales/views/kraken_items/hu.yml b/config/locales/views/kraken_items/hu.yml
new file mode 100644
index 000000000..be4ef5d0f
--- /dev/null
+++ b/config/locales/views/kraken_items/hu.yml
@@ -0,0 +1,85 @@
+---
+hu:
+ kraken_items:
+ provider_connection:
+ default_name: Kraken
+ default_description: Kapcsolódás Kraken tőzsdei számlához
+ name: "Kraken - %{name}"
+ description: "Kapcsolódás ehhez: %{name}"
+ create:
+ default_name: Kraken
+ success: Sikeresen csatlakoztatva a Krakenhez. A tőzsdei számlád szinkronizálása folyamatban van.
+ update:
+ success: Kraken kapcsolat sikeresen frissítve.
+ destroy:
+ success: Kraken kapcsolat törlése ütemezve.
+ select_accounts:
+ select_connection: Válassz Kraken kapcsolatot a Szolgáltatói beállításokban.
+ no_credentials_configured: Add meg a Kraken API hitelesítő adatokat a számlák beállítása előtt.
+ link_accounts:
+ select_connection: Válassz Kraken kapcsolatot a számlák összekapcsolása előtt.
+ select_existing_account:
+ title: Kraken számla összekapcsolása
+ no_accounts_found: Nem találhatók Kraken számlák.
+ wait_for_sync: Várd meg, amíg a Kraken befejezi a szinkronizálást.
+ check_provider_health: Ellenőrizd, hogy a Kraken API hitelesítő adataid érvényesek-e.
+ link: Összekapcsolás
+ cancel: Mégse
+ link_existing_account:
+ success: Sikeresen összekapcsolva Kraken számlával
+ select_connection: Válassz Kraken kapcsolatot a számlák összekapcsolása előtt.
+ errors:
+ only_manual: Csak olyan manuális kriptopiaci számlák kapcsolhatók a Krakenhez, amelyekhez még nincs meglévő szolgáltatói kapcsolat
+ invalid_kraken_account: Érvénytelen Kraken számla
+ kraken_account_already_linked: Ez a Kraken számla már össze van kapcsolva
+ setup_accounts:
+ title: Kraken számla importálása
+ subtitle: Válaszd ki a nyomon követendő tőzsdei számlát
+ instructions: A Kraken egy kombinált kriptotőzsdei számlát importál ehhez a kapcsolathoz, csak portfólióelemekkel és azonnali ügyletteljesítésekkel.
+ no_accounts: Minden Kraken számla importálva lett.
+ accounts_count:
+ one: "%{count} elérhető számla"
+ other: "%{count} elérhető számla"
+ select_all: Összes kijelölése
+ import_selected: Kijelöltek importálása
+ cancel: Mégse
+ creating: Importálás...
+ complete_account_setup:
+ success:
+ one: "%{count} számla importálva"
+ other: "%{count} számla importálva"
+ none_selected: Nincs kijelölt számla
+ no_accounts: Nincs importálható számla
+ kraken_item:
+ provider_name: Kraken
+ syncing: Szinkronizálás...
+ reconnect: A hitelesítő adatok frissítést igényelnek
+ deletion_in_progress: Törlés folyamatban...
+ sync_status:
+ no_accounts: Nem találhatók számlák
+ all_synced:
+ one: "%{count} számla szinkronizálva"
+ other: "%{count} számla szinkronizálva"
+ partial_sync: "%{linked_count} szinkronizálva, %{unlinked_count} beállítást igényel"
+ status: "Utolsó szinkronizálás %{timestamp} ezelőtt"
+ status_with_summary: "Utolsó szinkronizálás %{timestamp} ezelőtt - %{summary}"
+ status_never: Még nem szinkronizált
+ delete: Törlés
+ no_accounts_title: Nem találhatók számlák
+ no_accounts_message: A Kraken tőzsdei számlád szinkronizálás után jelenik meg itt.
+ setup_needed: Számla importálásra kész
+ setup_description: Importáld ezt a Kraken kapcsolatot kriptotőzsdei számlaként.
+ setup_action: Számla importálása
+ import_accounts_menu: Számla importálása
+ stale_rate_warning: "Az egyenleg közelítő értékű, mert a(z) %{date} pontos árfolyama nem volt elérhető. A következő szinkronizáláskor frissül."
+ kraken_item:
+ syncer:
+ checking_credentials: Hitelesítő adatok ellenőrzése...
+ credentials_invalid: Érvénytelen Kraken API hitelesítő adatok. Kérlek ellenőrizd az API-kulcsodat és a titkos kulcsodat.
+ importing_accounts: Számlák importálása a Krakenből...
+ checking_configuration: Számlakonfiguráció ellenőrzése...
+ accounts_need_setup:
+ one: "%{count} számla beállítást igényel"
+ other: "%{count} számla beállítást igényel"
+ processing_accounts: Számlaadat-feldolgozás...
+ calculating_balances: Egyenlegek kiszámítása...
diff --git a/config/locales/views/layout/hu.yml b/config/locales/views/layout/hu.yml
index 7a0d252b4..299aaac90 100644
--- a/config/locales/views/layout/hu.yml
+++ b/config/locales/views/layout/hu.yml
@@ -19,6 +19,10 @@ hu:
footer:
privacy_policy: Adatvédelmi irányelvek
terms_of_service: Felhasználási feltételek
+ confirm_dialog:
+ are_you_sure: Biztosan?
+ cannot_be_undone: Ez a művelet nem vonható vissza.
+ confirm: Megerősítés
trial:
open_demo: Demo megnyitása
data_deleted_in_days: Az adatok törlődnek %{days} nap múlva
diff --git a/config/locales/views/loans/hu.yml b/config/locales/views/loans/hu.yml
index 79cf3f8e2..3a2141329 100644
--- a/config/locales/views/loans/hu.yml
+++ b/config/locales/views/loans/hu.yml
@@ -10,6 +10,7 @@ hu:
rate_type: Kamat típusa
term_months: Futamidő (hónap)
term_months_placeholder: '360'
+ none: Nincs
subtype_prompt: Válassz hiteltípust
subtype_none: Nincs
new:
@@ -23,3 +24,14 @@ hu:
term: Futamidő
type: Típus
unknown: Ismeretlen
+ tabs:
+ overview:
+ interest_rate: Kamatláb
+ monthly_payment: Havi törlesztőrészlet
+ not_applicable: N/A
+ original_principal: Eredeti tőkeösszeg
+ remaining_principal: Fennmaradó tőkeösszeg
+ term: Futamidő
+ type: Típus
+ unknown: Ismeretlen
+ edit_loan_details: "Hitel adatainak szerkesztése"
diff --git a/config/locales/views/lunchflow_items/hu.yml b/config/locales/views/lunchflow_items/hu.yml
index 8527a8dc5..ebbc76dc2 100644
--- a/config/locales/views/lunchflow_items/hu.yml
+++ b/config/locales/views/lunchflow_items/hu.yml
@@ -1,6 +1,29 @@
---
hu:
lunchflow_items:
+ api_error:
+ title: Lunch Flow kapcsolódási hiba
+ unable_to_connect: Nem sikerült csatlakozni a Lunch Flow-hoz
+ common_issues: "Gyakori problémák:"
+ invalid_api_key_label: Érvénytelen API-kulcs
+ invalid_api_key_desc: Ellenőrizd az API-kulcsodat a Szolgáltatói beállításokban
+ expired_credentials_label: Lejárt hitelesítő adatok
+ expired_credentials_desc: Generálj új API-kulcsot a Lunch Flow-ban
+ network_issue_label: Hálózati probléma
+ network_issue_desc: Ellenőrizd az internetkapcsolatodat
+ service_down_label: Szolgáltatás leállása
+ service_down_desc: A Lunch Flow API ideiglenesen nem érhető el
+ check_provider_settings: Szolgáltatói beállítások ellenőrzése
+ setup_required:
+ title: Lunch Flow beállítás szükséges
+ api_key_not_configured: Az API-kulcs nincs beállítva
+ api_key_description: A Lunch Flow számlák összekapcsolása előtt be kell állítanod a Lunch Flow API-kulcsodat.
+ setup_steps_title: "Beállítási lépések:"
+ setup_step_1_html: "Menj a Beállítások → Szolgáltatók menübe"
+ setup_step_2_html: "Keresd meg a Lunch Flow részt"
+ setup_step_3: Add meg a Lunch Flow API-kulcsodat
+ setup_step_4: Térj vissza ide a számlák összekapcsolásához
+ go_to_provider_settings: Szolgáltatói beállítások megnyitása
create:
success: Lunch Flow kapcsolat sikeresen létrehozva
destroy:
@@ -86,7 +109,7 @@ hu:
credit_card: Hitelkártya
investment: Befektetési számla
loan: Hitel vagy jelzálog
- other_asset: Egyéb eszköz
+ other_asset: Egyéb vagyon
subtype_labels:
depository: "Számla altípusa:"
credit_card: ""
@@ -95,7 +118,7 @@ hu:
other_asset: ""
subtype_messages:
credit_card: "A hitelkártyák automatikusan hitelkártya számlákként lesznek beállítva."
- other_asset: "Az egyéb eszközökhöz nincs szükség további beállításokra."
+ other_asset: "Az egyéb vagyonelemekhez nincs szükség további beállításokra."
subtypes:
depository:
checking: Folyószámla
diff --git a/config/locales/views/merchants/hu.yml b/config/locales/views/merchants/hu.yml
index 7d22880cb..f6979411c 100644
--- a/config/locales/views/merchants/hu.yml
+++ b/config/locales/views/merchants/hu.yml
@@ -34,6 +34,9 @@ hu:
merchant: Kereskedő
actions: Műveletek
source: Forrás
+ family_merchant:
+ edit: Szerkesztés
+ delete: Törlés
merchant:
confirm_accept: Kereskedő törlése
confirm_body: Biztosan törlöd ezt a kereskedőt? A törlés megszünteti az összes kapcsolódó tranzakció hozzárendelését, ami hatással lehet a jelentéseidre.
diff --git a/config/locales/views/mercury_items/hu.yml b/config/locales/views/mercury_items/hu.yml
index 8bf7271a7..011e8a4d7 100644
--- a/config/locales/views/mercury_items/hu.yml
+++ b/config/locales/views/mercury_items/hu.yml
@@ -1,6 +1,31 @@
---
hu:
mercury_items:
+ api_error:
+ title: Mercury kapcsolati hiba
+ unable_to_connect: Nem sikerült csatlakozni a Mercury-hoz
+ common_issues: "Gyakori problémák:"
+ invalid_api_token_label: Érvénytelen API token
+ invalid_api_token_desc: Ellenőrizd az API tokenedet a Szolgáltatói beállításokban
+ expired_credentials_label: Lejárt hitelesítő adatok
+ expired_credentials_desc: Generálj új API tokent a Mercury-ban
+ insufficient_permissions_label: Elégtelen jogosultságok
+ insufficient_permissions_desc: Győződj meg róla, hogy a tokened csak olvasási hozzáféréssel rendelkezik
+ network_issue_label: Hálózati hiba
+ network_issue_desc: Ellenőrizd az internetkapcsolatodat
+ service_down_label: Szolgáltatás nem elérhető
+ service_down_desc: A Mercury API átmenetileg nem elérhető
+ check_provider_settings: Szolgáltatói beállítások ellenőrzése
+ setup_required:
+ title: Mercury beállítás szükséges
+ api_token_not_configured: Az API token nincs beállítva
+ api_token_description: Mielőtt Mercury-számlákat kapcsolnál össze, be kell állítanod a Mercury API tokenedet.
+ setup_steps_title: "Beállítási lépések:"
+ setup_step_1_html: "Menj a Beállítások > Szolgáltatók menübe"
+ setup_step_2_html: "Keresd meg a Mercury részt"
+ setup_step_3: Add meg a Mercury API tokenedet
+ setup_step_4: Térj vissza ide a számlák összekapcsolásához
+ go_to_provider_settings: Ugrás a szolgáltatói beállításokhoz
create:
success: Mercury kapcsolat sikeresen létrehozva
destroy:
@@ -121,7 +146,7 @@ hu:
credit_card: Hitelkártya
investment: Befektetési számla
loan: Hitel vagy jelzálog
- other_asset: Egyéb eszköz
+ other_asset: Egyéb vagyon
subtype_labels:
depository: "Számla altípusa:"
credit_card: ""
@@ -130,7 +155,7 @@ hu:
other_asset: ""
subtype_messages:
credit_card: "A hitelkártyák automatikusan hitelkártya számlákként lesznek beállítva."
- other_asset: "Az egyéb eszközökhöz nincs szükség további beállításokra."
+ other_asset: "Az egyéb vagyonelemekhez nincs szükség további beállításokra."
subtypes:
depository:
checking: Folyószámla
@@ -176,3 +201,8 @@ hu:
success: Szinkronizálás elindítva
update:
success: Mercury kapcsolat frissítve
+ mercury_item_selection_error_payload:
+ select_connection: Válassz Mercury kapcsolatot a számlák betöltése előtt.
+ render_mercury_item_selection_failure:
+ select_connection: Válassz Mercury kapcsolatot a Szolgáltatói beállításokban.
+ no_credentials_configured: Kérlek előbb állítsd be a Mercury API tokenedet a Szolgáltatói beállításokban.
diff --git a/config/locales/views/messages/hu.yml b/config/locales/views/messages/hu.yml
new file mode 100644
index 000000000..df1edc25e
--- /dev/null
+++ b/config/locales/views/messages/hu.yml
@@ -0,0 +1,6 @@
+---
+hu:
+ messages:
+ chat_form:
+ placeholder: "Kérdezz bármit..."
+ disclaimer: "Az AI-válaszok csak tájékoztató jellegűek. Nem pénzügyi tanácsadás!"
diff --git a/config/locales/views/oidc_accounts/hu.yml b/config/locales/views/oidc_accounts/hu.yml
index dd08ba7ed..90c9783f4 100644
--- a/config/locales/views/oidc_accounts/hu.yml
+++ b/config/locales/views/oidc_accounts/hu.yml
@@ -2,6 +2,7 @@
hu:
oidc_accounts:
link:
+ no_pending_oidc: Nem található függőben lévő OIDC-hitelesítés
title_link: OIDC-fiók összekapcsolása
title_create: Fiók létrehozása
verify_heading: Igazold az azonosságodat
@@ -21,7 +22,10 @@ hu:
submit_accept_invitation: Meghívó elfogadása
account_creation_disabled: Az egyszeri bejelentkezésen keresztüli új fiók létrehozása le van tiltva. Kérjük, lépj kapcsolatba egy rendszergazdával a fiókod létrehozásához.
cancel: Mégse
+ create_link:
+ no_pending_oidc: Nem található függőben lévő OIDC-hitelesítés
new_user:
+ no_pending_oidc: Nem található függőben lévő OIDC-hitelesítés
title: Fiókod véglegesítése
heading: Hozd létre a fiókodat
description: Kérjük, erősítsd meg az adataidat a fiókod létrehozásának befejezéséhez a(z) %{provider} azonosítóddal.
@@ -32,3 +36,7 @@ hu:
last_name_placeholder: Add meg a vezetéknevedet
submit: Fiók létrehozása
cancel: Mégse
+ create_user:
+ no_pending_oidc: Nem található függőben lévő OIDC-hitelesítés
+ account_creation_disabled: Az SSO-fiók létrehozása le van tiltva. Kérjük, lépj kapcsolatba egy rendszergazdával.
+ account_created: "Üdvözlünk! A fiókod sikeresen létrejött."
diff --git a/config/locales/views/other_assets/hu.yml b/config/locales/views/other_assets/hu.yml
index 5a60935d7..38cd263ed 100644
--- a/config/locales/views/other_assets/hu.yml
+++ b/config/locales/views/other_assets/hu.yml
@@ -3,7 +3,7 @@ hu:
other_assets:
edit:
edit: '%{account} szerkesztése'
- balance_tracking_info: 'Az egyéb eszközök értékét manuális értékelésekkel lehet követni az „Új egyenleg” funkcióval, nem tranzakciókkal. A pénzforgalom nem befolyásolja a számlaegyenleget.'
+ balance_tracking_info: 'Az egyéb vagyonelemek értékét manuális értékelésekkel lehet követni az „Új egyenleg” funkcióval, nem tranzakciókkal. A pénzforgalom nem befolyásolja a számlaegyenleget.'
new:
- title: Add meg az eszköz adatait
- balance_tracking_info: 'Az egyéb eszközök értékét manuális értékelésekkel lehet követni az „Új egyenleg" funkcióval, nem tranzakciókkal. A pénzforgalom nem befolyásolja a számlaegyenleget.'
+ title: Add meg a vagyonelem adatait
+ balance_tracking_info: 'Az egyéb vagyonelemek értékét manuális értékelésekkel lehet követni az „Új egyenleg” funkcióval, nem tranzakciókkal. A pénzforgalom nem befolyásolja a számlaegyenleget.'
diff --git a/config/locales/views/pages/en.yml b/config/locales/views/pages/en.yml
index bd96938e5..e5cd8e1d1 100644
--- a/config/locales/views/pages/en.yml
+++ b/config/locales/views/pages/en.yml
@@ -51,9 +51,16 @@ en:
title: "Balance Sheet"
no_items: "No %{name} yet"
add_accounts: "Add your %{name} accounts to see a full breakdown"
+ no_asset: "No assets yet"
+ no_liability: "No liabilities yet"
+ add_asset_accounts: "Add your asset accounts to see a full breakdown"
+ add_liability_accounts: "Add your liability accounts to see a full breakdown"
name: "Name"
weight: "Weight"
value: "Value"
+ classifications:
+ asset: "Assets"
+ liability: "Liabilities"
cashflow_sankey:
title: "Cashflow"
no_data_title: "No cash flow data for this time period"
diff --git a/config/locales/views/pages/hu.yml b/config/locales/views/pages/hu.yml
index 06e4831fa..b1393e2b7 100644
--- a/config/locales/views/pages/hu.yml
+++ b/config/locales/views/pages/hu.yml
@@ -1,6 +1,29 @@
---
hu:
pages:
+ feedback:
+ title: Visszajelzés
+ heading: Visszajelzés küldése
+ description: Oszd meg velünk, ha konkrét visszajelzésed van. Nyugodtan csatolhatsz videóhivatkozásokat vagy képernyőképeket.
+ feature_request: Funkcióigény beküldése
+ bug_report: Hibajelentés
+ discuss: "%{product} megbeszélése másokkal"
+ intro:
+ not_authorized: "Az intro csak vendégfelhasználók számára érhető el."
+ welcome: "Üdvözöllek!"
+ coming_soon: Az intro hamarosan elérhető
+ description: "Gazdagabb bevezetési élményt fejlesztünk, hogy megismerjük a céljaidat, mérföldköveidet és mindennapi igényeidet. Addig is menj a csevegőoldalsávba, indíts egy beszélgetést a Sure-ral, és mesélj a pénzügyi útjaidról."
+ start_chatting: Csevegés indítása
+ redis_configuration_error:
+ page_title: Redis konfiguráció szükséges – Sure
+ heading: Redis konfiguráció szükséges
+ subheading: Az önállóan üzemeltetett Sure telepítésedhez megfelelően konfigurált Redis szükséges.
+ why_required_title: Miért szükséges a Redis?
+ why_required_body: A Sure Redis-t használ a Sidekiq háttérfeladatokhoz, például a számlaadatok szinkronizálásához, importálások feldolgozásához és más háttérműveletekhez, amelyek naprakészen tartják a pénzügyi adataidat.
+ view_setup_guide: Beállítási útmutató megtekintése
+ setup_guide_hint: Kövesd az átfogó Docker beállítási útmutatónkat a Redis konfigurálásához
+ refresh_hint: "Ha konfigurálta a Redis-t, frissítsd ezt az oldalt a folytatáshoz."
+ refresh_page: Oldal frissítése
changelog:
title: Újdonságok
privacy:
@@ -26,8 +49,18 @@ hu:
no_account_title: Még nincs számla
balance_sheet:
title: "Mérleg"
- no_items: "Még nincs %{name}"
- add_accounts: "Add hozzá a(z) %{name} számláidat a teljes áttekintésért"
+ no_items: "Még nincsenek %{name}"
+ add_accounts: "Add hozzá %{name} számláidat a teljes áttekintésért"
+ no_asset: "Még nincs vagyonod"
+ no_liability: "Még nincsenek kötelezettségeid"
+ add_asset_accounts: "Adj hozzá vagyonszámlákat a teljes pénzügyi áttekintésért"
+ add_liability_accounts: "Adj hozzá kötelezettségszámlákat a teljes pénzügyi áttekintésért"
+ name: "Név"
+ weight: "Arány"
+ value: "Érték"
+ classifications:
+ asset: "Vagyon"
+ liability: "Kötelezettségek"
cashflow_sankey:
title: "Pénzforgalom"
no_data_title: "Nincs pénzforgalmi adat erre az időszakra"
diff --git a/config/locales/views/pending_duplicate_merges/hu.yml b/config/locales/views/pending_duplicate_merges/hu.yml
index eee805273..191592600 100644
--- a/config/locales/views/pending_duplicate_merges/hu.yml
+++ b/config/locales/views/pending_duplicate_merges/hu.yml
@@ -1,6 +1,13 @@
---
hu:
pending_duplicate_merges:
+ create:
+ no_posted_selected: Kérlek válassz egy könyvelt tranzakciót az összevonáshoz
+ invalid_transaction: Érvénytelen tranzakció van kijelölve az összevonáshoz
+ merge_success: A függőben lévő tranzakció összevonva a könyvelt tranzakcióval
+ merge_failed: Nem sikerült összevonni a tranzakciókat
+ set_transaction:
+ pending_only: Ez a funkció csak függőben lévő tranzakciókhoz érhető el
new:
title: Összevonás könyvelt tranzakcióval
warning_title: Manuális duplikáció-összevonás
diff --git a/config/locales/views/plaid_items/hu.yml b/config/locales/views/plaid_items/hu.yml
index 6d4293eef..458bb24b9 100644
--- a/config/locales/views/plaid_items/hu.yml
+++ b/config/locales/views/plaid_items/hu.yml
@@ -22,7 +22,12 @@ hu:
syncing: Szinkronizálás folyamatban...
update: Frissítés
select_existing_account:
+ no_available_accounts: Nincs elérhető Plaid-számla az összekapcsoláshoz. Először csatlakozz egy új Plaid-fiókhoz.
title: "%{account_name} csatlakoztatása Plaid-hez"
description: Válassz egy Plaid-számlát a meglévő számlád összekapcsolásához
cancel: Mégse
link_account: Számla összekapcsolása
+ link_existing_account:
+ invalid_account: Érvénytelen Plaid-számla van kijelölve
+ already_linked: Ez a Plaid-számla már össze van kapcsolva
+ success: A számla sikeresen össze lett kapcsolva a Plaid-del
diff --git a/config/locales/views/properties/hu.yml b/config/locales/views/properties/hu.yml
index 8b3218e78..4bc7021f9 100644
--- a/config/locales/views/properties/hu.yml
+++ b/config/locales/views/properties/hu.yml
@@ -23,6 +23,38 @@ hu:
year_built_placeholder: '2000'
new:
title: Add meg az ingatlan adatait
+ next: "Tovább"
+ address:
+ title: "Add meg az ingatlan adatait"
+ address_line1_label: "Utca, házszám"
+ address_line1_placeholder: "Kossuth utca 1."
+ city_label: "Város"
+ city_placeholder: "Budapest"
+ state_region_label: "Megye/Kerület"
+ state_region_placeholder: "Budapest"
+ postal_code_label: "Irányítószám"
+ postal_code_placeholder: "1011"
+ country_label: "Ország"
+ country_placeholder: "Magyarország"
+ save: "Mentés"
+ balances:
+ title: "Add meg az ingatlan adatait"
+ market_value_label: "Becsült piaci érték"
+ market_value_tooltip: "Az ingatlan becsült piaci értéke. Ezt az értéket ingatlanértékelő oldalakon találhatod, és soha nem pontos szám."
+ save: "Mentés"
+ next: "Tovább"
+ overview_fields:
+ name_label: "Név"
+ name_placeholder: "Nyaraló"
+ subtype_prompt: "Típus kiválasztása"
+ property_type_label: "Ingatlantípus"
+ year_built_label: "Építési év (nem kötelező)"
+ year_built_placeholder: "1990"
+ area_label: "Alapterület (nem kötelező)"
+ area_placeholder: "1200"
+ square_feet: "Négyzetláb"
+ square_meters: "Négyzetméter"
+ area_unit_label: "Területi egység"
overview:
living_area: Alapterület
market_value: Piaci érték
@@ -30,3 +62,28 @@ hu:
trend: Tendencia
unknown: Ismeretlen
year_built: Építési év
+ tabs:
+ overview:
+ living_area: Alapterület
+ market_value: Piaci érték
+ purchase_price: Vételár
+ trend: Tendencia
+ unknown: Ismeretlen
+ year_built: Építési év
+ edit_account_details: "Számlaadatok szerkesztése"
+ subtypes:
+ apartment:
+ short: Lakás
+ long: Lakás
+ plot:
+ short: Telek
+ long: Telek/Föld
+ commercial:
+ short: Kereskedelmi
+ long: Kereskedelmi ingatlan
+ rented:
+ short: Bérelt
+ long: Bérelt ingatlan
+ agri_land:
+ short: Mezőgazdasági
+ long: Mezőgazdasági föld
diff --git a/config/locales/views/recurring_transactions/hu.yml b/config/locales/views/recurring_transactions/hu.yml
index b88edb27c..a20ecfade 100644
--- a/config/locales/views/recurring_transactions/hu.yml
+++ b/config/locales/views/recurring_transactions/hu.yml
@@ -50,3 +50,7 @@ hu:
inactive: Inaktív
badges:
manual: Manuális
+ transfer_marked_as_recurring: Átutalás ismétlődőként jelölve
+ transfer_already_exists: Ehhez a számlápárhoz már létezik ismétlődő átutalás
+ transfer_creation_failed: Nem sikerült létrehozni az ismétlődő átutalást. Kérlek ellenőrizd az átutalás adatait, és próbáld újra.
+ transfer_feature_disabled: Az ismétlődő tranzakciók le vannak tiltva ennél a háztartásnál
diff --git a/config/locales/views/reports/hu.yml b/config/locales/views/reports/hu.yml
index d0ec88489..c0dee944c 100644
--- a/config/locales/views/reports/hu.yml
+++ b/config/locales/views/reports/hu.yml
@@ -18,6 +18,21 @@ hu:
from: Kezdő dátum
to: Záró dátum
showing_period: "Adatok megjelenítése: %{start} – %{end}"
+ previous_period: "Előző időszak"
+ next_period: "Következő időszak"
+ today: "Ma"
+ period_label:
+ quarterly: "N%{quarter} %{year}"
+ ytd: "ÉTD %{year}"
+ past_year: "%{year}"
+ last_6_months: "%{start} – %{end}"
+ period_picker:
+ quarter: "N%{quarter} %{year}"
+ ytd: "ÉTD %{year}"
+ previous_year: "Előző év"
+ next_year: "Következő év"
+ previous_decade: "Előző évtized"
+ next_decade: "Következő évtized"
invalid_date_range: "A záró dátum nem lehet korábbi a kezdő dátumnál. A dátumok fel lettek cserélve."
summary:
total_income: Összes bevétel
@@ -118,10 +133,10 @@ hu:
title: Nettó vagyon
current_net_worth: Jelenlegi nettó vagyon
period_change: Időszaki változás
- assets_vs_liabilities: Eszközök vs. kötelezettségek
- total_assets: Eszközök
+ assets_vs_liabilities: Vagyon vs. kötelezettségek
+ total_assets: Vagyon
total_liabilities: Kötelezettségek
- no_assets: Nincsenek eszközök
+ no_assets: Nincs vagyon
no_liabilities: Nincsenek kötelezettségek
investment_performance:
title: Befektetési teljesítmény
@@ -155,8 +170,11 @@ hu:
title: Befektetési pénzáramlás
description: Kövesd nyomon a befektetési számláidra be- és onnan kiáramló pénzt
contributions: Befizetések
+ contributions_description: Befektetésekbe befizetett összeg
withdrawals: Kivétek
+ withdrawals_description: Befektetésekből kivett összeg
net_flow: Nettó pénzáramlás
+ net_flow_description: Teljes nettó változás
google_sheets_instructions:
title_with_key: "✅ URL másolása Google Sheetshez"
title_no_key: "⚠️ API-kulcs szükséges"
@@ -190,7 +208,7 @@ hu:
title: Nettó vagyon
current_balance: Jelenlegi egyenleg
this_period: ebben az időszakban
- assets: Eszközök
+ assets: Vagyon
liabilities: Kötelezettségek
no_liabilities: Nincsenek kötelezettségek
trends:
diff --git a/config/locales/views/rules/hu.yml b/config/locales/views/rules/hu.yml
index 77d716338..23d879ab2 100644
--- a/config/locales/views/rules/hu.yml
+++ b/config/locales/views/rules/hu.yml
@@ -3,6 +3,53 @@ hu:
rules:
no_action: Nincs művelet
no_condition: Nincs feltétel
+ rule:
+ edit: Szerkesztés
+ re_apply_rule: Szabály újraalkalmazása
+ delete: Törlés
+ then: AKKOR
+ and_more_conditions:
+ one: és 1 további feltétel
+ other: és %{count} további feltétel
+ and_more_actions:
+ one: és 1 további művelet
+ other: és %{count} további művelet
+ action_label_to: "%{label} erre: %{value}"
+ all_past_and_future: Összes korábbi és jövőbeli %{resource}
+ on_or_after: "%{resource} %{date} napon vagy azt követően"
+ form:
+ rule_name_label: Szabály neve (nem kötelező)
+ rule_name_placeholder: Add meg a szabály nevét
+ add_condition: Feltétel hozzáadása
+ add_condition_group: Feltételcsoport hozzáadása
+ add_action: Művelet hozzáadása
+ all_past_and_future: Összes korábbi és jövőbeli %{resource}
+ starting_from: Kezdve
+ then: AKKOR
+ index:
+ page_title: Szabályok
+ delete_all_rules: Összes szabály törlése
+ new_rule: Új szabály
+ ai_cost_warning: Az AI-t igénybe vevő szabályakciók pénzbe kerülnek. Szűrj minél szűkebbre a felesleges költségek elkerülése érdekében.
+ rules_heading: Szabályok
+ sort_by: "Rendezés:"
+ sort_name: Név szerint
+ sort_updated_at: Módosítás dátuma szerint
+ toggle_sort_direction: Rendezési irány váltása
+ no_rules_title: Még nincsenek szabályok
+ no_rules_description: Állíts be szabályokat, amelyek minden fiókszinkronizáláskor automatikusan elvégzik a megadott műveleteket a tranzakciókon és egyéb adatokon.
+ confirm:
+ title: Változtatások megerősítése
+ title_with_name: "Változtatások megerősítése: \"%{name}\""
+ apply_notice_html: "Ezzel a szabályt %{count} %{resource} elemre alkalmazod, amelyek megfelelnek a feltételeknek. Kérjük, erősítsd meg, ha folytatni szeretnéd."
+ ai_cost_title: AI-költség becslése
+ ai_cost_with_estimate_html: "Ez AI segítségével kategorizál %{count} tranzakciót. Becsült költség: ~$%{cost}"
+ ai_cost_no_estimate_html: "Ez AI segítségével kategorizál %{count} tranzakciót."
+ cost_unavailable_model: "A(z) \"%{model}\" modellhez nem érhető el költségbecslés."
+ cost_unavailable_no_provider: A költségbecslés nem érhető el (nincs LLM-szolgáltató beállítva).
+ cost_warning: Költségek merülhetnek fel – a legfrissebb árakért ellenőrizd a modellszolgáltatónál.
+ view_usage_history: Felhasználási előzmények megtekintése
+ confirm_changes: Változtatások megerősítése
actions:
value_placeholder: Adj meg egy értéket
apply_all:
@@ -18,6 +65,12 @@ hu:
cost_unavailable_no_provider: A költségbecslés nem érhető el (nincs LLM-szolgáltató beállítva).
cost_warning: Költségek merülhetnek fel – a legfrissebb árakért ellenőrizd a modellszolgáltatónál.
view_usage: Felhasználási előzmények megtekintése
+ update:
+ success: Szabály frissítve
+ destroy:
+ success: Szabály törölve
+ destroy_all:
+ success: Összes szabály törölve
recent_runs:
title: Legutóbbi futtatások
description: Tekintsd meg a szabályok végrehajtási előzményeit, beleértve a sikeres/sikertelen állapotot és a tranzakciók számát.
@@ -31,6 +84,7 @@ hu:
queued: Sorban álló
processed: Feldolgozott
modified: Módosított
+ blocked: Blokkolt
execution_types:
manual: Manuális
scheduled: Ütemezett
@@ -50,3 +104,12 @@ hu:
expense: Kiadás
transfer: Átutalás
equal_to: Egyenlő
+ rule:
+ conditions:
+ condition_group:
+ and_prefix: és
+ match: egyezik
+ all: összes
+ any: bármelyik
+ of_the_following_conditions: a következő feltételek közül
+ add_condition: Feltétel hozzáadása
diff --git a/config/locales/views/sessions/hu.yml b/config/locales/views/sessions/hu.yml
index bc811fcce..c1578339f 100644
--- a/config/locales/views/sessions/hu.yml
+++ b/config/locales/views/sessions/hu.yml
@@ -16,6 +16,8 @@ hu:
sso_provider_unavailable: "Az egyszeri bejelentkezés szolgáltatója jelenleg nem elérhető. Kérjük, próbáld újra később, vagy lépj kapcsolatba egy rendszergazdával."
sso_invalid_response: "Érvénytelen választ kaptunk az egyszeri bejelentkezés szolgáltatójától. Kérjük, próbáld újra."
sso_failed: "Az egyszeri bejelentkezés sikertelen volt. Kérjük, próbáld újra."
+ mobile_sso_start:
+ redirecting_html: "Átirányítás bejelentkezéshez... Kattints ide, ha nincs átirányítás."
new:
email: E-mail cím
email_placeholder: te@pelda.hu
diff --git a/config/locales/views/settings/api_keys/hu.yml b/config/locales/views/settings/api_keys/hu.yml
index a0b601b92..ad0df2325 100644
--- a/config/locales/views/settings/api_keys/hu.yml
+++ b/config/locales/views/settings/api_keys/hu.yml
@@ -11,6 +11,13 @@ hu:
read_balances: "Egyenlegek megtekintése"
write_transactions: "Tranzakciók létrehozása"
api_keys:
+ create:
+ success: "Az API-kulcsod sikeresen létrehozva"
+ destroy:
+ not_found: "Az API-kulcs nem található"
+ cannot_revoke: "Ez az API-kulcs nem vonható vissza"
+ revoked_successfully: "Az API-kulcs sikeresen visszavonva"
+ revoke_failed: "Nem sikerült visszavonni az API-kulcsot"
show:
title: "API-kulcs kezelése"
no_api_key:
@@ -24,18 +31,33 @@ hu:
security_note_title: "Biztonság az első"
security_note: "Az API-kulcsodnak korlátozott jogosultságai lesznek a kiválasztott hatókörök alapján. Egyszerre csak egy aktív API-kulcsod lehet."
create_api_key: "API-kulcs létrehozása"
+ newly_created:
+ page_title: "API-kulcs sikeresen létrehozva"
+ heading: "API-kulcs sikeresen létrehozva!"
+ key_ready: "Az új \"%{name}\" API-kulcsod létrehozva és készen áll a használatra."
+ your_api_key: "Az API-kulcsod"
+ copy_store_securely: "Másold le és tárold biztonságosan. Szükséged lesz rá az API-kérések hitelesítéséhez."
+ copy_api_key: "API-kulcs másolása"
+ how_to_use: "Az API-kulcs használata"
+ continue: "Tovább az API-kulcs beállításaihoz"
current_api_key:
title: "Az API-kulcsod"
description: "Az aktív API-kulcsod készen áll a használatra. Tartsd biztonságban, és soha ne oszd meg nyilvánosan."
active: "Aktív"
key_name: "Név"
created_at: "Létrehozva"
+ created_ago: "Létrehozva %{time} ezelőtt"
last_used: "Utoljára használva"
+ last_used_ago: "Utoljára használva %{time} ezelőtt"
expires: "Lejár"
ago: "ezelőtt"
never_used: "Még nem használt"
never_expires: "Nem jár le"
permissions: "Jogosultságok"
+ scope_read_only: "Csak olvasható"
+ scope_read_write: "Olvasás/Írás"
+ copy_api_key: "API-kulcs másolása"
+ copy_store_securely: "Másold le és tárold biztonságosan. Szükséged lesz rá az API-kérések hitelesítéséhez."
usage_instructions_title: "Az API-kulcs használata"
usage_instructions: "Add meg az API-kulcsodat az X-Api-Key fejlécben, amikor kéréseket küldesz a(z) %{product_name} API-nak:"
regenerate_key: "Új kulcs létrehozása"
@@ -43,34 +65,52 @@ hu:
revoke_confirmation: "Biztosan vissza szeretnéd vonni ezt az API-kulcsot? Ez a művelet nem vonható vissza, és azonnal letiltja az összes ezt a kulcsot használó alkalmazást."
new:
title: "API-kulcs létrehozása"
- create_new_key: "Új API-kulcs létrehozása"
+ create_new_api_key: "Új API-kulcs létrehozása"
+ subtitle: "Generálj új API-kulcsot a Sure-adataid programozható eléréséhez."
description: "Konfiguráld az új API-kulcsodat leíró névvel és megfelelő jogosultságokkal."
name_label: "API-kulcs neve"
name_placeholder: "pl.: Éles alkalmazás, Elemzési irányítópult"
+ name_help_text: "Válassz leíró nevet, amely segít azonosítani a kulcsot."
name_help: "Válassz leíró nevet, amely segít azonosítani a kulcs célját."
permissions_label: "Jogosultságok"
- permissions_help: "Válaszd ki az API-kulcsod számára szükséges jogosultságokat. Bármikor létrehozhatsz új kulcsot eltérő jogosultságokkal."
+ permissions_help: "Válaszd ki az API-kulcsod számára szükséges jogosultságokat:"
+ scope_read_only: "Csak olvasható"
+ scope_read_only_description: "Fiókok, tranzakciók és egyenlegek megtekintése"
+ scope_read_write: "Olvasás/Írás"
+ scope_read_write_description: "Adatok megtekintése és új tranzakciók létrehozása"
scope_details:
read_accounts: "Fiókinformációk, egyenlegek és fiókszintű adatok megtekintése"
read_transactions: "Tranzakciós adatok, kategóriák és tranzakciós részletek megtekintése"
read_balances: "Korábbi egyenlegadatok és fiókérték-trendek megtekintése"
write_transactions: "Tranzakciók létrehozása és frissítése (hamarosan)"
- security_warning_title: "Fontos biztonsági figyelmeztetés"
+ security_warning_title: "Biztonsági figyelmeztetés"
+ security_warning_body: "Az API-kulcsod csak egyszer jelenik meg a létrehozás után. Győződj meg róla, hogy lemásolod és biztonságosan tárolod. Bárki, aki hozzáfér ehhez a kulcshoz, a kiválasztott jogosultságoknak megfelelően hozzáférhet az adataidhoz."
security_warning: "Az API-kulcsod csak egyszer jelenik meg a létrehozás után. Tárold biztonságosan, és soha ne oszd meg nyilvánosan. Ha elveszíted, új kulcsot kell létrehoznod."
create_key: "API-kulcs létrehozása"
cancel: "Mégse"
+ save_api_key: "API-kulcs mentése"
created:
+ page_title: "API-kulcs létrehozva"
title: "API-kulcs létrehozva"
success_title: "API-kulcs sikeresen létrehozva"
- success_description: "Az új API-kulcsod készen áll a használatra. Feltétlenül másold le most, mert többé nem fogod látni."
+ success_description: "Az új API-kulcsod sikeresen generálva."
+ key_ready: "Az új \"%{name}\" API-kulcsod létrehozva és készen áll a használatra."
your_api_key: "Az API-kulcsod"
+ copy_store_securely: "Másold le és tárold biztonságosan. Szükséged lesz rá az API-kérések hitelesítéséhez."
+ key_details_title: "Kulcs adatai"
+ key_name_label: "Név:"
+ permissions_label: "Jogosultságok:"
+ created_label: "Létrehozva:"
+ security_note_title: "Fontos biztonsági megjegyzés"
+ security_note_body: "Ez az egyetlen alkalom, amikor az API-kulcsod megjelenik. Mindenképpen másold le most és tárold biztonságosan. Ha elveszíted, újat kell generálnod."
+ usage_instructions_title: "Az API-kulcs használata"
key_name: "Név"
permissions: "Jogosultságok"
critical_warning_title: "⚠️ Kritikus: Mentsd el az API-kulcsodat most"
critical_warning_1: "Ez az egyetlen alkalom, amikor az API-kulcsod egyszerű szövegként látható."
critical_warning_2: "Másold le és tárold biztonságosan a jelszókezelődben vagy az alkalmazásodban."
critical_warning_3: "Ha elveszíted ezt a kulcsot, újat kell létrehoznod."
- usage_instructions_title: "Gyors kezdés"
+ usage_instructions_title: "Az API-kulcs használata"
usage_instructions: "Használd az API-kulcsodat az X-Api-Key fejlécbe illesztve:"
copy_key: "API-kulcs másolása"
continue: "Tovább az API-kulcs beállításaihoz"
diff --git a/config/locales/views/settings/hostings/hu.yml b/config/locales/views/settings/hostings/hu.yml
index 4d9d4148a..3d0131bfb 100644
--- a/config/locales/views/settings/hostings/hu.yml
+++ b/config/locales/views/settings/hostings/hu.yml
@@ -80,6 +80,11 @@ hu:
body: Ez eltávolítja a mentett URL-t, tokent és ügynökazonosítót, és visszavált a beépített asszisztensre. Később újra csatlakozhatsz új hitelesítő adatok megadásával.
brand_fetch_settings:
description: Add meg a Brand Fetch által biztosított kliens-azonosítót
+ env_configured_message: Sikeresen konfiguráltad a Brand Fetch kliens-azonosítódat a BRAND_FETCH_CLIENT_ID környezeti változón keresztül.
+ show_details: "(részletek megjelenítése)"
+ setup_step_1_html: 'Látogass el a brandfetch.com oldalra, és hozz létre egy ingyenes Brand Fetch fejlesztői fiókot.'
+ setup_step_2_html: 'Menj a Logo API oldalra.'
+ setup_step_3: 'Kattints a szem ikonra a „Your Client ID" rész alatt, hogy megjelenítsd a kliens-azonosítódat, majd illeszd be alább.'
label: Kliens-azonosító
placeholder: Add meg ide a kliens-azonosítódat
title: Brand Fetch beállítások
@@ -176,6 +181,10 @@ hu:
clear_cache:
cache_cleared: Az adatcache törölve. Ez néhány percet vehet igénybe.
not_authorized: Nincs jogosultságod ehhez a művelethez
+ ensure_super_admin_for_onboarding:
+ not_authorized: Nincs jogosultságod ehhez a művelethez
+ sync_auto_sync_scheduler!:
+ scheduler_sync_failed: A beállítások mentve, de a szinkronizálási ütemezés frissítése nem sikerült. Kérjük, próbáld újra, vagy ellenőrizd a szerver naplóit.
sync_settings:
auto_sync_label: Automatikus szinkronizálás engedélyezése
auto_sync_description: Ha engedélyezve van, az összes fiók naponta automatikusan szinkronizálódik a megadott időpontban.
diff --git a/config/locales/views/settings/hu.yml b/config/locales/views/settings/hu.yml
index 4d4d3dc91..b43b6cc97 100644
--- a/config/locales/views/settings/hu.yml
+++ b/config/locales/views/settings/hu.yml
@@ -6,6 +6,32 @@ hu:
renewal: "A hozzájárulásod %{date}-én megújul."
cancellation: "A hozzájárulásod %{date}-én lejár."
settings:
+ llm_usages:
+ show:
+ page_title: "LLM-használat és -költségek"
+ subtitle: "Kövesd nyomon az AI-használatot és a becsült költségeket"
+ start_date: "Kezdő dátum"
+ end_date: "Záró dátum"
+ filter: "Szűrő"
+ total_requests: "Összes kérés"
+ total_tokens: "Összes token"
+ prompt: "prompt"
+ completion: "befejezés"
+ total_cost: "Összes költség"
+ avg_cost_per_request: "Átl. költség/kérés"
+ based_on_requests: "%{total} kérésből %{with_cost} rendelkezik költségadattal"
+ cost_by_operation: "Költség műveletek szerint"
+ cost_by_model: "Költség modellek szerint"
+ recent_usage: "Legutóbbi használat"
+ col_date: "Dátum"
+ col_operation: "Művelet"
+ col_model: "Modell"
+ col_tokens: "Tokenek"
+ col_cost: "Költség"
+ failed: "Sikertelen"
+ no_usage_data: "Nem található használati adat a kiválasztott időszakra"
+ cost_estimates_title: "A költségbecslésekről"
+ cost_estimates_description: "A költségek az OpenAI 2025-ös árazása alapján vannak becsülve. A tényleges költségek eltérhetnek. Az árazás millió tokenenként van megadva, és modellenként változik. Az egyéni vagy önállóan üzemeltetett modellek \"N/A\"-t mutatnak, és nem szerepelnek a költségösszesítőkben."
ai_prompts:
show:
page_title: MI promptok
@@ -26,6 +52,17 @@ hu:
page_title: Fizetések
subscription_subtitle: Frissítsd bankkártyaadataidat
subscription_title: Hozzájárulások kezelése
+ currently_on_plan: "Jelenleg a"
+ trialing: "Jelenleg a %{product_name} nyílt demóját használod"
+ trial_days_left:
+ one: "Az adatok %{count} nap múlva törlődnek"
+ other: "Az adatok %{count} nap múlva törlődnek"
+ not_contributing_prefix: "Jelenleg"
+ not_contributing_emphasis: "nem járulsz hozzá"
+ contributions_note: "A(z) %{product_name} felé tett hozzájárulásaid itt jelennek meg."
+ manage: "Kezelés"
+ choose_level: "Szint kiválasztása"
+ payment_via_stripe: "Fizetés Stripe-on keresztül"
appearances:
show:
page_title: Megjelenés
@@ -159,8 +196,10 @@ hu:
general_section_title: Általános
imports_label: Importálások
exports_label: Exportálások
+ llm_usage_label: LLM-használat
logout: Kijelentkezés
merchants_label: Kereskedők
+ providers_label: Szolgáltatók
guides_label: Útmutatók
other_section_title: Egyéb
preferences_label: Preferenciák
@@ -169,8 +208,11 @@ hu:
rules_label: Szabályok
security_label: Biztonság
self_hosting_label: Saját üzemeltetés
+ sso_providers_label: SSO-szolgáltatók
+ statement_vault_label: Kimutatástár
tags_label: Címkék
transactions_section_title: Tranzakciók
+ users_label: Felhasználók
whats_new_label: Újdonságok
api_keys_label: API-kulcs
appearance_label: Megjelenés
@@ -184,6 +226,76 @@ hu:
choose_label: (nem kötelező)
change: Fotó módosítása
providers:
+ update:
+ updated_successfully: Szolgáltatói beállítások sikeresen frissítve
+ no_changes: Nem történt változtatás
+ not_authorized: Nincs jogosultság
+ bank_sync:
+ page_title: Banki szinkronizálás
+ lede: Csatlakoztasd a külső számlákat, hogy a tranzakciók, egyenlegek és portfólióadatok automatikusan áramlanak a Sure-ba.
+ status:
+ ok: Csatlakoztatva
+ warn: Beavatkozás szükséges
+ err: Hiba
+ off: Nincs konfigurálva
+ maturity:
+ beta: Béta
+ alpha: Alfa
+ drawer_trust_statement: "Csak olvasási hozzáférés. A Sure soha nem tud pénzt mozgatni, és a hitelesítő adatok titkosítva vannak tárolva."
+ setup_steps:
+ eyebrow: Beállítás
+ need_help: "Segítségre van szükséged?"
+ connect: Csatlakozás
+ groups:
+ your_connections: A te kapcsolataid
+ available: Elérhető
+ empty_available: Minden elérhető szolgáltató csatlakoztatva van.
+ health_strip:
+ connected: csatlakoztatva
+ needs_attention: figyelmet igényel
+ accounts_syncing: számla szinkronizálódik
+ last_synced: Utoljára szinkronizálva %{time} ezelőtt
+ meta:
+ sync_error: Szinkronizálási hiba
+ no_recent_sync: Szinkronizálás lejárt
+ registration_needed: Regisztráció szükséges
+ reconsent_required: Újrahozzájárulás szükséges
+ reconsent_needed:
+ one: Újrahozzájárulás szükséges 1 napon belül
+ other: Újrahozzájárulás szükséges %{count} napon belül
+ last_synced: Szinkronizálva %{time} ezelőtt
+ sync_all: Összes szinkronizálása
+ sync_all_in_progress: Az összes csatlakoztatott szolgáltató szinkronizálása folyamatban...
+ sync_all_recently: Szinkronizálás már folyamatban van. Próbáld újra egy pillanat múlva.
+ sync_provider: Szinkronizálás most
+ sync_provider_in_progress: Szinkronizálás elindítva.
+ recently_synced: Nemrég szinkronizálva. Próbáld újra egy pillanat múlva.
+ taglines:
+ simplefin: US bankszámlák csatlakoztatása az open SimpleFIN protokollon keresztül.
+ lunchflow: 40+ ország 20 000+ bankjának csatlakoztatása (Egyesült Királyság, EU, USA stb.!)
+ enable_banking: Európai bankszámlák szinkronizálása PSD2 open banking révén.
+ coinstats: Teljes kriptoportfólió nyomon követése tárcákon és tőzsdéken keresztül.
+ mercury: Mercury üzleti bankszámlák automatikus szinkronizálása.
+ brex: Brex készpénz és vállalati kártya tevékenység szinkronizálása csak olvasási hozzáféréssel.
+ coinbase: Coinbase kriptoeszközök importálása és teljesítmény nyomon követése.
+ binance: Binance spot egyenlegek szinkronizálása csak olvasási API-kulccsal.
+ kraken: Kraken egyenlegek és spot ügyletek szinkronizálása csak olvasási API-kulccsal.
+ snaptrade: Brókeri számlák csatlakoztatása a SnapTrade aggregációs hálózaton keresztül.
+ ibkr: Interactive Brokers befektetési számlák szinkronizálása Flex Query importálással.
+ indexa_capital: Indexa Capital automatizált befektetési portfólió nyomon követése.
+ sophtron: US és kanadai bankok és közüzemi szolgáltatók csatlakoztatása.
+ plaid: Ezernyi US pénzintézet csatlakoztatása Plaid-en keresztül.
+ plaid_eu: Európai pénzintézetek csatlakoztatása Plaid-en keresztül (PSD2 / Open Banking).
+ search_filters:
+ aria_label: Szolgáltatók keresése
+ placeholder: Szolgáltatók keresése
+ chips:
+ all: Összes
+ bank: Bankok
+ crypto: Kripto
+ investment: Befektetések
+ empty_filter: Nincs a szűrőnek megfelelő szolgáltató.
+ clear_filter: Szűrők törlése
show:
coinbase_title: Coinbase
encryption_error:
@@ -208,6 +320,8 @@ hu:
step2: "Hozz létre egy új API-kulcsot, csak olvasási engedéllyel"
step3: "Illeszd be az API-kulcsodat és az API-titkodat az alábbiakba"
no_withdraw_warning: "Figyelmeztetés: NE engedélyezd a kifizetési jogosultságot"
+ no_withdraw_title: "Csak olvasható kulcs"
+ no_withdraw_body: "Ne engedélyezd a kifizetési jogosultságot a Binance API-kulcs létrehozásakor. A Sure csak olvasási hozzáférést igényel."
ip_hint_title: "IP-cím-engedélyezési lista szükséges"
ip_hint_body: "Add hozzá az alkalmazásszerver kimenő IP-címét a Binance API-kulcs engedélyezési listájához:"
ip_hint_contact_admin: "Az alkalmazásszerver kimenő IP-címéért fordulj a rendszergazdádhoz."
@@ -219,6 +333,136 @@ hu:
syncing: Szinkronizálás...
sync: Szinkronizálás
disconnect_confirm: "Biztosan le szeretnéd választani a Binance-t?"
+ kraken_panel:
+ step1_html: 'Nyisd meg a Kraken API-beállításait'
+ step2: "Hozz létre egy API-kulcsot csak Lekérdezési alapok és Lekérdezési zárt megbízások & ügyletek jogosultsággal."
+ step3: "Illeszd be az API-kulcsot és a privát kulcsot az alábbiakba."
+ read_only_title: "Csak olvasási tőzsdei szinkronizálás"
+ read_only_body: "Ne adj kereskedési, visszavonási, kifizetési, exportálási, főkönyvi, Earn, staking vagy átutalási jogosultságot. A Sure csak egyenlegeket, pozíciókat és spot ügyletek adatait importálja."
+ default_connection_name: Kraken
+ add_connection: Kraken-kapcsolat hozzáadása
+ update_connection: Kapcsolat frissítése
+ connection_name_label: Kapcsolat neve
+ connection_name_placeholder: Fő Kraken
+ api_key_label: API-kulcs
+ api_key_placeholder: Illeszd be a Kraken API-kulcsodat
+ keep_api_key_placeholder: Hagyd üresen a meglévő API-kulcs megtartásához
+ api_secret_label: Privát kulcs
+ api_secret_placeholder: Illeszd be a Kraken privát kulcsodat
+ keep_api_secret_placeholder: Hagyd üresen a meglévő privát kulcs megtartásához
+ setup_accounts: Számla beállítása
+ syncing: Szinkronizálás...
+ sync: Szinkronizálás
+ disconnect: Lecsatlakozás
+ disconnect_confirm: "Biztosan le szeretnéd választani a(z) %{name}-t?"
enable_banking_panel:
callback_url_instruction: "A visszahívási URL-hez használd a következőt: %{callback_url}."
connection_error: Kapcsolódási hiba
+ step_1_html: "Menj a(z) %{link} oldalra, és szerezd meg a fejlesztői hitelesítő adataidat."
+ step_2: "Válaszd ki az országodat, és illeszd be az alkalmazásazonosítót és az ügyfél-tanúsítványt alább."
+ step_3: "Mentsd el, majd a Kapcsolat hozzáadása gombbal csatlakoztasd a bankod."
+ config_locked_title: "Konfiguráció zárolva"
+ config_locked_message: "Válassz le minden csatlakoztatott bankot a hitelesítő adatok módosítása előtt."
+ application_id_label: "Alkalmazásazonosító"
+ application_id_placeholder_new: "Add meg az alkalmazásazonosítót"
+ application_id_placeholder_update: "Add meg az új azonosítót a frissítéshez"
+ client_certificate_label: "Ügyfél-tanúsítvány (privát kulccsal)"
+ save_and_connect: "Mentés és csatlakozás"
+ update_connection: "Kapcsolat frissítése"
+ connected_bank: "Csatlakoztatott bank"
+ session_expires: "Munkamenet lejárata: %{date}"
+ unknown: "Ismeretlen"
+ connection: "Kapcsolat"
+ session_expired_reconnect: "Munkamenet lejárt – csatlakozz újra"
+ configured: "Konfigurálva"
+ ready_to_link: "Kész számlák összekapcsolására"
+ sync: "Szinkronizálás"
+ reconnect: "Újracsatlakozás"
+ connect_bank: "Bank csatlakoztatása"
+ remove: "Eltávolítás"
+ remove_confirm: "Biztosan el szeretnéd távolítani ezt a kapcsolatot?"
+ add_connection: "Kapcsolat hozzáadása"
+ syncing: "Szinkronizálás"
+ select_country: "Ország kiválasztása..."
+ country_label: "Ország"
+ lunchflow_panel:
+ step_1_html: "Menj a(z) %{link} oldalra és hozz létre egy API-kulcsot."
+ step_2: "Illeszd be a kulcsodat alább és csatlakozz."
+ step_3: "Ezután menj a Számlák menübe a szinkronizált számlák összekapcsolásához."
+ api_key_label: "API-kulcs"
+ api_key_placeholder_new: "Illeszd be ide az API-kulcsot"
+ api_key_placeholder_update: "Add meg az új API-kulcsot a frissítéshez"
+ base_url_label: "Alap URL (nem kötelező)"
+ base_url_placeholder: "https://lunchflow.app/api/v1 (alapértelmezett)"
+ save_and_connect: "Mentés és csatlakozás"
+ update_connection: "Kapcsolat frissítése"
+ simplefin_panel:
+ step_1_html: "Menj a(z) %{link} oldalra egy egyszeri beállítási tokenért."
+ step_2: "Illeszd be a tokent alább és csatlakozz."
+ step_3: "Ezután menj a Számlák menübe a szinkronizált számlák összekapcsolásához."
+ setup_token_label: "Beállítási token"
+ setup_token_placeholder: "SimpleFIN beállítási token beillesztése"
+ save_and_connect: "Mentés és csatlakozás"
+ plaid_panel:
+ step_1_html: "Nyisd meg a(z) %{link} oldalt, és másold ki az ügyfél-azonosítódat és titkos kulcsodat."
+ step_2: "Válassz környezetet. Teszteléshez sandbox, éles számlákhoz production."
+ step_3: "Illeszd be a hitelesítő adataidat alább és csatlakozz."
+ plaid_eu_panel:
+ step_1_html: "Nyisd meg a(z) %{link} oldalt, és másold ki az EU ügyfél-azonosítódat és titkos kulcsodat."
+ not_found: Szolgáltató nem található.
+ sync_provider_no_items: Nincs elérhető kapcsolat a szinkronizáláshoz.
+ ibkr_panel:
+ steps:
+ step_1: 'Az IBKR ügyfélportálon menj a „Teljesítmény és Jelentések" > „Flex lekérdezések" menübe.'
+ step_2: 'Kattints a „+" ikonra az „Activity Flex Query" részben egy új lekérdezés létrehozásához.'
+ step_3: 'Nevezd el a lekérdezést (pl. „Sure Sync"), majd tekintsd át az alábbi Flex Query részleteket, és engedélyezd a felsorolt szakaszokat, mezőket és konfigurációs lehetőségeket.'
+ step_4: 'Mentsd el a lekérdezést, jegyezd fel a „Query ID"-t, majd a „Flex Web Service Configuration" részben a fogaskerék ikonnal hozz létre egy hozzáférési tokent.'
+ step_5: "Illeszd be a Query ID-t és a tokent alább, mentsd el a konfigurációt, majd menj a Számlák menübe a felderített IBKR-számlák összekapcsolásához."
+ flex_query_details:
+ eyebrow: Flex Query
+ title: Szakaszok, mezők és konfiguráció
+ summary: Bővítsd ki a pontos szakaszok, mezők és beállítások megtekintéséhez, amelyeket az IBKR Activity Flex Query-nek tartalmaznia kell.
+ sections_heading: Engedélyezd ezeket a szakaszokat és mezőket
+ configuration_heading: Állítsd be ezeket a lekérdezési opciókat
+ sections:
+ account_information: "Számla adatai: Számlaazonosító, Pénznem"
+ cash_report: "Készpénzjelentés:"
+ cash_report_options: "Opciók: Nincs"
+ cash_report_fields: "Mezők: Pénznem, Záró készpénz"
+ cash_transactions: "Készpénztranzakciók:"
+ cash_transactions_options: "Opciók: Osztalékok, Befizetések és kifizetések, Részletek"
+ cash_transactions_fields: "Mezők: Összeg, Conid, Pénznem, FX-árfolyam alaphoz, Jelentési dátum, Tranzakció-azonosító, Típus"
+ change_in_position_value_summary: "Pozícióérték változásának összefoglalója: Pénznem, Időszak végi érték"
+ net_asset_value: "Nettó eszközérték (NAV) alapban:"
+ net_asset_value_options: "Opciók: Nincs"
+ net_asset_value_fields: "Mezők: Pénznem, Jelentési dátum, Összesen"
+ open_positions: "Nyitott pozíciók:"
+ open_positions_options: "Opciók: Összefoglalás"
+ open_positions_fields: "Mezők: Eszközosztály, Conid, Bekerülési ár, Pénznem, FX-árfolyam alaphoz, Piaci ár, Mennyiség, Jelentési dátum, Értékpapír-azonosító, Értékpapír-azonosító típus, Oldal, Szimbólum"
+ trades: "Ügyletek:"
+ trades_options: "Opciók: Végrehajtás"
+ trades_fields: "Mezők: Eszközosztály, Vétel/Eladás, Conid, Pénznem, FX-árfolyam alaphoz, IB jutalék, IB jutalék pénzneme, Mennyiség, Szimbólum, Ügylet dátuma, Ügylet-azonosító, Ügylet ára, Tranzakció-azonosító"
+ configuration:
+ models: "Modellek: Opcionális"
+ format: "Formátum: XML"
+ period: "Időszak: Utolsó 365 naptári nap"
+ date_format: "Dátumformátum: éééé-HH-nn"
+ time_format: "Időformátum: ÓÓ:pp:mm"
+ date_time_separator: "Dátum/idő elválasztó: ; (pontosvessző)"
+ profit_and_loss: "Nyereség és veszteség: Alapértelmezett"
+ all_other_options: 'Minden egyéb konfigurációs opció: „Nem"'
+ report_window_note: "Az IBKR Flex-jelentések az IBKR-ben konfigurált lekérdezési ablakra korlátozódnak. A Sure a teljes aktuális pozíciókat, valamint a jelentésből legfeljebb 365 nap tevékenységet importál."
+ sync: Szinkronizálás
+ disconnect_confirm: Leválasztja az Interactive Brokers-t?
+ query_id_label: Lekérdezés azonosítója
+ query_id_placeholder_new: Add meg az IBKR Flex lekérdezés azonosítóját
+ query_id_placeholder_existing: Hagyd üresen a meglévő azonosító megtartásához
+ token_label: Token
+ token_placeholder_new: Add meg az IBKR Flex Web Service tokenedet
+ token_placeholder_existing: Hagyd üresen a meglévő token megtartásához
+ save_configuration: Konfiguráció mentése
+ update_configuration: Konfiguráció frissítése
+ status_configured_prefix: "%{summary}. Látogasd meg a"
+ accounts_tab: Számlák
+ status_configured_suffix: fület a felderített számlák kezeléséhez.
+ not_configured: Nincs konfigurálva.
diff --git a/config/locales/views/settings/securities/en.yml b/config/locales/views/settings/securities/en.yml
index 453df4ccd..1b8ae5641 100644
--- a/config/locales/views/settings/securities/en.yml
+++ b/config/locales/views/settings/securities/en.yml
@@ -7,6 +7,10 @@ en:
disable_mfa_confirm: Are you sure you want to disable two-factor authentication?
This will make your account less secure.
enable_mfa: Enable 2FA
+ mfa_enabled_status_html: "Two-factor authentication is enabled"
+ mfa_enabled_description: Your account is protected with an additional layer of security.
+ mfa_disabled_status_html: "Two-factor authentication is disabled"
+ mfa_disabled_description: Enable 2FA to add an extra layer of security to your account.
mfa_description: Add an extra layer of security to your account by requiring
a code from your authenticator app when signing in
mfa_title: Two-Factor Authentication
diff --git a/config/locales/views/settings/securities/hu.yml b/config/locales/views/settings/securities/hu.yml
index 3d28037dc..f3dddd801 100644
--- a/config/locales/views/settings/securities/hu.yml
+++ b/config/locales/views/settings/securities/hu.yml
@@ -7,6 +7,10 @@ hu:
disable_mfa_confirm: Biztosan le szeretnéd tiltani a kétlépéses hitelesítést?
Ez kevésbé biztonságossá teszi a fiókodat.
enable_mfa: 2FA engedélyezése
+ mfa_enabled_status_html: "A kétlépéses hitelesítés engedélyezve"
+ mfa_enabled_description: A fiókod egy extra biztonsági réteggel védett.
+ mfa_disabled_status_html: "A kétlépéses hitelesítés letiltva"
+ mfa_disabled_description: Engedélyezd a 2FA-t, hogy extra védelmet adj a fiókodnak.
mfa_description: Adj egy extra biztonsági réteget a fiókodhoz azzal, hogy bejelentkezéskor
kódot kérsz az hitelesítő alkalmazásodtól
mfa_title: Kétlépéses hitelesítés
diff --git a/config/locales/views/shared/hu.yml b/config/locales/views/shared/hu.yml
index d8896b0a4..8f0809e72 100644
--- a/config/locales/views/shared/hu.yml
+++ b/config/locales/views/shared/hu.yml
@@ -1,5 +1,8 @@
---
hu:
+ concerns:
+ self_hostable:
+ redis_configured: "A Redis most megfelelően van konfigurálva! Mostantól beállíthatod a Sure alkalmazásodat."
shared:
confirm_modal:
accept: Megerősítés
@@ -17,5 +20,17 @@ hu:
syncing_notice:
syncing: Számlák adatainak szinkronizálása...
require_admin: "Ezt a műveletet csak adminisztrátorok hajthatják végre"
+ custom_confirm:
+ default_title: "Biztosan?"
+ default_body: "Ez a művelet nem vonható vissza."
+ default_btn_text: "Megerősítés"
+ family_moniker:
+ singular: Háztartás
+ plural: Háztartások
trend_change:
no_change: "nincs változás"
+ cancel: Mégse
+ transaction_tabs:
+ expense: Kiadás
+ income: Bevétel
+ transfer: Átutalás
diff --git a/config/locales/views/simplefin_items/hu.yml b/config/locales/views/simplefin_items/hu.yml
index ff1fad2d3..c2d844bc9 100644
--- a/config/locales/views/simplefin_items/hu.yml
+++ b/config/locales/views/simplefin_items/hu.yml
@@ -30,7 +30,34 @@ hu:
label: "SimpleFIN beállítási token:"
placeholder: "Illeszd be ide a SimpleFIN beállítási tokenedet..."
help_text: "A token egy betűkkel és számokkal kezdődő hosszú karakterlánc"
+ title: SimpleFIN kapcsolat frissítése
+ header_subtitle: Szerezz be egy új beállítási tokent a SimpleFIN-fiókod újracsatlakoztatásához
+ connection_needs_update: "A SimpleFIN kapcsolatodat frissíteni kell:"
+ step_1_html: "Látogass el a SimpleFIN Bridge oldalra egy új beállítási token létrehozásához"
+ step_2: Másold ki a tokent és illeszd be alább
+ step_3: "Kattints a \"Frissítés\" gombra a hozzáférés visszaállításához"
+ update: Frissítés
+ cancel: Mégse
setup_accounts:
+ title: SimpleFIN számlák beállítása
+ header_subtitle: Válaszd ki az importált számlák helyes típusait
+ choose_account_type: "Válaszd ki a megfelelő számlatípust minden SimpleFIN számlához:"
+ account_type_checking_savings: Folyó- vagy megtakarítási
+ account_type_checking_savings_desc: Normál bankszámlák
+ account_type_credit_card: Hitelkártya
+ account_type_credit_card_desc: Hitelkártya számlák
+ account_type_investment: Befektetési
+ account_type_investment_desc: "Brókeri, 401(k), IRA számlák"
+ account_type_loan: Hitel vagy jelzálog
+ account_type_loan_desc: Adósságszámlák
+ account_type_other_asset: Egyéb vagyon
+ account_type_other_asset_desc: Minden más
+ transaction_history_title: "Tranzakciós előzmények:"
+ transaction_history_description_html: "A SimpleFIN általában 60-90 nap tranzakciós előzményt biztosít, a banktól függően. A kezdeti beállítás után az új tranzakciók automatikusan szinkronizálódnak. Az előzmények elérhetősége intézményenként és számlatípusonként változó."
+ account_type_label: "Számla típusa:"
+ create_accounts: Számlák létrehozása
+ creating_accounts: Számlák létrehozása...
+ cancel: Mégse
account_card:
balance: "Egyenleg"
activity:
diff --git a/config/locales/views/snaptrade_items/hu.yml b/config/locales/views/snaptrade_items/hu.yml
index 424ba7ca3..dab3d05ce 100644
--- a/config/locales/views/snaptrade_items/hu.yml
+++ b/config/locales/views/snaptrade_items/hu.yml
@@ -2,6 +2,8 @@
hu:
snaptrade_items:
default_name: "SnapTrade kapcsolat"
+ link_accounts:
+ use_setup_flow: Használd helyette a számlabeállítási folyamatot
create:
success: "SnapTrade sikeresen beállítva."
update:
@@ -74,6 +76,8 @@ hu:
available_accounts: "Elérhető számlák"
balance_label: "Egyenleg:"
account_number: "Számla:"
+ sync_start_date_label: "Tranzakciók importálása ettől:"
+ sync_start_date_help: "Hagyd üresen az összes elérhető előzményhez"
create_button: "Kiválasztott számlák létrehozása"
cancel_button: "Mégse"
creating: "Számlák létrehozása..."
@@ -133,6 +137,7 @@ hu:
needs_setup:
one: "%{count} beállítást igényel"
other: "%{count} beállítást igényel"
+ status_needs_registration: "Hitelesítő adatok elmentve. Fejezd be a beállítást egy brókercég csatlakoztatásához."
status_ready: "Készen áll brókercégek csatlakoztatásához"
setup_accounts_button: "Számlák beállítása"
connect_button: "Brókercég csatlakoztatása"
diff --git a/config/locales/views/sophtron_items/hu.yml b/config/locales/views/sophtron_items/hu.yml
index a4cb2d375..c64f06715 100644
--- a/config/locales/views/sophtron_items/hu.yml
+++ b/config/locales/views/sophtron_items/hu.yml
@@ -59,6 +59,42 @@ hu:
no_accounts_found: Nem találhatók számlák. Kérlek ellenőrizd az API-kulcs konfigurációdat.
no_access_key: A Sophtron hozzáférési kulcs nincs beállítva. Kérlek állítsd be a Beállításokban.
no_user_id: A Sophtron felhasználói azonosító nincs beállítva. Kérlek állítsd be a Beállításokban.
+ no_institution_connected: Kérlek először csatlakoztass egy banki intézményt a Sophtron-nal.
+ connect:
+ cancel: Mégse
+ captcha: Captcha
+ connect: Csatlakozás
+ institution_search_label: Intézmény
+ institution_search_placeholder: Keresés banknév szerint
+ no_institutions: Nem találhatók egyező intézmények.
+ password: Jelszó
+ search: Keresés
+ search_too_short: Legalább két karaktert adj meg a kereséshez.
+ title: Sophtron intézmény csatlakoztatása
+ username: Felhasználónév
+ connect_institution:
+ api_error: "Sophtron kapcsolódás sikertelen: %{message}"
+ missing_parameters: Válassz intézményt és add meg a banki bejelentkezési adataidat.
+ connection_status:
+ api_error: "API kapcsolódási hiba: %{message}"
+ attempt: "%{attempt}. kísérlet a(z) %{max}-ból"
+ check_again: Ellenőrzés újra
+ failed: A Sophtron nem tudta befejezni ezt az intézményi kapcsolatot.
+ failed_timeout: A Sophtron túllépte az időkorlátot, miközben az intézmény befejezi a bejelentkezést.
+ timeout: A Sophtron nem fejezte be a kapcsolódást a várt időn belül. Ellenőrizheted újra, vagy próbálkozz meg a kapcsolódással később.
+ title: Sophtron csatlakoztatása
+ waiting: A Sophtron még kapcsolódik az intézményedhez.
+ mfa:
+ captcha: Captcha szöveg
+ captcha_alt: Sophtron captcha
+ phone_confirmed: Telefonon megerősítettem
+ submit: Elküldés
+ title: Sophtron ellenőrzés
+ token: Ellenőrző kód
+ submit_mfa:
+ api_error: "Ellenőrzés sikertelen: %{message}"
+ invalid_security_answers: A biztonsági válaszok hiányoznak vagy túl hosszúak.
+ unknown_challenge: Ismeretlen Sophtron ellenőrzési lépés.
sophtron_item:
accounts_need_setup: Számlák beállítást igényelnek
automatic_sync: Automatikus szinkronizálás használata
@@ -102,6 +138,7 @@ hu:
no_user_id: A Sophtron felhasználói azonosító nincs beállítva. Kérlek állítsd be a Beállításokban.
no_credentials_configured: "Kérlek előbb állítsd be a Sophtron API felhasználói azonosítódat és hozzáférési kulcsodat a Szolgáltatói beállításokban."
no_name_placeholder: "(Nincs név)"
+ no_institution_connected: Kérlek először csatlakoztass egy banki intézményt a Sophtron-nal.
title: Sophtron számlák kiválasztása
select_existing_account:
account_already_linked: Ez a számla már össze van kapcsolva egy szolgáltatóval
@@ -116,7 +153,9 @@ hu:
no_access_key: A Sophtron hozzáférési kulcs nincs beállítva. Kérlek állítsd be a Beállításokban.
no_user_id: A Sophtron felhasználói azonosító nincs beállítva. Kérlek állítsd be a Beállításokban.
no_name_placeholder: "(Nincs név)"
+ no_institution_connected: Kérlek először csatlakoztass egy banki intézményt a Sophtron-nal.
title: "%{account_name} összekapcsolása a Sophtron-nal"
+ unexpected_error: "Váratlan hiba történt"
link_existing_account:
account_already_linked: Ez a számla már össze van kapcsolva egy szolgáltatóval
api_error: "API kapcsolódási hiba"
@@ -125,6 +164,7 @@ hu:
sophtron_account_already_linked: Ez a Sophtron számla már össze van kapcsolva egy másik számlával
sophtron_account_not_found: Sophtron számla nem található
missing_parameters: Hiányzó kötelező paraméterek
+ no_institution_connected: Kérlek először csatlakoztass egy banki intézményt a Sophtron-nal.
success: "%{account_name} sikeresen összekapcsolva a Sophtron-nal"
setup_accounts:
account_type_label: "Számla típusa:"
@@ -135,13 +175,14 @@ hu:
no_accounts_to_setup: "Nincs beállítandó számla"
no_access_key: "A Sophtron hozzáférési kulcs nincs beállítva. Kérlek ellenőrizd a kapcsolati beállításaidat."
no_user_id: "A Sophtron felhasználói azonosító nincs beállítva. Kérlek ellenőrizd a kapcsolati beállításaidat."
+ no_institution_connected: "A Sophtron intézmény még nincs csatlakoztatva."
account_types:
skip: Számla kihagyása
depository: Folyó- vagy megtakarítási számla
credit_card: Hitelkártya
investment: Befektetési számla
loan: Hitel vagy jelzálog
- other_asset: Egyéb eszköz
+ other_asset: Egyéb vagyon
subtype_labels:
depository: "Számla altípusa:"
credit_card: ""
@@ -150,7 +191,7 @@ hu:
other_asset: ""
subtype_messages:
credit_card: "A hitelkártyák automatikusan hitelkártya számlákként lesznek beállítva."
- other_asset: "Az egyéb eszközökhöz nincs szükség további beállításokra."
+ other_asset: "Az egyéb vagyonelemekhez nincs szükség további beállításokra."
balance: Egyenleg
cancel: Mégse
choose_account_type: "Válaszd ki a megfelelő számlatípust minden Sophtron számlához:"
@@ -198,13 +239,19 @@ hu:
api_error:
title: "Sophtron kapcsolódási hiba"
unable_to_connect: "Nem sikerült csatlakozni a Sophtron-hoz"
+ institution_unable_to_connect: "Nem sikerült csatlakozni az intézményhez"
common_issues_title: "Gyakori problémák:"
incorrect_user_id: "Helytelen felhasználói azonosító: Ellenőrizd a felhasználói azonosítódat a Szolgáltatói beállításokban"
invalid_access_key: "Érvénytelen hozzáférési kulcs: Ellenőrizd a hozzáférési kulcsodat a Szolgáltatói beállításokban"
expired_credentials: "Lejárt hitelesítő adatok: Hozz létre új felhasználói azonosítót és hozzáférési kulcsot a Sophtron-ban"
network_issue: "Hálózati probléma: Ellenőrizd az internetkapcsolatodat"
service_down: "Szolgáltatás leállása: A Sophtron API ideiglenesen nem érhető el"
+ bad_credentials: "Banki bejelentkezési adatok: Ellenőrizd, hogy a felhasználónév és jelszó helyes-e"
+ verification_code: "Ellenőrző kód: Győződj meg róla, hogy a legújabb kódot adtad meg, mielőtt lejárt"
+ institution_timeout: "Intézményi időtúllépés: A bank bejelentkezési oldala nem fejezte be a folyamatot időben"
+ unsupported_mfa: "MFA-támogatás: A Sophtron esetleg nem támogatja az intézmény jelenlegi ellenőrzési folyamatát"
check_provider_settings: "Szolgáltatói beállítások ellenőrzése"
+ try_again: "Próbálkozz újra a csatlakozással"
select_option: "%{type} kiválasztása"
subtype: "altípus"
type: "típus"
@@ -243,3 +290,24 @@ hu:
sophtron_entry:
processor:
unknown_transaction: "Ismeretlen tranzakció"
+ render_connection_timeout:
+ timeout: "A kapcsolat túllépte az időkorlátot. Kérlek próbáld újra."
+ redirect_after_account_link:
+ invalid_account_names:
+ one: "%{count} számlát nem lehet összekapcsolni üres névvel"
+ other: "%{count} számlát nem lehet összekapcsolni üres névvel"
+ partial_invalid: "%{created_count} számla összekapcsolva. %{already_linked_count} már össze volt kapcsolva, %{invalid_count} érvénytelen névvel rendelkezik."
+ partial_success: "%{created_count} számla összekapcsolva. %{already_linked_count} számla már össze volt kapcsolva."
+ success:
+ one: "%{count} számla sikeresen összekapcsolva."
+ other: "%{count} számla sikeresen összekapcsolva."
+ all_already_linked:
+ one: "A kiválasztott számla már össze van kapcsolva"
+ other: "Mind a(z) %{count} kiválasztott számla már össze van kapcsolva"
+ link_failed: "Nem sikerült összekapcsolni a számlákat"
+ start_manual_sync:
+ already_running: "Már folyamatban van egy szinkronizálás."
+ no_linked_accounts: "Nincs elérhető összekapcsolt számla a szinkronizáláshoz."
+ api_error: "API hiba: %{message}"
+ start_manual_sync_for_account:
+ failed: "Nem sikerült szinkronizálni a számlát"
diff --git a/config/locales/views/subscriptions/hu.yml b/config/locales/views/subscriptions/hu.yml
index 996f3a56b..b2b70f03f 100644
--- a/config/locales/views/subscriptions/hu.yml
+++ b/config/locales/views/subscriptions/hu.yml
@@ -3,6 +3,10 @@ hu:
subscriptions:
self_hosted_alert: "%{product_name} önállóan üzemeltetett módban nem érhető el."
upgrade:
+ already_contributing: Már hozzájárulsz. Köszönjük!
+ page_title: "Frissítés"
+ account_settings: "Fiókbeállítások"
+ sign_out: "Kijelentkezés"
contribute_and_support_sure: "Járulj hozzá és támogasd a Sure-t"
cta: "Folytasd ennek a kódbázisnak a fejlesztésének támogatását!"
header:
@@ -12,3 +16,9 @@ hu:
redirect_to_stripe: "A következő lépésben átirányítunk a Stripe-ra, amely kezeli a bankkártyás fizetéseket."
trialing: "Az adataid %{days} nap múlva törlésre kerülnek"
trial_over: "A próbaidőszakod lejárt"
+ create:
+ welcome: "Üdvözlünk a Sure-ban!"
+ trial_already_used: "Már elindítottál vagy befejezted egy próbaidőszakot. A folytatáshoz kérlek frissítsd az előfizetésedet."
+ success:
+ welcome_with_contribution: "Üdvözlünk a Sure-ban! Köszönjük a hozzájárulásodat."
+ contribution_failed: "Hiba történt a hozzájárulás feldolgozása során. Kérlek próbáld újra."
diff --git a/config/locales/views/tag/deletions/hu.yml b/config/locales/views/tag/deletions/hu.yml
index c923f762f..f0a10847e 100644
--- a/config/locales/views/tag/deletions/hu.yml
+++ b/config/locales/views/tag/deletions/hu.yml
@@ -7,6 +7,7 @@ hu:
new:
delete_and_leave_uncategorized: '"%{tag_name}" törlése'
delete_and_recategorize: '"%{tag_name}" törlése és új címke hozzárendelése'
+ delete_and_reassign: Törlés és újraosztás
delete_tag: Törlöd a címkét?
explanation: "%{tag_name} el lesz távolítva a tranzakciókból és egyéb, címkézett elemekből. Ahelyett, hogy címke nélkül maradnának, alább új címkét is hozzárendelhetsz."
replacement_tag_prompt: Válassz címkét
diff --git a/config/locales/views/tags/hu.yml b/config/locales/views/tags/hu.yml
index 0edff9b46..ee487af83 100644
--- a/config/locales/views/tags/hu.yml
+++ b/config/locales/views/tags/hu.yml
@@ -6,6 +6,8 @@ hu:
error: 'Hiba a címke létrehozásakor: %{error}'
destroy:
deleted: Címke törölve
+ destroy_all:
+ all_deleted: Minden címke törölve
edit:
edit: Címke szerkesztése
form:
@@ -14,6 +16,7 @@ hu:
empty: Még nincsenek címkék
new: Új címke
tags: Címkék
+ delete_all: Összes törlése
new:
new: Új címke
tag:
diff --git a/config/locales/views/transactions/en.yml b/config/locales/views/transactions/en.yml
index 5cde05d72..e1f248a9c 100644
--- a/config/locales/views/transactions/en.yml
+++ b/config/locales/views/transactions/en.yml
@@ -3,12 +3,27 @@ en:
transactions:
bulk_updates:
new:
+ cancel: Cancel
+ category_label: Category
+ category_prompt: Select a category
+ date_label: Date
+ header_title: Edit transactions
+ merchant_label: Merchant
+ merchant_prompt: Select a merchant
name_label: Name
name_placeholder: Enter a name that will be applied to selected transactions
+ none: "(none)"
+ notes_label: Notes
+ notes_placeholder: Enter a note that will be applied to selected transactions
+ overview: Overview
+ save: Save
+ tags_label: Tags
+ transactions_section: Transactions
unknown_name: Unknown transaction
selection_bar:
duplicate: Duplicate
edit: Edit
+ selected: selected
form:
details: Details
account: Account
diff --git a/config/locales/views/transactions/hu.yml b/config/locales/views/transactions/hu.yml
index ed516d633..bd12ab3c2 100644
--- a/config/locales/views/transactions/hu.yml
+++ b/config/locales/views/transactions/hu.yml
@@ -3,17 +3,34 @@ hu:
transactions:
bulk_updates:
new:
+ cancel: Mégse
+ category_label: Kategória
+ category_prompt: Válassz kategóriát
+ date_label: Dátum
+ header_title: Tranzakciók szerkesztése
+ merchant_label: Kereskedő
+ merchant_prompt: Válassz kereskedőt
name_label: Név
name_placeholder: Add meg a kiválasztott tranzakciókra alkalmazandó nevet
+ none: "(egyik sem)"
+ notes_label: Megjegyzések
+ notes_placeholder: Add meg a kiválasztott tranzakciókra alkalmazandó megjegyzést
+ overview: Áttekintés
+ save: Mentés
+ tags_label: Címkék
+ transactions_section: Tranzakciók
unknown_name: Ismeretlen tranzakció
selection_bar:
duplicate: Duplikálás
edit: Szerkesztés
+ selected: kijelölve
form:
+ details: Részletek
account: Számla
account_prompt: Válassz számlát
amount: Összeg
category: Kategória
+ category_label: Kategória
category_prompt: Válassz kategóriát
date: Dátum
description: Leírás
@@ -27,9 +44,22 @@ hu:
submit: Tranzakció hozzáadása
tags_label: Címkék
transfer: Átutalás
+ create:
+ created: Tranzakció létrehozva
+ update:
+ updated: Tranzakció frissítve
new:
new_transaction: Új tranzakció
show:
+ keep_both: Nem, mindkettőt tartsd meg
+ loan_payment: Hiteltörlesztés
+ mark_recurring: Ismétlődőként jelölés
+ mark_recurring_subtitle: Kövesd ezt ismétlődő tranzakcióként. Az összegeltérés automatikusan kiszámításra kerül az elmúlt 6 hónap hasonló tranzakcióiból.
+ mark_recurring_title: Ismétlődő tranzakció
+ merge_duplicate: Igen, egyesítsd őket
+ potential_duplicate_description: Ez a függőben lévő tranzakció megegyezhet az alábbi közzétett tranzakcióval. Ha igen, egyesítsd őket a kettős könyvelés elkerülése érdekében.
+ potential_duplicate_title: Lehetséges duplikátum észlelve
+ transfer: Átutalás
account_label: Számla
amount: Összeg
category_label: Kategória
@@ -64,6 +94,14 @@ hu:
tab_transactions: Tranzakciók
tab_upcoming: Közelgő
uncategorized: "(kategorizálatlan)"
+ additional_details: "További részletek"
+ payee: "Kedvezményezett"
+ description: "Leírás"
+ memo: "Megjegyzés"
+ provider_extras: "Szolgáltatói kiegészítők"
+ transfer_or_debt_payment: "Átutalás vagy adósságtörlesztés?"
+ open_matcher: "Összevonó megnyitása"
+ convert: "Konvertálás"
activity_labels:
buy: Vétel
sell: Eladás
@@ -125,9 +163,17 @@ hu:
edit_tags: Címkék szerkesztése
import: Import
index:
+ title: "Tranzakciók"
transaction: tranzakció
transactions: tranzakció
import: Import
+ new_rule: "Új szabály"
+ edit_rules: "Szabályok szerkesztése"
+ edit_categories: "Kategóriák szerkesztése"
+ edit_tags: "Címkék szerkesztése"
+ edit_merchants: "Kereskedők szerkesztése"
+ edit_imports: "Importok szerkesztése"
+ new_transaction: "Új tranzakció"
categorize_button:
one: "Kategorizálás (1)"
other: "Kategorizálás (%{count})"
@@ -224,6 +270,9 @@ hu:
unexpected_error: "Váratlan hiba a konverzió során: %{error}"
searches:
filters:
+ date_filter:
+ start_date: "Kezdő dátum"
+ end_date: "Záró dátum"
amount_filter:
equal_to: Egyenlő
greater_than: Nagyobb, mint
@@ -262,6 +311,8 @@ hu:
less_than: kisebb, mint
form:
toggle_selection_checkboxes: Összes jelölőnégyzet be/ki
+ search_placeholder: "Tranzakciók keresése..."
+ filter: "Szűrő"
attachments:
cannot_exceed: "Tranzakciónként legfeljebb %{count} melléklet engedélyezett"
uploaded_one: "Melléklet sikeresen feltöltve"
diff --git a/config/locales/views/transfer_matches/hu.yml b/config/locales/views/transfer_matches/hu.yml
index 0a6d73cc4..f4ac47f51 100644
--- a/config/locales/views/transfer_matches/hu.yml
+++ b/config/locales/views/transfer_matches/hu.yml
@@ -1,7 +1,24 @@
---
hu:
transfer_matches:
+ create:
+ success: Átutalás létrehozva
new:
header:
title: Átutalás vagy fizetés párosítása
subtitle: Párosítsd a megfelelő tranzakciót egy másik számlán, vagy hozz létre újat, ha még nem létezik.
+ from_account: Forrásszámla
+ from_account_named: "Forrásszámla: %{name}"
+ to_account: Célszámla
+ to_account_named: "Célszámla: %{name}"
+ outflow_transaction: Kiáramlási tranzakció
+ inflow_transaction: Beáramlási tranzakció
+ create_transfer_match: Átutalás-egyezés létrehozása
+ matching_fields:
+ select_method: Válassz módszert a tranzakciók párosításához.
+ match_existing_recommended: Meglévő tranzakció párosítása (ajánlott)
+ create_new_transaction: Új tranzakció létrehozása
+ matching_method: Párosítási módszer
+ matching_transaction: Párosított tranzakció
+ target_account: Célszámla
+ no_matching_transactions: Nem találtunk párosítható tranzakciókat a többi számlán. Kérlek válassz számlát, és létrehozunk egy új beáramlási tranzakciót.
diff --git a/config/locales/views/transfers/hu.yml b/config/locales/views/transfers/hu.yml
index de8535642..18df870c0 100644
--- a/config/locales/views/transfers/hu.yml
+++ b/config/locales/views/transfers/hu.yml
@@ -30,9 +30,18 @@ hu:
delete_subtitle: Ez eltávolítja az átutalást. Az alapul szolgáló tranzakciókat nem törli.
delete_title: Eltávolítja az átutalást?
details: Részletek
+ mark_recurring: Ismétlődőként jelölés
+ mark_recurring_subtitle: Kövesd ezt az átutalást ismétlődő mintaként a közelgő eseménylistában és az ismétlődők oldalon.
+ mark_recurring_title: Átutalás ismétlődőként jelölése
note_label: Megjegyzések
note_placeholder: Adj meg egy megjegyzést ehhez az átutaláshoz
overview: Áttekintés
settings: Beállítások
+ from: Honnan
+ to: Hova
+ date: Dátum
+ amount: Összeg
+ category: Kategória
+ uncategorized: Kategorizálatlan
update:
success: Átutalás frissítve
diff --git a/config/locales/views/users/hu.yml b/config/locales/views/users/hu.yml
index 8d0a73f82..6cc4bdb4b 100644
--- a/config/locales/views/users/hu.yml
+++ b/config/locales/views/users/hu.yml
@@ -15,3 +15,10 @@ hu:
unauthorized: Nincs jogosultságod ezt a műveletet végrehajtani.
reset_with_sample_data:
success: A fiókod visszaállítva, és a mintaadatok előkészítése folyamatban van. Hamarosan megjelennek a demóadatok.
+ user_menu:
+ version: Verzió
+ settings: Beállítások
+ changelog: Változásnapló
+ feedback: Visszajelzés
+ contact: Kapcsolat
+ log_out: Kijelentkezés
diff --git a/config/locales/views/valuations/hu.yml b/config/locales/views/valuations/hu.yml
index 53ad3986b..f00a1cfa8 100644
--- a/config/locales/views/valuations/hu.yml
+++ b/config/locales/views/valuations/hu.yml
@@ -1,6 +1,33 @@
---
hu:
valuations:
+ confirmation_contents:
+ this_will: "Ez %{action_verb} a számlaértéket"
+ to_colon: "erre:"
+ total_account_value: Számla teljes értéke
+ holdings_value: Portfólió értéke
+ brokerage_cash: Brókeri készpénz
+ account_balance: számlaegyenleg
+ credit_card_balance: hitelkártya-egyenleg
+ loan_balance: hitelegyenleg
+ property_value: ingatlan értéke
+ vehicle_value: jármű értéke
+ crypto_balance: kriptoegyenleg
+ asset_value: vagyonérték
+ liability_balance: kötelezettségegyenleg
+ balance: egyenleg
+ "on": "ezen:"
+ to: "erre:"
+ recalculate_notice: "Minden jövőbeli tranzakció és egyenleg újraszámításra kerül ezen %{change_or_update} alapján."
+ change: változás
+ update: frissítés
+ create:
+ account_updated: Számla frissítve
+ update:
+ account_updated: Számla frissítve
+ entry_updated: Bejegyzés frissítve
+ errors:
+ amount_required: Az összeg megadása kötelező
form:
amount: Összeg
submit: Egyenlegfrissítés hozzáadása
@@ -17,6 +44,7 @@ hu:
title: Új egyenleg
show:
amount: Összeg
+ amount_label: Számlaérték a megadott napon
date_label: Dátum
delete: Törlés
delete_subtitle: Ez a művelet nem vonható vissza
@@ -28,3 +56,5 @@ hu:
note_placeholder: Adj meg további részleteket erről a bejegyzésről
overview: Áttekintés
settings: Beállítások
+ opening_balance: "Nyitóegyenleg"
+ update_value: Érték frissítése
diff --git a/config/locales/views/vehicles/hu.yml b/config/locales/views/vehicles/hu.yml
index dfad86013..6ad9810c2 100644
--- a/config/locales/views/vehicles/hu.yml
+++ b/config/locales/views/vehicles/hu.yml
@@ -23,3 +23,13 @@ hu:
trend: Tendencia
unknown: Ismeretlen
year: Évjárat
+ tabs:
+ overview:
+ current_price: Jelenlegi ár
+ make_model: Márka és modell
+ mileage: Kilométeróra-állás
+ purchase_price: Vételár
+ trend: Tendencia
+ unknown: Ismeretlen
+ year: Évjárat
+ edit_account_details: "Számlaadatok szerkesztése"
diff --git a/test/models/account_test.rb b/test/models/account_test.rb
index a903f5d86..6b1507159 100644
--- a/test/models/account_test.rb
+++ b/test/models/account_test.rb
@@ -99,6 +99,13 @@ class AccountTest < ActiveSupport::TestCase
assert_equal opening_date, opening_anchor.entry.date
end
+ test "accountable display names expose singular and group contexts" do
+ assert_equal "Investment", Investment.singular_display_name
+ assert_equal "Investments", Investment.display_name
+ assert_equal "Cash", Depository.singular_display_name
+ assert_equal "Cash", Depository.display_name
+ end
+
test "gets short/long subtype label" do
investment = Investment.new(subtype: "hsa")
account = @family.accounts.create!(
diff --git a/test/models/balance_sheet_test.rb b/test/models/balance_sheet_test.rb
index 9021baf27..558657279 100644
--- a/test/models/balance_sheet_test.rb
+++ b/test/models/balance_sheet_test.rb
@@ -56,9 +56,9 @@ class BalanceSheetTest < ActiveSupport::TestCase
asset_groups = BalanceSheet.new(@family).assets.account_groups
assert_equal 3, asset_groups.size
- assert_equal 1000 + 2000, asset_groups.find { |ag| ag.name == I18n.t("accounts.types.depository") }.total
- assert_equal 3000, asset_groups.find { |ag| ag.name == I18n.t("accounts.types.investment") }.total
- assert_equal 5000, asset_groups.find { |ag| ag.name == I18n.t("accounts.types.other_asset") }.total
+ assert_equal 1000 + 2000, asset_groups.find { |ag| ag.name == Depository.display_name }.total
+ assert_equal 3000, asset_groups.find { |ag| ag.name == Investment.display_name }.total
+ assert_equal 5000, asset_groups.find { |ag| ag.name == OtherAsset.display_name }.total
end
test "calculates liability group totals" do
@@ -71,8 +71,8 @@ class BalanceSheetTest < ActiveSupport::TestCase
liability_groups = BalanceSheet.new(@family).liabilities.account_groups
assert_equal 2, liability_groups.size
- assert_equal 1000 + 2000, liability_groups.find { |ag| ag.name == I18n.t("accounts.types.credit_card") }.total
- assert_equal 3000 + 5000, liability_groups.find { |ag| ag.name == I18n.t("accounts.types.other_liability") }.total
+ assert_equal 1000 + 2000, liability_groups.find { |ag| ag.name == CreditCard.display_name }.total
+ assert_equal 3000 + 5000, liability_groups.find { |ag| ag.name == OtherLiability.display_name }.total
end
private
diff --git a/test/system/accounts_test.rb b/test/system/accounts_test.rb
index 555959190..b7595f238 100644
--- a/test/system/accounts_test.rb
+++ b/test/system/accounts_test.rb
@@ -105,7 +105,7 @@ class AccountsTest < ApplicationSystemTestCase
end
def assert_account_created(accountable_type, &block)
- click_link Accountable.from_type(accountable_type).display_name.singularize
+ click_link Accountable.from_type(accountable_type).singular_display_name
click_link "Enter account balance" if accountable_type.in?(%w[Depository Investment Crypto Loan CreditCard])
account_name = "[system test] #{accountable_type} Account"
@@ -164,6 +164,6 @@ class AccountsTest < ApplicationSystemTestCase
end
def humanized_accountable(accountable_type)
- Accountable.from_type(accountable_type).display_name.singularize
+ Accountable.from_type(accountable_type).singular_display_name
end
end
From 6262b0a49319895b693c85b0ffbfb78c1b20533c Mon Sep 17 00:00:00 2001
From: CrossDrain <32982516+CrossDrain@users.noreply.github.com>
Date: Mon, 18 May 2026 19:03:04 +0000
Subject: [PATCH 07/33] fix(ibkr): correct historical cash/non-cash split for
linked accounts (#1813)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* fix(ibkr): resolve weekend balance oscillations and improve data processing
Address issues where IBKR weekend/holiday data caused incorrect balance
calculations and improve the robustness of IBKR account processing.
- Fix historical balance oscillations by ignoring anomalous weekend rows
and filling gaps by carrying forward the last known trading day value.
- Normalize report dates to the last trading day to ensure consistency.
- Improve `HoldingsProcessor` to skip individual bad lots instead of
failing the entire group.
- Refactor `ActivitiesProcessor` to accumulate fee counts locally via
return values instead of using instance variables.
- Add support for accounting parentheses notation in `DataHelpers`.
- Memoize the account object in `IbkrAccount::Processor` to reduce
database queries.
- Update tests to reflect date normalization and improved precision
assertions.
* fix(ibkr): derive historical cash from materializer balances, not equity summary
Real IBKR Flex exports do not include a reliable cash/stock breakdown in
EquitySummaryByReportDateInBase — only the total is consistently present.
The previous implementation parsed the missing cash field as zero and wrote
cash_balance=0 for every historical date, causing negative and wildly
incorrect cash values throughout the account history.
Instead, read the materializer's already-computed cash_balance for each date
(derived from holdings via the reverse calculator) and use only IBKR's total
as an authoritative balance anchor. This is consistent with how present-day
balances are handled and requires no weekend/holiday filtering since IBKR does
not emit weekend rows and holiday totals are legitimate data points.
Also accept equity summary rows without an explicit currency field (some Flex
configurations omit it) and explicitly reject BASE_SUMMARY aggregate rows.
Co-Authored-By: Claude Sonnet 4.6
* style: simplify boolean coercion in import_commission_transaction
Co-Authored-By: Claude Sonnet 4.6
* fix(ibkr): cover trailing weekend gap and align qty with valid lots
HistoricalBalancesSync: extend fill_gaps to account.current_anchor_date
so days after the last equity summary row (e.g. Saturday/Sunday when a
sync runs over the weekend) are also overridden rather than left with the
materializer's stale total=cash value.
HoldingsProcessor: replace separate quantity sum + weighted_cost_basis_for
with a single valid_lots method that computes both from the same set of
parseable lots. Previously a lot with a valid position but unparseable
cost_basis_price was excluded from the cost basis calculation but still
counted in quantity, producing inconsistent qty/cost_basis values.
Co-Authored-By: Claude Sonnet 4.6
* review: address PR feedback on ibkr fix branch
- Remove all "Fix N:" review-artifact comment labels
- Add Sentry.capture_message for silenced anchor repair failure so it surfaces in production monitoring
- Add Rails.logger.warn for zero/nil total rows skipped in HistoricalBalancesSync
- Document normalize_to_last_trading_day holiday limitation and why gap-fill covers it
- Rewrite two non-obvious comments to stand alone without the label prefix
Co-Authored-By: Claude Sonnet 4.6
* style: remove alignment padding in balance_rows hash
Co-Authored-By: Claude Sonnet 4.6
* fix(ibkr): address two P1 review findings
- Allow zero and negative equity summary totals through HistoricalBalancesSync
so fully-liquidated and margin accounts are not silently skipped (which would
cause fill_gaps to propagate a stale non-zero total forward).
- Remove normalize_to_last_trading_day from HoldingsProcessor: shifting weekend
report_dates to Friday caused Balance::SyncCache#get_holdings_value to find
no holdings on Saturday/Sunday (exact-date lookup), collapsing non_cash to
zero — reintroducing the very oscillation the fix was meant to prevent.
Co-Authored-By: Claude Sonnet 4.6
* test(ibkr): add tests for historical balances sync and data helpers
- Add test case to verify non-cash balance calculation in historical balances sync
- Add test case to ensure rows with unparseable or nil totals are skipped
- Add new test file for IBKR data helpers
* fix(ibkr): prevent date range overflow during historical sync
Adjust the calculation of `last_date` in `HistoricalBalancesSync` to
ensure it does not exceed the current anchor date or today's date.
This prevents the sync process from attempting to fetch or process
future dates, which was causing oscillations in weekend data.
Also remove the conditional check for Sentry before capturing
error messages in the account processor.
---------
Co-authored-by: Claude Sonnet 4.6
---
.../ibkr_account/activities_processor.rb | 41 ++--
app/models/ibkr_account/data_helpers.rb | 3 +
.../ibkr_account/historical_balances_sync.rb | 98 ++++++--
app/models/ibkr_account/holdings_processor.rb | 51 +++--
app/models/ibkr_account/processor.rb | 19 +-
test/models/ibkr_account/data_helpers_test.rb | 57 +++++
.../historical_balances_sync_test.rb | 209 ++++++++++++++----
test/models/ibkr_account_processor_test.rb | 2 +-
8 files changed, 365 insertions(+), 115 deletions(-)
create mode 100644 test/models/ibkr_account/data_helpers_test.rb
diff --git a/app/models/ibkr_account/activities_processor.rb b/app/models/ibkr_account/activities_processor.rb
index 3b33c224d..e2f906d07 100644
--- a/app/models/ibkr_account/activities_processor.rb
+++ b/app/models/ibkr_account/activities_processor.rb
@@ -13,15 +13,14 @@ class IbkrAccount::ActivitiesProcessor
activities = (@ibkr_account.raw_activities_payload || {}).with_indifferent_access
trades = Array(activities[:trades])
cash_transactions = Array(activities[:cash_transactions])
- @fee_transactions_count = 0
- trades_count = trades.sum { |trade| process_trade(trade.with_indifferent_access) ? 1 : 0 }
- cash_transactions_count = cash_transactions.sum { |cash_transaction| process_cash_transaction(cash_transaction.with_indifferent_access) ? 1 : 0 }
+ trade_results = trades.map { |trade| process_trade(trade.with_indifferent_access) }
+ trades_count = trade_results.count { |r| r[:imported] }
+ fee_count = trade_results.sum { |r| r[:fees] }
- {
- trades: trades_count,
- transactions: cash_transactions_count + @fee_transactions_count
- }
+ cash_count = cash_transactions.sum { |t| process_cash_transaction(t.with_indifferent_access) ? 1 : 0 }
+
+ { trades: trades_count, transactions: cash_count + fee_count }
end
private
@@ -35,14 +34,14 @@ class IbkrAccount::ActivitiesProcessor
end
def process_trade(row)
- return false unless supported_trade?(row)
+ return { imported: false, fees: 0 } unless supported_trade?(row)
security = resolve_security(row)
- return false unless security
+ return { imported: false, fees: 0 } unless security
quantity = parse_decimal(row[:quantity])
native_price = parse_decimal(row[:trade_price])
- return false if quantity.nil? || native_price.nil?
+ return { imported: false, fees: 0 } if quantity.nil? || native_price.nil?
buy_sell = row[:buy_sell].to_s.upcase
signed_quantity = buy_sell == "SELL" ? -quantity.abs : quantity.abs
@@ -65,11 +64,11 @@ class IbkrAccount::ActivitiesProcessor
exchange_rate: parse_decimal(row[:fx_rate_to_base])&.to_f
)
- import_commission_transaction(row, security, date)
- true
+ fees = import_commission_transaction(row, security, date) ? 1 : 0
+ { imported: true, fees: fees }
rescue => e
Rails.logger.error("IbkrAccount::ActivitiesProcessor - Failed to process trade #{row[:trade_id]}: #{e.message}")
- false
+ { imported: false, fees: 0 }
end
def process_cash_transaction(row)
@@ -114,9 +113,10 @@ class IbkrAccount::ActivitiesProcessor
def import_commission_transaction(row, security, date)
commission = parse_decimal(row[:ib_commission])
- return if commission.nil? || commission.zero?
- currency = row.with_indifferent_access[:ib_commission_currency].to_s.upcase.presence || @ibkr_account.currency
- ticker = security&.ticker || row.with_indifferent_access[:symbol]
+ return false if commission.nil? || commission.zero?
+
+ currency = row[:ib_commission_currency].to_s.upcase.presence || @ibkr_account.currency
+ ticker = security&.ticker || row[:symbol]
result = import_adapter.import_transaction(
external_id: "ibkr_trade_fee_#{row[:trade_id]}",
@@ -139,7 +139,7 @@ class IbkrAccount::ActivitiesProcessor
}
)
- @fee_transactions_count += 1 if result
+ !!result
end
def build_trade_name(ticker, signed_quantity)
@@ -170,6 +170,7 @@ class IbkrAccount::ActivitiesProcessor
type != "DIVIDENDS" || row[:conid].present?
end
+ # supported_cash_transaction? ensures only known types reach here; no else branch needed
def classify_cash_transaction(row, amount)
type = row[:type].to_s.upcase.strip
@@ -178,8 +179,6 @@ class IbkrAccount::ActivitiesProcessor
amount.positive? ? [ "Contribution", -amount.abs ] : [ "Withdrawal", amount.abs ]
when "DIVIDENDS"
[ "Dividend", -amount.abs ]
- else
- [ nil, nil ]
end
end
@@ -205,12 +204,12 @@ class IbkrAccount::ActivitiesProcessor
end&.with_indifferent_access&.dig(:symbol)
return holding_symbol if holding_symbol.present?
- Array(@ibkr_account.raw_activities_payload&.dig("trades") || @ibkr_account.raw_activities_payload&.dig(:trades)).find do |trade|
+ activities = (@ibkr_account.raw_activities_payload || {}).with_indifferent_access
+ Array(activities[:trades]).find do |trade|
trade.with_indifferent_access[:conid].to_s == conid.to_s
end&.with_indifferent_access&.dig(:symbol)
end
-
def fx_rate_available?(row)
source_currency = extract_currency(row, fallback: nil)
return false if source_currency.blank?
diff --git a/app/models/ibkr_account/data_helpers.rb b/app/models/ibkr_account/data_helpers.rb
index c3416d74b..6135557a2 100644
--- a/app/models/ibkr_account/data_helpers.rb
+++ b/app/models/ibkr_account/data_helpers.rb
@@ -9,6 +9,9 @@ module IbkrAccount::DataHelpers
normalized = value.is_a?(String) ? value.delete(",").strip : value.to_s
return nil if normalized.blank? || normalized == "-"
+ # Convert accounting parentheses notation: "(1234.56)" → "-1234.56"
+ normalized = "-#{normalized[1..-2]}" if normalized.start_with?("(") && normalized.end_with?(")")
+
BigDecimal(normalized)
rescue ArgumentError
nil
diff --git a/app/models/ibkr_account/historical_balances_sync.rb b/app/models/ibkr_account/historical_balances_sync.rb
index a7a0bc363..4d302d7ba 100644
--- a/app/models/ibkr_account/historical_balances_sync.rb
+++ b/app/models/ibkr_account/historical_balances_sync.rb
@@ -18,33 +18,93 @@ class IbkrAccount::HistoricalBalancesSync
end
private
+
def account
ibkr_account.current_account
end
+ def account_currency
+ ibkr_account.currency.to_s.upcase
+ end
+
def normalized_rows
- @normalized_rows ||= Array(ibkr_account.raw_equity_summary_payload)
- .filter_map do |row|
- next unless row.is_a?(Hash)
+ @normalized_rows ||= begin
+ # Batch-load the materializer's already-computed balances so we can
+ # preserve its cash split rather than reading cash from the equity summary.
+ # Real IBKR Flex exports do not reliably include a cash/stock breakdown in
+ # EquitySummaryByReportDateInBase — only the total is consistently present.
+ existing_balances = account.balances
+ .where(currency: account.currency)
+ .index_by(&:date)
- data = row.with_indifferent_access
- currency = data[:currency].presence&.upcase
- account_currency = ibkr_account.currency.to_s.upcase
- next if currency.present? && currency != account_currency
+ trading_day_rows = Array(ibkr_account.raw_equity_summary_payload)
+ .filter_map do |row|
+ next unless row.is_a?(Hash)
- date = parse_date(data[:report_date])
- total = parse_decimal(data[:total])
- cash = parse_decimal(data[:cash]) || BigDecimal("0")
- next unless date && total
+ data = row.with_indifferent_access
+ currency = data[:currency].presence&.upcase
- {
- date: date,
- total: total,
- cash: cash,
- non_cash: total - cash
- }
+ # BASE_SUMMARY rows aggregate across all currencies — not a per-date balance
+ next if currency == "BASE_SUMMARY"
+ # Reject rows with an explicit wrong currency; absent currency is accepted
+ # (some Flex configurations omit it and the row is implicitly in base currency)
+ next if currency.present? && currency != account_currency
+
+ date = parse_date(data[:report_date])
+ next unless date
+
+ total = parse_decimal(data[:total])
+ if total.nil?
+ Rails.logger.warn(
+ "IbkrAccount::HistoricalBalancesSync - Skipping equity summary row with missing or unparseable total " \
+ "for date=#{data[:report_date].inspect} account=#{account.id}"
+ )
+ next
+ end
+
+ # Use the materializer's cash_balance as ground truth for the cash split.
+ # This is consistent with how the reverse calculator handles present-day
+ # weekends and holidays — derive cash from holdings, not from IBKR's field.
+ cash = existing_balances[date]&.cash_balance || BigDecimal("0")
+
+ { date: date, total: total, cash: cash, non_cash: total - cash }
+ end
+ .sort_by { |r| r[:date] }
+
+ fill_gaps(trading_day_rows, existing_balances)
+ end
+ end
+
+ # IBKR does not emit rows for weekends and some holidays. The reverse
+ # calculator fills those dates using only imported holdings — which only
+ # cover the current snapshot — so it cannot reconstruct the correct
+ # non-cash value for historical gap dates. We carry the most recent
+ # IBKR total forward to every missing calendar day and pair it with the
+ # materializer's already-correct cash for that date.
+ #
+ # The range is extended to the account's current anchor date so that days
+ # after the last equity summary row (e.g. a Saturday sync where the payload
+ # ends on Friday) are also covered and not left with the materializer's
+ # stale total=cash value.
+ def fill_gaps(rows, existing_balances)
+ return [] if rows.empty?
+
+ by_date = rows.index_by { |r| r[:date] }
+ first_date = rows.first[:date]
+ anchor_date = [ account.current_anchor_date || Date.current, Date.current ].min
+ last_date = [ rows.last[:date], anchor_date ].max
+
+ last_total = nil
+ (first_date..last_date).filter_map do |date|
+ if by_date[date]
+ last_total = by_date[date][:total]
+ by_date[date]
+ else
+ next unless last_total
+ cash = existing_balances[date]&.cash_balance || BigDecimal("0")
+ { date: date, total: last_total, cash: cash, non_cash: last_total - cash }
end
- .sort_by { |row| row[:date] }
+ end
end
def balance_rows
@@ -52,7 +112,7 @@ class IbkrAccount::HistoricalBalancesSync
normalized_rows.each_with_index.map do |row, index|
previous_row = index.zero? ? nil : normalized_rows[index - 1]
- start_cash_balance = previous_row ? previous_row[:cash] : row[:cash]
+ start_cash_balance = previous_row ? previous_row[:cash] : row[:cash]
start_non_cash_balance = previous_row ? previous_row[:non_cash] : row[:non_cash]
{
diff --git a/app/models/ibkr_account/holdings_processor.rb b/app/models/ibkr_account/holdings_processor.rb
index 9ff657f3f..8d5ebc704 100644
--- a/app/models/ibkr_account/holdings_processor.rb
+++ b/app/models/ibkr_account/holdings_processor.rb
@@ -8,8 +8,8 @@ class IbkrAccount::HoldingsProcessor
def process
return unless account.present?
- grouped_positions.each_value do |group|
- process_group(group)
+ grouped_positions.each do |(_, _, report_date), group|
+ process_group(group, report_date)
end
end
@@ -28,32 +28,32 @@ class IbkrAccount::HoldingsProcessor
data = position.with_indifferent_access
next unless supported_position?(data)
- symbol_key = data[:conid].presence || data[:symbol].presence || data[:security_id].presence
+ # conid is guaranteed present by supported_position?, so no fallbacks needed
currency = extract_currency(data, fallback: @ibkr_account.currency)
report_date = parse_date(data[:report_date]) || @ibkr_account.report_date || Date.current
- key = [ symbol_key, currency, report_date ]
+ key = [ data[:conid], currency, report_date ]
groups[key] ||= []
groups[key] << data
end
end
- def process_group(rows)
+ def process_group(rows, report_date)
sample = rows.first
security = resolve_security(sample)
return unless security
- quantity = rows.sum { |row| parse_decimal(row[:position]) || BigDecimal("0") }
- return if quantity.zero?
-
price = parse_decimal(sample[:mark_price])
- cost_basis = weighted_cost_basis_for(rows)
- return unless price && cost_basis
-
- amount = quantity.abs * price
+ # quantity and cost_basis are derived from the same set of valid lots so
+ # they are always consistent — a lot with an unparseable cost_basis_price
+ # is excluded from both counts rather than inflating qty while shrinking basis.
+ aggregate = valid_lots(rows)
+ return unless price && aggregate
+ quantity = aggregate[:quantity]
+ cost_basis = aggregate[:cost_basis]
+ amount = quantity * price
currency = extract_currency(sample, fallback: @ibkr_account.currency)
- report_date = parse_date(sample[:report_date]) || @ibkr_account.report_date || Date.current
- external_id = [ "ibkr", @ibkr_account.ibkr_account_id, sample[:conid].presence || security.ticker, report_date, currency ].join("_")
+ external_id = [ "ibkr", @ibkr_account.ibkr_account_id, sample[:conid], report_date, currency ].join("_")
import_adapter.import_holding(
security: security,
@@ -61,7 +61,7 @@ class IbkrAccount::HoldingsProcessor
amount: amount,
currency: currency,
date: report_date,
- price: price || BigDecimal("0"),
+ price: price,
cost_basis: cost_basis,
external_id: external_id,
source: "ibkr",
@@ -70,22 +70,33 @@ class IbkrAccount::HoldingsProcessor
)
end
- def weighted_cost_basis_for(rows)
+ # Aggregates only the lots that have both a parseable position and cost_basis_price.
+ # Returns { quantity:, cost_basis: } so the caller uses a consistent lot set for
+ # both values — a lot skipped here is excluded from quantity too, preventing the
+ # case where qty covers more shares than the cost basis was computed from.
+ def valid_lots(rows)
total_quantity = BigDecimal("0")
total_cost = BigDecimal("0")
rows.each do |row|
- row_quantity = parse_decimal(row[:position])
+ row_quantity = parse_decimal(row[:position])
row_cost_basis = parse_decimal(row[:cost_basis_price])
- return nil unless row_quantity && row_cost_basis
+
+ unless row_quantity && row_cost_basis
+ Rails.logger.warn(
+ "IbkrAccount::HoldingsProcessor - Skipping lot with missing position or cost_basis_price " \
+ "for conid=#{row[:conid].inspect}"
+ )
+ next
+ end
total_quantity += row_quantity.abs
- total_cost += row_quantity.abs * row_cost_basis
+ total_cost += row_quantity.abs * row_cost_basis
end
return nil if total_quantity.zero?
- total_cost / total_quantity
+ { quantity: total_quantity, cost_basis: total_cost / total_quantity }
end
def supported_position?(row)
diff --git a/app/models/ibkr_account/processor.rb b/app/models/ibkr_account/processor.rb
index 2fa30e4e2..0a924d4a7 100644
--- a/app/models/ibkr_account/processor.rb
+++ b/app/models/ibkr_account/processor.rb
@@ -6,21 +6,23 @@ class IbkrAccount::Processor
end
def process
- return unless ibkr_account.current_account.present?
+ return unless account.present?
update_account_balance!
IbkrAccount::HoldingsProcessor.new(ibkr_account).process
IbkrAccount::ActivitiesProcessor.new(ibkr_account).process
repair_default_opening_anchor!
- ibkr_account.current_account.broadcast_sync_complete
+ account.broadcast_sync_complete
end
private
- def update_account_balance!
- account = ibkr_account.current_account
+ def account
+ @account ||= ibkr_account.current_account
+ end
+ def update_account_balance!
total_balance = ibkr_account.current_balance || ibkr_account.cash_balance || 0
cash_balance = ibkr_account.cash_balance || 0
@@ -34,7 +36,6 @@ class IbkrAccount::Processor
end
def repair_default_opening_anchor!
- account = ibkr_account.current_account
return unless account&.linked_to?("IbkrAccount")
return unless account.has_opening_anchor?
@@ -51,6 +52,12 @@ class IbkrAccount::Processor
date: opening_anchor_entry.date
)
- raise result.error if result.error
+ # Don't raise — broadcast_sync_complete must still run after a repair failure.
+ if result.error
+ Rails.logger.error(
+ "IbkrAccount::Processor - Failed to repair opening anchor for account #{account.id}: #{result.error}"
+ )
+ Sentry.capture_message(result.error)
+ end
end
end
diff --git a/test/models/ibkr_account/data_helpers_test.rb b/test/models/ibkr_account/data_helpers_test.rb
new file mode 100644
index 000000000..bc8089ac1
--- /dev/null
+++ b/test/models/ibkr_account/data_helpers_test.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+require "test_helper"
+
+class IbkrAccount::DataHelpersTest < ActiveSupport::TestCase
+ class TestHelper
+ include IbkrAccount::DataHelpers
+
+ public :parse_decimal
+ end
+
+ setup do
+ @helper = TestHelper.new
+ end
+
+ test "parse_decimal returns nil for nil input" do
+ assert_nil @helper.parse_decimal(nil)
+ end
+
+ test "parse_decimal returns nil for blank string" do
+ assert_nil @helper.parse_decimal("")
+ assert_nil @helper.parse_decimal(" ")
+ end
+
+ test "parse_decimal returns nil for dash placeholder" do
+ assert_nil @helper.parse_decimal("-")
+ end
+
+ test "parse_decimal converts parentheses notation to negative" do
+ assert_equal BigDecimal("-1234.56"), @helper.parse_decimal("(1234.56)")
+ end
+
+ test "parse_decimal converts parentheses notation with comma-separated number" do
+ assert_equal BigDecimal("-1234.56"), @helper.parse_decimal("(1,234.56)")
+ end
+
+ test "parse_decimal strips commas from positive numbers" do
+ assert_equal BigDecimal("1234.56"), @helper.parse_decimal("1,234.56")
+ end
+
+ test "parse_decimal parses plain decimal string" do
+ assert_equal BigDecimal("3351.00"), @helper.parse_decimal("3351.00")
+ end
+
+ test "parse_decimal returns nil for empty parentheses" do
+ assert_nil @helper.parse_decimal("()")
+ end
+
+ test "parse_decimal returns nil for unclosed parenthesis" do
+ assert_nil @helper.parse_decimal("(123")
+ end
+
+ test "parse_decimal returns nil for non-numeric string" do
+ assert_nil @helper.parse_decimal("N/A")
+ assert_nil @helper.parse_decimal("not_a_number")
+ end
+end
diff --git a/test/models/ibkr_account/historical_balances_sync_test.rb b/test/models/ibkr_account/historical_balances_sync_test.rb
index 22d082284..66b5ee89b 100644
--- a/test/models/ibkr_account/historical_balances_sync_test.rb
+++ b/test/models/ibkr_account/historical_balances_sync_test.rb
@@ -21,33 +21,23 @@ class IbkrAccount::HistoricalBalancesSyncTest < ActiveSupport::TestCase
current_balance: 3351,
cash_balance: 1000.5,
raw_equity_summary_payload: [
- {
- currency: "CHF",
- report_date: "2026-05-07",
- cash: "900.50",
- stock: "2300.50",
- total: "3201.00"
- },
- {
- currency: "CHF",
- report_date: "2026-05-08",
- cash: "1000.50",
- stock: "2350.50",
- total: "3351.00"
- }
+ { report_date: "2026-05-07", total: "3201.00" },
+ { report_date: "2026-05-08", total: "3351.00" }
]
)
@ibkr_account.ensure_account_provider!(@account)
end
- test "upserts historical balances without creating activity entries" do
+ # Seed an existing balance row as if the materializer already ran.
+ def seed_balance(date:, balance:, cash_balance:)
+ non_cash = balance - cash_balance
@account.balances.create!(
- date: Date.new(2026, 5, 7),
- balance: 0,
- cash_balance: 0,
+ date: date,
+ balance: balance,
+ cash_balance: cash_balance,
currency: "CHF",
- start_cash_balance: 0,
- start_non_cash_balance: 0,
+ start_cash_balance: cash_balance,
+ start_non_cash_balance: non_cash,
cash_inflows: 0,
cash_outflows: 0,
non_cash_inflows: 0,
@@ -57,60 +47,183 @@ class IbkrAccount::HistoricalBalancesSyncTest < ActiveSupport::TestCase
non_cash_adjustments: 0,
flows_factor: 1
)
+ end
+
+ test "overrides total from IBKR equity summary while preserving materializer cash split" do
+ seed_balance(date: Date.new(2026, 5, 7), balance: 3000.00, cash_balance: 900.50)
+ seed_balance(date: Date.new(2026, 5, 8), balance: 3100.00, cash_balance: 1000.50)
assert_no_difference "@account.entries.count" do
IbkrAccount::HistoricalBalancesSync.new(@ibkr_account).sync!
end
- first_balance = @account.balances.find_by!(date: Date.new(2026, 5, 7), currency: "CHF")
- second_balance = @account.balances.find_by!(date: Date.new(2026, 5, 8), currency: "CHF")
+ first = @account.balances.find_by!(date: Date.new(2026, 5, 7), currency: "CHF")
+ second = @account.balances.find_by!(date: Date.new(2026, 5, 8), currency: "CHF")
- assert_equal BigDecimal("3201.0"), first_balance.end_balance
- assert_equal BigDecimal("900.5"), first_balance.end_cash_balance
- assert_equal BigDecimal("2300.5"), first_balance.end_non_cash_balance
+ # Total overridden with IBKR's reported figure
+ assert_equal BigDecimal("3201.00"), first.end_balance
+ assert_equal BigDecimal("3351.00"), second.end_balance
- assert_equal BigDecimal("3351.0"), second_balance.end_balance
- assert_equal BigDecimal("1000.5"), second_balance.end_cash_balance
- assert_equal BigDecimal("2350.5"), second_balance.end_non_cash_balance
- assert_equal BigDecimal("900.5"), second_balance.start_cash_balance
- assert_equal BigDecimal("2300.5"), second_balance.start_non_cash_balance
+ # Cash preserved from the materializer, not read from equity summary
+ assert_equal BigDecimal("900.50"), first.end_cash_balance
+ assert_equal BigDecimal("1000.50"), second.end_cash_balance
+
+ # Non-cash = IBKR total - materializer cash
+ assert_equal BigDecimal("2300.50"), first.end_non_cash_balance
+ assert_equal BigDecimal("2350.50"), second.end_non_cash_balance
end
- test "accepts equity summary rows when stored account currency casing differs" do
- @ibkr_account.update!(currency: "chf")
+ test "uses zero cash when no prior materializer balance exists for a date" do
+ # No existing balance rows — first-ever sync
+ IbkrAccount::HistoricalBalancesSync.new(@ibkr_account).sync!
+
+ balance = @account.balances.find_by!(date: Date.new(2026, 5, 7), currency: "CHF")
+ assert_equal BigDecimal("3201.00"), balance.end_balance
+ assert_equal BigDecimal("0"), balance.end_cash_balance
+ assert_equal BigDecimal("3201.00"), balance.end_non_cash_balance
+ end
+
+ test "accepts rows without a currency field (Flex configs that omit the attribute)" do
+ @ibkr_account.update!(
+ raw_equity_summary_payload: [
+ { report_date: "2026-05-07", total: "3201.00" } # no currency key
+ ]
+ )
+ seed_balance(date: Date.new(2026, 5, 7), balance: 3000.00, cash_balance: 900.50)
IbkrAccount::HistoricalBalancesSync.new(@ibkr_account).sync!
- first_balance = @account.balances.find_by!(date: Date.new(2026, 5, 7), currency: "CHF")
- second_balance = @account.balances.find_by!(date: Date.new(2026, 5, 8), currency: "CHF")
-
- assert_equal BigDecimal("3201.0"), first_balance.end_balance
- assert_equal BigDecimal("3351.0"), second_balance.end_balance
+ balance = @account.balances.find_by!(date: Date.new(2026, 5, 7), currency: "CHF")
+ assert_equal BigDecimal("3201.00"), balance.end_balance
+ assert_equal BigDecimal("900.50"), balance.end_cash_balance
end
- test "skips malformed equity summary rows and still imports valid rows" do
+ test "accepts rows when account currency casing differs from payload" do
+ @ibkr_account.update!(currency: "chf")
+ seed_balance(date: Date.new(2026, 5, 7), balance: 3000.00, cash_balance: 900.50)
+
+ @ibkr_account.update!(
+ raw_equity_summary_payload: [
+ { currency: "CHF", report_date: "2026-05-07", total: "3201.00" }
+ ]
+ )
+
+ IbkrAccount::HistoricalBalancesSync.new(@ibkr_account).sync!
+
+ balance = @account.balances.find_by!(date: Date.new(2026, 5, 7), currency: "CHF")
+ assert_equal BigDecimal("3201.00"), balance.end_balance
+ end
+
+ test "skips BASE_SUMMARY rows" do
+ @ibkr_account.update!(
+ raw_equity_summary_payload: [
+ { currency: "BASE_SUMMARY", report_date: "2026-05-07", total: "9999.00" },
+ { currency: "CHF", report_date: "2026-05-07", total: "3201.00" }
+ ]
+ )
+
+ IbkrAccount::HistoricalBalancesSync.new(@ibkr_account).sync!
+
+ balance = @account.balances.find_by!(date: Date.new(2026, 5, 7), currency: "CHF")
+ assert_equal BigDecimal("3201.00"), balance.end_balance
+ end
+
+ test "skips rows with a mismatched explicit currency" do
+ @ibkr_account.update!(
+ raw_equity_summary_payload: [
+ { currency: "USD", report_date: "2026-05-07", total: "9999.00" },
+ { currency: "CHF", report_date: "2026-05-07", total: "3201.00" }
+ ]
+ )
+
+ IbkrAccount::HistoricalBalancesSync.new(@ibkr_account).sync!
+
+ balance = @account.balances.find_by!(date: Date.new(2026, 5, 7), currency: "CHF")
+ assert_equal BigDecimal("3201.00"), balance.end_balance
+ end
+
+ test "skips malformed rows and still imports valid ones" do
@ibkr_account.update!(
raw_equity_summary_payload: [
nil,
"bad-row",
[],
- {
- currency: "CHF",
- report_date: "2026-05-09",
- cash: "1100.50",
- total: "3400.00"
- }
+ { report_date: "2026-05-11", total: "3400.00" }
]
)
+ seed_balance(date: Date.new(2026, 5, 11), balance: 3300.00, cash_balance: 1100.50)
assert_nothing_raised do
IbkrAccount::HistoricalBalancesSync.new(@ibkr_account).sync!
end
- balance = @account.balances.find_by!(date: Date.new(2026, 5, 9), currency: "CHF")
+ balance = @account.balances.find_by!(date: Date.new(2026, 5, 11), currency: "CHF")
+ assert_equal BigDecimal("3400.00"), balance.end_balance
+ assert_equal BigDecimal("1100.50"), balance.end_cash_balance
+ end
- assert_equal BigDecimal("3400.0"), balance.end_balance
- assert_equal BigDecimal("1100.5"), balance.end_cash_balance
- assert_equal BigDecimal("2299.5"), balance.end_non_cash_balance
+ test "fills weekend and holiday gaps by carrying forward the last IBKR total with materializer cash" do
+ # Simulate the real-world situation: IBKR has no weekend rows, and historical
+ # holdings only cover the current snapshot so the materializer writes total=cash
+ # for gap dates. HistoricalBalancesSync must write the correct total for those days.
+ @ibkr_account.update!(
+ raw_equity_summary_payload: [
+ { report_date: "2026-05-08", total: "3351.00" }, # Friday
+ # Saturday May 9 and Sunday May 10 absent — IBKR never sends them
+ { report_date: "2026-05-11", total: "3400.00" } # Monday
+ ]
+ )
+
+ # Materializer computed correct cash for all dates; wrong total for the weekend
+ seed_balance(date: Date.new(2026, 5, 8), balance: 3351.00, cash_balance: 900.50)
+ seed_balance(date: Date.new(2026, 5, 9), balance: 900.50, cash_balance: 900.50) # wrong total
+ seed_balance(date: Date.new(2026, 5, 10), balance: 900.50, cash_balance: 900.50) # wrong total
+ seed_balance(date: Date.new(2026, 5, 11), balance: 3400.00, cash_balance: 910.00)
+
+ IbkrAccount::HistoricalBalancesSync.new(@ibkr_account).sync!
+
+ saturday = @account.balances.find_by!(date: Date.new(2026, 5, 9), currency: "CHF")
+ sunday = @account.balances.find_by!(date: Date.new(2026, 5, 10), currency: "CHF")
+
+ # Total corrected to Friday's IBKR total; cash preserved from materializer
+ assert_equal BigDecimal("3351.00"), saturday.end_balance
+ assert_equal BigDecimal("900.50"), saturday.end_cash_balance
+ assert_equal BigDecimal("2450.50"), saturday.end_non_cash_balance
+
+ assert_equal BigDecimal("3351.00"), sunday.end_balance
+ assert_equal BigDecimal("900.50"), sunday.end_cash_balance
+ assert_equal BigDecimal("2450.50"), sunday.end_non_cash_balance
+ end
+
+ test "skips rows with missing or unparseable total" do
+ @ibkr_account.update!(
+ raw_equity_summary_payload: [
+ { report_date: "2026-05-06", total: "N/A" }, # unparseable string — before first valid date
+ { report_date: "2026-05-07", total: nil }, # nil total
+ { report_date: "2026-05-08", total: "3351.00" } # valid
+ ]
+ )
+
+ IbkrAccount::HistoricalBalancesSync.new(@ibkr_account).sync!
+
+ # Gap-fill starts at the first valid trading day (May 8), so pre-range
+ # dates with bad totals must not produce any balance row.
+ assert_nil @account.balances.find_by(date: Date.new(2026, 5, 6), currency: "CHF")
+ assert_nil @account.balances.find_by(date: Date.new(2026, 5, 7), currency: "CHF")
+ assert_not_nil @account.balances.find_by(date: Date.new(2026, 5, 8), currency: "CHF")
+ end
+
+ test "writes balance row with zero total for fully liquidated dates" do
+ @ibkr_account.update!(
+ raw_equity_summary_payload: [
+ { report_date: "2026-05-07", total: "0" },
+ { report_date: "2026-05-08", total: "3351.00" }
+ ]
+ )
+
+ IbkrAccount::HistoricalBalancesSync.new(@ibkr_account).sync!
+
+ balance = @account.balances.find_by!(date: Date.new(2026, 5, 7), currency: "CHF")
+ assert_equal BigDecimal("0"), balance.end_balance
end
end
diff --git a/test/models/ibkr_account_processor_test.rb b/test/models/ibkr_account_processor_test.rb
index 94555bb61..7e2254f61 100644
--- a/test/models/ibkr_account_processor_test.rb
+++ b/test/models/ibkr_account_processor_test.rb
@@ -189,7 +189,7 @@ class IbkrAccountProcessorTest < ActiveSupport::TestCase
assert_not_nil holding
assert_equal BigDecimal("30"), holding.qty
- assert_equal BigDecimal("123.1667"), holding.cost_basis
+ assert_in_delta BigDecimal("123.1667"), holding.cost_basis, BigDecimal("0.0001")
end
test "processor repairs default opening anchor after importing activity entries" do
From bc9f13059ad6e8b7f609db495cc3c599edb31196 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Jos=C3=A9=20Mata?=
Date: Mon, 18 May 2026 21:46:28 +0200
Subject: [PATCH 08/33] Bump version by hand
---
.sure-version | 2 +-
charts/sure/Chart.yaml | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/.sure-version b/.sure-version
index 6d64966b7..38d939e70 100644
--- a/.sure-version
+++ b/.sure-version
@@ -1 +1 @@
-0.7.1-alpha.9
+0.7.1-alpha.10
diff --git a/charts/sure/Chart.yaml b/charts/sure/Chart.yaml
index 650c52a72..412a3c29e 100644
--- a/charts/sure/Chart.yaml
+++ b/charts/sure/Chart.yaml
@@ -2,8 +2,8 @@ apiVersion: v2
name: sure
description: Official Helm chart for deploying the Sure Rails app (web + Sidekiq) on Kubernetes with optional HA PostgreSQL (CloudNativePG) and Redis.
type: application
-version: 0.7.1-alpha.9
-appVersion: "0.7.1-alpha.9"
+version: 0.7.1-alpha.10
+appVersion: "0.7.1-alpha.10"
kubeVersion: ">=1.25.0-0"
From 1ddd8bd040082748e3954cffc3797c0c07ecd72f Mon Sep 17 00:00:00 2001
From: Guillem Arias Fauste
Date: Tue, 19 May 2026 13:37:10 +0200
Subject: [PATCH 09/33] feat(i18n): complete Catalan translations + extract
residual hardcoded strings (#1836)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat(i18n): complete Catalan translations + extract residual hardcoded strings
CA coverage
- All view/model/breadcrumb/doorkeeper/mailer locale files for ca: 0 missing
keys (was ~3,400). Translations follow informal "tu" register, sentence case,
domain glossary (Compte/Saldo/Transacció/Posició/Operació/Pressupost/...).
- Catalan pluralization test: ca uses one/other; mirrors
test/lib/polish_pluralization_test.rb.
- 8 LanguageTool-flagged grammar fixes applied (Connexió òrfena, Secret de
l'API, comma-pero, apostrophe elisions, etc).
Hardcoded string extraction (also fixes EN parity)
- UI::Account::Chart#title + chart.html.erb view tabs -> UI.account.chart.*
- UI::Account::BalanceReconciliation labels + tooltips ->
UI.account.balance_reconciliation.{labels,tooltips}.*
- transactions/_transfer_match.html.erb (Auto-matched, A/M, Confirm/Reject
match, Payment/Transfer is confirmed) -> transactions.transfer_match.*
- AccountOrder labels (Name/Balance asc/desc) -> account_order.* keys with
fallback to existing hardcoded labels.
- Depository::SUBTYPES surface in account list -> depositories.subtypes.*.*
- User role badge -> users.roles.* (admin / member / super_admin).
- 110+ country names -> countries.* (config/locales/countries.ca.yml).
Breadcrumb locale fix
- Breadcrumbable was a before_action that ran before Localize's around_action
switched I18n.locale, so default crumbs rendered in EN even when locale=ca.
- Convert to helper_method that defers translation to render-time (when
I18n.locale is already correct). Add all missing breadcrumb keys to ca + en.
- Layouts switched from @breadcrumbs to breadcrumbs helper.
Locale-aware helpers / formatters
- ApplicationHelper#localized_ordinal: ordinalize that respects ca
(1r/2n/3r/4t/Nè). Wired into preferences month_start_day select.
- Family#moniker_label / moniker_label_plural: translate the default "Family"/
"Group" monikers via shared.family_moniker.* with fallback to the family's
custom override.
- Budget#name: use I18n.l for month_year/short/long instead of strftime("%B %Y")
so the budget header date follows the active locale.
Tooling
- script/lt_check_ca.rb: batched LanguageTool checker (premium endpoint when
LT_USERNAME/LT_API_KEY are set, free fallback otherwise), picky mode,
motherTongue=en for false-friend detection.
- lib/tasks/i18n_screenshot.rake: dev-only rake to set user.locale=ca and
role=super_admin on the demo user so the i18n surfaces can be walked.
Out of scope (pre-existing, not introduced here)
- Native browser file input "Choose Files / No file chosen" (browser locale).
- D3.js client-side chart x-axis dates (JS-side Intl.DateTimeFormat needed).
- Sankey/donut labels = seed category names (data, not i18n).
- 2 rails-i18n datetime/errors interpolation warnings inherited from
config/locales/defaults/ca.yml.
* fix(i18n): apply idiomatic Catalan review (3-agent + native review)
Three parallel review agents flagged 203 findings (31 high / 73 medium / 99 low)
across all 111 ca.yml files. This commit applies the high-severity bugs plus a
curated subset of medium-impact fixes.
Grammar / agreement
- provider_sync_summary.health.stale_pending: `(exclòs)` -> `(exclosa/excloses)`
to agree with feminine `transacció(s)`.
- accounts.confirm_unlink.warning_no_sync: added reflexive `es` -
`el compte ja no es sincronitzarà`.
- sophtron_setup_required.heading: `no configurats` -> `sense configurar`
(avoids broken agreement across "ID" masc. + "clau" fem.).
- admin.sso_providers.form.errors_title: split into one/other pluralization
keys (en + ca); singular `ha impedit` was wrong for count > 1.
Brand consistency
- IndexaCapital -> Indexa Capital (37 occurrences across one file).
- Lunchflow -> Lunch Flow in two remaining places.
Anglicisms / domain mistranslations
- kraken_items setup_accounts.instructions: `ompliments d'operacions`
(lit. dental/food fillings) -> `execucions d'operacions`.
- settings kraken_panel.read_only_title: `Sincronització d'intercanvi`
(swap/trade) -> `Sincronització només de lectura amb l'exchange`.
- transactions convert_to_trade.security_custom + security_not_listed_hint:
`cotització` (price quote) -> `ticker` (the EN field IS a ticker symbol).
- loans.form.rate_type: `Tipus d'interès` collided with sibling
interest_rate -> `Modalitat del tipus`.
- brex_items.provider_panel.sandbox_note_html: `L'staging` (broken
contraction) -> `el staging`.
Idiom traps
- coinbase/binance/kraken wait_for_sync: `acabi de sincronitzar` is
ambiguous in CA (`acabar de + inf` reads as "has just done X") ->
`acabi la sincronització`.
- chats.ai_greeting.there: `a tothom` -> `''` (the EN fallback "Hey there"
is singular; literal CA `tothom` is plural and wrong for 1:1 chat).
- transactions.split_parent_row.split_label: `Divideix` (imperative) is
wrong as a status badge -> `Divisió` (noun).
- transactions.keep_both (2 occurrences): infinitive `mantenir ambdues` ->
imperative `mantén-les totes dues` to match the sibling Yes/No buttons.
- rules.clear_ai_cache: `Reinicia` (restart) -> `Buida` (empty/clear),
which matches the success notice (`s'està netejant`).
Moniker gender breakage (cross-file)
%{moniker} is interpolated downcased from family.moniker_label and may
resolve to feminine `família`/`llar` or masculine `grup`. Strings that
hard-code a gendered article ('al teu %{moniker}', 'aquesta %{moniker}',
'aquest/a %{moniker}') broke on at least one branch. Restructured the
affected sentences to drop the gendered determiner:
- account_sharings.show.no_members
- merchants.family_empty / family_title / provider_empty
- registrations.new.join_family_title
- settings.preferences.show.currencies_subtitle / sharing_subtitle
- simplefin_items.select_existing_account.no_accounts_found
- invitations.new.subtitle
- invitation_mailer.invite_email.subject (mailers/) + body (views/)
- snaptrade_items.providers.snaptrade.free_tier_warning
Terminology consistency
- models/account_statement/ca.yml attributes aligned with view-side
forms: `Saldo d'obertura`/`Saldo de tancament` ->
`Saldo inicial`/`Saldo final`; `Suggeriment de...` -> `Pista de...`.
- account_statements.coverage.status.not_expected:
`No s'esperava` -> `No previst` (status label, not past action).
- account_statements.index.empty_unmatched: aligned with the section's
own label `Safata sense aparellar`.
- imports.create.document_provider_not_configured + document_upload_failed:
`arxiu vectorial` -> `magatzem vectorial` (correct TermCat term).
- coinstats_items blockchain gender: `els blockchains` / `un blockchain` ->
`les blockchains` / `una blockchain` (feminine per TermCat).
- accounts.account.remove_default: `Treu el predeterminat` ->
`Treu com a predeterminat` (pairs with sibling `Estableix com a
predeterminat`).
- accounts.tax_treatments.tax_deferred: `Diferit fiscalment` (lit. calque)
-> `Tributació diferida` (standard CA tax-accounting term).
- settings.payments.show.currently_on_plan: `Actualment al` ->
`Actualment al pla:` (was a fragment).
Out of scope (review flagged, not applied here)
- LOW-severity stylistic preferences (Veure vs Mostra, etc).
- `models/category/ca.yml` default category names — seeded at family
creation, not via I18n at runtime, so changes wouldn't affect existing
families.
- `models/period/ca.yml` short labels mixing EN (MTD/YTD) and CA (STD/MA)
— needs a one-convention decision separately.
* fix(i18n,ca): drop gendered article in period_activity + tighten cash-flow terms
- pages.dashboard.investment_summary.period_activity: 'Activitat del
%{period}' contracted 'del' = 'de el' (masc.sg.). %{period} resolves
to mixed forms ('Setmana en curs' fem, 'Últims 30 dies' pl., 'Any en
curs' apostrophe), so hard-coded 'del' was wrong on most labels.
Replaced with 'Activitat — %{period}' (em-dash) to skip the
contraction entirely.
- pages.dashboard.outflows_donut.title / total_outflows: switched from
bare 'Sortides' / 'Total de sortides' to 'Sortides de caixa' /
'Total de sortides de caixa' to match TermCat's precise term
('sortida de caixa' = cash outflow).
* fix(i18n,ca): rephrase transfer source/destination amount labels
'Import d'origen' / 'Import de destinació' were literal calques of
'Source amount' / 'Destination amount'. In a multi-currency transfer
form (sender/receiver in different currencies) the natural CA pair is
'Import enviat' / 'Import rebut'.
* fix(i18n,ca): 'Dades en brut' -> 'Dades sense processar'
The literal calque of 'Raw data' read as too technical for personal-
finance UI. 'Dades sense processar' is the more natural Catalan
equivalent for raw/unprocessed data files.
* fix(i18n): localize Import col_sep label + separator options
The CSV upload form rendered 'Col sep' (the auto-humanized attribute
name) plus hardcoded English 'Comma (,)' / 'Semicolon (;)' options
from Import::SEPARATORS.
- activerecord.attributes.import.col_sep added (en + ca: 'Column
separator' / 'Separador de columnes').
- Import.separator_options class method returns translated tuples;
view switched from Import::SEPARATORS to Import.separator_options.
- activerecord.attributes.import.col_seps.{comma,semicolon} added so
the option labels follow the active locale.
* fix(i18n,ca): drop moniker apposition in sharing/currencies section titles
- sharing_title 'Compartició de %{moniker}' rendered as 'Compartició
de Família' (a noun-noun apposition that's odd in CA) -> 'Compartició
de comptes'.
- sharing_subtitle replaced '%{moniker}' with 'entre els membres' so
the sentence reads naturally and doesn't depend on moniker gender.
- currencies_title 'Divises de %{moniker}' had the same apposition
-> 'Divises'. Subtitle no longer references moniker either.
* fix(i18n,ca): keep 'Self Hosting' untranslated
Reverted 'Autoallotjament' / 'autoallotjada' / 'autoallotjats' usages
to the original English 'Self Hosting' (sidebar label, breadcrumbs,
hostings page title, chat assistant settings hint, redis configuration
subheading, LLM usages cost-estimates description).
The brand-style term reads more naturally in EN for technical users
configuring their own deployment.
* fix(i18n,ca): lowercase 'self hosting' (sentence case in labels)
* fix(i18n): extract budget_categories stepper + allocation_progress strings
Hardcoded English strings on the budget category editor:
- 'Setup' / 'Categories' stepper labels in budgets/_budget_nav.html.erb
- 'X% set' / '> 100% set' / 'left to allocate' / 'Budget exceeded by ...'
in budget_categories/_allocation_progress.erb
- '/m avg' caption + 'Shared' placeholder + 'Leave empty to share
parent's budget' tooltip in budget_categories/_budget_category_form
and _uncategorized_budget_category_form
Extracted to:
- budgets.budget_nav.{setup,categories}
- budget_categories.allocation_progress.{percent_set,over_set,left_to_allocate,budget_exceeded_html}
- budget_categories.budget_category_form.{monthly_average,shared_placeholder,shared_title}
CA translations added; EN keys mirror the prior literals.
* chore(i18n): drop translation tooling from PR
These were dev-only helpers used during the Catalan translation pass:
- script/lt_check_ca.rb: LanguageTool API checker (premium/free
endpoint, picky mode, batching). Useful for ongoing locale QA but
shouldn't ship in this feature PR.
- lib/tasks/i18n_screenshot.rake: rake task that flips user.locale and
role on the demo user for walking the i18n surfaces locally.
Both stay available locally; pulled out of the PR scope.
* fix(i18n): apply PR review feedback (CodeRabbit + Codex)
- balance_reconciliation crypto_items: use :end_balance_crypto tooltip
(was :end_balance_investment). Added new UI.account.balance_reconciliation.tooltips.end_balance_crypto key in en + ca.
- doorkeeper.ca.yml confidentiality.no: was YAML boolean false, now string 'No'.
- views/categories: 'Poor contrast, choose darker color or' continued with hardcoded 'auto-adjust.' button text; extracted to categories.form.auto_adjust key (en + ca).
- imports.create.document_upload_failed: 'a l'magatzem' was broken
contraction -> 'al magatzem'.
- invitation_mailer body + mailer subject: 'unir-se' -> 'unir-te' (was
3rd person, should be 2nd to match the rest of the copy).
- 7 strings across mercury_items / sophtron_items / simplefin_items /
lunchflow_items / brex_items / indexa_capital_items / other_assets:
'se sincronitzaran' -> 'es sincronitzaran', 'se segueixen' ->
'es segueixen' (correct reflexive pronoun before consonants).
- settings.providers.status: key was 'false' (YAML-coerced), now 'off'
to match settings/en.yml status.off used in view lookups.
- sophtron_items.sophtron_setup_required.message: stripped trailing
blank line from the quoted scalar.
- settings/profiles/show.html.erb: switched 'family_moniker ==
"Group"' branch checks to 'Current.family&.moniker == "Group"'.
After Family#moniker_label started returning translated values,
callers using the display label for branching would render the
household copy for group families in ca. Compare the stored sentinel
instead.
- Did not apply CodeRabbit's webauthn 'eliminada' -> 'desada' suggestion:
the key is wired to the destroy action (verified at
settings/webauthn_credentials_controller.rb:55), so 'eliminada' is
correct.
---
.../UI/account/balance_reconciliation.rb | 85 +--
app/components/UI/account/chart.html.erb | 2 +-
app/components/UI/account/chart.rb | 20 +-
app/controllers/concerns/breadcrumbable.rb | 17 +-
app/helpers/application_helper.rb | 18 +
app/helpers/languages_helper.rb | 7 +-
app/models/account_order.rb | 4 +-
app/models/budget.rb | 6 +-
app/models/family.rb | 18 +-
app/models/import.rb | 7 +
.../_allocation_progress.erb | 8 +-
.../_budget_category_form.html.erb | 6 +-
...ncategorized_budget_category_form.html.erb | 2 +-
app/views/categories/_form.html.erb | 2 +-
app/views/import/uploads/show.html.erb | 4 +-
app/views/layouts/application.html.erb | 2 +-
app/views/layouts/settings.html.erb | 2 +-
app/views/settings/preferences/show.html.erb | 4 +-
app/views/settings/profiles/show.html.erb | 8 +-
.../transactions/_transfer_match.html.erb | 10 +-
config/locales/breadcrumbs/ca.yml | 81 +++
config/locales/breadcrumbs/en.yml | 66 +++
config/locales/countries.ca.yml | 121 +++++
config/locales/defaults/ca.yml | 20 +-
config/locales/doorkeeper.ca.yml | 5 +-
.../locales/mailers/invitation_mailer/ca.yml | 2 +-
.../locales/mailers/pdf_import_mailer/ca.yml | 5 +
config/locales/models/account/ca.yml | 24 +-
config/locales/models/account/en.yml | 13 +
.../locales/models/account_statement/ca.yml | 30 ++
config/locales/models/address/ca.yml | 1 -
config/locales/models/api_key/ca.yml | 8 +
config/locales/models/brex_item/ca.yml | 14 +
config/locales/models/category/ca.yml | 24 +-
config/locales/models/category_import/ca.yml | 8 +
config/locales/models/chat/ca.yml | 11 +
config/locales/models/coinbase_account/ca.yml | 5 +
config/locales/models/coinstats_item/ca.yml | 8 +-
config/locales/models/import/ca.yml | 9 +-
config/locales/models/import/en.yml | 4 +
.../locales/models/indexa_capital_item/ca.yml | 8 +
config/locales/models/period/ca.yml | 54 ++
config/locales/models/plaid_account/ca.yml | 7 +
.../locales/models/provider_warnings/ca.yml | 5 +-
.../models/recurring_transaction/ca.yml | 7 +
config/locales/models/rule/ca.yml | 9 +
config/locales/models/rule_import/ca.yml | 9 +
.../locales/models/simplefin_account/ca.yml | 7 +
config/locales/models/sophtron_account/ca.yml | 7 +
config/locales/models/sso_provider/ca.yml | 14 +
.../locales/models/time_series/value/ca.yml | 1 -
config/locales/models/transaction/ca.yml | 11 +
config/locales/models/transfer/ca.yml | 6 +-
config/locales/models/user/ca.yml | 7 +-
config/locales/views/account_sharings/ca.yml | 30 ++
.../locales/views/account_statements/ca.yml | 119 +++++
config/locales/views/accounts/ca.yml | 101 +++-
config/locales/views/admin/invitations/ca.yml | 8 +
.../locales/views/admin/sso_providers/ca.yml | 149 +++---
.../locales/views/admin/sso_providers/en.yml | 4 +-
config/locales/views/admin/users/ca.yml | 54 +-
config/locales/views/beta/ca.yml | 5 +
config/locales/views/binance_items/ca.yml | 81 +++
config/locales/views/brex_items/ca.yml | 308 +++++++++++
config/locales/views/budgets/ca.yml | 99 +++-
config/locales/views/budgets/en.yml | 12 +
config/locales/views/categories/ca.yml | 24 +-
config/locales/views/categories/en.yml | 3 +-
.../locales/views/category/dropdowns/ca.yml | 6 +-
config/locales/views/chats/ca.yml | 56 +-
config/locales/views/coinbase_items/ca.yml | 83 +++
config/locales/views/coinstats_items/ca.yml | 89 ++--
config/locales/views/components/ca.yml | 115 ++++-
config/locales/views/components/en.yml | 67 +++
config/locales/views/credit_cards/ca.yml | 1 +
config/locales/views/cryptos/ca.yml | 15 +
config/locales/views/depositories/ca.yml | 18 +
config/locales/views/depositories/en.yml | 16 +
.../locales/views/enable_banking_items/ca.yml | 127 ++++-
config/locales/views/entries/ca.yml | 11 +
config/locales/views/family_exports/ca.yml | 45 +-
config/locales/views/holdings/ca.yml | 83 ++-
config/locales/views/ibkr_items/ca.yml | 101 ++++
.../views/impersonation_sessions/ca.yml | 10 +
config/locales/views/imports/ca.yml | 438 ++++++++++++++--
.../locales/views/indexa_capital_items/ca.yml | 249 +++++++++
config/locales/views/investments/ca.yml | 176 ++++++-
config/locales/views/invitation_mailer/ca.yml | 2 +-
config/locales/views/invitations/ca.yml | 12 +-
config/locales/views/invite_codes/ca.yml | 4 +
config/locales/views/kraken_items/ca.yml | 95 ++++
config/locales/views/layout/ca.yml | 18 +-
config/locales/views/loans/ca.yml | 6 +-
config/locales/views/lunchflow_items/ca.yml | 162 +++---
config/locales/views/merchants/ca.yml | 80 +--
config/locales/views/mercury_items/ca.yml | 233 +++++++++
config/locales/views/messages/ca.yml | 6 +
config/locales/views/mfa/ca.yml | 23 +-
config/locales/views/oidc_accounts/ca.yml | 62 ++-
config/locales/views/onboardings/ca.yml | 100 ++--
config/locales/views/other_assets/ca.yml | 10 +-
config/locales/views/pages/ca.yml | 64 ++-
config/locales/views/password_resets/ca.yml | 22 +-
config/locales/views/passwords/ca.yml | 4 +-
config/locales/views/pdf_import_mailer/ca.yml | 21 +
.../views/pending_duplicate_merges/ca.yml | 23 +
config/locales/views/plaid_items/ca.yml | 18 +-
config/locales/views/properties/ca.yml | 62 ++-
.../views/recurring_transactions/ca.yml | 53 +-
config/locales/views/registrations/ca.yml | 13 +-
config/locales/views/reports/ca.yml | 133 +++--
config/locales/views/rules/ca.yml | 114 ++++-
config/locales/views/securities/ca.yml | 14 +
config/locales/views/sessions/ca.yml | 25 +-
config/locales/views/settings/api_keys/ca.yml | 142 ++---
config/locales/views/settings/ca.yml | 483 +++++++++++++++++-
config/locales/views/settings/en.yml | 1 +
config/locales/views/settings/hostings/ca.yml | 246 +++++++--
.../locales/views/settings/securities/ca.yml | 34 +-
.../views/settings/sso_identities/ca.yml | 2 +-
config/locales/views/shared/ca.yml | 21 +-
config/locales/views/shared/en.yml | 4 +-
config/locales/views/simplefin_items/ca.yml | 145 ++++--
config/locales/views/snaptrade_items/ca.yml | 209 ++++++++
config/locales/views/sophtron_items/ca.yml | 365 +++++++++++++
config/locales/views/splits/ca.yml | 51 ++
config/locales/views/subscriptions/ca.yml | 28 +-
config/locales/views/tag/deletions/ca.yml | 1 +
config/locales/views/tags/ca.yml | 3 +
config/locales/views/trades/ca.yml | 25 +-
config/locales/views/transactions/ca.yml | 268 +++++++++-
config/locales/views/transactions/en.yml | 7 +
config/locales/views/transfer_matches/ca.yml | 27 +
config/locales/views/transfers/ca.yml | 22 +-
config/locales/views/users/ca.yml | 24 +-
config/locales/views/users/en.yml | 4 +
config/locales/views/valuations/ca.yml | 35 +-
config/locales/views/vehicles/ca.yml | 11 +-
test/lib/catalan_pluralization_test.rb | 23 +
139 files changed, 6232 insertions(+), 874 deletions(-)
create mode 100644 config/locales/countries.ca.yml
create mode 100644 config/locales/mailers/pdf_import_mailer/ca.yml
create mode 100644 config/locales/models/account_statement/ca.yml
create mode 100644 config/locales/models/api_key/ca.yml
create mode 100644 config/locales/models/brex_item/ca.yml
create mode 100644 config/locales/models/category_import/ca.yml
create mode 100644 config/locales/models/chat/ca.yml
create mode 100644 config/locales/models/coinbase_account/ca.yml
create mode 100644 config/locales/models/indexa_capital_item/ca.yml
create mode 100644 config/locales/models/period/ca.yml
create mode 100644 config/locales/models/plaid_account/ca.yml
create mode 100644 config/locales/models/recurring_transaction/ca.yml
create mode 100644 config/locales/models/rule/ca.yml
create mode 100644 config/locales/models/rule_import/ca.yml
create mode 100644 config/locales/models/simplefin_account/ca.yml
create mode 100644 config/locales/models/sophtron_account/ca.yml
create mode 100644 config/locales/models/sso_provider/ca.yml
create mode 100644 config/locales/models/transaction/ca.yml
create mode 100644 config/locales/views/account_sharings/ca.yml
create mode 100644 config/locales/views/account_statements/ca.yml
create mode 100644 config/locales/views/admin/invitations/ca.yml
create mode 100644 config/locales/views/beta/ca.yml
create mode 100644 config/locales/views/binance_items/ca.yml
create mode 100644 config/locales/views/brex_items/ca.yml
create mode 100644 config/locales/views/coinbase_items/ca.yml
create mode 100644 config/locales/views/ibkr_items/ca.yml
create mode 100644 config/locales/views/indexa_capital_items/ca.yml
create mode 100644 config/locales/views/kraken_items/ca.yml
create mode 100644 config/locales/views/mercury_items/ca.yml
create mode 100644 config/locales/views/messages/ca.yml
create mode 100644 config/locales/views/pdf_import_mailer/ca.yml
create mode 100644 config/locales/views/pending_duplicate_merges/ca.yml
create mode 100644 config/locales/views/securities/ca.yml
create mode 100644 config/locales/views/snaptrade_items/ca.yml
create mode 100644 config/locales/views/sophtron_items/ca.yml
create mode 100644 config/locales/views/splits/ca.yml
create mode 100644 config/locales/views/transfer_matches/ca.yml
create mode 100644 test/lib/catalan_pluralization_test.rb
diff --git a/app/components/UI/account/balance_reconciliation.rb b/app/components/UI/account/balance_reconciliation.rb
index 980fad60d..0839bd1e1 100644
--- a/app/components/UI/account/balance_reconciliation.rb
+++ b/app/components/UI/account/balance_reconciliation.rb
@@ -27,105 +27,108 @@ class UI::Account::BalanceReconciliation < ApplicationComponent
private
+ def t_label(key)
+ I18n.t("UI.account.balance_reconciliation.labels.#{key}")
+ end
+
+ def t_tooltip(key)
+ I18n.t("UI.account.balance_reconciliation.tooltips.#{key}")
+ end
+
def default_items
items = [
- { label: "Start balance", value: balance.start_balance_money, tooltip: "The account balance at the beginning of this day", style: :start },
- { label: "Net cash flow", value: net_cash_flow, tooltip: "Net change in balance from all transactions during the day", style: :flow }
+ { label: t_label(:start_balance), value: balance.start_balance_money, tooltip: t_tooltip(:start_balance), style: :start },
+ { label: t_label(:net_cash_flow), value: net_cash_flow, tooltip: t_tooltip(:net_cash_flow), style: :flow }
]
if has_adjustments?
- items << { label: "End balance", value: end_balance_before_adjustments, tooltip: "The calculated balance after all transactions", style: :subtotal }
- items << { label: "Adjustments", value: total_adjustments, tooltip: "Manual reconciliations or other adjustments", style: :adjustment }
+ items << { label: t_label(:end_balance), value: end_balance_before_adjustments, tooltip: t_tooltip(:end_balance), style: :subtotal }
+ items << { label: t_label(:adjustments), value: total_adjustments, tooltip: t_tooltip(:adjustments), style: :adjustment }
end
- items << { label: "Final balance", value: balance.end_balance_money, tooltip: "The final account balance for the day", style: :final }
+ items << { label: t_label(:final_balance), value: balance.end_balance_money, tooltip: t_tooltip(:final_balance), style: :final }
items
end
def credit_card_items
items = [
- { label: "Start balance", value: balance.start_balance_money, tooltip: "The balance owed at the beginning of this day", style: :start },
- { label: "Charges", value: balance.cash_outflows_money, tooltip: "New charges made during the day", style: :flow },
- { label: "Payments", value: balance.cash_inflows_money * -1, tooltip: "Payments made to the card during the day", style: :flow }
+ { label: t_label(:start_balance), value: balance.start_balance_money, tooltip: t_tooltip(:start_balance_credit), style: :start },
+ { label: t_label(:charges), value: balance.cash_outflows_money, tooltip: t_tooltip(:charges), style: :flow },
+ { label: t_label(:payments), value: balance.cash_inflows_money * -1, tooltip: t_tooltip(:payments), style: :flow }
]
if has_adjustments?
- items << { label: "End balance", value: end_balance_before_adjustments, tooltip: "The calculated balance after all transactions", style: :subtotal }
- items << { label: "Adjustments", value: total_adjustments, tooltip: "Manual reconciliations or other adjustments", style: :adjustment }
+ items << { label: t_label(:end_balance), value: end_balance_before_adjustments, tooltip: t_tooltip(:end_balance), style: :subtotal }
+ items << { label: t_label(:adjustments), value: total_adjustments, tooltip: t_tooltip(:adjustments), style: :adjustment }
end
- items << { label: "Final balance", value: balance.end_balance_money, tooltip: "The final balance owed for the day", style: :final }
+ items << { label: t_label(:final_balance), value: balance.end_balance_money, tooltip: t_tooltip(:final_balance_credit), style: :final }
items
end
def investment_items
items = [
- { label: "Start balance", value: balance.start_balance_money, tooltip: "The total portfolio value at the beginning of this day", style: :start }
+ { label: t_label(:start_balance), value: balance.start_balance_money, tooltip: t_tooltip(:start_balance_investment), style: :start }
]
- # Change in brokerage cash (includes deposits, withdrawals, and cash from trades)
- items << { label: "Change in brokerage cash", value: net_cash_flow, tooltip: "Net change in cash from deposits, withdrawals, and trades", style: :flow }
-
- # Change in holdings from trading activity
- items << { label: "Change in holdings (buys/sells)", value: net_non_cash_flow, tooltip: "Impact on holdings from buying and selling securities", style: :flow }
-
- # Market price changes
- items << { label: "Change in holdings (market price activity)", value: balance.net_market_flows_money, tooltip: "Change in holdings value from market price movements", style: :flow }
+ items << { label: t_label(:change_in_brokerage_cash), value: net_cash_flow, tooltip: t_tooltip(:change_in_brokerage_cash), style: :flow }
+ items << { label: t_label(:change_in_holdings_trades), value: net_non_cash_flow, tooltip: t_tooltip(:change_in_holdings_trades), style: :flow }
+ items << { label: t_label(:change_in_holdings_market), value: balance.net_market_flows_money, tooltip: t_tooltip(:change_in_holdings_market), style: :flow }
if has_adjustments?
- items << { label: "End balance", value: end_balance_before_adjustments, tooltip: "The calculated balance after all activity", style: :subtotal }
- items << { label: "Adjustments", value: total_adjustments, tooltip: "Manual reconciliations or other adjustments", style: :adjustment }
+ items << { label: t_label(:end_balance), value: end_balance_before_adjustments, tooltip: t_tooltip(:end_balance_investment), style: :subtotal }
+ items << { label: t_label(:adjustments), value: total_adjustments, tooltip: t_tooltip(:adjustments), style: :adjustment }
end
- items << { label: "Final balance", value: balance.end_balance_money, tooltip: "The final portfolio value for the day", style: :final }
+ items << { label: t_label(:final_balance), value: balance.end_balance_money, tooltip: t_tooltip(:final_balance_investment), style: :final }
items
end
def loan_items
items = [
- { label: "Start principal", value: balance.start_balance_money, tooltip: "The principal balance at the beginning of this day", style: :start },
- { label: "Net principal change", value: net_non_cash_flow, tooltip: "Principal payments and new borrowing during the day", style: :flow }
+ { label: t_label(:start_principal), value: balance.start_balance_money, tooltip: t_tooltip(:start_principal), style: :start },
+ { label: t_label(:net_principal_change), value: net_non_cash_flow, tooltip: t_tooltip(:net_principal_change), style: :flow }
]
if has_adjustments?
- items << { label: "End principal", value: end_balance_before_adjustments, tooltip: "The calculated principal after all transactions", style: :subtotal }
- items << { label: "Adjustments", value: balance.non_cash_adjustments_money, tooltip: "Manual reconciliations or other adjustments", style: :adjustment }
+ items << { label: t_label(:end_principal), value: end_balance_before_adjustments, tooltip: t_tooltip(:end_principal), style: :subtotal }
+ items << { label: t_label(:adjustments), value: balance.non_cash_adjustments_money, tooltip: t_tooltip(:adjustments), style: :adjustment }
end
- items << { label: "Final principal", value: balance.end_balance_money, tooltip: "The final principal balance for the day", style: :final }
+ items << { label: t_label(:final_principal), value: balance.end_balance_money, tooltip: t_tooltip(:final_principal), style: :final }
items
end
- def asset_items # Property/Vehicle
+ def asset_items
items = [
- { label: "Start value", value: balance.start_balance_money, tooltip: "The asset value at the beginning of this day", style: :start },
- { label: "Net value change", value: net_total_flow, tooltip: "All value changes including improvements and depreciation", style: :flow }
+ { label: t_label(:start_value), value: balance.start_balance_money, tooltip: t_tooltip(:start_value), style: :start },
+ { label: t_label(:net_value_change), value: net_total_flow, tooltip: t_tooltip(:net_value_change), style: :flow }
]
if has_adjustments?
- items << { label: "End value", value: end_balance_before_adjustments, tooltip: "The calculated value after all changes", style: :subtotal }
- items << { label: "Adjustments", value: total_adjustments, tooltip: "Manual value adjustments or appraisals", style: :adjustment }
+ items << { label: t_label(:end_value), value: end_balance_before_adjustments, tooltip: t_tooltip(:end_value), style: :subtotal }
+ items << { label: t_label(:adjustments), value: total_adjustments, tooltip: t_tooltip(:adjustments_asset), style: :adjustment }
end
- items << { label: "Final value", value: balance.end_balance_money, tooltip: "The final asset value for the day", style: :final }
+ items << { label: t_label(:final_value), value: balance.end_balance_money, tooltip: t_tooltip(:final_value), style: :final }
items
end
def crypto_items
items = [
- { label: "Start balance", value: balance.start_balance_money, tooltip: "The crypto holdings value at the beginning of this day", style: :start }
+ { label: t_label(:start_balance), value: balance.start_balance_money, tooltip: t_tooltip(:start_balance_crypto), style: :start }
]
- items << { label: "Buys", value: balance.cash_outflows_money * -1, tooltip: "Crypto purchases during the day", style: :flow } if balance.cash_outflows != 0
- items << { label: "Sells", value: balance.cash_inflows_money, tooltip: "Crypto sales during the day", style: :flow } if balance.cash_inflows != 0
- items << { label: "Market changes", value: balance.net_market_flows_money, tooltip: "Value changes from market price movements", style: :flow } if balance.net_market_flows != 0
+ items << { label: t_label(:buys), value: balance.cash_outflows_money * -1, tooltip: t_tooltip(:buys), style: :flow } if balance.cash_outflows != 0
+ items << { label: t_label(:sells), value: balance.cash_inflows_money, tooltip: t_tooltip(:sells), style: :flow } if balance.cash_inflows != 0
+ items << { label: t_label(:market_changes), value: balance.net_market_flows_money, tooltip: t_tooltip(:market_changes), style: :flow } if balance.net_market_flows != 0
if has_adjustments?
- items << { label: "End balance", value: end_balance_before_adjustments, tooltip: "The calculated balance after all activity", style: :subtotal }
- items << { label: "Adjustments", value: total_adjustments, tooltip: "Manual reconciliations or other adjustments", style: :adjustment }
+ items << { label: t_label(:end_balance), value: end_balance_before_adjustments, tooltip: t_tooltip(:end_balance_crypto), style: :subtotal }
+ items << { label: t_label(:adjustments), value: total_adjustments, tooltip: t_tooltip(:adjustments), style: :adjustment }
end
- items << { label: "Final balance", value: balance.end_balance_money, tooltip: "The final crypto holdings value for the day", style: :final }
+ items << { label: t_label(:final_balance), value: balance.end_balance_money, tooltip: t_tooltip(:final_balance_crypto), style: :final }
items
end
diff --git a/app/components/UI/account/chart.html.erb b/app/components/UI/account/chart.html.erb
index 54933dcfe..91fb0b69c 100644
--- a/app/components/UI/account/chart.html.erb
+++ b/app/components/UI/account/chart.html.erb
@@ -21,7 +21,7 @@
<% if account.investment? %>
<%= form.select :chart_view,
- [["Total value", "balance"], ["Holdings", "holdings_balance"], ["Cash", "cash_balance"]],
+ [[t(".views.total_value"), "balance"], [t(".views.holdings"), "holdings_balance"], [t(".views.cash"), "cash_balance"]],
{ selected: view },
class: "bg-container border border-secondary rounded-lg text-sm pr-7 cursor-pointer text-primary focus:outline-hidden focus:ring-0",
data: { "auto-submit-form-target": "auto" } %>
diff --git a/app/components/UI/account/chart.rb b/app/components/UI/account/chart.rb
index ee55e499a..25c5880ab 100644
--- a/app/components/UI/account/chart.rb
+++ b/app/components/UI/account/chart.rb
@@ -31,20 +31,22 @@ class UI::Account::Chart < ApplicationComponent
when "Investment", "Crypto"
case view
when "balance"
- "Total account value"
+ I18n.t("UI.account.chart.title.total_account_value")
when "holdings_balance"
- "Holdings value"
+ I18n.t("UI.account.chart.title.holdings_value")
when "cash_balance"
- "Cash value"
+ I18n.t("UI.account.chart.title.cash_value")
end
- when "Property", "Vehicle"
- "Estimated #{account.accountable_type.humanize.downcase} value"
+ when "Property"
+ I18n.t("UI.account.chart.title.estimated_property_value")
+ when "Vehicle"
+ I18n.t("UI.account.chart.title.estimated_vehicle_value")
when "CreditCard", "OtherLiability"
- "Debt balance"
+ I18n.t("UI.account.chart.title.debt_balance")
when "Loan"
- "Remaining principal balance"
+ I18n.t("UI.account.chart.title.remaining_principal_balance")
else
- "Balance"
+ I18n.t("UI.account.chart.title.balance")
end
end
@@ -79,7 +81,7 @@ class UI::Account::Chart < ApplicationComponent
return period.comparison_label if start_date.blank?
if start_date > period.start_date
- "vs. available history"
+ I18n.t("UI.account.chart.vs_available_history")
else
period.comparison_label
end
diff --git a/app/controllers/concerns/breadcrumbable.rb b/app/controllers/concerns/breadcrumbable.rb
index 23410cb70..f2ff12282 100644
--- a/app/controllers/concerns/breadcrumbable.rb
+++ b/app/controllers/concerns/breadcrumbable.rb
@@ -2,12 +2,21 @@ module Breadcrumbable
extend ActiveSupport::Concern
included do
- before_action :set_breadcrumbs
+ helper_method :breadcrumbs
end
private
- # The default, unless specific controller or action explicitly overrides
- def set_breadcrumbs
- @breadcrumbs = [ [ t("breadcrumbs.home"), root_path ], [ t("breadcrumbs.#{controller_name}", default: controller_name.titleize), nil ] ]
+ # Render-time helper so I18n.locale (set by Localize's around_action) is
+ # already in effect when the breadcrumb labels are translated.
+ # Controllers can still override by assigning @breadcrumbs in their action.
+ def breadcrumbs
+ @breadcrumbs || default_breadcrumbs
+ end
+
+ def default_breadcrumbs
+ [
+ [ I18n.t("breadcrumbs.home"), root_path ],
+ [ I18n.t("breadcrumbs.#{controller_name}", default: controller_name.titleize), nil ]
+ ]
end
end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index d15266e03..9f2c0a647 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -14,6 +14,24 @@ module ApplicationHelper
form_with(**options, &block)
end
+ # Locale-aware ordinal label for integers.
+ # English falls through to Ruby's ordinalize ("1st"); Catalan returns "1r"/"2n"/...
+ def localized_ordinal(number)
+ case I18n.locale
+ when :ca
+ n = number.to_i
+ suffix = case n
+ when 1, 3 then "r"
+ when 2 then "n"
+ when 4 then "t"
+ else "è"
+ end
+ "#{n}#{suffix}"
+ else
+ number.to_i.ordinalize
+ end
+ end
+
def icon(key, size: "md", color: "default", custom: false, as_button: false, **opts)
extra_classes = opts.delete(:class)
sizes = { xs: "w-3 h-3", sm: "w-4 h-4", md: "w-5 h-5", lg: "w-6 h-6", xl: "w-7 h-7", "2xl": "w-8 h-8" }
diff --git a/app/helpers/languages_helper.rb b/app/helpers/languages_helper.rb
index 0d2bd8113..66677a6c1 100644
--- a/app/helpers/languages_helper.rb
+++ b/app/helpers/languages_helper.rb
@@ -371,7 +371,12 @@ module LanguagesHelper
}.freeze
def country_options
- COUNTRY_MAPPING.keys.map { |key| [ COUNTRY_MAPPING[key], key ] }
+ COUNTRY_MAPPING.keys.map do |key|
+ english = COUNTRY_MAPPING[key]
+ emoji, name = english.split(" ", 2)
+ label = I18n.t("countries.#{key}", default: name)
+ [ "#{emoji} #{label}", key ]
+ end
end
def language_options
diff --git a/app/models/account_order.rb b/app/models/account_order.rb
index 8a26c0fc4..bd7367c0b 100644
--- a/app/models/account_order.rb
+++ b/app/models/account_order.rb
@@ -33,11 +33,11 @@ class AccountOrder
end
def label
- ORDERS.dig(key, :label)
+ I18n.t("account_order.#{key}.label", default: ORDERS.dig(key, :label))
end
def label_short
- ORDERS.dig(key, :label_short)
+ I18n.t("account_order.#{key}.label_short", default: ORDERS.dig(key, :label_short))
end
def sql_order
diff --git a/app/models/budget.rb b/app/models/budget.rb
index 20b6e36e5..f08f1e0d0 100644
--- a/app/models/budget.rb
+++ b/app/models/budget.rb
@@ -130,11 +130,11 @@ class Budget < ApplicationRecord
if family.uses_custom_month_start?
I18n.t(
"budgets.name.custom_range",
- start: start_date.strftime("%b %d"),
- end_date: end_date.strftime("%b %d, %Y")
+ start: I18n.l(start_date, format: :short),
+ end_date: I18n.l(end_date, format: :long)
)
else
- I18n.t("budgets.name.month_year", month: start_date.strftime("%B %Y"))
+ I18n.t("budgets.name.month_year", month: I18n.l(start_date, format: :month_year))
end
end
diff --git a/app/models/family.rb b/app/models/family.rb
index 168773701..3ebd72406 100644
--- a/app/models/family.rb
+++ b/app/models/family.rb
@@ -83,11 +83,25 @@ class Family < ApplicationRecord
def moniker_label
- moniker.presence || "Family"
+ case moniker.presence
+ when nil, "Family"
+ I18n.t("shared.family_moniker.singular", default: "Family")
+ when "Group"
+ I18n.t("shared.family_moniker.group_singular", default: "Group")
+ else
+ moniker
+ end
end
def moniker_label_plural
- moniker_label == "Group" ? "Groups" : "Families"
+ case moniker.presence
+ when nil, "Family"
+ I18n.t("shared.family_moniker.plural", default: "Families")
+ when "Group"
+ I18n.t("shared.family_moniker.group_plural", default: "Groups")
+ else
+ "#{moniker}s"
+ end
end
def share_all_by_default?
diff --git a/app/models/import.rb b/app/models/import.rb
index c5e26327e..71887faed 100644
--- a/app/models/import.rb
+++ b/app/models/import.rb
@@ -14,6 +14,13 @@ class Import < ApplicationRecord
SIGNAGE_CONVENTIONS = %w[inflows_positive inflows_negative]
SEPARATORS = [ [ "Comma (,)", "," ], [ "Semicolon (;)", ";" ] ].freeze
+ def self.separator_options
+ [
+ [ I18n.t("activerecord.attributes.import.col_seps.comma"), "," ],
+ [ I18n.t("activerecord.attributes.import.col_seps.semicolon"), ";" ]
+ ]
+ end
+
NUMBER_FORMATS = {
"1,234.56" => { separator: ".", delimiter: "," }, # US/UK/Asia
"1.234,56" => { separator: ",", delimiter: "." }, # Most of Europe
diff --git a/app/views/budget_categories/_allocation_progress.erb b/app/views/budget_categories/_allocation_progress.erb
index bd162f5e0..0312cd677 100644
--- a/app/views/budget_categories/_allocation_progress.erb
+++ b/app/views/budget_categories/_allocation_progress.erb
@@ -9,10 +9,10 @@
<% end %>
<% if budget.available_to_allocate.negative? %>
-
" class="flex items-center gap-1">
<% if transaction.transfer.confirmed? %>
- is confirmed">
+ ">
<%= icon "link-2", size: "sm", class: "text-secondary" %>
<% elsif transaction.transfer.pending? %>
- Auto-matched
+ <%= t("transactions.transfer_match.auto_matched") %>
- A/M
+ <%= t("transactions.transfer_match.auto_matched_short") %>
<%= button_to transfer_path(transaction.transfer, transfer: { status: "confirmed" }),
method: :patch,
class: "text-secondary flex items-center justify-center cursor-pointer",
- title: "Confirm match" do %>
+ title: t("transactions.transfer_match.confirm_match") do %>
<%= icon "check", size: "sm", class: "text-secondary hover:text-primary" %>
<% end %>
@@ -24,7 +24,7 @@
method: :patch,
data: { turbo: false },
class: "text-secondary hover:text-primary flex items-center justify-center cursor-pointer",
- title: "Reject match" do %>
+ title: t("transactions.transfer_match.reject_match") do %>
<%= icon "x", size: "sm", class: "text-subdued hover:text-primary" %>
<% end %>
<% end %>
diff --git a/config/locales/breadcrumbs/ca.yml b/config/locales/breadcrumbs/ca.yml
index c726a4da7..af61405d4 100644
--- a/config/locales/breadcrumbs/ca.yml
+++ b/config/locales/breadcrumbs/ca.yml
@@ -1,6 +1,87 @@
---
ca:
breadcrumbs:
+ account_sharings: Compartició de comptes
+ account_statements: Arxiu d'extractes
+ accounts: Comptes
+ ai_prompts: Prompts d'IA
+ api_key: Clau API
+ api_keys: Claus API
+ appearance: Aparença
+ appearances: Aparença
+ bank_sync: Sincronització bancària
+ binance_items: Binance
+ brex_items: Brex
+ budget_categories: Categories del pressupost
+ budgets: Pressupostos
+ categories: Categories
+ categorize: Categoritza
+ chats: Xats
+ coinbase_items: Coinbase
+ coinstats_items: CoinStats
+ credit_cards: Targetes de crèdit
+ cryptos: Cripto
+ dashboard: Tauler
+ debug: Depuració
+ debugs: Depuració
+ depositories: Comptes d'efectiu
+ enable_banking_items: Enable Banking
exports: Exportacions
+ family_exports: Exportacions
+ family_merchants: Comerços
+ guides: Guies
+ holdings: Posicions
home: Inici
+ hostings: Self hosting
+ ibkr_items: Interactive Brokers
+ impersonation_sessions: Suplantacions
imports: Importacions
+ indexa_capital_items: Indexa Capital
+ intro: Introducció
+ investments: Inversions
+ invitations: Invitacions
+ invite_codes: Codis d'invitació
+ kraken_items: Kraken
+ llm_usage: Ús d'LLM
+ llm_usages: Ús d'LLM
+ loans: Préstecs
+ lunchflow_items: Lunch Flow
+ merchants: Comerços
+ mercury_items: Mercury
+ messages: Missatges
+ mfa: Autenticació de dos factors
+ oidc_accounts: Comptes SSO
+ onboardings: Configuració inicial
+ other_assets: Altres actius
+ other_liabilities: Altres passius
+ payments: Pagaments
+ pending_duplicate_merges: Revisió de duplicats
+ plaid_items: Plaid
+ preferences: Preferències
+ profile: Informació del perfil
+ profiles: Informació del perfil
+ properties: Propietats
+ providers: Proveïdors
+ recurring_transactions: Recurrents
+ registrations: Registre
+ reports: Informes
+ rules: Regles
+ securities: Seguretat
+ security: Seguretat
+ self_hosting: Self hosting
+ sessions: Inici de sessió
+ simplefin_items: SimpleFIN
+ snaptrade_items: SnapTrade
+ sophtron_items: Sophtron
+ splits: Divisió
+ sso_identities: Connexions SSO
+ sso_providers: Proveïdors SSO
+ subscriptions: Subscripció
+ tags: Etiquetes
+ trades: Operacions
+ transactions: Transaccions
+ transfer_matches: Coincidències de transferències
+ transfers: Transferències
+ users: Usuaris
+ valuations: Valoracions
+ vehicles: Vehicles
diff --git a/config/locales/breadcrumbs/en.yml b/config/locales/breadcrumbs/en.yml
index 53e8fef65..c6f1ba1d8 100644
--- a/config/locales/breadcrumbs/en.yml
+++ b/config/locales/breadcrumbs/en.yml
@@ -1,21 +1,87 @@
---
en:
breadcrumbs:
+ account_sharings: Account sharing
+ account_statements: Statement vault
+ accounts: Accounts
ai_prompts: AI Prompts
api_key: API Key
+ api_keys: API Keys
+ appearance: Appearance
+ appearances: Appearance
bank_sync: Bank Sync
+ binance_items: Binance
+ brex_items: Brex
+ budget_categories: Budget categories
budgets: Budgets
+ categories: Categories
categorize: Categorize
+ chats: Chats
+ coinbase_items: Coinbase
+ coinstats_items: CoinStats
+ credit_cards: Credit cards
+ cryptos: Crypto
dashboard: Dashboard
+ debug: Debug
+ debugs: Debug
+ depositories: Cash accounts
+ enable_banking_items: Enable Banking
exports: Exports
+ family_exports: Exports
+ family_merchants: Merchants
guides: Guides
+ holdings: Holdings
home: Home
+ hostings: Self-Hosting
+ ibkr_items: Interactive Brokers
+ impersonation_sessions: Impersonations
imports: Imports
+ indexa_capital_items: Indexa Capital
intro: Intro
+ investments: Investments
+ invitations: Invitations
+ invite_codes: Invite codes
+ kraken_items: Kraken
llm_usage: LLM Usage
+ llm_usages: LLM Usage
+ loans: Loans
+ lunchflow_items: Lunch Flow
merchants: Merchants
+ mercury_items: Mercury
+ messages: Messages
+ mfa: Two-factor authentication
+ oidc_accounts: SSO accounts
+ onboardings: Onboarding
+ other_assets: Other assets
+ other_liabilities: Other liabilities
+ payments: Payments
+ pending_duplicate_merges: Duplicate review
+ plaid_items: Plaid
+ preferences: Preferences
profile: Profile Info
+ profiles: Profile Info
+ properties: Properties
+ providers: Providers
+ recurring_transactions: Recurring
+ registrations: Sign up
reports: Reports
+ rules: Rules
+ securities: Security
security: Security
self_hosting: Self-Hosting
+ sessions: Sign in
+ simplefin_items: SimpleFIN
+ snaptrade_items: SnapTrade
+ sophtron_items: Sophtron
+ splits: Split
+ sso_identities: SSO connections
+ sso_providers: SSO providers
+ subscriptions: Subscription
+ tags: Tags
+ trades: Trades
transactions: Transactions
+ transfer_matches: Transfer matches
+ transfers: Transfers
+ users: Users
+ valuations: Valuations
+ vehicles: Vehicles
diff --git a/config/locales/countries.ca.yml b/config/locales/countries.ca.yml
new file mode 100644
index 000000000..ecb7b82f4
--- /dev/null
+++ b/config/locales/countries.ca.yml
@@ -0,0 +1,121 @@
+---
+ca:
+ countries:
+ AD: Andorra
+ AE: Emirats Àrabs Units
+ AF: Afganistan
+ AL: Albània
+ AM: Armènia
+ AO: Angola
+ AR: Argentina
+ AT: Àustria
+ AU: Austràlia
+ BA: Bòsnia i Hercegovina
+ BD: Bangla Desh
+ BE: Bèlgica
+ BG: Bulgària
+ BO: Bolívia
+ BR: Brasil
+ BY: Bielorússia
+ CA: Canadà
+ CD: República Democràtica del Congo
+ CG: República del Congo
+ CH: Suïssa
+ CI: Costa d'Ivori
+ CL: Xile
+ CM: Camerun
+ CN: Xina
+ CO: Colòmbia
+ CR: Costa Rica
+ CU: Cuba
+ CY: Xipre
+ CZ: República Txeca
+ DE: Alemanya
+ DK: Dinamarca
+ DO: República Dominicana
+ DZ: Algèria
+ EC: Equador
+ EE: Estònia
+ EG: Egipte
+ ES: Espanya
+ ET: Etiòpia
+ FI: Finlàndia
+ FR: França
+ GB: Regne Unit
+ GE: Geòrgia
+ GH: Ghana
+ GR: Grècia
+ GT: Guatemala
+ HK: Hong Kong
+ HN: Hondures
+ HR: Croàcia
+ HT: Haití
+ HU: Hongria
+ ID: Indonèsia
+ IE: Irlanda
+ IL: Israel
+ IN: Índia
+ IQ: Iraq
+ IR: Iran
+ IS: Islàndia
+ IT: Itàlia
+ JM: Jamaica
+ JO: Jordània
+ JP: Japó
+ KE: Kenya
+ KH: Cambodja
+ KP: Corea del Nord
+ KR: Corea del Sud
+ KW: Kuwait
+ KZ: Kazakhstan
+ LB: Líban
+ LT: Lituània
+ LU: Luxemburg
+ LV: Letònia
+ MA: Marroc
+ MD: Moldàvia
+ ME: Montenegro
+ MG: Madagascar
+ MK: Macedònia del Nord
+ MM: Myanmar (Birmània)
+ MN: Mongòlia
+ MT: Malta
+ MX: Mèxic
+ MY: Malàisia
+ NG: Nigèria
+ NI: Nicaragua
+ NL: Països Baixos
+ 'NO': Noruega
+ NP: Nepal
+ NZ: Nova Zelanda
+ PA: Panamà
+ PE: Perú
+ PH: Filipines
+ PK: Pakistan
+ PL: Polònia
+ PR: Puerto Rico
+ PT: Portugal
+ PY: Paraguai
+ QA: Qatar
+ RO: Romania
+ RS: Sèrbia
+ RU: Rússia
+ SA: Aràbia Saudita
+ SE: Suècia
+ SG: Singapur
+ SI: Eslovènia
+ SK: Eslovàquia
+ SV: El Salvador
+ SY: Síria
+ TH: Tailàndia
+ TN: Tunísia
+ TR: Turquia
+ TW: Taiwan
+ UA: Ucraïna
+ UG: Uganda
+ US: Estats Units
+ UY: Uruguai
+ VE: Veneçuela
+ VN: Vietnam
+ ZA: Sud-àfrica
+ ZW: Zimbàbue
diff --git a/config/locales/defaults/ca.yml b/config/locales/defaults/ca.yml
index 127267ac6..a88f011d3 100644
--- a/config/locales/defaults/ca.yml
+++ b/config/locales/defaults/ca.yml
@@ -41,7 +41,9 @@ ca:
formats:
default: "%d-%m-%Y"
long: "%d de %B de %Y"
+ month_year: "%B de %Y"
short: "%d de %b"
+ short_month_year: "%b de %Y"
month_names:
-
- Gener
@@ -83,7 +85,7 @@ ca:
other: menys de %{count} segons
over_x_years:
one: més d'%{count} any
- other: més de %{count} anys
+ other: més d'%{count} anys
x_days:
one: "%{count} dia"
other: "%{count} dies"
@@ -108,6 +110,8 @@ ca:
year: any
defaults:
brand_name: "%{brand_name}"
+ common:
+ close: Tanca
product_name: "%{product_name}"
errors:
format: "%{attribute} %{message}"
@@ -122,7 +126,7 @@ ca:
greater_than: ha de ser més gran que %{count}
greater_than_or_equal_to: ha de ser més gran o igual a %{count}
in: ha d'estar entre %{count}
- inclusion: no està inclós a la llista
+ inclusion: no està inclòs a la llista
invalid: no és vàlid
less_than: ha de ser menor que %{count}
less_than_or_equal_to: ha de ser menor o igual a %{count}
@@ -148,13 +152,17 @@ ca:
header:
one: No s'ha pogut desar aquest/a %{model} perquè hi ha %{count} error
other: No s'ha pogut desar aquest/a %{model} perquè hi ha hagut %{count} errors
+ global:
+ expand: Desplega
helpers:
select:
- prompt: Si us plau tria
+ default_label: Selecciona...
+ prompt: Tria
+ search_placeholder: Cerca
submit:
- create: Crear %{model}
- submit: Guardar %{model}
- update: Actualitzar %{model}
+ create: Crea %{model}
+ submit: Desa %{model}
+ update: Actualitza %{model}
number:
currency:
format:
diff --git a/config/locales/doorkeeper.ca.yml b/config/locales/doorkeeper.ca.yml
index 0b7a5f4aa..3f137996e 100644
--- a/config/locales/doorkeeper.ca.yml
+++ b/config/locales/doorkeeper.ca.yml
@@ -46,7 +46,7 @@ ca:
callback_url: URL de retorn
confidential: Confidencial?
confidentiality:
- 'no': No
+ 'no': 'No'
'yes': Sí
name: Nom
new: Nova aplicació
@@ -68,6 +68,7 @@ ca:
authorize: Autoritza
deny: Denega
error:
+ go_back: Torna enrere
title: S'ha produït un error
form_post:
title: Envia aquest formulari
@@ -76,6 +77,8 @@ ca:
prompt: Autoritzes %{client_name} a utilitzar el teu compte?
title: Autorització requerida
show:
+ authorization_code_label: 'Codi d''autorització:'
+ copy_instructions: Copia aquest codi i enganxa'l a l'aplicació.
title: Codi d'autorització
authorized_applications:
buttons:
diff --git a/config/locales/mailers/invitation_mailer/ca.yml b/config/locales/mailers/invitation_mailer/ca.yml
index e00247801..64274f354 100644
--- a/config/locales/mailers/invitation_mailer/ca.yml
+++ b/config/locales/mailers/invitation_mailer/ca.yml
@@ -2,4 +2,4 @@
ca:
invitation_mailer:
invite_email:
- subject: "%{inviter} t'ha convidat a unir-te al seu grup familiar a %{product_name}!"
+ subject: "%{inviter} t'ha convidat a unir-te al seu compte de %{product_name}!"
diff --git a/config/locales/mailers/pdf_import_mailer/ca.yml b/config/locales/mailers/pdf_import_mailer/ca.yml
new file mode 100644
index 000000000..1170cd293
--- /dev/null
+++ b/config/locales/mailers/pdf_import_mailer/ca.yml
@@ -0,0 +1,5 @@
+---
+ca:
+ pdf_import_mailer:
+ next_steps:
+ subject: S'ha analitzat el teu document PDF - %{product_name}
diff --git a/config/locales/models/account/ca.yml b/config/locales/models/account/ca.yml
index bc22cd01f..43c7f9960 100644
--- a/config/locales/models/account/ca.yml
+++ b/config/locales/models/account/ca.yml
@@ -1,12 +1,25 @@
---
ca:
+ account_order:
+ balance_asc:
+ label: Saldo (de menor a major)
+ label_short: Saldo ↑
+ balance_desc:
+ label: Saldo (de major a menor)
+ label_short: Saldo ↓
+ name_asc:
+ label: Nom (A-Z)
+ label_short: Nom ↑
+ name_desc:
+ label: Nom (Z-A)
+ label_short: Nom ↓
activerecord:
attributes:
account:
balance: Saldo
- currency: Moneda
- family: Família
- family_id: Família
+ currency: Divisa
+ family: "%{moniker}"
+ family_id: "%{moniker}"
name: Nom
subtype: Subtipus
models:
@@ -15,8 +28,7 @@ ca:
account/depository: Compte bancari
account/investment: Inversió
account/loan: Préstec
- account/other_asset: Altres actius
- account/other_liability: Altres passius
+ account/other_asset: Altre actiu
+ account/other_liability: Altre passiu
account/property: Immoble
account/vehicle: Vehicle
-
diff --git a/config/locales/models/account/en.yml b/config/locales/models/account/en.yml
index e4c882b9c..df47d3302 100644
--- a/config/locales/models/account/en.yml
+++ b/config/locales/models/account/en.yml
@@ -1,5 +1,18 @@
---
en:
+ account_order:
+ balance_asc:
+ label: Balance (Low to High)
+ label_short: Balance ↑
+ balance_desc:
+ label: Balance (High to Low)
+ label_short: Balance ↓
+ name_asc:
+ label: Name (A-Z)
+ label_short: Name ↑
+ name_desc:
+ label: Name (Z-A)
+ label_short: Name ↓
activerecord:
attributes:
account:
diff --git a/config/locales/models/account_statement/ca.yml b/config/locales/models/account_statement/ca.yml
new file mode 100644
index 000000000..f264559e8
--- /dev/null
+++ b/config/locales/models/account_statement/ca.yml
@@ -0,0 +1,30 @@
+---
+ca:
+ activerecord:
+ attributes:
+ account_statement:
+ account: Compte
+ account_last4_hint: Quatre últims dígits del compte
+ account_name_hint: Pista del nom del compte
+ closing_balance: Saldo final
+ content_sha256: Resum del contingut
+ currency: Divisa
+ filename: Nom del fitxer
+ institution_name_hint: Pista de la institució
+ opening_balance: Saldo inicial
+ original_file: Fitxer de l'extracte
+ period_end_on: Final del període
+ period_start_on: Inici del període
+ errors:
+ models:
+ account_statement:
+ attributes:
+ checksum:
+ duplicate_statement_file: ja s'ha pujat per a aquesta família
+ content_sha256:
+ duplicate_statement_file: ja s'ha pujat per a aquesta família
+ original_file:
+ invalid_format: ha de ser un fitxer PDF, CSV o XLSX
+ too_large: és massa gran. La mida màxima és %{max_mb}MB
+ period_end_on:
+ on_or_after_start: ha de ser igual o posterior a l'inici del període
diff --git a/config/locales/models/address/ca.yml b/config/locales/models/address/ca.yml
index d879be675..e43482fad 100644
--- a/config/locales/models/address/ca.yml
+++ b/config/locales/models/address/ca.yml
@@ -9,4 +9,3 @@ ca:
postal_code: Codi postal
region: Regió
format: "%{line1} %{line2}, %{locality}, %{region} %{postal_code} %{country}"
-
diff --git a/config/locales/models/api_key/ca.yml b/config/locales/models/api_key/ca.yml
new file mode 100644
index 000000000..95e88eb7d
--- /dev/null
+++ b/config/locales/models/api_key/ca.yml
@@ -0,0 +1,8 @@
+---
+ca:
+ activerecord:
+ errors:
+ models:
+ api_key:
+ cannot_destroy_demo_key: No es pot eliminar la clau API de monitoratge de
+ demostració
diff --git a/config/locales/models/brex_item/ca.yml b/config/locales/models/brex_item/ca.yml
new file mode 100644
index 000000000..ce59c6867
--- /dev/null
+++ b/config/locales/models/brex_item/ca.yml
@@ -0,0 +1,14 @@
+---
+ca:
+ activerecord:
+ attributes:
+ brex_item:
+ base_url: URL base
+ name: Nom de la connexió
+ token: Token
+ errors:
+ models:
+ brex_item:
+ attributes:
+ base_url:
+ official_hosts_only: ha de ser buit, https://api.brex.com o https://api-staging.brex.com
diff --git a/config/locales/models/category/ca.yml b/config/locales/models/category/ca.yml
index 310293577..ffa650927 100644
--- a/config/locales/models/category/ca.yml
+++ b/config/locales/models/category/ca.yml
@@ -2,6 +2,28 @@
ca:
models:
category:
+ defaults:
+ entertainment: Oci
+ fees: Comissions
+ food_and_drink: Menjar i begudes
+ gifts_and_donations: Regals i donacions
+ groceries: Alimentació
+ healthcare: Salut
+ home_improvement: Millora de la llar
+ income: Ingressos
+ insurance: Assegurances
+ loan_payments: Pagaments de préstecs
+ mortgage_rent: Hipoteca / Lloguer
+ personal_care: Cura personal
+ savings_and_investments: Estalvis i inversions
+ services: Serveis
+ shopping: Compres
+ sports_and_fitness: Esport i fitness
+ subscriptions: Subscripcions
+ taxes: Impostos
+ transportation: Transport
+ travel: Viatges
+ utilities: Subministraments
+ investment_contributions: Contribucions d'inversió
other_investments: Altres inversions
uncategorized: Sense categoria
- investment_contributions: Contribucions d'inversió
diff --git a/config/locales/models/category_import/ca.yml b/config/locales/models/category_import/ca.yml
new file mode 100644
index 000000000..9b7124b3f
--- /dev/null
+++ b/config/locales/models/category_import/ca.yml
@@ -0,0 +1,8 @@
+---
+ca:
+ activerecord:
+ errors:
+ models:
+ category_import:
+ missing_columns: 'Falten columnes obligatòries: %{columns}'
+ own_parent: La categoria '%{name}' no pot ser el seu propi pare
diff --git a/config/locales/models/chat/ca.yml b/config/locales/models/chat/ca.yml
new file mode 100644
index 000000000..7bb662ddb
--- /dev/null
+++ b/config/locales/models/chat/ca.yml
@@ -0,0 +1,11 @@
+---
+ca:
+ chat:
+ errors:
+ default: No s'ha pogut generar una resposta. Torna-ho a provar.
+ misconfigured: El proveïdor d'IA no està configurat correctament. Contacta amb
+ el teu administrador.
+ rate_limited: El proveïdor d'IA té un límit de peticions ara mateix. Torna-ho
+ a provar d'aquí a uns minuts.
+ temporarily_unavailable: El proveïdor d'IA no està disponible temporalment.
+ Torna-ho a provar d'aquí a uns minuts.
diff --git a/config/locales/models/coinbase_account/ca.yml b/config/locales/models/coinbase_account/ca.yml
new file mode 100644
index 000000000..3379622a3
--- /dev/null
+++ b/config/locales/models/coinbase_account/ca.yml
@@ -0,0 +1,5 @@
+---
+ca:
+ coinbase:
+ processor:
+ paid_via: Pagat amb %{method}
diff --git a/config/locales/models/coinstats_item/ca.yml b/config/locales/models/coinstats_item/ca.yml
index 2aadcea9b..d6d9f697e 100644
--- a/config/locales/models/coinstats_item/ca.yml
+++ b/config/locales/models/coinstats_item/ca.yml
@@ -4,7 +4,7 @@ ca:
coinstats_item:
syncer:
calculating_balances: S'estan calculant els saldos...
- checking_configuration: S'està comprovant la configuració del moneder...
- importing_wallets: S'estan important moneders de CoinStats...
- processing_holdings: S'estan processant les participacions...
- wallets_need_setup: "%{count} moneders necessiten configuració..."
+ checking_configuration: S'està comprovant la configuració del compte de CoinStats...
+ importing_wallets: S'estan important comptes de cripto des de CoinStats...
+ processing_holdings: S'estan processant les posicions...
+ wallets_need_setup: "%{count} comptes de cripto necessiten configuració..."
diff --git a/config/locales/models/import/ca.yml b/config/locales/models/import/ca.yml
index 56ecfa5c6..ffee0098d 100644
--- a/config/locales/models/import/ca.yml
+++ b/config/locales/models/import/ca.yml
@@ -3,7 +3,11 @@ ca:
activerecord:
attributes:
import:
- currency: Moneda
+ col_sep: Separador de columnes
+ col_seps:
+ comma: Coma (,)
+ semicolon: Punt i coma (;)
+ currency: Divisa
number_format: Format numèric
errors:
models:
@@ -11,4 +15,5 @@ ca:
attributes:
raw_file_str:
invalid_csv_format: no és un format CSV vàlid
-
+ duplicate_headers: 'Les capçaleres del CSV es normalitzen en columnes duplicades:
+ %{columns}'
diff --git a/config/locales/models/import/en.yml b/config/locales/models/import/en.yml
index 0c24706dd..1ff592eba 100644
--- a/config/locales/models/import/en.yml
+++ b/config/locales/models/import/en.yml
@@ -3,6 +3,10 @@ en:
activerecord:
attributes:
import:
+ col_sep: Column separator
+ col_seps:
+ comma: Comma (,)
+ semicolon: Semicolon (;)
currency: Currency
number_format: Number Format
errors:
diff --git a/config/locales/models/indexa_capital_item/ca.yml b/config/locales/models/indexa_capital_item/ca.yml
new file mode 100644
index 000000000..be3abb1b1
--- /dev/null
+++ b/config/locales/models/indexa_capital_item/ca.yml
@@ -0,0 +1,8 @@
+---
+ca:
+ activerecord:
+ errors:
+ models:
+ indexa_capital_item:
+ credentials_required: Cal la variable d'entorn INDEXA_API_TOKEN o bé les
+ credencials d'usuari/document/contrasenya
diff --git a/config/locales/models/period/ca.yml b/config/locales/models/period/ca.yml
new file mode 100644
index 000000000..f63df2d4a
--- /dev/null
+++ b/config/locales/models/period/ca.yml
@@ -0,0 +1,54 @@
+---
+ca:
+ period:
+ all_time:
+ comparison_label: vs. inici
+ label: Sempre
+ label_short: Tot
+ current_month:
+ comparison_label: vs. inici de mes
+ label: Mes en curs
+ label_short: MTD
+ current_week:
+ comparison_label: vs. inici de setmana
+ label: Setmana en curs
+ label_short: STD
+ current_year:
+ comparison_label: vs. inici d'any
+ label: Any en curs
+ label_short: YTD
+ custom:
+ label: Període personalitzat
+ label_short: Personalitzat
+ last_10_years:
+ comparison_label: vs. fa 10 anys
+ label: Últims 10 anys
+ label_short: 10A
+ last_30_days:
+ comparison_label: vs. últims 30 dies
+ label: Últims 30 dies
+ label_short: 30D
+ last_365_days:
+ comparison_label: vs. fa 1 any
+ label: Últims 365 dies
+ label_short: 365D
+ last_5_years:
+ comparison_label: vs. fa 5 anys
+ label: Últims 5 anys
+ label_short: 5A
+ last_7_days:
+ comparison_label: vs. setmana anterior
+ label: Últims 7 dies
+ label_short: 7D
+ last_90_days:
+ comparison_label: vs. trimestre anterior
+ label: Últims 90 dies
+ label_short: 90D
+ last_day:
+ comparison_label: vs. ahir
+ label: Últim dia
+ label_short: 1D
+ last_month:
+ comparison_label: vs. mes anterior
+ label: Mes anterior
+ label_short: MA
diff --git a/config/locales/models/plaid_account/ca.yml b/config/locales/models/plaid_account/ca.yml
new file mode 100644
index 000000000..29125eb3d
--- /dev/null
+++ b/config/locales/models/plaid_account/ca.yml
@@ -0,0 +1,7 @@
+---
+ca:
+ activerecord:
+ errors:
+ models:
+ plaid_account:
+ no_balance: El compte de Plaid ha de tenir un saldo actual o disponible
diff --git a/config/locales/models/provider_warnings/ca.yml b/config/locales/models/provider_warnings/ca.yml
index a78bd889d..d972ab171 100644
--- a/config/locales/models/provider_warnings/ca.yml
+++ b/config/locales/models/provider_warnings/ca.yml
@@ -1,4 +1,7 @@
---
ca:
provider_warnings:
- limited_investment_data: "Les dades d'inversió d'aquest proveïdor són limitades. Les etiquetes d'activitat (Compra, Venda, Dividend) no estan disponibles, cosa que pot afectar la precisió del pressupost. Considereu crear regles per excloure o categoritzar les transaccions d'inversió."
+ limited_investment_data: Les dades d'inversió d'aquest proveïdor són limitades.
+ Les etiquetes d'activitat (Compra, Venda, Dividend) no estan disponibles, cosa
+ que pot afectar la precisió del pressupost. Considera crear regles per excloure
+ o categoritzar les transaccions d'inversió.
diff --git a/config/locales/models/recurring_transaction/ca.yml b/config/locales/models/recurring_transaction/ca.yml
new file mode 100644
index 000000000..6fd1c3ed1
--- /dev/null
+++ b/config/locales/models/recurring_transaction/ca.yml
@@ -0,0 +1,7 @@
+---
+ca:
+ activerecord:
+ errors:
+ models:
+ recurring_transaction:
+ merchant_or_name_required: Cal indicar un comerç o un nom
diff --git a/config/locales/models/rule/ca.yml b/config/locales/models/rule/ca.yml
new file mode 100644
index 000000000..639de6ed1
--- /dev/null
+++ b/config/locales/models/rule/ca.yml
@@ -0,0 +1,9 @@
+---
+ca:
+ activerecord:
+ errors:
+ models:
+ rule:
+ duplicate_actions: La regla no pot tenir accions duplicades %{types}
+ min_actions: ha de tenir com a mínim una acció
+ nested_conditions: Les condicions compostes no es poden imbricar
diff --git a/config/locales/models/rule_import/ca.yml b/config/locales/models/rule_import/ca.yml
new file mode 100644
index 000000000..b0567f267
--- /dev/null
+++ b/config/locales/models/rule_import/ca.yml
@@ -0,0 +1,9 @@
+---
+ca:
+ activerecord:
+ errors:
+ models:
+ rule_import:
+ invalid_json: 'JSON no vàlid a les condicions o accions: %{message}'
+ min_actions: La regla ha de tenir com a mínim una acció
+ unsupported_resource_type: 'Tipus de recurs no compatible: %{resource_type}'
diff --git a/config/locales/models/simplefin_account/ca.yml b/config/locales/models/simplefin_account/ca.yml
new file mode 100644
index 000000000..76763c4c5
--- /dev/null
+++ b/config/locales/models/simplefin_account/ca.yml
@@ -0,0 +1,7 @@
+---
+ca:
+ activerecord:
+ errors:
+ models:
+ simplefin_account:
+ no_balance: El compte de SimpleFIN ha de tenir un saldo actual o disponible
diff --git a/config/locales/models/sophtron_account/ca.yml b/config/locales/models/sophtron_account/ca.yml
new file mode 100644
index 000000000..30ff9f50c
--- /dev/null
+++ b/config/locales/models/sophtron_account/ca.yml
@@ -0,0 +1,7 @@
+---
+ca:
+ activerecord:
+ errors:
+ models:
+ sophtron_account:
+ no_balance: El compte de Sophtron ha de tenir un saldo actual o disponible
diff --git a/config/locales/models/sso_provider/ca.yml b/config/locales/models/sso_provider/ca.yml
new file mode 100644
index 000000000..bed818f12
--- /dev/null
+++ b/config/locales/models/sso_provider/ca.yml
@@ -0,0 +1,14 @@
+---
+ca:
+ activerecord:
+ errors:
+ models:
+ sso_provider:
+ attributes:
+ settings:
+ metadata_url_invalid: L'URL de metadades de l'IdP ha de ser un URL vàlid
+ saml_cert_required: Cal el certificat de l'IdP o l'empremta del certificat
+ quan no s'utilitza l'URL de metadades
+ saml_url_required: Per als proveïdors SAML cal l'URL de metadades de
+ l'IdP o l'URL d'SSO de l'IdP
+ sso_url_invalid: L'URL d'SSO de l'IdP ha de ser un URL vàlid
diff --git a/config/locales/models/time_series/value/ca.yml b/config/locales/models/time_series/value/ca.yml
index 9990ae475..02ccaf3b4 100644
--- a/config/locales/models/time_series/value/ca.yml
+++ b/config/locales/models/time_series/value/ca.yml
@@ -7,4 +7,3 @@ ca:
attributes:
value:
must_be_a_money_or_numeric: ha de ser un Money o un valor numèric
-
diff --git a/config/locales/models/transaction/ca.yml b/config/locales/models/transaction/ca.yml
new file mode 100644
index 000000000..4cb3f500e
--- /dev/null
+++ b/config/locales/models/transaction/ca.yml
@@ -0,0 +1,11 @@
+---
+ca:
+ activerecord:
+ errors:
+ models:
+ transaction:
+ attributes:
+ attachments:
+ invalid_format: el fitxer %{index} té un format no compatible (%{file_format})
+ too_large: el fitxer %{index} és massa gran (màxim %{max_mb}MB)
+ too_many: no es poden superar %{max} fitxers per transacció
diff --git a/config/locales/models/transfer/ca.yml b/config/locales/models/transfer/ca.yml
index 75f00b76c..ca846488a 100644
--- a/config/locales/models/transfer/ca.yml
+++ b/config/locales/models/transfer/ca.yml
@@ -15,9 +15,13 @@ ca:
han d'estar dins d'un marge de 4 dies
must_have_opposite_amounts: Les transaccions de transferència han de
tenir imports oposats
- must_have_single_currency: La transferència ha de tenir una sola moneda
+ must_have_single_currency: La transferència ha de tenir una sola divisa
outflow_cannot_be_in_multiple_transfers: La transacció de sortida no
pot formar part de múltiples transferències
+ different_accounts: Han de ser de comptes diferents
+ opposite_amounts: Han de tenir imports oposats
+ same_family: Han de ser de la mateixa família
+ within_days: Han d'estar dins de %{count} dies
transfer:
name: Transferència a %{to_account}
payment_name: Pagament a %{to_account}
diff --git a/config/locales/models/user/ca.yml b/config/locales/models/user/ca.yml
index 0bcd625f9..33d47cbb9 100644
--- a/config/locales/models/user/ca.yml
+++ b/config/locales/models/user/ca.yml
@@ -4,8 +4,8 @@ ca:
attributes:
user:
email: Correu electrònic
- family: Família
- family_id: Família
+ family: "%{moniker}"
+ family_id: "%{moniker}"
first_name: Nom
last_name: Cognom
password: Contrasenya
@@ -16,7 +16,6 @@ ca:
attributes:
base:
cannot_deactivate_admin_with_other_users: L'administrador no pot eliminar
- el compte mentre hi hagi altres usuaris. Elimina tots els membres
- primer.
+ el compte mentre hi hagi altres usuaris. Elimina primer tots els membres.
profile_image:
invalid_file_size: la mida del fitxer ha de ser inferior a %{max_megabytes}MB
diff --git a/config/locales/views/account_sharings/ca.yml b/config/locales/views/account_sharings/ca.yml
new file mode 100644
index 000000000..2b932320e
--- /dev/null
+++ b/config/locales/views/account_sharings/ca.yml
@@ -0,0 +1,30 @@
+---
+ca:
+ account_sharings:
+ show:
+ exclude_from_finances: Exclou dels meus pressupostos i informes
+ finance_toggle_description: Compta aquest compte al teu patrimoni net, pressupostos
+ i informes
+ include_in_finances: Inclou als meus pressupostos i informes
+ member: Membre
+ no_members: Encara no hi ha altres membres amb qui compartir aquest compte
+ owner_label: 'Propietari: %{name}'
+ permission: Permís
+ permissions:
+ full_control: Control total
+ full_control_description: Pot veure, editar i gestionar transaccions
+ read_only: Només visualització
+ read_only_description: Només pot veure les dades del compte
+ read_write: Pot anotar
+ read_write_description: Pot categoritzar, etiquetar i afegir notes
+ save: Desa la configuració de compartició
+ shared: Compartit
+ shared_with_count:
+ one: Compartit amb 1 membre
+ other: Compartit amb %{count} membres
+ subtitle: Controla qui pot veure i interactuar amb aquest compte
+ title: Compartició de comptes
+ update:
+ finance_toggle_success: Preferència d'inclusió a les finances actualitzada
+ not_owner: Només el propietari del compte pot gestionar la compartició
+ success: Configuració de compartició actualitzada
diff --git a/config/locales/views/account_statements/ca.yml b/config/locales/views/account_statements/ca.yml
new file mode 100644
index 000000000..84f732424
--- /dev/null
+++ b/config/locales/views/account_statements/ca.yml
@@ -0,0 +1,119 @@
+---
+ca:
+ account_statements:
+ account_tab:
+ coverage_description: Mesos històrics coberts amb extractes pujats i comprovacions
+ de saldo.
+ coverage_range: "%{start} - %{end}"
+ coverage_title: Cobertura d'extractes
+ empty: Encara no hi ha extractes enllaçats a aquest compte.
+ open_inbox: Safata d'entrada
+ statements_title: Extractes
+ year_label: Any de cobertura
+ balance:
+ unknown: Desconegut
+ coverage:
+ status:
+ ambiguous: Ambigu
+ covered: Cobert
+ duplicate: Duplicat
+ mismatched: No coincideix
+ missing: Falta
+ not_expected: No previst
+ create:
+ duplicates:
+ one: S'ha omès 1 extracte duplicat.
+ other: S'han omès %{count} extractes duplicats.
+ invalid_file_type: Puja un extracte en PDF, CSV o XLSX dins del límit de mida.
+ no_files: Selecciona com a mínim un fitxer d'extracte.
+ success:
+ one: 1 extracte pujat.
+ other: "%{count} extractes pujats."
+ destroy:
+ failure: No s'ha pogut eliminar l'extracte.
+ success: Extracte eliminat.
+ form:
+ account_upload: Puja l'extracte
+ files_hint: PDF, CSV o XLSX. Màxim %{max_size}MB per fitxer.
+ files_label: Fitxers d'extracte
+ inbox_upload: Puja
+ index:
+ account_label: Compte
+ confidence: Coincidència %{confidence}
+ empty_linked: Encara no hi ha extractes enllaçats.
+ empty_unmatched: La safata sense aparellar està buida.
+ leave_unmatched: Deixa sense aparellar
+ linked_title: Extractes enllaçats
+ no_suggestion: Sense suggeriment
+ storage_used: Emmagatzematge utilitzat
+ title: Arxiu d'extractes
+ unmatched_title: Safata sense aparellar
+ upload_description: Puja extractes a la safata, o tria un compte per enllaçar-los
+ immediatament.
+ upload_title: Puja extractes
+ link:
+ no_account: Tria un compte abans d'enllaçar aquest extracte.
+ success: Extracte enllaçat a %{account}.
+ period:
+ unknown: Període desconegut
+ reconciliation:
+ checks:
+ closing_balance: Saldo final
+ opening_balance: Saldo inicial
+ period_movement: Moviment del període
+ unknown_check: Comprovació desconeguda
+ matched: Coincideix
+ mismatched: No coincideix
+ unavailable: No comprovat
+ reject:
+ success: Coincidència d'extracte rebutjada.
+ show:
+ account_label: Compte
+ account_last4_hint: Últims quatre dígits del compte
+ account_name_hint: Pista del nom del compte
+ closing_balance: Saldo final
+ currency: Divisa
+ delete: Elimina
+ difference: Diferència
+ download: Descarrega
+ institution_name_hint: Pista de la institució
+ ledger_amount: Llibre de Sure
+ link_suggestion: Suggeriment d'enllaç
+ linked_to: Enllaçat a %{account}.
+ linking_title: Enllaç del compte
+ metadata_title: Metadades de l'extracte
+ no_suggestion: Encara no hi ha cap suggeriment de compte.
+ opening_balance: Saldo inicial
+ period_end_on: Final del període
+ period_start_on: Inici del període
+ reconciliation_title: Conciliació
+ reconciliation_unavailable: Afegeix un període d'extracte i un saldo inicial
+ o final, i comprova que Sure tingui historial de saldos per a aquestes dates.
+ reject: Rebutja
+ save: Desa l'extracte
+ statement_amount: Extracte
+ suggested_account: El compte suggerit és %{account} (confiança %{confidence}).
+ title: Extracte
+ unknown_value: Desconegut
+ unlink: Desenllaça
+ unmatched_account: Safata sense aparellar
+ status:
+ linked: Enllaçat
+ rejected: Rebutjat
+ unmatched: Sense aparellar
+ table:
+ account: Compte
+ actions: Accions
+ download: Descarrega
+ file: Fitxer
+ link_suggestion: Suggeriment d'enllaç
+ period: Període
+ reconciliation: Conciliació
+ reject: Rebutja el suggeriment
+ suggestion: Suggeriment
+ unlink: Desenllaça
+ view: Visualitza
+ unlink:
+ success: Extracte mogut de nou a la safata sense aparellar.
+ update:
+ success: Extracte actualitzat.
diff --git a/config/locales/views/accounts/ca.yml b/config/locales/views/accounts/ca.yml
index 47ea78944..ed1919ea0 100644
--- a/config/locales/views/accounts/ca.yml
+++ b/config/locales/views/accounts/ca.yml
@@ -3,31 +3,41 @@ ca:
account:
entries:
destroy:
- success: Èxit
+ success: Entrada eliminada correctament.
accounts:
account:
+ change_simplefin_account: Canvia el compte de SimpleFIN
+ complete_setup: Completa la configuració
+ default_label: Per defecte
+ delete: Elimina el compte
+ disable: Desactiva el compte
+ edit: Edita
+ enable: Activa el compte
link_lunchflow: Enllaça amb Lunch Flow
link_provider: Enllaça amb proveïdor
+ remove_default: Treu com a predeterminat
+ set_default: Estableix com a predeterminat
+ sharing: Compartició
troubleshoot: Resolució de problemes
unlink_provider: Desenllaça del proveïdor
chart:
data_not_available: Dades no disponibles per al període seleccionat
confirm_unlink:
confirm_button: Confirma i desenllaça
- description_html: Estàs a punt de desenllaçar %{account_name} de
- %{provider_name}. Això el convertirà en un compte manual.
+ description_html: Estàs a punt de desenllaçar %{account_name}
+ de %{provider_name}. Això el convertirà en un compte manual.
title: Vols desenllaçar el compte del proveïdor?
- warning_can_delete: Després de desenllaçar-lo, podràs eliminar el compte
- si és necessari
- warning_manual_updates: Hauràs d'afegir transaccions i actualitzar saldos
- manualment
- warning_no_sync: El compte ja no sincronitzarà automàticament amb el teu proveïdor
+ warning_can_delete: Després de desenllaçar-lo, podràs eliminar el compte si
+ és necessari
+ warning_manual_updates: Hauràs d'afegir transaccions i actualitzar saldos manualment
+ warning_no_sync: El compte ja no es sincronitzarà automàticament amb el teu proveïdor
warning_title: Això significa
warning_transactions_kept: Totes les transaccions i saldos existents es conservaran
create:
success: Compte %{type} creat
destroy:
- cannot_delete_linked: No es pot eliminar un compte enllaçat. Si us plau, desenllaça'l primer.
+ cannot_delete_linked: No es pot eliminar un compte enllaçat. Desenllaça'l primer.
+ failed: No s'ha pogut eliminar el recurs. Torna-ho a provar més tard.
success: El compte %{type} s'ha programat per a l'eliminació
empty:
empty_message: Afegeix un compte mitjançant connexió, importació o introducció
@@ -36,16 +46,17 @@ ca:
no_accounts: Encara no hi ha cap compte
form:
additional_details: Detalls addicionals
- balance: Saldo actual
- institution_domain_label: Domini de l'institució
+ balance: 'Saldo a la data:'
+ institution_domain_label: Domini de la institució
institution_domain_placeholder: p. ex., chase.com
- institution_name_label: Nom de l'institució
+ institution_name_label: Nom de la institució
institution_name_placeholder: p. ex., Chase Bank
name_label: Nom del compte
name_placeholder: Exemple de nom de compte
notes_label: Notes
- notes_placeholder: Emmagatzema informació addicional com números de compte, codis de sortida,
- IBAN, números de ruta, etc.
+ notes_placeholder: Emmagatzema informació addicional com números de compte,
+ codis de sortida, IBAN, números de ruta, etc.
+ opening_balance_date_label: Data del saldo inicial
index:
accounts: Comptes
manual_accounts:
@@ -53,6 +64,10 @@ ca:
new_account: Nou compte
sync: Sincronitza-ho tot
new:
+ container:
+ close: Tanca
+ navigate: Navega
+ select: Selecciona
import_accounts: Importa comptes
method_selector:
connected_entry: Enllaça el compte
@@ -62,11 +77,15 @@ ca:
manual_entry: Introdueix el saldo del compte
title: Com vols afegir-lo?
title: Què vols afegir?
+ not_authorized: No tens permís per gestionar aquest compte
select_provider:
already_linked: Aquest compte ja està enllaçat a un proveïdor
description: Tria quin proveïdor vols utilitzar per enllaçar %{account_name}
no_providers: Actualment no hi ha cap proveïdor configurat
title: Selecciona un proveïdor per enllaçar
+ set_default:
+ depository_only: Només els comptes d'efectiu i de targeta de crèdit es poden
+ establir com a predeterminats.
show:
activity:
amount: Import
@@ -77,17 +96,27 @@ ca:
entry: entrada
filter: Filtra
new: Nou
+ new_activity: Nova activitat
new_balance: Nou saldo
+ new_trade: Nova operació
new_transaction: Nova transacció
+ new_transfer: Nova transferència
no_entries: No s'han trobat entrades
pending: Pendent
search:
placeholder: Cerca entrades per nom
+ search_placeholder: Cerca entrades per nom
status: Estat
title: Activitat
chart:
balance: Saldo
owed: Import degut
+ header:
+ complete_setup: Completa la configuració
+ limited_fx_history_warning: L'historial de tipus de canvi només està disponible
+ a partir del %{date}. Les transaccions anteriors a aquesta data utilitzen
+ conversions de divisa aproximades — això pot passar quan el proveïdor de FX
+ només ofereix una finestra històrica limitada.
menu:
confirm_accept: Elimina "%{name}"
confirm_body_html: "
En eliminar aquest compte, s'esborrarà l'historial
@@ -97,9 +126,19 @@ ca:
restaurar la informació del compte perquè hauràs d'afegir-lo com un compte
nou.
"
confirm_title: Vols eliminar el compte?
+ delete_account: Elimina el compte
edit: Edita
import: Importa transaccions
+ import_trades: Importa operacions
+ import_transactions: Importa transaccions
manage: Gestiona els comptes
+ sharing: Compartició
+ statements: Extractes
+ tabs:
+ activity: Activitat
+ holdings: Posicions
+ overview: Resum
+ statements: Extractes
sidebar:
configure_providers: Configura els teus proveïdors aquí.
missing_data: Falten dades històriques
@@ -114,8 +153,26 @@ ca:
all: Tots
assets: Actius
debts: Deutes
+ subtype_regions:
+ au: Austràlia
+ ca: Canadà
+ eu: Europa
+ generic: General
+ in: Índia
+ uk: Regne Unit
+ us: Estats Units
sync_all:
syncing: Sincronitzant comptes...
+ tax_treatment_descriptions:
+ tax_advantaged: Beneficis fiscals especials amb condicions
+ tax_deferred: Aportacions deduïbles, tributació en retirar
+ tax_exempt: Aportacions després d'impostos, guanys no tributats
+ taxable: Guanys tributats en realitzar-se
+ tax_treatments:
+ tax_advantaged: Amb avantatge fiscal
+ tax_deferred: Tributació diferida
+ tax_exempt: Exempt d'impostos
+ taxable: Subjecte a impostos
types:
credit_card: Targeta de crèdit
crypto: Cripto
@@ -123,12 +180,22 @@ ca:
investment: Inversió
loan: Préstec
other_asset: Altre actiu
- other_liability: Altra passiu
+ other_liability: Altre passiu
property: Propietat
vehicle: Vehicle
+ types_plural:
+ credit_card: Targetes de crèdit
+ crypto: Cripto
+ depository: Efectiu
+ investment: Inversions
+ loan: Préstecs
+ other_asset: Altres actius
+ other_liability: Altres passius
+ property: Propietats
+ vehicle: Vehicles
unlink:
- error: "No s'ha pogut desenllaçar el compte: %{error}"
- generic_error: S'ha produït un error inesperat. Si us plau, torna-ho a intentar.
+ error: 'No s''ha pogut desenllaçar el compte: %{error}'
+ generic_error: S'ha produït un error inesperat. Torna-ho a intentar.
not_linked: El compte no està enllaçat a cap proveïdor
success: El compte s'ha desenllaçat correctament. Ara és un compte manual.
update:
diff --git a/config/locales/views/admin/invitations/ca.yml b/config/locales/views/admin/invitations/ca.yml
new file mode 100644
index 000000000..0d12897a7
--- /dev/null
+++ b/config/locales/views/admin/invitations/ca.yml
@@ -0,0 +1,8 @@
+---
+ca:
+ admin:
+ invitations:
+ destroy:
+ success: Invitació eliminada.
+ destroy_all:
+ success: S'han eliminat totes les invitacions d'aquesta família.
diff --git a/config/locales/views/admin/sso_providers/ca.yml b/config/locales/views/admin/sso_providers/ca.yml
index 3906fd918..41ba67d6a 100644
--- a/config/locales/views/admin/sso_providers/ca.yml
+++ b/config/locales/views/admin/sso_providers/ca.yml
@@ -5,8 +5,8 @@ ca:
create:
success: El proveïdor SSO s'ha creat correctament.
destroy:
- confirm: Estàs segur que vols eliminar aquest proveïdor? Aquesta acció no es
- pot desfer.
+ confirm: Segur que vols eliminar aquest proveïdor? Aquesta acció no es pot
+ desfer.
success: El proveïdor SSO s'ha eliminat correctament.
edit:
description: Actualitza la configuració per a %{label}
@@ -18,99 +18,130 @@ ca:
cancel: Cancel·la
client_id_help: ID del client OAuth del teu proveïdor d'identitat
client_id_label: ID del client
- client_id_placeholder: el-teu-id-client
+ client_id_placeholder: el-teu-id-de-client
client_secret_help: Secret del client OAuth (xifrat a la base de dades)
- client_secret_help_existing: " - deixa en blanc per mantenir l'existent"
+ client_secret_help_existing: Deixa-ho en blanc per mantenir el secret existent
client_secret_label: Secret del client
- client_secret_placeholder_existing: "••••••••••••••••"
- client_secret_placeholder_new: el-teu-secret-client
+ client_secret_placeholder_existing: "••••••••"
+ client_secret_placeholder_new: el-teu-secret-de-client
copy_button: Copia
- default_role_help: Rol assignat als usuaris creats mitjançant aprovisionament
+ create_provider: Crea el proveïdor
+ default_role_help: Rol assignat als usuaris creats mitjançant l'aprovisionament
de comptes SSO just-in-time (JIT). Per defecte és Membre.
default_role_label: Rol per defecte per a nous usuaris
- enabled_help: Els usuaris poden iniciar sessió amb aquest proveïdor quan està
- habilitat
- enabled_label: Habilita aquest proveïdor
- errors_title: "%{count} error ha prohibit que aquest proveïdor s' desa:"
- groups_help: Llista separada per comes dels noms de grups del IdP. Usa * per coincidir
- amb tots els grups.
- icon_help: Nom de la icona Lucide (opcional)
- icon_label: Icona
- icon_placeholder: p. ex., key, google, github
- idp_cert_fingerprint: Emprempta del certificat (alternativa)
+ enabled_help: Els usuaris podran iniciar sessió amb aquest proveïdor quan
+ estigui activat
+ enabled_label: Activa aquest proveïdor
+ errors_title:
+ one: "%{count} error ha impedit desar aquest proveïdor:"
+ other: "%{count} errors han impedit desar aquest proveïdor:"
+ groups_help: Llista separada per comes amb els noms dels grups del IdP. Fes
+ servir * per fer coincidir tots els grups.
+ guest_groups: Grups de convidats
+ icon_help: Nom de la icona Lucide per al botó d'inici de sessió
+ icon_label: Icona (opcional)
+ icon_placeholder: p. ex., key, shield
+ idp_cert_fingerprint: Empremta del certificat (alternativa)
idp_certificate: Certificat del IdP
- idp_certificate_help: Certificat X.509 en format PEM. Obligatori si no s'utilitza
- l'URL de metadades.
+ idp_certificate_help: Certificat X.509 en format PEM. Obligatori si no fas
+ servir l'URL de metadades.
idp_metadata_url: URL de metadades del IdP
- idp_metadata_url_help: URL a les metadades SAML del teu IdP. Si es proporciona,
- altres configuracions SAML es configuraran automàticament.
+ idp_metadata_url_help: URL de les metadades SAML del teu IdP. Si la indiques,
+ la resta de paràmetres SAML es configuraran automàticament.
idp_slo_url: URL SLO del IdP (opcional)
idp_sso_url: URL SSO del IdP
- issuer_help: URL emisor OIDC (validarà el punt final .well-known/openid-configuration)
- issuer_label: Emisor
- issuer_placeholder: https://accounts.google.com
+ issuer_help: URL de l'emissor OIDC (valida .well-known/openid-configuration)
+ issuer_label: URL de l'emissor
+ issuer_placeholder: https://el-teu-idp.exemple.com/realms/el-teu-realm
label_help: Text del botó que es mostra als usuaris
- label_label: Etiqueta
+ label_label: Etiqueta del botó
label_placeholder: p. ex., Inicia sessió amb Keycloak
- manual_saml_config: Configuració manual (si no s'utilitza l'URL de metadades)
- manual_saml_help: Només utilitza aquesta configuració si el teu IdP no proporciona
+ manual_saml_config: Configuració manual (si no fas servir URL de metadades)
+ manual_saml_help: Fes servir aquesta configuració només si el teu IdP no proporciona
una URL de metadades.
member_groups: Grups de membres
- name_help: Identificador únic (només minúscules, números, subratllats)
+ name_help: Identificador únic (només minúscules, números i guions baixos)
name_id_email: Adreça de correu electrònic (per defecte)
name_id_format: Format NameID
name_id_persistent: Persistent
name_id_transient: Transient
name_id_unspecified: No especificat
name_label: Nom
- name_placeholder: p. ex., openid_connect, keycloak, authentik
+ name_placeholder: p. ex., keycloak, authentik
oauth_configuration: Configuració OAuth/OIDC
- prompt_consent: Força consentiment (autoritzar de nou)
+ prompt_consent: Força el consentiment (torna a autoritzar)
prompt_default: Per defecte (decideix el IdP)
- prompt_help: Controla com el IdP demana a l'usuari durant l'autenticació.
- prompt_label: Prompt d'autenticació
- prompt_login: Força inici de sessió (torna a autenticar)
- prompt_none: Sense prompt (autenticació silenciosa)
- prompt_select_account: Selecció de compte (triar compte)
- provisioning_title: Proveïment d'usuaris
- redirect_uri_help: URL de callback per configurar al teu proveïdor d'identitat
- redirect_uri_label: URI de redirecció
- redirect_uri_placeholder: https://teudomini.com/auth/openid_connect/callback
+ prompt_help: Controla com el IdP demana l'autenticació a l'usuari.
+ prompt_label: Indicador d'autenticació
+ prompt_login: Força l'inici de sessió (torna a autenticar)
+ prompt_none: Sense indicador (autenticació silenciosa)
+ prompt_select_account: Selecció de compte (tria el compte)
+ provisioning_title: Aprovisionament d'usuaris
+ redirect_uri_help: Configura aquesta URL al teu proveïdor d'identitat
+ redirect_uri_label: URL de retorn
+ redirect_uri_placeholder: https://elteudomini.com/auth/openid_connect/callback
role_admin: Administrador
- role_mapping_help: Mapa els grups/claims del IdP als rols de l'aplicació. Als usuaris
- se'ls assigna el rol més alt que coincideix. Deixa en blanc per utilitzar el rol per defecte
- de dalt.
- role_mapping_title: Mapa de grups a rols (Opcional)
+ role_guest: Convidat
+ role_mapping_help: Mapeja els grups/claims del IdP als rols de l'aplicació.
+ Als usuaris se'ls assigna el rol més alt que coincideixi. Deixa-ho en blanc
+ per utilitzar el rol per defecte de dalt.
+ role_mapping_title: Mapatge de grups a rols (opcional)
role_member: Membre
role_super_admin: Super administrador
saml_configuration: Configuració SAML
- scopes_help: Llista separada per espais d'àmbits OIDC. Deixa en blanc per defecte
- (openid email profile). Afegeix 'groups' per recuperar claims de grup.
+ saml_sp_callback_url_help: Configura aquesta URL com a URL del servei consumidor
+ d'assercions al teu IdP
+ saml_sp_callback_url_label: URL de retorn del SP (URL ACS)
+ scopes_help: Llista separada per espais amb els àmbits OIDC. Deixa-ho en blanc
+ per als valors per defecte (openid email profile). Afegeix 'groups' per
+ recuperar els claims de grup.
scopes_label: Àmbits personalitzats
- strategy_help: L'estratègia d'autenticació a utilitzar
+ strategy_github: GitHub
+ strategy_google_oauth2: Google OAuth2
+ strategy_help: L'estratègia d'autenticació que cal utilitzar
strategy_label: Estratègia
+ strategy_openid_connect: OpenID Connect
+ strategy_saml: SAML 2.0
submit: Desa el proveïdor
super_admin_groups: Grups de super administradors
test_connection: Prova la connexió
+ update_provider: Actualitza el proveïdor
index:
add_provider: Afegeix proveïdor
- description: Gestiona proveïdors d'autenticació d'inici de sessió únic per a la teva instància
+ configuration_mode: Mode de configuració
+ configured_providers: Proveïdors configurats
+ db_backed_providers: Proveïdors basats en base de dades
+ db_backed_providers_description: Carrega els proveïdors des de la base de
+ dades en lloc de la configuració YAML
+ db_backed_providers_help_html: Defineix AUTH_PROVIDERS_SOURCE=db per activar els proveïdors
+ basats en base de dades. Això permet fer canvis sense reiniciar el servidor.
+ delete: Elimina
+ description: Gestiona proveïdors d'autenticació d'inici de sessió únic per
+ a la teva instància.
+ disable: Desactiva
+ disabled: Desactivat
+ edit: Edita
+ enable: Activa
+ enabled: Activat
env_configured: Entorn/YAML
legacy_providers_notice: Aquests proveïdors estan configurats mitjançant variables
- d'entorn o YAML i no es poden gestionar mitjançant aquesta interfície. Per gestionar-los
- aquí, migrant-los a proveïdors basats en base de dades activant AUTH_PROVIDERS_SOURCE=db
- i recreant-los a la interfície d'usuari.
- legacy_providers_title: Proveïdors configurats a l'entorn
- no_providers_message: Comença afegint el teu primer proveïdor SSO.
+ d'entorn o YAML i no es poden gestionar des d'aquesta interfície. Per gestionar-los
+ aquí, migra'ls a proveïdors basats en base de dades activant AUTH_PROVIDERS_SOURCE=db
+ i recreant-los a la interfície.
+ legacy_providers_title: Proveïdors configurats per entorn
+ no_providers_message: Encara no hi ha proveïdors SSO configurats.
no_providers_title: No hi ha proveïdors SSO
- note: Els canvis als proveïdors SSO requereixen un reinici del servidor per fer efecte.
- Alternativament, activa la bandera de característica AUTH_PROVIDERS_SOURCE=db per carregar
- proveïdors de la base de dades de manera dinàmica.
+ note: Els canvis als proveïdors SSO requereixen un reinici del servidor per
+ fer efecte. Alternativament, activa la bandera de característica AUTH_PROVIDERS_SOURCE=db
+ per carregar els proveïdors des de la base de dades de manera dinàmica.
+ page_title: Proveïdors SSO
+ restart_required: Els canvis requereixen un reinici del servidor per fer efecte.
table:
actions: Accions
disabled: Desactivat
- enabled: Actiu
- issuer: Emisor
+ enabled: Activat
+ issuer: Emissor
name: Nom
status: Estat
strategy: Estratègia
@@ -119,8 +150,8 @@ ca:
description: Configura un nou proveïdor d'autenticació d'inici de sessió únic
title: Afegeix proveïdor SSO
toggle:
- confirm_disable: Estàs segur que vols desactivar aquest proveïdor?
- confirm_enable: Estàs segur que vols activar aquest proveïdor?
+ confirm_disable: Segur que vols desactivar aquest proveïdor?
+ confirm_enable: Segur que vols activar aquest proveïdor?
success_disabled: El proveïdor SSO s'ha desactivat correctament.
success_enabled: El proveïdor SSO s'ha activat correctament.
update:
diff --git a/config/locales/views/admin/sso_providers/en.yml b/config/locales/views/admin/sso_providers/en.yml
index f563c38a7..5dd727796 100644
--- a/config/locales/views/admin/sso_providers/en.yml
+++ b/config/locales/views/admin/sso_providers/en.yml
@@ -93,7 +93,9 @@ en:
submit: "Save Provider"
create_provider: "Create Provider"
update_provider: "Update Provider"
- errors_title: "%{count} error prohibited this provider from being saved:"
+ errors_title:
+ one: "%{count} error prohibited this provider from being saved:"
+ other: "%{count} errors prohibited this provider from being saved:"
provisioning_title: "User Provisioning"
default_role_label: "Default Role for New Users"
default_role_help: "Role assigned to users created via just-in-time (JIT) SSO account provisioning. Defaults to Member."
diff --git a/config/locales/views/admin/users/ca.yml b/config/locales/views/admin/users/ca.yml
index e0fa5149a..adb977c85 100644
--- a/config/locales/views/admin/users/ca.yml
+++ b/config/locales/views/admin/users/ca.yml
@@ -3,26 +3,58 @@ ca:
admin:
users:
index:
- description: Gestiona els rols d'usuari per a la teva instància. Els super administradors poden accedir
- a la configuració de proveïdors SSO i la gestió d'usuaris.
+ description: Gestiona els rols d'usuari per a la teva instància. Els super
+ administradors poden accedir a la configuració de proveïdors SSO i a la
+ gestió d'usuaris.
+ family_summary: "%{members} membres · %{accounts} comptes · %{transactions}
+ transaccions"
+ filters:
+ role: Rol
+ role_all: Tots els rols
+ submit: Filtra
+ trial_all: Tots
+ trial_expiring_soon: Caduca en 7 dies
+ trial_status: Estat de la prova
+ trial_trialing: En prova
+ invitations:
+ delete: Elimina
+ delete_all: Elimina-ho tot
+ expires: Caduca %{date}
+ pending_label: Convidat (pendent)
+ no_subscription: Sense subscripció
no_users: No s'han trobat usuaris.
+ not_available: n/d
role_descriptions:
- admin: Administrador familiar. Pot accedir a configuracions avançades com claus API,
- importacions i prompts d'IA.
+ admin: Administrador familiar. Pot accedir a configuracions avançades com
+ claus API, importacions i prompts d'IA.
+ guest: Experiència centrada en l'assistent amb permisos restringits intencionadament
+ per a fluxos d'introducció.
member: Accés bàsic d'usuari. Pot gestionar els seus propis comptes, transaccions
i configuracions.
- super_admin: Administrador d'instància. Pot gestionar proveïdors SSO, rols d'usuari
- i personificar usuaris per suport.
- role_descriptions_title: Descripcions de rols
+ super_admin: Administrador d'instància. Pot gestionar proveïdors SSO, rols
+ d'usuari i personificar usuaris per donar suport.
+ role_descriptions_title: Descripcions dels rols
roles:
admin: Administrador
+ guest: Convidat
member: Membre
super_admin: Super administrador
- section_title: Usuaris
+ section_title: Famílies / Grups
+ summary:
+ trials_expiring_7_days: Proves que caduquen en els pròxims 7 dies
+ table:
+ family_accounts: Comptes familiars
+ family_transactions: Transaccions familiars
+ last_login: Últim inici de sessió
+ never: Mai
+ role: Rol
+ session_count: Nombre de sessions
+ trial_ends_at: Fi de la prova
+ user: Usuari
title: Gestió d'usuaris
+ trial_ends_at: Fi de la prova
+ unnamed_family: Família/grup sense nom
you: "(Tu)"
- trial_ends_at: Fi de prova
- not_available: n/a
update:
failure: No s'ha pogut actualitzar el rol d'usuari.
- success: El rol d'usuari s'ha actualitzat correctament.
+ success: Rol d'usuari actualitzat correctament.
diff --git a/config/locales/views/beta/ca.yml b/config/locales/views/beta/ca.yml
new file mode 100644
index 000000000..9484728c3
--- /dev/null
+++ b/config/locales/views/beta/ca.yml
@@ -0,0 +1,5 @@
+---
+ca:
+ beta:
+ not_enabled: Aquesta funció està en beta. Activa les funcions beta a Configuració
+ → Preferències per provar-la.
diff --git a/config/locales/views/binance_items/ca.yml b/config/locales/views/binance_items/ca.yml
new file mode 100644
index 000000000..c33580047
--- /dev/null
+++ b/config/locales/views/binance_items/ca.yml
@@ -0,0 +1,81 @@
+---
+ca:
+ binance_item:
+ syncer:
+ accounts_need_setup:
+ one: "%{count} compte necessita configuració"
+ other: "%{count} comptes necessiten configuració"
+ calculating_balances: Calculant saldos...
+ checking_configuration: Comprovant la configuració del compte...
+ checking_credentials: Comprovant credencials...
+ credentials_invalid: Credencials de l'API no vàlides. Revisa la teva clau API
+ i el secret.
+ importing_accounts: Important comptes des de Binance...
+ processing_accounts: Processant dades del compte...
+ binance_items:
+ binance_item:
+ delete: Elimina
+ deletion_in_progress: Eliminant...
+ import_accounts_menu: Importa compte
+ no_accounts_message: El teu portafoli de Binance apareixerà aquí després de
+ sincronitzar.
+ no_accounts_title: No s'han trobat comptes
+ provider_name: Binance
+ reconnect: Les credencials necessiten actualització
+ setup_action: Importa compte
+ setup_description: Selecciona quins portafolis de Binance vols seguir.
+ setup_needed: Compte a punt per importar
+ stale_rate_warning: El saldo és aproximat — el tipus de canvi exacte per a %{date}
+ no estava disponible. S'actualitzarà a la propera sincronització.
+ status: Darrera sincronització fa %{timestamp}
+ status_never: Mai sincronitzat
+ status_with_summary: Darrera sincronització fa %{timestamp} - %{summary}
+ sync_status:
+ all_synced:
+ one: "%{count} compte sincronitzat"
+ other: "%{count} comptes sincronitzats"
+ no_accounts: No s'han trobat comptes
+ partial_sync: "%{linked_count} sincronitzats, %{unlinked_count} necessiten
+ configuració"
+ syncing: Sincronitzant...
+ update_credentials: Actualitza les credencials
+ complete_account_setup:
+ no_accounts: No hi ha comptes per importar
+ none_selected: No s'ha seleccionat cap compte
+ success:
+ one: S'ha importat %{count} compte
+ other: S'han importat %{count} comptes
+ create:
+ default_name: Binance
+ success: S'ha connectat correctament a Binance! El teu compte s'està sincronitzant.
+ destroy:
+ success: S'ha programat la connexió Binance per a la seva eliminació.
+ link_existing_account:
+ errors:
+ invalid_binance_account: Compte Binance no vàlid
+ only_manual: Només els comptes manuals es poden enllaçar a Binance
+ success: S'ha enllaçat correctament al compte Binance
+ select_existing_account:
+ cancel: Cancel·la
+ check_provider_health: Comprova que les teves credencials de l'API de Binance
+ siguin vàlides
+ currently_linked_to: 'Actualment enllaçat a: %{account_name}'
+ link: Enllaça
+ no_accounts_found: No s'han trobat comptes Binance.
+ title: Enllaça compte Binance
+ wait_for_sync: Espera que Binance acabi la sincronització
+ setup_accounts:
+ accounts_count:
+ one: "%{count} compte disponible"
+ other: "%{count} comptes disponibles"
+ cancel: Cancel·la
+ creating: Important...
+ import_selected: Importa els seleccionats
+ instructions: Selecciona els portafolis de Binance que vols importar. Només
+ es mostren els portafolis amb saldos.
+ no_accounts: Tots els comptes s'han importat.
+ select_all: Selecciona-ho tot
+ subtitle: Selecciona quins portafolis vols seguir
+ title: Importa compte Binance
+ update:
+ success: La configuració de Binance s'ha actualitzat correctament.
diff --git a/config/locales/views/brex_items/ca.yml b/config/locales/views/brex_items/ca.yml
new file mode 100644
index 000000000..cbe5595c7
--- /dev/null
+++ b/config/locales/views/brex_items/ca.yml
@@ -0,0 +1,308 @@
+---
+ca:
+ brex_items:
+ account_metadata:
+ provider: Brex
+ separator: " • "
+ api_error:
+ common_issues: 'Problemes habituals:'
+ expired_credentials: Genera un nou token API des de Brex.
+ expired_credentials_label: 'Credencials caducades:'
+ heading: No s'ha pogut connectar a Brex
+ invalid_token: Revisa el teu token API a la configuració del proveïdor.
+ invalid_token_label: 'Token API no vàlid:'
+ network: Comprova la teva connexió a internet.
+ network_label: 'Problema de xarxa:'
+ permissions: Assegura't que el teu token té els permisos necessaris només de
+ lectura per a comptes i transaccions.
+ permissions_label: 'Permisos insuficients:'
+ service: L'API de Brex pot estar temporalment no disponible.
+ service_label: 'Servei caigut:'
+ settings_link: Revisa la configuració del proveïdor
+ title: Error de connexió Brex
+ brex_item:
+ accounts_need_setup: Els comptes necessiten configuració
+ delete: Elimina la connexió
+ deletion_in_progress: eliminació en curs...
+ error: Error
+ no_accounts_description: Aquesta connexió encara no té comptes enllaçats.
+ no_accounts_title: No hi ha comptes
+ setup_action: Configura els nous comptes
+ setup_description: "%{linked} de %{total} comptes enllaçats. Tria els tipus
+ de compte per als teus nous comptes Brex importats."
+ setup_needed: Nous comptes a punt per configurar
+ status: Sincronitzat fa %{timestamp}
+ status_never: Mai sincronitzat
+ status_with_summary: Darrera sincronització fa %{timestamp} - %{summary}
+ syncing: Sincronitzant...
+ total: Total
+ unlinked: Sense enllaç
+ complete_account_setup:
+ all_skipped: S'han omès tots els comptes. No s'ha creat cap compte.
+ creation_failed: 'No s''han pogut crear els comptes: %{error}'
+ creation_failed_count: No s'han pogut crear %{count} compte(s).
+ no_accounts: No hi ha comptes per configurar.
+ partial_skipped: S'han creat correctament %{created_count} compte(s); s'han
+ omès %{skipped_count} compte(s).
+ partial_success: S'han creat correctament %{created_count} compte(s), però %{failed_count}
+ compte(s) han fallat.
+ success: S'han creat correctament %{count} compte(s).
+ unexpected_error: S'ha produït un error inesperat.
+ create:
+ success: La connexió Brex s'ha creat correctament
+ default_card_name: Targeta Brex
+ default_cash_name: Brex Cash %{id}
+ default_connection_name: Connexió Brex
+ destroy:
+ success: La connexió Brex s'ha eliminat
+ entries:
+ default_name: Transacció Brex
+ errors:
+ unexpected_error: S'ha produït un error inesperat. Torna-ho a provar més tard.
+ index:
+ title: Connexions Brex
+ institution_summary:
+ count:
+ one: "%{count} entitat"
+ other: "%{count} entitats"
+ none: No hi ha entitats connectades
+ one: "%{name}"
+ kinds:
+ card: Targeta
+ cash: Efectiu
+ link_accounts:
+ all_already_linked:
+ one: El compte seleccionat (%{names}) ja està enllaçat
+ other: 'Tots els %{count} comptes seleccionats ja estan enllaçats: %{names}'
+ api_error: 'Error de l''API: %{message}'
+ invalid_account_names:
+ one: No es pot enllaçar un compte sense nom
+ other: No es poden enllaçar %{count} comptes sense nom
+ invalid_account_type: Tipus de compte Brex no admès
+ link_failed: No s'han pogut enllaçar els comptes
+ no_accounts_selected: Selecciona almenys un compte
+ no_api_token: No s'ha trobat el token API de Brex. Configura'l a la configuració
+ del proveïdor.
+ partial_invalid: S'han enllaçat correctament %{created_count} compte(s), %{already_linked_count}
+ compte(s) ja estaven enllaçats, %{invalid_count} compte(s) tenien noms no
+ vàlids
+ partial_success: 'S''han enllaçat correctament %{created_count} compte(s). %{already_linked_count}
+ compte(s) ja estaven enllaçats: %{already_linked_names}'
+ select_connection: Tria una connexió Brex abans d'enllaçar comptes.
+ success:
+ one: S'ha enllaçat correctament %{count} compte
+ other: S'han enllaçat correctament %{count} comptes
+ link_existing_account:
+ account_already_linked: Aquest compte ja està enllaçat a un proveïdor
+ api_error: 'Error de l''API: %{message}'
+ invalid_account_name: No es pot enllaçar un compte sense nom
+ missing_parameters: Falten paràmetres obligatoris
+ no_account_specified: No s'ha especificat cap compte
+ no_api_token: No s'ha trobat el token API de Brex. Configura'l a la configuració
+ del proveïdor.
+ provider_account_already_linked: Aquest compte Brex ja està enllaçat a un altre
+ compte
+ provider_account_not_found: No s'ha trobat el compte Brex
+ select_connection: Tria una connexió Brex abans d'enllaçar comptes.
+ success: S'ha enllaçat correctament %{account_name} amb Brex
+ loading:
+ loading_message: Carregant comptes Brex...
+ loading_title: Carregant
+ provider_connection:
+ default_description: Connecta't al teu compte Brex
+ default_name: Brex
+ description: Connecta amb %{name}
+ name: Brex - %{name}
+ provider_panel:
+ accounts_link: Comptes
+ add_connection: Afegeix connexió Brex
+ base_url_label: URL base (opcional)
+ base_url_placeholder: https://api.brex.com
+ configured_html: Configurat i a punt per utilitzar. Visita la pestanya %{accounts_link}
+ per gestionar i configurar comptes.
+ connection_name_label: Nom de la connexió
+ connection_name_placeholder: Compte corrent d'empresa
+ default_connection_name: Connexió Brex
+ disconnect_confirm: Vols desconnectar %{name}?
+ disconnect_label: Desconnecta %{name}
+ encryption_warning:
+ message: Configura les claus de xifrat d'Active Record abans d'afegir tokens
+ de Brex en producció. Sense claus de xifrat, Sure emmagatzema les credencials
+ i les instantànies del proveïdor Brex en text pla com altres registres de
+ proveïdors.
+ title: El xifrat de la base de dades no està configurat
+ instructions:
+ copy_token_html: Copia el token i afegeix-lo com a connexió amb nom a continuació.
+ Sure emmagatzema el token només per sincronitzar aquesta família.
+ create_token: 'Crea un token API amb aquests permisos només de lectura: accounts.cash.readonly,
+ accounts.card.readonly, transactions.cash.readonly, transactions.card.readonly'
+ open_tokens: Ves a la configuració de tokens API/desenvolupador de Brex per
+ a l'empresa que vols connectar
+ sign_in_html: Visita %{link} i inicia sessió al compte que vols connectar
+ keep_token_placeholder: Deixa-ho en blanc per mantenir el token actual
+ not_configured: No configurat
+ sandbox_note_html: Utilitza una connexió amb nom separada per a cada empresa/token
+ API de Brex que vulguis sincronitzar. Deixa l'URL base en blanc per a producció.
+ El staging està limitat a les proves aprovades per Brex i no funciona amb tokens
+ de clients.
+ setup_accounts: Configura comptes
+ setup_title: 'Instruccions de configuració:'
+ sync: Sincronitza
+ token_label: Token
+ token_placeholder: Enganxa el token aquí
+ update_connection: Actualitza la connexió
+ select_accounts:
+ accounts_selected: comptes seleccionats
+ api_error: 'Error de l''API: %{message}'
+ cancel: Cancel·la
+ configure_name_in_brex: No es pot importar — configura el nom del compte a Brex
+ description: Selecciona els comptes que vols enllaçar al teu compte de %{product_name}.
+ link_accounts: Enllaça els comptes seleccionats
+ no_accounts_found: No s'han trobat comptes. Comprova la configuració del teu
+ token API.
+ no_api_token: No s'ha trobat el token API de Brex. Configura'l a la configuració
+ del proveïdor.
+ no_credentials_configured: Primer, configura el teu token API de Brex a la configuració
+ del proveïdor.
+ no_name_placeholder: "(Sense nom)"
+ select_connection: Tria una connexió Brex a la configuració del proveïdor.
+ title: Selecciona comptes Brex
+ unexpected_error: S'ha produït un error inesperat. Torna-ho a provar més tard.
+ select_existing_account:
+ account_already_linked: Aquest compte ja està enllaçat a un proveïdor
+ all_accounts_already_linked: Tots els comptes Brex ja estan enllaçats
+ api_error: 'Error de l''API: %{message}'
+ cancel: Cancel·la
+ configure_name_in_brex: No es pot importar — configura el nom del compte a Brex
+ description: Selecciona un compte Brex per enllaçar-lo amb aquest compte. Les
+ transaccions es sincronitzaran i deduplicaran automàticament.
+ link_account: Enllaça compte
+ no_account_specified: No s'ha especificat cap compte
+ no_accounts_found: No s'han trobat comptes Brex. Comprova la configuració del
+ teu token API.
+ no_api_token: No s'ha trobat el token API de Brex. Configura'l a la configuració
+ del proveïdor.
+ no_credentials_configured: Primer, configura el teu token API de Brex a la configuració
+ del proveïdor.
+ no_name_placeholder: "(Sense nom)"
+ select_connection: Tria una connexió Brex a la configuració del proveïdor.
+ title: Enllaça %{account_name} amb Brex
+ unexpected_error: S'ha produït un error inesperat. Torna-ho a provar més tard.
+ setup_accounts:
+ account_type_label: 'Tipus de compte:'
+ account_types:
+ credit_card: Targeta de crèdit
+ depository: Compte corrent o d'estalvis
+ investment: Compte d'inversió
+ loan: Préstec o hipoteca
+ other_asset: Altre actiu
+ skip: Omet aquest compte
+ all_accounts_linked: Tots els teus comptes Brex ja s'han configurat.
+ api_error: 'Error de l''API: %{message}'
+ balance: Saldo
+ cancel: Cancel·la
+ choose_account_type: 'Tria el tipus de compte correcte per a cada compte Brex:'
+ create_accounts: Crea comptes
+ creating_accounts: Creant comptes...
+ fetch_failed: No s'han pogut obtenir els comptes
+ historical_data_range: 'Rang de dades històriques:'
+ no_accounts_to_setup: No hi ha comptes per configurar
+ no_api_token: No s'ha trobat el token API de Brex. Configura'l a la configuració
+ del proveïdor.
+ subtitle: Tria els tipus de compte correctes per als teus comptes importats
+ subtype_labels:
+ credit_card: ''
+ depository: 'Subtipus de compte:'
+ investment: 'Tipus d''inversió:'
+ loan: 'Tipus de préstec:'
+ other_asset: ''
+ subtype_messages:
+ credit_card: Les targetes de crèdit es configuraran automàticament com a comptes
+ de targeta de crèdit.
+ other_asset: No calen opcions addicionals per a altres actius.
+ subtypes:
+ depository:
+ cd: Certificat de dipòsit
+ checking: Compte corrent
+ hsa: Compte d'estalvi per a salut
+ money_market: Mercat monetari
+ savings: Estalvis
+ investment:
+ 401k: 401(k)
+ 403b: 403(b)
+ 529_plan: Pla 529
+ angel: Inversió àngel
+ brokerage: Corredoria
+ hsa: Compte d'estalvi per a salut
+ ira: IRA tradicional
+ mutual_fund: Fons d'inversió
+ pension: Pensió
+ retirement: Jubilació
+ roth_401k: Roth 401(k)
+ roth_ira: IRA Roth
+ tsp: Pla d'estalvis de jubilació (TSP)
+ loan:
+ auto: Préstec d'automòbil
+ mortgage: Hipoteca
+ other: Altre préstec
+ student: Préstec d'estudis
+ sync_start_date_help: Selecciona fins on vols sincronitzar l'historial de transaccions.
+ Hi ha un màxim de 3 anys d'historial disponible.
+ sync_start_date_label: 'Comença a sincronitzar transaccions des de:'
+ title: Configura els teus comptes Brex
+ setup_required:
+ description: Abans d'enllaçar comptes Brex, has de configurar el teu token API
+ de Brex.
+ heading: Token API no configurat
+ settings_link: Ves a la configuració del proveïdor
+ setup_steps: 'Passos de configuració:'
+ steps:
+ enter_token: Introdueix el teu token API de Brex
+ find_section_html: Localitza la secció Brex
+ open_settings_html: Ves a Configuració > Proveïdors
+ return_to_link: Torna aquí per enllaçar els teus comptes
+ title: Cal configurar Brex
+ statuses:
+ ACTIVE: Actiu
+ CLOSED: Tancat
+ FROZEN: Congelat
+ active: Actiu
+ closed: Tancat
+ frozen: Congelat
+ subtype_select:
+ placeholder:
+ subtype: Selecciona el subtipus
+ type: Selecciona el tipus
+ sync:
+ success: Sincronització iniciada
+ sync_status:
+ all_synced:
+ one: "%{count} compte sincronitzat"
+ other: "%{count} comptes sincronitzats"
+ no_accounts: No s'han trobat comptes
+ partial_setup: "%{synced} sincronitzats, %{pending} necessiten configuració"
+ syncer:
+ account_processing_failed:
+ one: "%{count} compte Brex ha fallat durant el processament."
+ other: "%{count} comptes Brex han fallat durant el processament."
+ account_sync_failed:
+ one: "%{count} sincronització de compte Brex no s'ha pogut programar."
+ other: "%{count} sincronitzacions de compte Brex no s'han pogut programar."
+ accounts_failed:
+ one: "%{count} compte Brex no s'ha pogut importar."
+ other: "%{count} comptes Brex no s'han pogut importar."
+ accounts_need_setup:
+ one: "%{count} compte necessita configuració..."
+ other: "%{count} comptes necessiten configuració..."
+ calculating_balances: Calculant saldos...
+ checking_account_configuration: Comprovant la configuració dels comptes...
+ credentials_invalid: Token API de Brex no vàlid o permisos del compte incorrectes
+ failed: La sincronització ha fallat. Torna-ho a provar o contacta amb el suport.
+ import_failed: La importació de Brex ha fallat.
+ importing_accounts: Important comptes des de Brex...
+ processing_transactions: Processant transaccions...
+ transactions_failed:
+ one: "%{count} compte Brex ha tingut errors d'importació de transaccions."
+ other: "%{count} comptes Brex han tingut errors d'importació de transaccions."
+ update:
+ success: La connexió Brex s'ha actualitzat
diff --git a/config/locales/views/budgets/ca.yml b/config/locales/views/budgets/ca.yml
index 6f3d53e3d..c1131fece 100644
--- a/config/locales/views/budgets/ca.yml
+++ b/config/locales/views/budgets/ca.yml
@@ -1,21 +1,102 @@
---
ca:
+ budget_categories:
+ allocation_progress:
+ budget_exceeded_html: 'Pressupost superat en %{amount}'
+ left_to_allocate: per assignar
+ over_set: "> 100 % assignat"
+ percent_set: "%{percent} assignat"
+ budget_category_form:
+ monthly_average: "%{amount}/mes (mitjana)"
+ shared_placeholder: Compartit
+ shared_title: Deixa-ho buit per compartir el pressupost de la categoria pare
+ confirm_button:
+ confirm: Confirma
+ index:
+ description: Ajusta els pressupostos per categoria per establir límits de despesa.
+ Els fons no assignats es marcaran automàticament com a sense categoritzar.
+ title: Edita els pressupostos per categoria
+ no_categories:
+ new_category: Nova categoria
+ no_categories_message: Encara no has creat ni assignat cap categoria de despesa
+ a les teves transaccions.
+ oops: Vaja!
+ use_defaults: Usa els valors per defecte (recomanat)
+ show:
+ budgeted: Pressupostat
+ category: Categoria
+ left: restant
+ monthly_average_spending: Despesa mensual mitjana
+ monthly_median_spending: Despesa mensual mediana
+ no_transactions: No s'han trobat transaccions per a aquest període pressupostari.
+ overspent: per sobre
+ overview: Resum
+ recent_transactions: Transaccions recents
+ spending: Despesa de %{date}
+ status: Estat
+ view_all_transactions: Veure totes les transaccions de la categoria
budgets:
+ actuals_summary:
+ expenses: Despeses
+ income: Ingressos
+ budget_donut:
+ new_budget: Nou pressupost
+ of_budget: de %{amount}
+ spent: Gastat
+ unused: Sense utilitzar
+ budget_header:
+ today: Avui
+ budget_nav:
+ categories: Categories
+ setup: Configuració
+ budgeted_summary:
+ budgeted: Pressupostat
+ earned: "%{amount} guanyats"
+ expected_income: Ingressos esperats
+ left: "%{amount} restants"
+ over: "%{amount} per sobre"
+ spent: "%{amount} gastats"
+ copy_previous:
+ already_initialized: Aquest pressupost ja s'ha configurat
+ no_source: No s'ha trobat cap pressupost anterior per copiar
+ success: Pressupost copiat de %{source_name}
+ copy_previous_prompt:
+ copy_button: Copia de %{source_name}
+ description: Pots copiar el teu pressupost de %{source_name} o començar de zero.
+ fresh_button: Comença de zero
+ title: Configura el teu pressupost
+ edit:
+ autosuggest_description: Es basarà en l'historial de transaccions. La IA pot
+ equivocar-se, verifica-ho abans de continuar.
+ autosuggest_title: Suggereix automàticament el pressupost d'ingressos i despeses
+ budgeted_spending: Despesa pressupostada
+ continue: Continua
+ expected_income: Ingressos esperats
+ setup_description: Introdueix els teus ingressos mensuals i la despesa planificada
+ a sota per configurar el teu pressupost.
+ setup_title: Configura el teu pressupost
+ name:
+ custom_range: "%{start} - %{end_date}"
+ month_year: "%{month}"
+ over_allocation_warning:
+ fix_allocations: Corregeix les assignacions
+ over_allocated_message: Has assignat per sobre del teu pressupost. Corregeix
+ les assignacions.
show:
categories:
- amount: Quantitat
+ amount: Import
edit: Edita
title: Categories
- on_track_categories:
- short_title: En bon cami
- title: En bon cami
- over_budget_categories:
- short_title: Sobre pressupost
- title: Sobre pressupost
filter:
all: Totes
- on_track: En bon cami
- over_budget: Sobre pressupost
+ on_track: Sota control
+ over_budget: Pressupost superat
+ on_track_categories:
+ short_title: Sota control
+ title: Sota control
+ over_budget_categories:
+ short_title: Pressupost superat
+ title: Pressupost superat
tabs:
actual: Real
budgeted: Pressupostat
diff --git a/config/locales/views/budgets/en.yml b/config/locales/views/budgets/en.yml
index af53f4f2f..04f745c61 100644
--- a/config/locales/views/budgets/en.yml
+++ b/config/locales/views/budgets/en.yml
@@ -8,6 +8,9 @@ en:
unused: "Unused"
budget_header:
today: "Today"
+ budget_nav:
+ categories: Categories
+ setup: Setup
over_allocation_warning:
over_allocated_message: "You have over-allocated your budget. Please fix your allocations."
fix_allocations: "Fix allocations"
@@ -60,6 +63,15 @@ en:
no_source: "No previous budget found to copy from"
already_initialized: "This budget has already been set up"
budget_categories:
+ allocation_progress:
+ budget_exceeded_html: 'Budget exceeded by %{amount}'
+ left_to_allocate: left to allocate
+ over_set: "> 100% set"
+ percent_set: "%{percent} set"
+ budget_category_form:
+ monthly_average: "%{amount}/m avg"
+ shared_placeholder: Shared
+ shared_title: Leave empty to share parent's budget
confirm_button:
confirm: "Confirm"
no_categories:
diff --git a/config/locales/views/categories/ca.yml b/config/locales/views/categories/ca.yml
index 877e1c665..f57ac01e7 100644
--- a/config/locales/views/categories/ca.yml
+++ b/config/locales/views/categories/ca.yml
@@ -4,21 +4,31 @@ ca:
bootstrap:
success: Categories per defecte creades correctament
category:
- delete: Elimina categoria
- edit: Edita categoria
+ delete: Elimina la categoria
+ edit: Edita la categoria
create:
success: Categoria creada correctament
destroy:
success: Categoria eliminada correctament
+ destroy_all:
+ success: Totes les categories eliminades
edit:
- edit: Edita categoria
+ edit: Edita la categoria
form:
+ color: Color
+ icon: Icona
+ name_label: Nom
+ parent_category_label: Categoria pare (opcional)
placeholder: Nom de la categoria
+ auto_adjust: ajusta'l automàticament.
+ poor_contrast: Contrast insuficient; tria un color més fosc o
+ unassigned: "(sense assignar)"
index:
bootstrap: Utilitza les predeterminades (recomanat)
categories: Categories
categories_expenses: Categories de despesa
categories_incomes: Categories d'ingressos
+ delete_all: Elimina-les totes
empty: No s'han trobat categories
new: Nova categoria
menu:
@@ -27,8 +37,16 @@ ca:
new_category: Nova categoria
update:
success: Categoria actualitzada correctament
+ virtual:
+ payment: Pagament
+ trade: Operació
+ transfer: Transferència
category:
dropdowns:
show:
bootstrap: Genera categories per defecte
empty: No s'han trobat categories
+ expense: despesa
+ income: ingrés
+ match_transfer: Fes coincidir amb transferència/pagament
+ one_time: "%{type} puntual"
diff --git a/config/locales/views/categories/en.yml b/config/locales/views/categories/en.yml
index 37c8c2568..0422c07cf 100644
--- a/config/locales/views/categories/en.yml
+++ b/config/locales/views/categories/en.yml
@@ -19,7 +19,8 @@ en:
parent_category_label: "Parent category (optional)"
color: Color
icon: Icon
- poor_contrast: "Poor contrast, choose darker color or"
+ auto_adjust: auto-adjust.
+ poor_contrast: "Poor contrast, choose a darker color or"
destroy_all:
success: All categories deleted
index:
diff --git a/config/locales/views/category/dropdowns/ca.yml b/config/locales/views/category/dropdowns/ca.yml
index c77fc6255..6cfdb1b6c 100644
--- a/config/locales/views/category/dropdowns/ca.yml
+++ b/config/locales/views/category/dropdowns/ca.yml
@@ -3,9 +3,9 @@ ca:
category:
dropdowns:
row:
- delete: Elimina categoria
- edit: Edita categoria
+ delete: Elimina la categoria
+ edit: Edita la categoria
show:
- clear: Neteja categoria
+ clear: Esborra la categoria
no_categories: No s'han trobat categories
search_placeholder: Cerca
diff --git a/config/locales/views/chats/ca.yml b/config/locales/views/chats/ca.yml
index 1e6971c16..e3d25e036 100644
--- a/config/locales/views/chats/ca.yml
+++ b/config/locales/views/chats/ca.yml
@@ -1,8 +1,54 @@
---
ca:
+ assistant_messages:
+ assistant_message:
+ assistant_reasoning: Raonament de l'assistent
+ tool_calls:
+ arguments: 'Arguments:'
+ function: 'Funció:'
+ tool_calls: Crides a eines
chats:
- demo_banner_message: "Estàs utilitzant un LLM Qwen3 de pesos oberts amb crèdits proporcionats
- per Cloudflare Workers AI. Els resultats poden variar ja que el codi es va provar
- principalment amb `gpt-4.1` però els teus tokens no van a cap altre lloc per ser entrenats! 🤖"
- demo_banner_title: Mode de demostració
- thinking: "Treballant ..."
+ ai_consent:
+ available_description: El xat amb IA pot respondre preguntes financeres i oferir-te
+ anàlisis basades en les teves dades. Per utilitzar aquesta funcionalitat l'has
+ d'activar explícitament.
+ disable_note: Desactiva-ho en qualsevol moment. Totes les dades enviades als
+ nostres proveïdors de LLM són anonimitzades.
+ enable_button: Activa els xats d'IA
+ title: Activa els xats d'IA
+ unavailable_description_html: Per utilitzar l'assistent d'IA, has d'establir
+ la variable d'entorn OPENAI_ACCESS_TOKEN o configurar-la a la configuració de self hosting
+ de la teva instància.
+ ai_greeting:
+ commands_hint_html: Pots utilitzar / per accedir a les ordres
+ evaluate_portfolio: Avalua la cartera d'inversió
+ greeting: Hola %{name}! Sóc una IA / model de llenguatge gran que et pot ajudar
+ amb les teves finances. Tinc accés al web i a les dades del teu compte.
+ questions_intro: 'Aquí tens algunes preguntes que pots fer:'
+ spending_insights: Mostra anàlisi de la despesa
+ there: ''
+ unusual_patterns: Troba patrons inusuals
+ chat:
+ delete_chat: Elimina el xat
+ edit_chat_title: Edita el títol del xat
+ chat_nav:
+ all_chats: Tots els xats
+ delete_chat: Elimina el xat
+ edit_chat_title: Edita el títol del xat
+ start_new_chat: Inicia un xat nou
+ demo_banner_message: "Estàs utilitzant LLM amb crèdits proporcionats per Cloudflare
+ Workers AI. Els resultats poden variar, ja que el codi s'ha provat amb `gpt-4.1`,
+ però els teus tokens no s'envien enlloc més per entrenar-los! 🤖"
+ demo_banner_title: Mode demostració actiu
+ destroy:
+ notice: Xat eliminat correctament
+ error:
+ retry: Torna-ho a provar
+ index:
+ chats: Xats
+ new_chat: Nou xat
+ thinking: Pensant...
+ update:
+ success: Xat actualitzat
diff --git a/config/locales/views/coinbase_items/ca.yml b/config/locales/views/coinbase_items/ca.yml
new file mode 100644
index 000000000..2cdb8cf9d
--- /dev/null
+++ b/config/locales/views/coinbase_items/ca.yml
@@ -0,0 +1,83 @@
+---
+ca:
+ coinbase_item:
+ syncer:
+ accounts_need_setup:
+ one: "%{count} compte necessita configuració"
+ other: "%{count} comptes necessiten configuració"
+ calculating_balances: Calculant saldos...
+ checking_configuration: Comprovant la configuració del compte...
+ checking_credentials: Comprovant credencials...
+ credentials_invalid: Credencials de l'API no vàlides. Revisa la teva clau API
+ i el secret.
+ importing_accounts: Important comptes des de Coinbase...
+ processing_accounts: Processant dades del compte...
+ coinbase_items:
+ coinbase_item:
+ delete: Elimina
+ deletion_in_progress: Eliminant...
+ import_wallets_menu: Importa carteres
+ more_wallets_available:
+ one: "%{count} cartera més disponible per importar"
+ other: "%{count} carteres més disponibles per importar"
+ no_accounts_message: Les teves carteres de Coinbase apareixeran aquí després
+ de sincronitzar.
+ no_accounts_title: No s'han trobat comptes
+ provider_name: Coinbase
+ reconnect: Les credencials necessiten actualització
+ setup_action: Importa carteres
+ setup_description: Selecciona quines carteres de Coinbase vols seguir.
+ setup_needed: Carteres a punt per importar
+ status: Darrera sincronització fa %{timestamp}
+ status_never: Mai sincronitzat
+ status_with_summary: Darrera sincronització fa %{timestamp} - %{summary}
+ sync_status:
+ all_synced:
+ one: "%{count} compte sincronitzat"
+ other: "%{count} comptes sincronitzats"
+ no_accounts: No s'han trobat comptes
+ partial_sync: "%{linked_count} sincronitzats, %{unlinked_count} necessiten
+ configuració"
+ syncing: Sincronitzant...
+ update_credentials: Actualitza les credencials
+ complete_account_setup:
+ no_accounts: No hi ha carteres per importar
+ none_selected: No s'ha seleccionat cap cartera
+ success:
+ one: S'ha importat %{count} cartera
+ other: S'han importat %{count} carteres
+ create:
+ default_name: Coinbase
+ success: S'ha connectat correctament a Coinbase! Els teus comptes s'estan sincronitzant.
+ destroy:
+ success: S'ha programat la connexió Coinbase per a la seva eliminació.
+ link_existing_account:
+ errors:
+ invalid_coinbase_account: Compte Coinbase no vàlid
+ only_manual: Només els comptes manuals es poden enllaçar a Coinbase
+ success: S'ha enllaçat correctament al compte Coinbase
+ select_existing_account:
+ balance: Saldo
+ cancel: Cancel·la
+ check_provider_health: Comprova que les teves credencials de l'API de Coinbase
+ siguin vàlides
+ currently_linked_to: 'Actualment enllaçat a: %{account_name}'
+ link: Enllaça
+ no_accounts_found: No s'han trobat comptes Coinbase.
+ title: Enllaça compte Coinbase
+ wait_for_sync: Espera que Coinbase acabi la sincronització
+ setup_accounts:
+ accounts_count:
+ one: "%{count} cartera disponible"
+ other: "%{count} carteres disponibles"
+ cancel: Cancel·la
+ creating: Important...
+ import_selected: Importa les seleccionades
+ instructions: Selecciona les carteres que vols importar. Les carteres no seleccionades
+ quedaran disponibles si les vols afegir més tard.
+ no_accounts: Totes les carteres s'han importat.
+ select_all: Selecciona-ho tot
+ subtitle: Selecciona quines carteres vols seguir
+ title: Importa carteres Coinbase
+ update:
+ success: La configuració de Coinbase s'ha actualitzat correctament.
diff --git a/config/locales/views/coinstats_items/ca.yml b/config/locales/views/coinstats_items/ca.yml
index 66140452a..9694cfc41 100644
--- a/config/locales/views/coinstats_items/ca.yml
+++ b/config/locales/views/coinstats_items/ca.yml
@@ -3,59 +3,86 @@ ca:
coinstats_items:
coinstats_item:
delete: Elimina
- deletion_in_progress: S'estan esborrant les dades de la cartera de criptomonedes...
- no_wallets_message: Actualment no hi ha carteres de criptomonedes connectades a CoinStats.
- no_wallets_title: No hi ha carteres de criptomonedes connectades
+ deletion_in_progress: S'estan eliminant les dades de la cartera de cripto...
+ no_wallets_message: Actualment no hi ha carteres de cripto connectades a CoinStats.
+ no_wallets_title: No hi ha carteres de cripto connectades
provider_name: CoinStats
- reconnect: Torna a connectar
- status: Sincronitzat per última vegada %{timestamp} fa
+ reconnect: Reconnecta
+ status: Darrera sincronització fa %{timestamp}
status_never: Mai sincronitzat
- status_with_summary: Sincronitzat per última vegada %{timestamp} fa • %{summary}
+ status_with_summary: Darrera sincronització fa %{timestamp} • %{summary}
sync_status:
all_synced:
- one: "%{count} cartera de criptomonedes sincronitzada"
- other: "%{count} carteres de criptomonedes sincronitzades"
- no_accounts: No s'han trobat carteres de criptomonedes
- partial_sync: "%{linked_count} carteres de criptomonedes sincronitzades, %{unlinked_count} necessiten configuració"
+ one: "%{count} cartera de cripto sincronitzada"
+ other: "%{count} carteres de cripto sincronitzades"
+ no_accounts: No s'han trobat carteres de cripto
+ partial_sync: "%{linked_count} carteres de cripto sincronitzades, %{unlinked_count}
+ necessiten configuració"
syncing: Sincronitzant...
- update_api_key: Actualitzar clau API
+ update_api_key: Actualitza la clau API
create:
default_name: Connexió CoinStats
errors:
- validation_failed: "La validació ha fallat: %{message}."
+ validation_failed: 'La validació ha fallat: %{message}.'
success: La connexió amb el proveïdor CoinStats s'ha configurat correctament.
destroy:
- success: La connexió amb el proveïdor CoinStats està programada per a la seva eliminació.
+ success: La connexió amb el proveïdor CoinStats està programada per a la seva
+ eliminació.
+ link_exchange:
+ error: 'No s''ha pogut enllaçar l''exchange: %{message}.'
+ failed: No s'ha pogut enllaçar l'exchange.
+ invalid_exchange: L'exchange seleccionat ja no està admès.
+ missing_params: Cal l'exchange i les credencials.
+ success: S'ha enllaçat l'exchange %{name}.
link_wallet:
- error: "L'enllaç de la cartera de criptomonedes ha fallat: %{message}."
+ error: 'L''enllaç de la cartera de criptomonedes ha fallat: %{message}.'
failed: L'enllaç de la cartera de criptomonedes ha fallat.
- missing_params: "Falten els paràmetres requerits: adreça i blockchain."
+ missing_params: 'Falten els paràmetres requerits: adreça i blockchain.'
success: "%{count} cartera(s) de criptomonedes enllaçades correctament."
new:
address_label: Adreça
- address_placeholder: Requerit
+ address_placeholder: Obligatori
api_key_label: Clau API
- api_key_placeholder: Requerit
- blockchain_fetch_error: No s'han pogut carregar els Blockchains. Torna a intentar-ho més tard.
+ api_key_placeholder: Obligatori
+ blockchain_fetch_error: No s'han pogut carregar les blockchains. Torna-ho a
+ provar més tard.
blockchain_label: Blockchain
- blockchain_placeholder: Requerit
- blockchain_select_blank: Selecciona un Blockchain
+ blockchain_placeholder: Obligatori
+ blockchain_select_blank: Selecciona una blockchain
configure: Configura
default_name: Connexió CoinStats
- go_to_settings: Anar a la configuració del proveïdor
- link: Enllaça una cartera de criptomonedes
- not_configured_message: Per enllaçar una cartera de criptomonedes, primer has de configurar la connexió amb el proveïdor CoinStats.
+ exchange_label: Exchange
+ exchange_select_blank: Selecciona un exchange
+ go_to_settings: Ves a la configuració del proveïdor
+ link_exchange_description: Utilitza una clau API d'exchange només de lectura
+ perquè CoinStats pugui sincronitzar saldos i transaccions de Bitvavo, Binance
+ i altres exchanges admesos.
+ link_exchange_note: Si el teu exchange requereix activació de la clau API o
+ confirmació per correu, completa aquest pas abans d'enllaçar-lo aquí.
+ link_exchange_submit: Enllaça l'exchange
+ link_exchange_title: Enllaça l'API de l'exchange
+ link_wallet_description: Fes el seguiment d'una cartera autocustodiada o d'una
+ sola adreça on-chain a través de CoinStats.
+ link_wallet_submit: Enllaça la cartera de cripto
+ link_wallet_title: Enllaça l'adreça de la cartera
+ not_configured_message: Per enllaçar una cartera de cripto o un exchange, primer
+ has de configurar la connexió amb el proveïdor CoinStats.
not_configured_step1_html: Ves a Configuració → Proveïdors
not_configured_step2_html: Localitza el proveïdor CoinStats
- not_configured_step3_html: Segueix les instruccions de configuració proporcionades per completar la configuració del proveïdor
+ not_configured_step3_html: Segueix les instruccions de configuració
+ proporcionades per completar la configuració del proveïdor
not_configured_title: La connexió amb el proveïdor CoinStats no està configurada
- setup_instructions: "Instruccions de configuració:"
- step1_html: Ves al Panell de l'API Pública de CoinStats per obtenir una clau API.
+ setup_instructions: 'Instruccions de configuració:'
+ step1_html: Visita el panell de l'API pública de CoinStats
+ per obtenir una clau API.
step2: Introdueix la teva clau API a continuació i fes clic a Configura.
- step3_html: Després d'una connexió reeixida, ves a la pestanya Comptes per configurar les carteres de criptomonedes.
- title: Enllaça una cartera de criptomonedes amb CoinStats
- update_configuration: Torna a configurar
+ step3_html: Després d'una connexió correcta, ves a la pestanya Comptes per configurar els teus comptes
+ de cripto.
+ title: Enllaça cripto amb CoinStats
+ update_configuration: Reconfigura
update:
errors:
- validation_failed: "La validació ha fallat: %{message}."
- success: La connexió amb el proveïdor CoinStats s'ha actualitzat correctament.
\ No newline at end of file
+ validation_failed: 'La validació ha fallat: %{message}.'
+ success: La connexió amb el proveïdor CoinStats s'ha actualitzat correctament.
diff --git a/config/locales/views/components/ca.yml b/config/locales/views/components/ca.yml
index c5dcbeb11..41dfa8c3d 100644
--- a/config/locales/views/components/ca.yml
+++ b/config/locales/views/components/ca.yml
@@ -1,5 +1,98 @@
---
ca:
+ UI:
+ account:
+ activity_date:
+ balance_tooltip: Saldo al final del dia, després de totes les transaccions
+ i ajustos
+ no_balance_data: No hi ha dades de saldo per a aquesta data
+ activity_feed:
+ toggle_selection_checkboxes: Commuta la selecció
+ balance_reconciliation:
+ labels:
+ adjustments: Ajustos
+ buys: Compres
+ change_in_brokerage_cash: Variació de l'efectiu del broker
+ change_in_holdings_market: Variació de les posicions (preu de mercat)
+ change_in_holdings_trades: Variació de les posicions (compres/vendes)
+ charges: Càrrecs
+ end_balance: Saldo final
+ end_principal: Capital final
+ end_value: Valor final
+ final_balance: Saldo final del dia
+ final_principal: Capital final del dia
+ final_value: Valor final del dia
+ market_changes: Variacions de mercat
+ net_cash_flow: Flux net d'efectiu
+ net_principal_change: Variació neta del capital
+ net_value_change: Variació neta del valor
+ payments: Pagaments
+ sells: Vendes
+ start_balance: Saldo inicial
+ start_principal: Capital inicial
+ start_value: Valor inicial
+ tooltips:
+ adjustments: Conciliacions manuals o altres ajustos
+ adjustments_asset: Ajustos de valor manuals o taxacions
+ buys: Compres de cripto durant el dia
+ change_in_brokerage_cash: Variació neta de l'efectiu per dipòsits, retirades
+ i operacions
+ change_in_holdings_market: Variació del valor de les posicions per moviments
+ del preu de mercat
+ change_in_holdings_trades: Impacte sobre les posicions per compres i vendes
+ de valors
+ charges: Nous càrrecs realitzats durant el dia
+ end_balance: Saldo calculat després de totes les transaccions
+ end_balance_investment: Saldo calculat després de tota l'activitat
+ end_principal: Capital calculat després de totes les transaccions
+ end_value: Valor calculat després de tots els canvis
+ final_balance: Saldo final del compte del dia
+ final_balance_credit: Saldo deutor final del dia
+ final_balance_crypto: Valor final de les posicions cripto del dia
+ final_balance_investment: Valor final de la cartera del dia
+ final_principal: Capital final del préstec del dia
+ final_value: Valor final de l'actiu del dia
+ market_changes: Variacions de valor pels moviments del preu de mercat
+ net_cash_flow: Variació neta del saldo per totes les transaccions del dia
+ net_principal_change: Pagaments de capital i nous préstecs durant el dia
+ net_value_change: Totes les variacions de valor incloent millores i depreciació
+ payments: Pagaments fets a la targeta durant el dia
+ sells: Vendes de cripto durant el dia
+ start_balance: Saldo del compte a l'inici del dia
+ start_balance_credit: Saldo deutor a l'inici del dia
+ start_balance_crypto: Valor de les posicions cripto a l'inici del dia
+ start_balance_investment: Valor total de la cartera a l'inici del dia
+ start_principal: Saldo del capital a l'inici del dia
+ start_value: Valor de l'actiu a l'inici del dia
+ chart:
+ no_data_available: No hi ha dades disponibles
+ title:
+ balance: Saldo
+ cash_value: Valor de l'efectiu
+ debt_balance: Saldo del deute
+ estimated_property_value: Valor estimat de l'immoble
+ estimated_vehicle_value: Valor estimat del vehicle
+ holdings_value: Valor de les posicions
+ remaining_principal_balance: Capital pendent
+ total_account_value: Valor total del compte
+ views:
+ cash: Efectiu
+ holdings: Posicions
+ total_value: Valor total
+ vs_available_history: vs. historial disponible
+ ds:
+ alert:
+ variants:
+ destructive: Error
+ error: Error
+ info: Informació
+ success: Èxit
+ warning: Avís
+ dialog:
+ close: Tanca
+ pill:
+ aria_label: "%{label}"
+ default_label: Beta
provider_sync_summary:
accounts:
institutions: 'Institucions: %{count}'
@@ -20,8 +113,8 @@ ca:
rate_limited: Sota límit de %{time_ago}
recently: recentment
stale_pending:
- one: "%{count} transacció pendent obsoleta (exclòs dels pressupostos)"
- other: "%{count} transaccions pendents obsoletes (exclòs dels pressupostos)"
+ one: "%{count} transacció pendent obsoleta (exclosa dels pressupostos)"
+ other: "%{count} transaccions pendents obsoletes (excloses dels pressupostos)"
stale_pending_count:
one: "%{count} transacció"
other: "%{count} transaccions"
@@ -34,6 +127,7 @@ ca:
title: Estat
view_data_quality: Veure detalls de qualitat de dades
view_duplicate_suggestions: Veure duplicades suggerides
+ view_error_details: Veure detalls de l'error
view_reconciled: Veure transaccions conciliades
view_stale_pending: Veure comptes afectats
view_stale_unmatched: Veure transaccions que necessiten revisió
@@ -42,10 +136,25 @@ ca:
processed: 'Processat: %{count}'
title: Posicions
last_sync: 'Última sincronització: fa %{time_ago}'
+ skip_reasons:
+ excluded: Excloses
+ import_locked: Importació CSV
+ protected: Protegides
+ user_modified: Modificades per l'usuari
title: Resum de sincronització
- transactions:
+ trades:
+ fetching: Recuperant activitats del broker...
imported: 'Importat: %{count}'
+ skipped: 'Omès: %{count}'
+ title: Operacions
+ transactions:
+ fetching: Recuperant del broker...
+ imported: 'Importat: %{count}'
+ protected:
+ one: "%{count} entrada protegida (no sobreescrita)"
+ other: "%{count} entrades protegides (no sobreescrites)"
seen: 'Vist: %{count}'
skipped: 'Omès: %{count}'
title: Transaccions
updated: 'Actualitzat: %{count}'
+ view_protected: Veure entrades protegides
diff --git a/config/locales/views/components/en.yml b/config/locales/views/components/en.yml
index fcfa566bd..cc74d1051 100644
--- a/config/locales/views/components/en.yml
+++ b/config/locales/views/components/en.yml
@@ -4,8 +4,75 @@ en:
account:
activity_feed:
toggle_selection_checkboxes: Toggle selection
+ balance_reconciliation:
+ labels:
+ adjustments: Adjustments
+ buys: Buys
+ change_in_brokerage_cash: Change in brokerage cash
+ change_in_holdings_market: Change in holdings (market price activity)
+ change_in_holdings_trades: Change in holdings (buys/sells)
+ charges: Charges
+ end_balance: End balance
+ end_principal: End principal
+ end_value: End value
+ final_balance: Final balance
+ final_principal: Final principal
+ final_value: Final value
+ market_changes: Market changes
+ net_cash_flow: Net cash flow
+ net_principal_change: Net principal change
+ net_value_change: Net value change
+ payments: Payments
+ sells: Sells
+ start_balance: Start balance
+ start_principal: Start principal
+ start_value: Start value
+ tooltips:
+ adjustments: Manual reconciliations or other adjustments
+ adjustments_asset: Manual value adjustments or appraisals
+ buys: Crypto purchases during the day
+ change_in_brokerage_cash: Net change in cash from deposits, withdrawals, and trades
+ change_in_holdings_market: Change in holdings value from market price movements
+ change_in_holdings_trades: Impact on holdings from buying and selling securities
+ charges: New charges made during the day
+ end_balance: The calculated balance after all transactions
+ end_balance_investment: The calculated balance after all activity
+ end_principal: The calculated principal after all transactions
+ end_value: The calculated value after all changes
+ final_balance: The final account balance for the day
+ final_balance_credit: The final balance owed for the day
+ final_balance_crypto: The final crypto holdings value for the day
+ final_balance_investment: The final portfolio value for the day
+ final_principal: The final principal balance for the day
+ final_value: The final asset value for the day
+ market_changes: Value changes from market price movements
+ net_cash_flow: Net change in balance from all transactions during the day
+ net_principal_change: Principal payments and new borrowing during the day
+ net_value_change: All value changes including improvements and depreciation
+ payments: Payments made to the card during the day
+ sells: Crypto sales during the day
+ start_balance: The account balance at the beginning of this day
+ start_balance_credit: The balance owed at the beginning of this day
+ start_balance_crypto: The crypto holdings value at the beginning of this day
+ start_balance_investment: The total portfolio value at the beginning of this day
+ start_principal: The principal balance at the beginning of this day
+ start_value: The asset value at the beginning of this day
chart:
no_data_available: "No data available"
+ title:
+ balance: Balance
+ cash_value: Cash value
+ debt_balance: Debt balance
+ estimated_property_value: Estimated property value
+ estimated_vehicle_value: Estimated vehicle value
+ holdings_value: Holdings value
+ remaining_principal_balance: Remaining principal balance
+ total_account_value: Total account value
+ views:
+ cash: Cash
+ holdings: Holdings
+ total_value: Total value
+ vs_available_history: vs. available history
activity_date:
balance_tooltip: "The end of day balance, after all transactions and adjustments"
no_balance_data: "No balance data available for this date"
diff --git a/config/locales/views/credit_cards/ca.yml b/config/locales/views/credit_cards/ca.yml
index 9f6ad0003..6ac6a7515 100644
--- a/config/locales/views/credit_cards/ca.yml
+++ b/config/locales/views/credit_cards/ca.yml
@@ -20,6 +20,7 @@ ca:
annual_fee: Quota anual
apr: TAE
available_credit: Crèdit disponible
+ edit_account_details: Edita els detalls del compte
expiration_date: Data de caducitat
minimum_payment: Pagament mínim
unknown: Desconegut
diff --git a/config/locales/views/cryptos/ca.yml b/config/locales/views/cryptos/ca.yml
index 597bd3cbe..fb41ce5bc 100644
--- a/config/locales/views/cryptos/ca.yml
+++ b/config/locales/views/cryptos/ca.yml
@@ -3,5 +3,20 @@ ca:
cryptos:
edit:
edit: Edita %{account}
+ form:
+ subtype_label: Tipus de compte
+ subtype_none: Cap
+ subtype_prompt: Selecciona el tipus de compte
+ tax_treatment_hint: La majoria de les criptomonedes es tenen en comptes subjectes
+ a impostos. Selecciona una altra opció si es tenen en un compte amb avantatges
+ fiscals.
+ tax_treatment_label: Tractament fiscal
new:
title: Introdueix el saldo del compte
+ subtypes:
+ exchange:
+ long: Exchange de cripto
+ short: Exchange
+ wallet:
+ long: Cartera de cripto
+ short: Cartera
diff --git a/config/locales/views/depositories/ca.yml b/config/locales/views/depositories/ca.yml
index 59d4cb0de..8f4327d69 100644
--- a/config/locales/views/depositories/ca.yml
+++ b/config/locales/views/depositories/ca.yml
@@ -8,3 +8,21 @@ ca:
subtype_prompt: Selecciona el tipus de compte
new:
title: Introdueix el saldo del compte
+ subtypes:
+ cd:
+ long: Certificat de dipòsit
+ short: CD
+ checking:
+ long: Corrent
+ short: Corrent
+ hsa:
+ long: Compte d'estalvi per a salut
+ short: HSA
+ money_market:
+ long: Mercat monetari
+ short: MM
+ savings:
+ long: Estalvis
+ short: Estalvis
+ types_plural:
+ depository: Comptes corrents i estalvis
diff --git a/config/locales/views/depositories/en.yml b/config/locales/views/depositories/en.yml
index 081d14679..99cc944d1 100644
--- a/config/locales/views/depositories/en.yml
+++ b/config/locales/views/depositories/en.yml
@@ -8,3 +8,19 @@ en:
subtype_prompt: Select account type
new:
title: Enter account balance
+ subtypes:
+ cd:
+ long: Certificate of Deposit
+ short: CD
+ checking:
+ long: Checking
+ short: Checking
+ hsa:
+ long: Health Savings Account
+ short: HSA
+ money_market:
+ long: Money Market
+ short: MM
+ savings:
+ long: Savings
+ short: Savings
diff --git a/config/locales/views/enable_banking_items/ca.yml b/config/locales/views/enable_banking_items/ca.yml
index a2ee3c9bf..432240782 100644
--- a/config/locales/views/enable_banking_items/ca.yml
+++ b/config/locales/views/enable_banking_items/ca.yml
@@ -2,52 +2,131 @@
ca:
enable_banking_items:
authorize:
- authorization_failed: No s'ha pogut iniciar l'autorització
- bank_required: Si us plau, selecciona un banc.
- invalid_redirect: L'URL d'autorització rebuta no és vàlida. Si us plau, torna-ho
- a provar o contacta amb l'assistència.
- redirect_uri_not_allowed: Redirecció no permesa. Si us plau, configura `%{callback_url}`
- a la configuració de l'aplicació Enable Banking.
- unexpected_error: S'ha produït un error inesperat. Si us plau, torna-ho a provar.
+ authorization_failed: 'No s''ha pogut iniciar l''autorització: %{message}'
+ bank_required: Selecciona un banc.
+ decoupled_not_supported: Aquest banc utilitza un mètode d'autenticació amb dispositiu
+ separat que encara no està admès. Afegeix aquest compte manualment.
+ invalid_redirect: L'URL d'autorització rebuda no és vàlida. Torna-ho a provar.
+ redirect_uri_not_allowed: Redirecció no permesa. Configura `%{callback_url}`
+ a la configuració de la teva aplicació Enable Banking.
+ unexpected_error: S'ha produït un error inesperat. Torna-ho a provar.
callback:
authorization_error: L'autorització ha fallat
invalid_callback: Paràmetres de callback no vàlids.
item_not_found: Connexió no trobada.
session_failed: No s'ha pogut completar l'autorització
- success: S'ha connectat correctament amb el teu banc. Les teves comptes s'estan sincronitzant.
- unexpected_error: S'ha produït un error inesperat. Si us plau, torna-ho a provar.
+ success: T'has connectat correctament al teu banc. Els teus comptes s'estan
+ sincronitzant.
+ unexpected_error: S'ha produït un error inesperat. Torna-ho a provar.
complete_account_setup:
- all_skipped: S'han omès tots els comptes. Pots configurar-los més tard a la pàgina
- de comptes.
+ all_skipped: S'han omès tots els comptes. Pots configurar-los més tard a la
+ pàgina de comptes.
no_accounts: No hi ha comptes disponibles per configurar.
success: S'han creat correctament %{count} comptes!
create:
success: La configuració d'Enable Banking s'ha fet amb èxit.
destroy:
success: La connexió d'Enable Banking s'ha posat a la cua per a l'eliminació.
+ enable_banking_item:
+ delete: Elimina
+ deletion_in_progress: Eliminació en curs
+ last_synced: Darrera sincronització fa %{time}
+ never_synced: Mai sincronitzat
+ no_accounts_found: No s'han trobat comptes
+ no_accounts_found_description: No s'han trobat comptes a Enable Banking. Torna
+ a sincronitzar.
+ provider_name: Enable Banking
+ reconnect: Reconnecta
+ set_up_accounts: Configura comptes
+ setup_needed: Cal configuració
+ setup_needed_description:
+ one: 1 compte importat d'Enable Banking necessita configuració
+ other: "%{count} comptes importats d'Enable Banking necessiten configuració"
+ syncing: Sincronitzant...
+ update: Actualitza
+ errors:
+ api_error: S'ha produït un error de comunicació amb el banc.
+ network_unreachable: El servei bancari està temporalment inaccessible. Torna-ho
+ a provar més tard.
+ session_invalid: La sessió ha caducat. Torna a connectar el teu banc.
+ unexpected: S'ha produït un error inesperat durant la sincronització.
link_accounts:
- already_linked: Els comptes seleccionats ja estan vinculats.
- link_failed: No s'ha pogut vincular els comptes
+ already_linked: Els comptes seleccionats ja estan enllaçats.
+ link_failed: No s'han pogut enllaçar els comptes
no_accounts_selected: No s'han seleccionat comptes.
- no_session: No hi ha connexió activa d'Enable Banking. Si us plau, connecta't a un banc primer.
- success: S'han vinculat correctament %{count} comptes.
+ no_session: No hi ha cap connexió activa d'Enable Banking. Primer connecta't
+ a un banc.
+ success: S'han enllaçat correctament %{count} comptes.
link_existing_account:
errors:
- invalid_enable_banking_account: S'ha seleccionat un compte d'Enable Banking no vàlid
- only_manual: Només es poden vincular comptes manuals
- success: Compte vinculat correctament a Enable Banking
+ invalid_enable_banking_account: S'ha seleccionat un compte d'Enable Banking
+ no vàlid
+ only_manual: Només els comptes manuals es poden enllaçar
+ success: El compte s'ha enllaçat correctament a Enable Banking
new:
- link_enable_banking_title: Vincula Enable Banking
+ add_connection: Afegeix connexió
+ configured: Configurat
+ connect_bank: Connecta el banc
+ connected_bank: Banc connectat
+ connection: Connexió
+ go_to_provider_settings: Ves a la configuració del proveïdor
+ link_enable_banking_title: Enllaça Enable Banking
+ not_configured: Connexió d'Enable Banking no configurada
+ not_configured_description: Abans d'enllaçar comptes d'Enable Banking, has de
+ configurar la teva connexió d'Enable Banking.
+ ready_to_connect: A punt per connectar un banc
+ reconnect: Reconnecta
+ remove: Elimina
+ remove_confirm: Segur que vols eliminar aquesta connexió?
+ session_expired: La sessió ha caducat — cal tornar a autoritzar
+ session_expires: La sessió caduca
+ setup_step_1_html: Ves a Configuració → Proveïdors
+ setup_step_2_html: Localitza la secció Enable Banking
+ setup_step_3: Introdueix les teves credencials d'Enable Banking
+ setup_step_4: Torna aquí per enllaçar els teus comptes
+ setup_steps_title: 'Passos de configuració:'
+ sync: Sincronitza
+ unknown: Desconegut
reauthorize:
- invalid_redirect: L'URL d'autorització rebuta no és vàlida. Si us plau, torna-ho
- a provar o contacta amb l'assistència.
+ invalid_redirect: L'URL d'autorització rebuda no és vàlida. Torna-ho a provar.
reauthorization_failed: La reautorització ha fallat
select_bank:
+ beta_label: Beta
cancel: Cancel·la
- check_country: Si us plau, revisa els teus codis de país.
- credentials_required: Si us plau, configura les teves credencials d'Enable Banking primer.
+ check_country: Revisa la configuració del codi de país.
+ credentials_required: Primer configura les teves credencials d'Enable Banking.
description: Selecciona el banc al qual vols connectar els teus comptes.
- no_banks: No hi ha bancs disponibles per aquest país/regió.
+ no_banks: No hi ha bancs disponibles per a aquest país/regió.
+ no_search_results: Cap banc coincideix amb la teva cerca.
+ search_label: Cerca el teu banc
+ search_placeholder: Cerca el teu banc...
title: Selecciona el teu banc
+ select_existing_account:
+ all_linked: Sembla que tots els comptes d'Enable Banking ja estan enllaçats.
+ balance: Saldo
+ cancel: Cancel·la
+ link: Enllaça
+ title: Enllaça compte d'Enable Banking
+ try_after_sync: Si acabes de connectar o sincronitzar, torna-ho a provar després
+ que la sincronització acabi.
+ unlink_to_move: Per enllaçar un compte diferent, primer desenllaça'l del menú
+ d'accions del compte.
+ setup_accounts:
+ account_type_label: 'Tipus de compte:'
+ balance: Saldo
+ cancel: Cancel·la
+ choose_account_type: 'Tria el tipus de compte correcte per a cada compte d''Enable
+ Banking:'
+ create_accounts: Crea comptes
+ creating_accounts: Creant comptes...
+ header_subtitle: Tria els tipus de compte correctes per als teus comptes importats
+ historical_data_range: 'Rang de dades històriques:'
+ psd2_savings_notice: 'Nota: alguns comptes d''estalvi regulats francesos (Livret
+ A, PEL, LEP, LDDS) tenen accés limitat o nul a través de l''Open Banking (PSD2).
+ Si manca un compte d''estalvi, pots afegir-lo manualment.'
+ sync_start_date_help: Selecciona fins on vols sincronitzar l'historial de transaccions.
+ Hi ha un màxim de 2 anys d'historial disponible.
+ sync_start_date_label: 'Comença a sincronitzar transaccions des de:'
+ title: Configura els teus comptes d'Enable Banking
update:
success: La configuració d'Enable Banking s'ha actualitzat.
diff --git a/config/locales/views/entries/ca.yml b/config/locales/views/entries/ca.yml
index 4ece9e3aa..5e9e0d459 100644
--- a/config/locales/views/entries/ca.yml
+++ b/config/locales/views/entries/ca.yml
@@ -10,5 +10,16 @@ ca:
title: No s'han trobat entrades
loading:
loading: Carregant entrades...
+ protection:
+ description: Les teves edicions a aquesta entrada no se sobreescriuran amb la
+ sincronització del proveïdor.
+ locked_fields_label: 'Camps bloquejats:'
+ title: Protegida de la sincronització
+ tooltip: Protegida de la sincronització
+ unlock_button: Permet que la sincronització l'actualitzi
+ unlock_confirm: Vols permetre que la sincronització actualitzi aquesta entrada?
+ Els teus canvis es poden sobreescriure a la pròxima sincronització.
+ unlock:
+ success: Entrada desbloquejada. Pot ser actualitzada a la pròxima sincronització.
update:
success: Entrada actualitzada
diff --git a/config/locales/views/family_exports/ca.yml b/config/locales/views/family_exports/ca.yml
index 9056ea5c6..04a517f20 100644
--- a/config/locales/views/family_exports/ca.yml
+++ b/config/locales/views/family_exports/ca.yml
@@ -3,29 +3,46 @@ ca:
family_exports:
access_denied: Accés denegat
create:
- success: Exportació iniciada. Podràs descarregar-la aviat.
- delete_confirmation: Estàs segur que vols eliminar aquesta exportació? Aquesta acció no es pot desfer.
- delete_failed_confirmation: Estàs segur que vols eliminar aquesta exportació fallida?
+ success: Exportació iniciada. La podràs descarregar aviat.
+ delete_confirmation: Segur que vols eliminar aquesta exportació? Aquesta acció
+ no es pot desfer.
+ delete_failed_confirmation: Segur que vols eliminar aquesta exportació fallida?
destroy:
- success: Exportació eliminada amb èxit
- export_not_ready: L'exportació no està llesta per descarregar
+ success: Exportació eliminada correctament
+ export_not_ready: L'exportació no està a punt per descarregar
exporting: Exportant...
index:
- title: Exportacions
new: Nova exportació
- table:
title: Exportacions
+ new:
+ accounts_and_balances: Tots els comptes i saldos
+ cancel: Cancel·la
+ categories_tags_rules: Categories, etiquetes i regles
+ dialog_subtitle: Descarrega totes les teves dades financeres
+ dialog_title: Exporta les teves dades
+ export_data: Exporta les dades
+ investment_trades: Operacions d'inversió
+ note_description: Aquesta exportació inclou totes les teves dades, però només
+ se'n pot importar de nou una part mitjançant la funció d'importació CSV. Donem
+ suport a la importació de comptes, transaccions (amb categoria i etiquetes)
+ i operacions. La resta de dades del compte no es poden importar i són només
+ per als teus registres.
+ note_label: Nota
+ transaction_history: Historial de transaccions
+ whats_included: 'Què s''inclou:'
+ table:
+ empty: Encara no hi ha exportacions.
header:
+ actions: Accions
date: Data
filename: Nom del fitxer
status: Estat
- actions: Accions
row:
- status:
- in_progress: En curs
- complete: Completat
- failed: Error
actions:
delete: Elimina
- download: Descarregar
- empty: Encara no hi ha exportacions.
+ download: Descarrega
+ status:
+ complete: Completat
+ failed: Error
+ in_progress: En curs
+ title: Exportacions
diff --git a/config/locales/views/holdings/ca.yml b/config/locales/views/holdings/ca.yml
index ea6b8e0dd..899da5016 100644
--- a/config/locales/views/holdings/ca.yml
+++ b/config/locales/views/holdings/ca.yml
@@ -2,23 +2,28 @@
ca:
holdings:
cash:
- brokerage_cash: Efectiu de broker
+ brokerage_cash: Efectiu del broker
cost_basis_cell:
cancel: Cancel·la
- or_per_share_label: 'O entra per acció:'
+ or_per_share_label: 'O introdueix per acció:'
overwrite_confirm_body: Això reemplaçarà el cost base actual de %{current}.
overwrite_confirm_title: Reemplaça el cost base?
per_share: per acció
save: Desa
- set_cost_basis_header: Estableix el cost base per %{ticker} (%{qty} accions)
+ set: Estableix
+ set_cost_basis_header: Estableix el cost base per a %{ticker} (%{qty} accions)
total_cost_basis_label: Cost base total
unknown: "--"
cost_basis_sources:
- calculated: Des de les operacions
+ calculated: A partir de les operacions
manual: Establert per l'usuari
- provider: Des del proveïdor
+ provider: Del proveïdor
destroy:
+ cannot_delete: No pots eliminar aquesta posició
success: Posició eliminada
+ errors:
+ security_collision: 'No es pot reassignar: ja tens una posició per a %{ticker}
+ a %{date}.'
holding:
no_cost_basis: Sense cost base
per_share: per acció
@@ -28,38 +33,84 @@ ca:
average_cost: Cost mitjà
holdings: Posicions
name: Nom
- new_holding: Nova transacció
+ new_holding: Nova activitat
no_holdings: No hi ha posicions per mostrar.
return: Rendiment total
weight: Pes
missing_price_tooltip:
- description: Aquesta inversió té valors que falten i no hem pogut calcular-ne
- el rendiment o el valor.
+ description: Aquesta inversió té valors que falten i no se n'han pogut calcular
+ el rendiment ni el valor.
missing_data: Falten dades
+ remap_security:
+ security_not_found: No s'ha pogut trobar el valor seleccionat.
+ success: Valor actualitzat correctament.
+ reset_security:
+ success: Valor restablert al del proveïdor.
show:
avg_cost_label: Cost mitjà
- cost_basis_locked_description: El cost base establert manualment no canviarà
+ book_value_label: Valor comptable
+ cancel: Cancel·la
+ cost_basis_locked_description: El cost base establert manualment no es modificarà
amb les sincronitzacions.
cost_basis_locked_label: El cost base està bloquejat
current_market_price_label: Preu de mercat actual
delete: Elimina
delete_subtitle: Això eliminarà la posició i totes les operacions associades
d'aquest compte. Aquesta acció no es pot desfer.
- delete_title: Elimina posició
+ delete_title: Elimina la posició
+ edit_security: Edita el valor
history: Historial
+ last_price_update: Última actualització de preu
+ market_data_label: Dades de mercat
+ market_data_sync_button: Actualitza
+ market_value_label: Valor de mercat
+ never: Mai
+ no_security_provider: Proveïdor de valors no configurat. No es poden cercar
+ valors.
+ no_trade_history: No hi ha historial d'operacions per a aquesta posició.
+ originally: era %{ticker}
overview: Resum
- portfolio_weight_label: Pes al portafolis
+ portfolio_weight_label: Pes a la cartera
+ provider_disabled_warning: Actualitzacions de preu en pausa — el proveïdor %{provider}
+ està desactivat. Canvia a un altre proveïdor o torna'l a activar a Configuració.
+ provider_sent: 'El proveïdor ha enviat: %{ticker}'
+ remap_security: Desa
+ reset_confirm_body: Això canviarà el valor de %{current} a %{original} i mourà
+ totes les operacions associades.
+ reset_confirm_title: Restablir el valor al del proveïdor?
+ reset_to_provider: Restableix al del proveïdor
+ search_security: Cerca valor
+ search_security_placeholder: Cerca per símbol o nom
+ security_label: Valor
+ security_remapped_label: Valor reassignat
settings: Configuració
- ticker_label: Ticker
+ shares_label: Accions
+ switch_provider_button: Canvia
+ switch_provider_description: "%{provider} està desactivat. Cerca aquest valor
+ en un altre proveïdor activat."
+ switch_provider_label: Canvia de proveïdor
+ syncing: Sincronitzant...
+ ticker_label: Símbol
total_return_label: Rendiment total
trade_history_entry: "%{qty} accions de %{security} a %{price}"
+ truncated_history_warning: L'historial de preus només està disponible a partir
+ del %{date}. Les dates anteriors no tenen dades del proveïdor seleccionat
+ — això pot passar quan l'actiu es va llistar després de la data de l'operació,
+ o quan el proveïdor només ofereix una finestra històrica limitada al seu pla
+ actual.
unknown: Desconegut
- unlock_confirm_body: Això permetrà que el cost base s'actualitzi per sincronitzacions
- del proveïdor o càlculs d'operacions.
- unlock_confirm_title: Desbloqueja el cost base?
+ unlock_confirm_body: Això permetrà que el cost base s'actualitzi per les sincronitzacions
+ del proveïdor o pels càlculs d'operacions.
+ unlock_confirm_title: Desbloquejar el cost base?
unlock_cost_basis: Desbloqueja
+ sync_prices:
+ provider_error: No s'han pogut obtenir els preus més recents. Torna-ho a provar
+ d'aquí a uns minuts.
+ success: Dades de mercat sincronitzades correctament.
+ unavailable: La sincronització de dades de mercat no està disponible per a valors
+ sense connexió.
unlock_cost_basis:
- success: El cost base s'ha desbloquejat. Pot actualitzar-se en la següent sincronització.
+ success: Cost base desbloquejat. Pot actualitzar-se a la propera sincronització.
update:
error: Valor de cost base no vàlid.
success: Cost base desat.
diff --git a/config/locales/views/ibkr_items/ca.yml b/config/locales/views/ibkr_items/ca.yml
new file mode 100644
index 000000000..7cf62c8ba
--- /dev/null
+++ b/config/locales/views/ibkr_items/ca.yml
@@ -0,0 +1,101 @@
+---
+ca:
+ ibkr_items:
+ complete_account_setup:
+ none_created: No s'ha creat cap compte.
+ none_selected: No s'ha seleccionat cap compte.
+ success:
+ one: S'ha creat correctament %{count} compte d'Interactive Brokers.
+ other: S'han creat correctament %{count} comptes d'Interactive Brokers.
+ create:
+ success: Interactive Brokers s'ha configurat correctament.
+ defaults:
+ name: Interactive Brokers
+ destroy:
+ success: S'ha programat la connexió Interactive Brokers per a la seva eliminació.
+ ibkr_item:
+ accounts_need_setup: Els comptes necessiten configuració
+ accounts_need_setup_description: Alguns comptes d'IBKR necessiten ser enllaçats
+ a comptes de Sure.
+ delete: Elimina
+ deletion_in_progress: Eliminació en curs
+ error: Error
+ flex_web_service: Flex Web Service
+ never_synced: Mai sincronitzat.
+ no_accounts_discovered: Encara no s'han descobert comptes d'IBKR.
+ no_accounts_discovered_description: Executa una sincronització després de configurar
+ la teva consulta Flex per descobrir comptes.
+ requires_update: Les credencials necessiten atenció
+ setup_accounts: Configura comptes
+ synced: Sincronitzat fa %{time}. %{summary}.
+ syncing: Sincronitzant
+ link_existing_account:
+ already_linked: Aquest compte d'Interactive Brokers ja està enllaçat.
+ failed: No s'ha pogut enllaçar el compte d'Interactive Brokers.
+ not_found: No s'ha trobat el compte o la configuració d'Interactive Brokers.
+ only_manual_investment: Només els comptes d'inversió manuals es poden enllaçar
+ a Interactive Brokers.
+ success: S'ha enllaçat correctament al compte d'Interactive Brokers.
+ select_accounts:
+ not_configured: Interactive Brokers no està configurat.
+ select_existing_account:
+ balance: Saldo
+ cancel: Cancel·la
+ link: Enllaça
+ no_accounts_available: Encara no hi ha comptes d'Interactive Brokers sense enllaçar
+ disponibles.
+ run_sync_hint: Executa una sincronització des de Configuració > Proveïdors després
+ d'actualitzar la teva consulta Flex.
+ title: Enllaça compte d'Interactive Brokers
+ wait_for_sync: Espera que la sincronització de descobriment de comptes acabi.
+ setup_accounts:
+ available_accounts:
+ account_id: 'ID del compte: %{account_id}'
+ account_summary: "%{account_type} • Saldo: %{balance}"
+ account_type_investment: Inversió
+ title: Comptes disponibles
+ buttons:
+ back_to_settings: Torna a la configuració
+ cancel: Cancel·la
+ create_selected_accounts: Crea els comptes seleccionats
+ done: Fet
+ link: Enllaça
+ refresh: Actualitza
+ dialog_title: Configura els teus comptes d'Interactive Brokers
+ info_box:
+ items:
+ item_1: Posicions amb preus i quantitats actuals
+ item_2: Cost base per posició
+ item_3: Operacions, dividends, comissions i dipòsits o retirades d'efectiu
+ title: Importació de la consulta Flex d'IBKR
+ warning: L'activitat històrica està limitada a la finestra de l'informe de
+ la consulta Flex
+ link_existing:
+ description: O enllaça un compte d'IBKR descobert a un compte d'inversió manual
+ existent.
+ manual_account_option: "%{name} (%{balance})"
+ select_prompt: Selecciona un compte...
+ linked_accounts:
+ linked_to_html: 'Enllaçat a: %{account}'
+ title: Ja enllaçats
+ page_title: Configura els comptes d'Interactive Brokers
+ status:
+ fetching_accounts: Obtenint comptes d'Interactive Brokers...
+ no_accounts_found_description: Sure no ha pogut trobar cap compte d'IBKR a
+ l'últim informe Flex.
+ no_accounts_found_title: No s'han trobat comptes.
+ subtitle: Selecciona quins comptes de broker d'IBKR vols enllaçar.
+ sync_status:
+ all_linked:
+ one: 1 compte enllaçat
+ other: "%{count} comptes enllaçats"
+ no_accounts: Encara no s'han descobert comptes d'IBKR
+ partial: "%{linked} enllaçats, %{unlinked} necessiten configuració"
+ update:
+ success: La configuració d'Interactive Brokers s'ha actualitzat correctament.
+ providers:
+ ibkr:
+ connection_description: Connecta un informe de Flex Web Service d'Interactive
+ Brokers
+ institution_name: Interactive Brokers
+ name: Interactive Brokers
diff --git a/config/locales/views/impersonation_sessions/ca.yml b/config/locales/views/impersonation_sessions/ca.yml
index ca1a23e07..71932d26d 100644
--- a/config/locales/views/impersonation_sessions/ca.yml
+++ b/config/locales/views/impersonation_sessions/ca.yml
@@ -13,3 +13,13 @@ ca:
success: Has sortit de la sessió
reject:
success: Sol·licitud rebutjada
+ super_admin_bar:
+ impersonating: Personificant
+ jobs: Tasques
+ join: Uneix-te
+ join_a_session: Uneix-te a una sessió
+ leave: Surt
+ request_impersonation: Sol·licita personificació
+ super_admin: Super administrador
+ terminate: Finalitza
+ uuid_placeholder: UUID
diff --git a/config/locales/views/imports/ca.yml b/config/locales/views/imports/ca.yml
index 8de803977..723d6471e 100644
--- a/config/locales/views/imports/ca.yml
+++ b/config/locales/views/imports/ca.yml
@@ -3,19 +3,51 @@ ca:
import:
cleans:
show:
+ all_rows: Totes les files
+ data_cleaned: Les teves dades s'han netejat
description: Edita les teves dades a la taula de sota. Les cel·les vermelles
són invàlides.
+ error_rows: Files amb errors
errors_notice: Hi ha errors a les teves dades. Passa el cursor per sobre de
l'error per veure'n els detalls.
errors_notice_mobile: Hi ha errors a les teves dades. Toca la icona d'error
per veure'n els detalls.
+ next_step: Pas següent
+ not_configured: Configura la teva importació abans de continuar.
title: Neteja les teves dades
configurations:
+ account_import:
+ apply_configuration: Aplica la configuració
+ balance: Saldo
+ balance_date: Data del saldo
+ currency: Divisa
+ date_format: Format de data
+ default: Per defecte
+ entity_type: Tipus d'entitat
+ leave_empty: Deixa-ho buit
+ name: Nom
+ select_format: Selecciona el format
+ actual_import:
+ account_label: Compte (opcional)
+ amount_label: Import
+ apply_configuration: Aplica la configuració
+ category_label: Categoria (opcional)
+ date_format_label: Format de data
+ date_label: Data
+ incomes_are_negative: Els ingressos són negatius
+ incomes_are_positive: Els ingressos són positius
+ leave_empty: Deixa-ho buit
+ name_label: Beneficiari (opcional)
+ notes_label: Notes (opcional)
+ preconfigured_notice: Hem preconfigurat la teva importació d'Actual Budget.
+ Continua al pas següent.
+ signage_convention_label: Convenció de signes
category_import:
button_label: Continua
description: Puja un fitxer CSV senzill (com el que generem quan exportes
les teves dades). Automàticament maparem les columnes per tu.
- instructions: Selecciona continuar per analitzar el teu CSV i passar al pas de neteja.
+ instructions: Selecciona continuar per analitzar el teu CSV i passar al pas
+ de neteja.
mint_import:
date_format_label: Format de data
rule_import:
@@ -28,13 +60,65 @@ ca:
description: Selecciona les columnes que corresponen a cada camp del teu CSV.
title: Configura la teva importació
trade_import:
+ account_label: Compte
+ apply_configuration: Aplica la configuració
+ buys_are_negative: Les compres tenen quantitat negativa
+ buys_are_positive: Les compres tenen quantitat positiva
+ currency_label: Divisa
date_format_label: Format de data
+ date_label: Data
+ default: Per defecte
+ format_label: Format
+ leave_empty: Deixa-ho buit
+ name_label: Nom
+ no_security_provider_warning: El proveïdor de preus de valors no està configurat.
+ Les teves importacions d'operacions funcionaran, però Sure no recuperarà
+ l'historial de preus. Ves a la configuració per configurar-ho.
+ note_label: Nota
+ price_label: Preu
+ quantity_label: Quantitat
+ select_column: Selecciona la columna
+ select_format: Selecciona el format
+ stock_exchange_code_label: Codi de borsa
+ ticker_label: Ticker
transaction_import:
+ account_label: Compte
+ amount_label: Import
+ amount_type_label: Tipus d'import
+ amount_type_strategy_label: Estratègia del tipus d'import
+ apply_configuration: Aplica la configuració
+ as_amount_type_column: com a columna del tipus d'import
+ as_identifier_value: com a valor identificador
+ category_label: Categoria
+ currency_label: Divisa
date_format_label: Format de data
+ date_label: Data
+ default: Per defecte
+ expense_outflow: Despesa (sortida)
+ format_label: Format
+ income_inflow: Ingrés (entrada)
+ incomes_are_negative: Els ingressos són negatius
+ incomes_are_positive: Els ingressos són positius
+ leave_empty: Deixa-ho buit
+ name_label: Nom
+ notes_label: Notes
+ rows_to_skip_label: Omet les primeres n files
+ select_column: Selecciona la columna
+ select_convention: Selecciona la convenció
+ select_format: Selecciona el format
+ select_strategy: Selecciona l'estratègia
+ select_type: Selecciona el tipus
+ select_value: Selecciona el valor
+ set: Estableix
+ tags_label: Etiquetes
+ treat_as_html: Tracta «%{value}» com a
+ update:
+ success: Importació configurada correctament.
confirms:
mappings:
create_account: Crea un compte
csv_mapping_label: "%{mapping} al CSV"
+ next: Següent
no_accounts: Encara no tens cap compte. Crea un compte que puguem utilitzar
per a les files (sense assignar) del teu CSV o torna al pas de Neteja i
proporciona un nom de compte que puguem utilitzar.
@@ -43,75 +127,347 @@ ca:
unassigned_account: Necessites crear un nou compte per a les files sense assignar?
show:
account_mapping_description: Assigna tots els comptes del teu fitxer importat
- als comptes existents de Maybe. També pots afegir nous comptes o deixar-los
+ als comptes existents. També pots afegir nous comptes o deixar-los
sense categoria.
account_mapping_title: Assigna els teus comptes
account_type_mapping_description: Assigna tots els tipus de compte del teu
- fitxer importat als de Maybe
+ fitxer importat als existents
account_type_mapping_title: Assigna els teus tipus de compte
category_mapping_description: Assigna totes les categories del teu fitxer
- importat a les categories existents de Maybe. També pots afegir-ne de noves
+ importat a les categories existents. També pots afegir-ne de noves
o deixar-les sense categoria.
category_mapping_title: Assigna les teves categories
+ invalid_data: Hi ha dades invàlides; edita-les fins que es resolguin tots
+ els errors
tag_mapping_description: Assigna totes les etiquetes del teu fitxer importat
- a les etiquetes existents de Maybe. També pots afegir-ne de noves o deixar-les
+ a les etiquetes existents. També pots afegir-ne de noves o deixar-les
sense categoria.
tag_mapping_title: Assigna les teves etiquetes
- uploads:
+ sure_import:
+ cancel: Cancel·la
+ description: Revisa les dades que s'importaran del teu fitxer d'exportació.
+ empty_summary: No s'han trobat registres importables en aquest fitxer. Pot
+ estar buit, o les línies no coincideixen amb el format d'exportació esperat
+ (cada línia ha de ser un objecte JSON amb les claus «type» i «data», amb
+ tipus admesos per aquesta importació).
+ publish_button: Inicia la importació
+ summary: Resum de la importació
+ title: Confirma la teva importació
+ qif_category_selections:
show:
+ categories_found:
+ one: 1 categoria trobada
+ other: "%{count} categories trobades"
+ categories_heading: Categories
+ category_name_col: Nom de la categoria
+ description: Revisa el format de data detectat i tria quines categories i
+ etiquetes del teu fitxer QIF vols importar a %{product_name}.
+ empty_state_primary: No s'han trobat categories ni etiquetes en aquest fitxer
+ QIF.
+ empty_state_secondary: Totes les transaccions s'importaran sense categories
+ ni etiquetes.
+ split_badge: dividida
+ split_warning_description: Aquest fitxer QIF conté transaccions dividides.
+ Les divisions encara no estan suportades, així que cada transacció dividida
+ s'importarà com una sola transacció amb el seu import complet i sense categoria.
+ El detall individual de cada divisió no es conservarà.
+ split_warning_title: Transaccions dividides detectades
+ submit: Continua per revisar
+ tag_name_col: Nom de l'etiqueta
+ tags_found:
+ one: 1 etiqueta trobada
+ other: "%{count} etiquetes trobades"
+ tags_heading: Etiquetes
+ title: Configura i selecciona
+ transactions_col: Transaccions
+ txn_count:
+ one: 1 trans.
+ other: "%{count} trans."
+ update:
+ success: Categories i etiquetes desades.
+ uploads:
+ handle_qif_upload:
+ qif_uploaded: Fitxer QIF pujat correctament.
+ show:
+ account_optional_label: Compte (opcional)
+ browse: Explora
+ copy_paste_tab: Copia i enganxa
+ csv_file_prompt: per afegir aquí el teu fitxer CSV
+ csv_invalid: Ha de ser un CSV vàlid amb capçaleres i com a mínim una fila
+ de dades
description: Enganxa o puja el teu fitxer CSV a continuació. Revisa les instruccions
de la taula abans de començar.
+ download_sample_csv: Descarrega un CSV d'exemple
+ drop_csv_subtitle: El teu fitxer es pujarà automàticament
+ drop_csv_title: Deixa anar el CSV per pujar-lo
instructions_1: A sota hi ha un exemple de CSV amb columnes disponibles per
importar.
instructions_2: El teu CSV ha de tenir una fila d'encapçalament
instructions_3: Pots posar el nom que vulguis a les columnes. Les maparàs
en un pas posterior.
instructions_4: Les columnes marcades amb un asterisc (*) són obligatòries.
- instructions_5: Sense comes, símbols de moneda ni parèntesis als números.
+ instructions_5: Sense comes, símbols de divisa ni parèntesis als números.
+ multi_account_import: Importació multicompte
+ paste_csv_placeholder: Enganxa aquí el contingut del teu fitxer CSV
+ qif_account_label: Compte
+ qif_account_placeholder: Selecciona un compte…
+ qif_description: Selecciona el compte al qual pertany aquest fitxer QIF i
+ puja la teva exportació .qif de Quicken.
+ qif_file_hint: només fitxers .qif
+ qif_file_prompt: per afegir aquí el teu fitxer QIF
+ qif_submit: Puja QIF
+ qif_title: Puja el fitxer QIF
title: Importa les teves dades
+ to_see_format: per veure el format CSV requerit
+ upload_csv_button: Puja CSV
+ upload_csv_tab: Puja CSV
+ sure_import:
+ browse: Explora
+ browse_hint: per afegir aquí el teu fitxer all.ndjson
+ description: Puja el fitxer all.ndjson de la teva exportació de dades per
+ restaurar els teus comptes, transaccions, categories i més.
+ drop_subtitle: El teu fitxer es pujarà automàticament
+ drop_title: Deixa anar el NDJSON per pujar-lo
+ hint_html: Puja el fitxer all.ndjson del teu ZIP d'exportació
+ de dades
+ ndjson_invalid: Ha de ser un NDJSON vàlid amb com a mínim un registre
+ title: Importa des d'una exportació
+ upload_button: Puja NDJSON
+ update:
+ qif_uploaded: Fitxer QIF pujat correctament.
imports:
+ apply_template:
+ no_template_found: No s'ha trobat cap plantilla; configura manualment la teva
+ importació.
+ template_applied: Plantilla aplicada.
+ column_labels:
+ account: Compte
+ amount: Import
+ category: Categoria
+ category_color: Color
+ category_icon: Icona Lucide
+ category_parent: Categoria pare
+ currency: Divisa
+ date: Data
+ entity_type: Tipus
+ exchange: Borsa
+ name: Nom
+ notes: Notes
+ price: Preu
+ qty: Quantitat
+ tags: Etiquetes
+ ticker: Ticker
+ create:
+ csv_uploaded: CSV pujat correctament.
+ document_provider_not_configured: No hi ha cap magatzem vectorial configurat per
+ a la pujada de documents.
+ document_too_large: El fitxer del document és massa gran. La mida màxima és
+ %{max_size}MB.
+ document_upload_failed: No hem pogut pujar el document al magatzem vectorial.
+ Torna-ho a provar.
+ document_uploaded: Document pujat correctament.
+ file_too_large: El fitxer és massa gran. La mida màxima és %{max_size}MB.
+ invalid_document_file_type: Tipus de fitxer de document no vàlid per a l'arxiu
+ vectorial actiu.
+ invalid_file_type: Tipus de fitxer no vàlid. Puja un fitxer CSV.
+ invalid_ndjson_file_type: Tipus o format de fitxer no vàlid. Puja un fitxer
+ d'exportació .ndjson o .json vàlid.
+ invalid_pdf: El fitxer pujat no és un PDF vàlid.
+ ndjson_uploaded: Fitxer NDJSON pujat correctament.
+ pdf_processing: El teu PDF s'està processant. Rebràs un correu electrònic quan
+ l'anàlisi estigui completa.
+ pdf_too_large: El fitxer PDF és massa gran. La mida màxima és %{max_size}MB.
+ date_format:
+ description: El format de data s'ha detectat automàticament del teu fitxer.
+ Canvia'l si les dates no es veuen correctament.
+ error_description: Cap dels formats de data suportats ha pogut analitzar les
+ dates d'aquest fitxer. Comprova que el fitxer contingui entrades de data vàlides.
+ error_title: No s'ha pogut detectar el format de data
+ heading: Format de data
+ preview: Primera data analitzada
+ destroy:
+ deleted: La teva importació s'ha eliminat.
+ document_types:
+ bank_statement: Extracte bancari
+ contract: Contracte
+ credit_card_statement: Extracte de targeta de crèdit
+ financial_document: Document financer
+ investment_statement: Extracte d'inversions
+ other: Altre document
+ unknown: Document desconegut
+ empty:
+ message: No s'ha trobat cap importació.
+ errors:
+ custom_column_requires_inflow: Les importacions amb columna personalitzada requereixen
+ seleccionar una columna d'entrada
+ failure:
+ description: Comprova el format del fitxer, els errors i que tots els camps
+ obligatoris estiguin omplerts, i torna-ho a provar.
+ title: Importació fallida
+ try_again: Torna-ho a provar
+ importing:
+ back_to_dashboard: Tornar al tauler
+ check_status: Comprova l'estat
+ description: La teva importació està en curs. Consulta el menú d'importacions
+ per veure l'estat o clica «Comprova l'estat» per actualitzar la pàgina. Pots
+ continuar utilitzant l'aplicació.
+ title: Importació en curs
index:
- title: Importacions
new: Nova importació
+ title: Importacions
+ mapping_labels:
+ account: Compte
+ account_type: Tipus de compte
+ category: Categoria
+ tag: Etiqueta
+ new:
+ coming_soon: Properament
+ description: Importa des d'una eina financera o puja fitxers de dades sense
+ processar.
+ import_accounts: Importa comptes
+ import_actual: Importa des d'Actual Budget
+ import_categories: Importa categories
+ import_file: Importa document
+ import_file_description: Anàlisi amb IA per a PDFs i pujada de fitxers cercables
+ import_mint: Importa des de Mint
+ import_portfolio: Importa inversions
+ import_qif: Importa des de Quicken (QIF)
+ import_rules: Importa regles
+ import_sure: Importa des de Sure
+ import_sure_description: Fitxer .ndjson d'exportació completa
+ import_transactions: Importa transaccions
+ import_ynab: Importa des de YNAB
+ requires_account: Importa comptes primer per desbloquejar aquesta opció.
+ resume: Reprèn %{type}
+ sources: Fonts
+ tab_financial_tools: Eines financeres i fitxers
+ tab_raw_data: Dades sense processar
+ title: Nova importació
+ pdf_import:
+ back_to_dashboard: Tornar al tauler
+ back_to_imports: Tornar a les importacions
+ check_status: Comprova l'estat
+ complete_description: Hem analitzat el teu PDF i això és el que hem trobat.
+ complete_title: Document analitzat
+ create_account: Crea un compte
+ delete_import: Elimina la importació
+ document_type_label: Tipus de document
+ email_sent_notice: T'hem enviat un correu electrònic amb els passos següents.
+ failed_description: No hem pogut processar el teu document PDF. Torna-ho a provar
+ o contacta amb el suport.
+ failed_title: El processament ha fallat
+ no_accounts: No hi ha comptes disponibles. Crea un compte primer.
+ processing_description: Estem analitzant el teu document amb IA. Pot trigar
+ un moment. Rebràs un correu electrònic quan l'anàlisi estigui completa.
+ processing_failed_generic: 'El processament ha fallat: %{error}'
+ processing_failed_with_message: "%{message}"
+ processing_title: Processant el teu PDF
+ publish_transactions:
+ one: Publica %{count} transacció
+ other: Publica %{count} transaccions
+ ready_for_review_description: Hem extret %{count} transaccions del teu extracte.
+ Revisa-les i publica-les per afegir-les al teu compte.
+ ready_for_review_title: A punt per revisar
+ review_transactions: Revisa les transaccions
+ save_account: Desa
+ select_account: Importa al compte
+ select_account_hint: Tria a quin compte vols importar aquestes transaccions.
+ select_account_placeholder: Selecciona un compte...
+ select_account_to_continue: Selecciona un compte a dalt per continuar.
+ summary_label: Resum
+ transactions_extracted: Transaccions extretes
+ transactions_extracted_count:
+ one: "%{count} transacció"
+ other: "%{count} transaccions"
+ try_again: Torna-ho a provar
+ unknown_document_type: Desconegut
+ unknown_state_description: Aquesta importació es troba en un estat inesperat.
+ Torna a les importacions.
+ unknown_state_title: Estat desconegut
+ publish:
+ max_rows_exceeded: La teva importació supera el límit màxim de %{max} files.
+ started: La teva importació s'ha iniciat en segon pla.
+ ready:
+ back_to_imports: Tornar a les importacions
+ description: Aquí tens un resum dels nous elements que s'afegiran al teu compte
+ un cop publiquis aquesta importació.
+ empty_summary: No s'han trobat registres importables en aquest fitxer. Pot estar
+ buit, o les línies no coincideixen amb el format d'exportació esperat (cada
+ línia ha de ser un objecte JSON amb les claus «type» i «data», amb tipus admesos
+ per aquesta importació).
+ publish_import: Publica la importació
+ summary_count_label: Quantitat
+ summary_item_label: Element
+ title: Confirma les teves dades d'importació
+ revert:
+ started: La importació s'està revertint en segon pla.
+ revert_failure:
+ description: Torna-ho a provar
+ title: La reversió de la importació ha fallat
+ try_again: Torna-ho a provar
+ show:
+ finalize_mappings: Finalitza els teus mapatges abans de continuar.
+ finalize_upload: Finalitza la pujada del fitxer.
+ steps:
+ clean: Neteja
+ configure: Configuració
+ confirm: Confirma
+ map: Mapatge
+ progress: Pas %{step} de %{total}
+ select: Selecciona
+ upload: Pujada
+ success:
+ back_to_dashboard: Tornar al tauler
+ description: Les teves dades importades s'han afegit correctament a l'aplicació
+ i ja es poden utilitzar.
+ title: Importació correcta
table:
- title: Imports
+ empty: Encara no hi ha importacions.
header:
+ actions: Accions
date: Data
operation: Operació
status: Estat
- actions: Accions
row:
+ actions:
+ confirm_revert: Això eliminarà les transaccions que s'han importat, però
+ encara podràs revisar i tornar a importar les teves dades en qualsevol
+ moment.
+ delete: Elimina
+ revert: Reverteix
+ view: Veure
status:
- in_progress: En curs
- uploading: Processant files
- reverting: Revertint
- revert_failed: Reversió fallida
complete: Completat
failed: Error
- actions:
- revert: Revertir
- confirm_revert: Això suprimirà les transaccions que s'han importat, però encara podràs revisar i tornar a importar les teves dades en qualsevol moment.
- delete: Elimina
- view: Veure
- empty: Encara no hi ha importacions.
- new:
- description: Pots importar manualment diversos tipus de dades via CSV o utilitzar
- una de les nostres plantilles d'importació com Mint.
- import_accounts: Importa comptes
- import_categories: Importa categories
- import_mint: Importa des de Mint
- import_portfolio: Importa inversions
- import_rules: Importa regles
- import_transactions: Importa transaccions
- resume: Reprèn %{type}
- sources: Fonts
- title: Nova importació CSV
- ready:
- description: Aquí tens un resum dels nous elements que s'afegiran al teu compte
- un cop publiquis aquesta importació.
- title: Confirma les teves dades d'importació
- summary_item_label: Element
- summary_count_label: Quantitat
- empty_summary: No s'han trobat registres importables en aquest fitxer. Pot estar buit, o les línies no coincideixen amb el format d'exportació esperat (cada línia ha de ser un objecte JSON amb les claus «type» i «data», amb tipus admesos per aquesta importació).
- publish_import: Publicar la importació
- back_to_imports: Tornar a les importacions
+ in_progress: En curs
+ revert_failed: Reversió fallida
+ reverting: Revertint
+ uploading: Processant files
+ type_labels:
+ account_import: Compte
+ actual_import: Actual
+ category_import: Categoria
+ document_import: Document
+ mint_import: Mint
+ pdf_import: PDF
+ qif_import: QIF
+ rule_import: Regla
+ sure_import: Sure
+ trade_import: Operació
+ transaction_import: Transacció
+ title: Importacions
+ type_labels:
+ account_import: Importació de comptes
+ actual_import: Importació d'Actual
+ category_import: Importació de categories
+ document_import: Importació de documents
+ mint_import: Importació de Mint
+ pdf_import: Importació PDF
+ qif_import: Importació QIF
+ rule_import: Importació de regles
+ sure_import: Importació Sure
+ trade_import: Importació d'operacions
+ transaction_import: Importació de transaccions
+ update:
+ account_saved: Compte desat.
+ invalid_account: No s'ha trobat el compte.
diff --git a/config/locales/views/indexa_capital_items/ca.yml b/config/locales/views/indexa_capital_items/ca.yml
new file mode 100644
index 000000000..e8daf63ac
--- /dev/null
+++ b/config/locales/views/indexa_capital_items/ca.yml
@@ -0,0 +1,249 @@
+---
+ca:
+ indexa_capital_items:
+ complete_account_setup:
+ all_skipped: S'han omès tots els comptes. No s'ha creat cap compte.
+ creation_failed: 'No s''han pogut crear els comptes: %{error}'
+ no_accounts: No hi ha comptes per configurar.
+ success: S'han creat correctament %{count} compte(s).
+ create:
+ success: La connexió Indexa Capital s'ha creat correctament
+ destroy:
+ success: La connexió Indexa Capital s'ha eliminat
+ errors:
+ provider_not_configured: El proveïdor Indexa Capital no està configurat
+ index:
+ title: Connexions Indexa Capital
+ indexa_capital_item:
+ accounts_need_setup: Els comptes necessiten configuració
+ delete: Elimina la connexió
+ deletion_in_progress: eliminació en curs...
+ error: Error
+ more_accounts_available:
+ one: "%{count} compte més disponible"
+ other: "%{count} comptes més disponibles"
+ no_accounts_description: Aquesta connexió encara no té comptes enllaçats.
+ no_accounts_title: No hi ha comptes
+ provider_name: Indexa Capital
+ requires_update: La connexió necessita actualització
+ setup_action: Configura els nous comptes
+ setup_description: "%{linked} de %{total} comptes enllaçats. Tria els tipus
+ de compte per als teus nous comptes Indexa Capital importats."
+ setup_needed: Nous comptes a punt per configurar
+ status: Sincronitzat fa %{timestamp} — %{summary}
+ status_never: Mai sincronitzat
+ syncing: Sincronitzant...
+ total: Total
+ unlinked: Sense enllaç
+ update_credentials: Actualitza les credencials
+ institution_summary:
+ count:
+ one: "%{count} entitat"
+ other: "%{count} entitats"
+ none: No hi ha entitats connectades
+ link_accounts:
+ all_already_linked:
+ one: El compte seleccionat (%{names}) ja està enllaçat
+ other: 'Tots els %{count} comptes seleccionats ja estan enllaçats: %{names}'
+ api_error: 'Error de l''API: %{message}'
+ invalid_account_names:
+ one: No es pot enllaçar un compte sense nom
+ other: No es poden enllaçar %{count} comptes sense nom
+ link_failed: No s'han pogut enllaçar els comptes
+ no_accounts_selected: Selecciona almenys un compte
+ no_api_key: No s'han trobat les credencials d'Indexa Capital. Configura-les a
+ la configuració del proveïdor.
+ partial_invalid: S'han enllaçat correctament %{created_count} compte(s), %{already_linked_count}
+ ja estaven enllaçats, %{invalid_count} compte(s) tenien noms no vàlids
+ partial_success: 'S''han enllaçat correctament %{created_count} compte(s). %{already_linked_count}
+ compte(s) ja estaven enllaçats: %{already_linked_names}'
+ success:
+ one: S'ha enllaçat correctament %{count} compte
+ other: S'han enllaçat correctament %{count} comptes
+ link_existing_account:
+ account_already_linked: Aquest compte ja està enllaçat a un proveïdor
+ api_error: 'Error de l''API: %{message}'
+ invalid_account_name: No es pot enllaçar un compte sense nom
+ missing_parameters: Falten paràmetres obligatoris
+ no_api_key: No s'han trobat les credencials d'Indexa Capital. Configura-les a
+ la configuració del proveïdor.
+ provider_account_already_linked: Aquest compte Indexa Capital ja està enllaçat
+ a un altre compte
+ provider_account_not_found: No s'ha trobat el compte Indexa Capital
+ success: S'ha enllaçat correctament %{account_name} amb Indexa Capital
+ loading:
+ loading_message: Carregant comptes d'Indexa Capital...
+ loading_title: Carregant
+ panel:
+ alternative_auth: O utilitza l'autenticació amb nom d'usuari/contrasenya...
+ field_descriptions: 'Descripció dels camps:'
+ fields:
+ api_token:
+ description: El teu token API només de lectura del panell d'Indexa Capital
+ label: Token API
+ placeholder_new: Enganxa el teu token API aquí
+ placeholder_update: Introdueix un nou token API per actualitzar
+ document:
+ description: El teu document/ID d'Indexa Capital
+ label: ID del document
+ placeholder_new: Enganxa l'ID del document aquí
+ placeholder_update: Introdueix un nou ID de document per actualitzar
+ password:
+ description: La teva contrasenya d'Indexa Capital
+ label: Contrasenya
+ placeholder_new: Enganxa la contrasenya aquí
+ placeholder_update: Introdueix una nova contrasenya per actualitzar
+ username:
+ description: El teu nom d'usuari/correu electrònic d'Indexa Capital
+ label: Nom d'usuari
+ placeholder_new: Enganxa el nom d'usuari aquí
+ placeholder_update: Introdueix un nou nom d'usuari per actualitzar
+ optional: "(opcional)"
+ optional_with_default: "(opcional, per defecte %{default_value})"
+ required: "(obligatori)"
+ save_button: Desa la configuració
+ setup_instructions: 'Instruccions de configuració:'
+ step_1: Visita el teu panell d'Indexa Capital per generar un token API només
+ de lectura
+ step_2: Enganxa el teu token API a continuació i fes clic a Desa
+ step_3: Després d'una connexió correcta, ves a la pestanya Comptes per configurar
+ nous comptes
+ update_button: Actualitza la configuració
+ preload_accounts:
+ no_credentials_configured: Primer, configura les teves credencials d'Indexa Capital
+ a la configuració del proveïdor.
+ select_accounts:
+ accounts_selected: comptes seleccionats
+ api_error: 'Error de l''API: %{message}'
+ cancel: Cancel·la
+ configure_name_in_provider: No es pot importar — configura el nom del compte
+ a Indexa Capital
+ description: Selecciona els comptes que vols enllaçar al teu compte de %{product_name}.
+ link_accounts: Enllaça els comptes seleccionats
+ no_accounts_found: No s'han trobat comptes. Comprova les teves credencials d'Indexa Capital.
+ no_api_key: Les credencials d'Indexa Capital no estan configurades. Configura-les
+ a la configuració.
+ no_credentials_configured: Primer, configura les teves credencials d'Indexa Capital
+ a la configuració del proveïdor.
+ no_name_placeholder: "(Sense nom)"
+ title: Selecciona comptes Indexa Capital
+ select_existing_account:
+ account_already_linked: Aquest compte ja està enllaçat a un proveïdor
+ all_accounts_already_linked: Tots els comptes Indexa Capital ja estan enllaçats
+ api_error: 'Error de l''API: %{message}'
+ balance_label: 'Saldo:'
+ cancel: Cancel·la
+ cancel_button: Cancel·la
+ configure_name_in_provider: No es pot importar — configura el nom del compte
+ a Indexa Capital
+ connect_hint: Connecta un compte Indexa Capital per habilitar la sincronització
+ automàtica.
+ description: Selecciona un compte Indexa Capital per enllaçar-lo amb aquest compte.
+ Les transaccions es sincronitzaran i deduplicaran automàticament.
+ header: Enllaça amb Indexa Capital
+ link_account: Enllaça compte
+ link_button: Enllaça aquest compte
+ linking_to: 'Enllaçant a:'
+ no_account_specified: No s'ha especificat cap compte
+ no_accounts: No s'han trobat comptes Indexa Capital sense enllaçar.
+ no_accounts_found: No s'han trobat comptes Indexa Capital. Comprova les teves
+ credencials.
+ no_api_key: Les credencials d'Indexa Capital no estan configurades. Configura-les
+ a la configuració.
+ no_credentials_configured: Primer, configura les teves credencials d'Indexa Capital
+ a la configuració del proveïdor.
+ no_name_placeholder: "(Sense nom)"
+ settings_link: Ves a la configuració del proveïdor
+ subtitle: Tria un compte Indexa Capital
+ title: Enllaça %{account_name} amb Indexa Capital
+ setup_accounts:
+ account_type_label: 'Tipus de compte:'
+ account_types:
+ credit_card: Targeta de crèdit
+ crypto: Compte de criptomonedes
+ depository: Compte corrent o d'estalvis
+ investment: Compte d'inversió
+ loan: Préstec o hipoteca
+ other_asset: Altre actiu
+ skip: Omet aquest compte
+ accounts_count:
+ one: "%{count} compte disponible"
+ other: "%{count} comptes disponibles"
+ all_accounts_linked: Tots els teus comptes Indexa Capital ja s'han configurat.
+ api_error: 'Error de l''API: %{message}'
+ balance: Saldo
+ cancel: Cancel·la
+ choose_account_type: 'Tria el tipus de compte correcte per a cada compte Indexa Capital:'
+ create_accounts: Crea comptes
+ creating: Creant comptes...
+ creating_accounts: Creant comptes...
+ fetch_failed: No s'han pogut obtenir els comptes
+ historical_data_range: 'Rang de dades històriques:'
+ import_selected: Importa els comptes seleccionats
+ instructions: Selecciona els comptes que vols importar des d'Indexa Capital.
+ Pots triar diversos comptes.
+ no_accounts: No s'han trobat comptes sense enllaçar d'aquesta connexió Indexa Capital.
+ no_accounts_to_setup: No hi ha comptes per configurar
+ no_api_key: Les credencials d'Indexa Capital no estan configurades. Revisa la
+ configuració de la connexió.
+ select_all: Selecciona-ho tot
+ subtitle: Tria els tipus de compte correctes per als teus comptes importats
+ subtype_labels:
+ credit_card: ''
+ crypto: ''
+ depository: 'Subtipus de compte:'
+ investment: 'Tipus d''inversió:'
+ loan: 'Tipus de préstec:'
+ other_asset: ''
+ subtype_messages:
+ credit_card: Les targetes de crèdit es configuraran automàticament com a comptes
+ de targeta de crèdit.
+ crypto: Els comptes de criptomonedes es configuraran per fer el seguiment
+ de posicions i transaccions.
+ other_asset: No calen opcions addicionals per a altres actius.
+ subtypes:
+ depository:
+ cd: Certificat de dipòsit
+ checking: Compte corrent
+ hsa: Compte d'estalvi per a salut
+ money_market: Mercat monetari
+ savings: Estalvis
+ investment:
+ 401k: 401(k)
+ 403b: 403(b)
+ 529_plan: Pla 529
+ angel: Inversió àngel
+ brokerage: Corredoria
+ hsa: Compte d'estalvi per a salut
+ ira: IRA tradicional
+ mutual_fund: Fons d'inversió
+ pension: Pensió
+ retirement: Jubilació
+ roth_401k: Roth 401(k)
+ roth_ira: IRA Roth
+ tsp: Pla d'estalvis de jubilació (TSP)
+ loan:
+ auto: Préstec d'automòbil
+ mortgage: Hipoteca
+ other: Altre préstec
+ student: Préstec d'estudis
+ sync_start_date_help: Selecciona fins on vols sincronitzar l'historial de transaccions.
+ sync_start_date_label: 'Comença a sincronitzar transaccions des de:'
+ title: Configura els teus comptes Indexa Capital
+ sync:
+ status:
+ calculating: Calculant saldos...
+ checking_setup: Comprovant la configuració dels comptes...
+ importing: Important comptes des d'Indexa Capital...
+ importing_data: Important dades del compte...
+ needs_setup: "%{count} comptes necessiten configuració..."
+ processing: Processant posicions i activitats...
+ success: Sincronització iniciada
+ sync_status:
+ no_accounts: No s'han trobat comptes
+ synced:
+ one: "%{count} compte sincronitzat"
+ other: "%{count} comptes sincronitzats"
+ synced_with_setup: "%{linked} sincronitzats, %{unlinked} necessiten configuració"
+ update:
+ success: La connexió Indexa Capital s'ha actualitzat
diff --git a/config/locales/views/investments/ca.yml b/config/locales/views/investments/ca.yml
index a7a0cd9b9..3325ed665 100644
--- a/config/locales/views/investments/ca.yml
+++ b/config/locales/views/investments/ca.yml
@@ -10,9 +10,181 @@ ca:
title: Introdueix el saldo del compte
show:
chart_title: Valor total
+ subtypes:
+ 401k:
+ long: 401(k)
+ short: 401(k)
+ 403b:
+ long: 403(b)
+ short: 403(b)
+ 457b:
+ long: 457(b)
+ short: 457(b)
+ 529_plan:
+ long: Pla 529 d'estalvi per a l'educació
+ short: Pla 529
+ angel:
+ long: Inversió àngel
+ short: Àngel
+ apy:
+ long: Atal Pension Yojana
+ short: APY
+ brokerage:
+ long: Compte de broker
+ short: Broker
+ corporate_bond:
+ long: Bo corporatiu
+ short: Bo corporatiu
+ fd:
+ long: Dipòsit a termini fix
+ short: FD
+ g_sec:
+ long: Valors governamentals (G-Secs)
+ short: G-Sec
+ gold:
+ long: Or (físic o digital)
+ short: Or
+ gold_etf:
+ long: ETF d'or
+ short: ETF d'or
+ gold_mf:
+ long: Fons mutu d'or
+ short: MF d'or
+ hsa:
+ long: Compte d'estalvi sanitari
+ short: HSA
+ indian_equity:
+ long: Renda variable índia
+ short: Renda variable índia
+ indian_etf:
+ long: ETF indi
+ short: ETF indi
+ indian_stocks:
+ long: Accions índies (Demat)
+ short: Accions índies
+ infrastructure_bond:
+ long: Bo d'infraestructures
+ short: Bo d'infraestr.
+ ira:
+ long: IRA tradicional
+ short: IRA
+ isa:
+ long: Compte d'estalvi individual
+ short: ISA
+ kvp:
+ long: Kisan Vikas Patra
+ short: KVP
+ life_insurance:
+ long: Assegurança de vida
+ short: Assegurança de vida
+ lira:
+ long: Compte de jubilació bloquejat
+ short: LIRA
+ lisa:
+ long: ISA vitalícia
+ short: LISA
+ mutual_fund:
+ long: Fons d'inversió
+ short: Fons d'inversió
+ nps:
+ long: Sistema nacional de pensions
+ short: NPS
+ nsc:
+ long: Certificat nacional d'estalvi
+ short: NSC
+ other:
+ long: Altra inversió
+ short: Altres
+ pea:
+ long: Plan d'Épargne en Actions
+ short: PEA
+ pension:
+ long: Pensió
+ short: Pensió
+ pillar_3a:
+ long: Pensió privada (Pilar 3a)
+ short: Pilar 3a
+ pomis:
+ long: Pla mensual de l'oficina de correus
+ short: POMIS
+ ppf:
+ long: Fons provident públic
+ short: PPF
+ rd:
+ long: Dipòsit recurrent
+ short: RD
+ resp:
+ long: Pla registrat d'estalvi per a l'educació
+ short: RESP
+ retirement:
+ long: Compte de jubilació
+ short: Jubilació
+ riester:
+ long: Riester-Rente
+ short: Riester
+ roth_401k:
+ long: Roth 401(k)
+ short: Roth 401(k)
+ roth_ira:
+ long: Roth IRA
+ short: Roth IRA
+ rrif:
+ long: Fons registrat d'ingressos de jubilació
+ short: RRIF
+ rrsp:
+ long: Pla registrat d'estalvi per a la jubilació
+ short: RRSP
+ scss:
+ long: Pla d'estalvi per a gent gran
+ short: SCSS
+ sdl:
+ long: Préstecs de desenvolupament estatal (SDL)
+ short: SDL
+ sep_ira:
+ long: SEP IRA
+ short: SEP IRA
+ sgb:
+ long: Bo sobirà d'or
+ short: SGB
+ simple_ira:
+ long: SIMPLE IRA
+ short: SIMPLE IRA
+ sipp:
+ long: Pensió personal autoinvertida
+ short: SIPP
+ smsf:
+ long: Fons de superannuació autogestionat
+ short: SMSF
+ ssy:
+ long: Sukanya Samriddhi Yojana
+ short: SSY
+ super:
+ long: Superannuació
+ short: Super
+ tax_free_bond:
+ long: Bo exempt d'impostos
+ short: Bo exempt
+ tfsa:
+ long: Compte d'estalvi lliure d'impostos
+ short: TFSA
+ trust:
+ long: Fideïcomís
+ short: Fideïcomís
+ tsp:
+ long: Thrift Savings Plan
+ short: TSP
+ ugma:
+ long: Compte custodi UGMA
+ short: UGMA
+ utma:
+ long: Compte custodi UTMA
+ short: UTMA
+ workplace_pension_uk:
+ long: Pensió laboral
+ short: Pensió
value_tooltip:
cash: Efectiu
holdings: Posicions
- total: Saldo del portafolis
- total_value_tooltip: El saldo total del portafolis és la suma de l'efectiu de
+ total: Saldo de la cartera
+ total_value_tooltip: El saldo total de la cartera és la suma de l'efectiu del
broker (disponible per operar) i el valor de mercat actual de les teves posicions.
diff --git a/config/locales/views/invitation_mailer/ca.yml b/config/locales/views/invitation_mailer/ca.yml
index da59026b1..31f2f8295 100644
--- a/config/locales/views/invitation_mailer/ca.yml
+++ b/config/locales/views/invitation_mailer/ca.yml
@@ -3,6 +3,6 @@ ca:
invitation_mailer:
invite_email:
accept_button: Accepta la invitació
- body: "%{inviter} t'ha convidat a unir-te a la família %{family} a %{product_name}!"
+ body: "%{inviter} t'ha convidat a unir-te a %{family} (%{moniker}) a %{product_name}!"
expiry_notice: Aquesta invitació caducarà en %{days} dies
greeting: Benvingut/da a %{product_name}!
diff --git a/config/locales/views/invitations/ca.yml b/config/locales/views/invitations/ca.yml
index e065d17d4..5c11e701b 100644
--- a/config/locales/views/invitations/ca.yml
+++ b/config/locales/views/invitations/ca.yml
@@ -1,7 +1,14 @@
---
ca:
invitations:
+ accept_choice:
+ create_account: Crea un compte nou
+ joined_household: T'has unit a la llar.
+ message: "%{inviter} t'ha convidat a unir-te com a %{role}."
+ sign_in_existing: Ja tinc un compte
+ title: Uneix-te a %{family}
create:
+ existing_user_added: S'ha afegit l'usuari a la teva llar.
failure: No s'ha pogut enviar la invitació
success: Invitació enviada correctament
destroy:
@@ -12,8 +19,9 @@ ca:
email_label: Correu electrònic
email_placeholder: Introdueix el correu electrònic
role_admin: Administrador/a
+ role_guest: Convidat/da
role_label: Rol
role_member: Membre
- submit: Envia invitació
- subtitle: Envia una invitació per unir-te al teu compte familiar a %{product_name}
+ submit: Envia la invitació
+ subtitle: Envia una invitació perquè s'uneixi al teu compte de %{product_name}
title: Convida algú
diff --git a/config/locales/views/invite_codes/ca.yml b/config/locales/views/invite_codes/ca.yml
index e9485d61d..26633cd4f 100644
--- a/config/locales/views/invite_codes/ca.yml
+++ b/config/locales/views/invite_codes/ca.yml
@@ -1,6 +1,10 @@
---
ca:
invite_codes:
+ create:
+ success: Codi generat
+ destroy:
+ success: Codi eliminat
index:
invite_code_description: Genera un nou codi per veure'l aquí. Els codis generats
que s'hagin utilitzat ja no es mostraran.
diff --git a/config/locales/views/kraken_items/ca.yml b/config/locales/views/kraken_items/ca.yml
new file mode 100644
index 000000000..1bbe2c645
--- /dev/null
+++ b/config/locales/views/kraken_items/ca.yml
@@ -0,0 +1,95 @@
+---
+ca:
+ kraken_item:
+ syncer:
+ accounts_need_setup:
+ one: "%{count} compte necessita configuració"
+ other: "%{count} comptes necessiten configuració"
+ calculating_balances: Calculant saldos...
+ checking_configuration: Comprovant la configuració del compte...
+ checking_credentials: Comprovant credencials...
+ credentials_invalid: Credencials de l'API de Kraken no vàlides. Revisa la teva
+ clau API i el secret.
+ importing_accounts: Important comptes des de Kraken...
+ processing_accounts: Processant dades del compte...
+ kraken_items:
+ complete_account_setup:
+ no_accounts: No hi ha comptes per importar
+ none_selected: No s'ha seleccionat cap compte
+ success:
+ one: S'ha importat %{count} compte
+ other: S'han importat %{count} comptes
+ create:
+ default_name: Kraken
+ success: S'ha connectat correctament a Kraken. El teu compte de l'exchange s'està
+ sincronitzant.
+ destroy:
+ success: S'ha programat la connexió Kraken per a la seva eliminació.
+ kraken_item:
+ delete: Elimina
+ deletion_in_progress: Eliminant...
+ import_accounts_menu: Importa compte
+ no_accounts_message: El teu compte de l'exchange Kraken apareixerà aquí després
+ de sincronitzar.
+ no_accounts_title: No s'han trobat comptes
+ provider_name: Kraken
+ reconnect: Les credencials necessiten actualització
+ setup_action: Importa compte
+ setup_description: Importa aquesta connexió Kraken com a compte d'exchange de
+ cripto.
+ setup_needed: Compte a punt per importar
+ stale_rate_warning: El saldo és aproximat perquè el tipus de canvi exacte per
+ a %{date} no estava disponible. S'actualitzarà a la propera sincronització.
+ status: Darrera sincronització fa %{timestamp}
+ status_never: Mai sincronitzat
+ status_with_summary: Darrera sincronització fa %{timestamp} - %{summary}
+ sync_status:
+ all_synced:
+ one: "%{count} compte sincronitzat"
+ other: "%{count} comptes sincronitzats"
+ no_accounts: No s'han trobat comptes
+ partial_sync: "%{linked_count} sincronitzats, %{unlinked_count} necessiten
+ configuració"
+ syncing: Sincronitzant...
+ link_accounts:
+ select_connection: Tria una connexió Kraken abans d'enllaçar comptes.
+ link_existing_account:
+ errors:
+ invalid_kraken_account: Compte Kraken no vàlid
+ kraken_account_already_linked: Aquest compte Kraken ja està enllaçat
+ only_manual: Només els comptes manuals d'exchange de cripto sense un enllaç
+ de proveïdor existent es poden enllaçar a Kraken
+ select_connection: Tria una connexió Kraken abans d'enllaçar comptes.
+ success: S'ha enllaçat correctament al compte Kraken
+ provider_connection:
+ default_description: Enllaça amb un compte de l'exchange Kraken
+ default_name: Kraken
+ description: Enllaça amb %{name}
+ name: Kraken - %{name}
+ select_accounts:
+ no_credentials_configured: Afegeix les credencials de l'API de Kraken abans
+ de configurar els comptes.
+ select_connection: Tria una connexió Kraken a la configuració del proveïdor.
+ select_existing_account:
+ cancel: Cancel·la
+ check_provider_health: Comprova que les teves credencials de l'API de Kraken
+ siguin vàlides.
+ link: Enllaça
+ no_accounts_found: No s'han trobat comptes Kraken.
+ title: Enllaça compte Kraken
+ wait_for_sync: Espera que Kraken acabi la sincronització.
+ setup_accounts:
+ accounts_count:
+ one: "%{count} compte disponible"
+ other: "%{count} comptes disponibles"
+ cancel: Cancel·la
+ creating: Important...
+ import_selected: Importa els seleccionats
+ instructions: Kraken importa un compte d'exchange de cripto combinat per a aquesta
+ connexió, només amb posicions i execucions d'operacions al comptat.
+ no_accounts: Tots els comptes Kraken s'han importat.
+ select_all: Selecciona-ho tot
+ subtitle: Selecciona el compte de l'exchange per fer-ne el seguiment
+ title: Importa compte Kraken
+ update:
+ success: La connexió Kraken s'ha actualitzat correctament.
diff --git a/config/locales/views/layout/ca.yml b/config/locales/views/layout/ca.yml
index d2981ad51..f7bf5a2b4 100644
--- a/config/locales/views/layout/ca.yml
+++ b/config/locales/views/layout/ca.yml
@@ -2,24 +2,28 @@
ca:
layouts:
application:
- privacy_mode: Alternar mode de privadesa
- skip_to_main: Saltar al contingut principal
nav:
assistant: Assistent
budgets: Pressupostos
home: Inici
reports: Informes
transactions: Transaccions
+ privacy_mode: Commuta el mode de privadesa
+ skip_to_main: Salta al contingut principal
auth:
existing_account: Ja tens un compte?
- no_account: Nou a %{product_name}?
+ no_account: Ets nou a %{product_name}?
sign_in: Inicia sessió
sign_up: Crea un compte
shared:
+ confirm_dialog:
+ are_you_sure: Segur que vols continuar?
+ cannot_be_undone: Aquesta acció no es pot desfer.
+ confirm: Confirma
footer:
- privacy_policy: Política de privacitat
- terms_of_service: Termes del servei
+ privacy_policy: Política de privadesa
+ terms_of_service: Condicions del servei
trial:
- open_demo: Demo oberta
+ contribute: Contribueix
data_deleted_in_days: Les dades s'eliminaran en %{days} dies
- contribute: Contribuir
\ No newline at end of file
+ open_demo: Demostració oberta
diff --git a/config/locales/views/loans/ca.yml b/config/locales/views/loans/ca.yml
index 74a8f1a52..c22103a32 100644
--- a/config/locales/views/loans/ca.yml
+++ b/config/locales/views/loans/ca.yml
@@ -7,7 +7,10 @@ ca:
initial_balance: Saldo inicial del préstec
interest_rate: Tipus d'interès
interest_rate_placeholder: '5.25'
- rate_type: Tipus d'interès
+ none: Cap
+ rate_type: Modalitat del tipus
+ subtype_none: Cap
+ subtype_prompt: Selecciona el tipus de préstec
term_months: Termini (mesos)
term_months_placeholder: '360'
new:
@@ -23,6 +26,7 @@ ca:
unknown: Desconegut
tabs:
overview:
+ edit_loan_details: Edita els detalls del préstec
interest_rate: Tipus d'interès
monthly_payment: Quota mensual
not_applicable: No aplicable
diff --git a/config/locales/views/lunchflow_items/ca.yml b/config/locales/views/lunchflow_items/ca.yml
index 525e285ee..0df27fcba 100644
--- a/config/locales/views/lunchflow_items/ca.yml
+++ b/config/locales/views/lunchflow_items/ca.yml
@@ -1,9 +1,22 @@
---
ca:
lunchflow_items:
+ api_error:
+ check_provider_settings: Revisa la configuració del proveïdor
+ common_issues: 'Problemes habituals:'
+ expired_credentials_desc: Genera una nova clau API des de Lunch Flow
+ expired_credentials_label: Credencials caducades
+ invalid_api_key_desc: Revisa la teva clau API a la configuració del proveïdor
+ invalid_api_key_label: Clau API no vàlida
+ network_issue_desc: Comprova la teva connexió a internet
+ network_issue_label: Problema de xarxa
+ service_down_desc: L'API de Lunch Flow pot estar temporalment no disponible
+ service_down_label: Servei caigut
+ title: Error de connexió Lunch Flow
+ unable_to_connect: No s'ha pogut connectar a Lunch Flow
complete_account_setup:
all_skipped: S'han omès tots els comptes. No s'ha creat cap compte.
- creation_failed: "No s'han pogut crear els comptes: %{error}"
+ creation_failed: 'No s''han pogut crear els comptes: %{error}'
no_accounts: No hi ha comptes per configurar.
success: S'han creat correctament %{count} compte(s).
create:
@@ -15,80 +28,88 @@ ca:
link_accounts:
all_already_linked:
one: El compte seleccionat (%{names}) ja està enllaçat
- other: "Tots els %{count} comptes seleccionats ja estan enllaçats: %{names}"
- api_error: "Error d'API: %{message}"
+ other: 'Tots els %{count} comptes seleccionats ja estan enllaçats: %{names}'
+ api_error: 'Error de l''API: %{message}'
invalid_account_names:
one: No es pot enllaçar un compte sense nom
other: No es poden enllaçar %{count} comptes sense nom
link_failed: No s'han pogut enllaçar els comptes
- no_accounts_selected: Si us plau, selecciona almenys un compte
- no_api_key: No hi ha clau API
+ no_accounts_selected: Selecciona almenys un compte
+ no_api_key: La clau API de Lunch Flow no està configurada. Configura-la a la
+ configuració.
+ no_credentials_configured: Configura primer la teva clau API de Lunch Flow a
+ la configuració del proveïdor.
partial_invalid: S'han enllaçat correctament %{created_count} compte(s), %{already_linked_count}
ja estaven enllaçats, %{invalid_count} compte(s) tenien noms no vàlids
- partial_success: "S'han enllaçat correctament %{created_count} compte(s). %{already_linked_count}
- compte(s) ja estaven enllaçats: %{already_linked_names}"
+ partial_success: 'S''han enllaçat correctament %{created_count} compte(s). %{already_linked_count}
+ compte(s) ja estaven enllaçats: %{already_linked_names}'
success:
one: S'ha enllaçat correctament %{count} compte
other: S'han enllaçat correctament %{count} comptes
link_existing_account:
account_already_linked: Aquest compte ja està enllaçat a un proveïdor
- api_error: "Error d'API: %{message}"
+ api_error: 'Error de l''API: %{message}'
invalid_account_name: No es pot enllaçar un compte sense nom
lunchflow_account_already_linked: Aquest compte de Lunch Flow ja està enllaçat
a un altre compte
lunchflow_account_not_found: No s'ha trobat el compte de Lunch Flow
- missing_parameters: Falten els paràmetres requerits
- no_api_key: No hi ha clau API
+ missing_parameters: Falten paràmetres obligatoris
+ no_api_key: La clau API de Lunch Flow no està configurada. Configura-la a la
+ configuració.
success: S'ha enllaçat correctament %{account_name} amb Lunch Flow
loading:
loading_message: Carregant comptes de Lunch Flow...
loading_title: Carregant
lunchflow_item:
accounts_need_setup: Els comptes necessiten configuració
- delete: Eliminar connexió
- deletion_in_progress: s'està eliminant...
+ delete: Elimina la connexió
+ deletion_in_progress: eliminació en curs...
error: Error
no_accounts_description: Aquesta connexió encara no té comptes enllaçats.
no_accounts_title: No hi ha comptes
- setup_action: Configurar nous comptes
- setup_description: "%{linked} de %{total} comptes enllaçats. Tria els tipus de comptes
- per als teus comptes de Lunch Flow importats recentment."
- setup_needed: Nous comptes preparats per a la configuració
- status: Sincronitzat %{timestamp} fa
+ setup_action: Configura els nous comptes
+ setup_description: "%{linked} de %{total} comptes enllaçats. Tria els tipus
+ de compte per als teus nous comptes Lunch Flow importats."
+ setup_needed: Nous comptes a punt per configurar
+ status: Sincronitzat fa %{timestamp}
status_never: Mai sincronitzat
- status_with_summary: Sincronitzat per última vegada %{timestamp} fa • %{summary}
+ status_with_summary: Darrera sincronització fa %{timestamp} • %{summary}
syncing: Sincronitzant...
total: Total
unlinked: Sense enllaç
select_accounts:
accounts_selected: comptes seleccionats
- api_error: "Error d'API: %{message}"
+ api_error: 'Error de l''API: %{message}'
cancel: Cancel·la
- configure_name_in_lunchflow: No es pot importar - si us plau, configura el nom del compte a
- Lunchflow
- description: Selecciona els comptes que vols enllaçar amb el teu compte de %{product_name}.
+ configure_name_in_lunchflow: No es pot importar — configura el nom del compte
+ a Lunch Flow
+ description: Selecciona els comptes que vols enllaçar al teu compte de %{product_name}.
link_accounts: Enllaça els comptes seleccionats
- no_accounts_found: No s'han trobat comptes. Si us plau, comprova la configuració de la teva clau API.
- no_api_key: La clau API de Lunch Flow no està configurada. Configura-la a Configuració.
- no_credentials_configured: Primer, configura la teva clau API de Lunch Flow a
- Configuració de proveïdors.
+ no_accounts_found: No s'han trobat comptes. Comprova la configuració de la teva
+ clau API.
+ no_api_key: La clau API de Lunch Flow no està configurada. Configura-la a la
+ configuració.
+ no_credentials_configured: Configura primer la teva clau API de Lunch Flow a
+ la configuració del proveïdor.
no_name_placeholder: "(Sense nom)"
title: Selecciona comptes de Lunch Flow
select_existing_account:
account_already_linked: Aquest compte ja està enllaçat a un proveïdor
all_accounts_already_linked: Tots els comptes de Lunch Flow ja estan enllaçats
- api_error: "Error d'API: %{message}"
+ api_error: 'Error de l''API: %{message}'
cancel: Cancel·la
- configure_name_in_lunchflow: No es pot importar - si us plau, configura el nom del compte a
- Lunchflow
- description: Selecciona un compte de Lunch Flow per enllaçar-lo amb aquest compte. Les transaccions
- se sincronitzaran i deduplicaran automàticament.
+ configure_name_in_lunchflow: No es pot importar — configura el nom del compte
+ a Lunch Flow
+ description: Selecciona un compte de Lunch Flow per enllaçar-lo amb aquest compte.
+ Les transaccions es sincronitzaran i deduplicaran automàticament.
link_account: Enllaça compte
no_account_specified: No s'ha especificat cap compte
- no_accounts_found: No s'han trobat comptes de Lunch Flow. Si us plau, comprova la configuració de la teva clau API.
- no_api_key: La clau API de Lunch Flow no està configurada. Configura-la a Configuració.
- no_credentials_configured: Primer, configura la teva clau API de Lunch Flow a
- Configuració de proveïdors.
+ no_accounts_found: No s'han trobat comptes de Lunch Flow. Comprova la configuració
+ de la teva clau API.
+ no_api_key: La clau API de Lunch Flow no està configurada. Configura-la a la
+ configuració.
+ no_credentials_configured: Configura primer la teva clau API de Lunch Flow a
+ la configuració del proveïdor.
no_name_placeholder: "(Sense nom)"
title: Enllaça %{account_name} amb Lunch Flow
setup_accounts:
@@ -97,62 +118,75 @@ ca:
credit_card: Targeta de crèdit
depository: Compte corrent o d'estalvis
investment: Compte d'inversió
- loan: Prèstec o hipoteca
- other_asset: Alt actiu
+ loan: Préstec o hipoteca
+ other_asset: Altre actiu
skip: Omet aquest compte
all_accounts_linked: Tots els teus comptes de Lunch Flow ja s'han configurat.
- api_error: "Error d'API: %{message}"
+ api_error: 'Error de l''API: %{message}'
balance: Saldo
cancel: Cancel·la
- choose_account_type: 'Tria el tipus de compte correcte per a cada compte de Lunch Flow:'
- create_accounts: Crear comptes
+ choose_account_type: 'Tria el tipus de compte correcte per a cada compte de
+ Lunch Flow:'
+ create_accounts: Crea comptes
creating_accounts: Creant comptes...
fetch_failed: No s'han pogut obtenir els comptes
historical_data_range: 'Rang de dades històriques:'
no_accounts_to_setup: No hi ha comptes per configurar
- no_api_key: La clau API de Lunch Flow no està configurada. Si us plau, comprova la configuració
+ no_api_key: La clau API de Lunch Flow no està configurada. Revisa la configuració
de la connexió.
- subtitle: Tria els tipus de comptes correctes per als teus comptes importats
+ subtitle: Tria els tipus de compte correctes per als teus comptes importats
subtype_labels:
- credit_card: Targeta de crèdit
+ credit_card: ''
depository: 'Subtipus de compte:'
- investment: "Tipus d'inversió:"
- loan: "Tipus de préstec:"
- other_asset: Alt actiu
+ investment: 'Tipus d''inversió:'
+ loan: 'Tipus de préstec:'
+ other_asset: ''
subtype_messages:
- credit_card: Les targetes de crèdit es configuraran automàticament com a comptes de targeta de crèdit.
- other_asset: No calen opcions addicionals per als Altres Actius.
+ credit_card: Les targetes de crèdit es configuraran automàticament com a comptes
+ de targeta de crèdit.
+ other_asset: No calen opcions addicionals per a altres actius.
subtypes:
depository:
- cd: Certificat de Dipòsit
+ cd: Certificat de dipòsit
checking: Compte corrent
- hsa: Compte d'estalvis de salut
- money_market: Fons mercant
- savings: Compte d'estalvis
+ hsa: Compte d'estalvi per a salut
+ money_market: Mercat monetari
+ savings: Estalvis
investment:
401k: 401(k)
403b: 403(b)
529_plan: Pla 529
- angel: Àngel
+ angel: Inversió àngel
brokerage: Corredoria
- hsa: Compte d'estalvis de salut
+ hsa: Compte d'estalvi per a salut
ira: IRA tradicional
- mutual_fund: Fons comú d'inversió
- pension: Jubilació
+ mutual_fund: Fons d'inversió
+ pension: Pensió
retirement: Jubilació
- roth_401k: 401(k) Roth
+ roth_401k: Roth 401(k)
roth_ira: IRA Roth
- tsp: Pla d'estalvis de retirada (TSP)
+ tsp: Pla d'estalvis de jubilació (TSP)
loan:
- auto: Prèstec de vehicle
+ auto: Préstec d'automòbil
mortgage: Hipoteca
- other: Alt préstec
- student: Prèstec estudiantil
+ other: Altre préstec
+ student: Préstec d'estudis
sync_start_date_help: Selecciona fins on vols sincronitzar l'historial de transaccions.
- Està disponible un màxim de 3 anys d'historial.
- sync_start_date_label: 'Començar a sincronitzar transaccions des de:'
+ Hi ha un màxim de 3 anys d'historial disponible.
+ sync_start_date_label: 'Comença a sincronitzar transaccions des de:'
title: Configura els teus comptes de Lunch Flow
+ setup_required:
+ api_key_description: Abans d'enllaçar comptes Lunch Flow, has de configurar
+ la teva clau API de Lunch Flow.
+ api_key_not_configured: Clau API no configurada
+ go_to_provider_settings: Ves a la configuració del proveïdor
+ setup_step_1_html: Ves a Configuració → Proveïdors
+ setup_step_2_html: Localitza la secció Lunch Flow
+ setup_step_3: Introdueix la teva clau API de Lunch Flow
+ setup_step_4: Torna aquí per enllaçar els teus comptes
+ setup_steps_title: 'Passos de configuració:'
+ title: Cal configurar Lunch Flow
sync:
- success: S'ha iniciat la sincronització
+ success: Sincronització iniciada
update:
success: La connexió amb Lunch Flow s'ha actualitzat
diff --git a/config/locales/views/merchants/ca.yml b/config/locales/views/merchants/ca.yml
index 96de7b12e..5ac3254f1 100644
--- a/config/locales/views/merchants/ca.yml
+++ b/config/locales/views/merchants/ca.yml
@@ -9,20 +9,37 @@ ca:
unlinked_success: El comerç s'ha eliminat de les teves transaccions
edit:
title: Edita el comerç
+ enhance:
+ already_running: La millora ja està en curs. Espera que acabi.
+ success: S'ha iniciat la millora de comerços del proveïdor. Aviat es milloraran
+ els comerços i es fusionaran els duplicats.
+ family_merchant:
+ delete: Elimina
+ edit: Edita
form:
name_placeholder: Nom del comerç
+ website_hint: Introdueix el lloc web del comerç per mostrar-ne automàticament
+ el logotip
+ website_placeholder: Lloc web (p. ex., starbucks.com)
index:
empty: Encara no hi ha comerços
- family_empty: Encara no hi ha comerços familiars
- family_title: Comerços familiars
+ enhance_button: Millora amb IA
+ enhance_info:
+ one: A %{count} comerç del proveïdor li falta informació del lloc web. Millora
+ amb IA per detectar llocs web, mostrar logotips i fusionar comerços duplicats.
+ other: A %{count} comerços del proveïdor els falta informació del lloc web.
+ Millora amb IA per detectar llocs web, mostrar logotips i fusionar comerços
+ duplicats.
+ family_empty: Encara no hi ha comerços
+ family_title: Els teus comerços
merge: Fusiona comerços
new: Nou comerç
- provider_empty: Encara no hi ha comerços del proveïdor vinculats a aquesta família
- provider_info: Aquests comerços es van detectar automàticament mitjançant les teves connexions
- bancàries o IA. Pots editar-los per crear la teva pròpia còpia, o eliminar-los per desvincular-los
- de les teves transaccions.
- provider_read_only: Els comerços del proveïdor se sincronitzen automàticament
- amb les institucions connectades. No es poden editar aquí.
+ provider_empty: Encara no hi ha comerços del proveïdor vinculats
+ provider_info: Aquests comerços es van detectar automàticament mitjançant les
+ teves connexions bancàries o l'IA. Pots editar-los per crear-ne una còpia
+ pròpia, o eliminar-los per desvincular-los de les teves transaccions.
+ provider_read_only: Els comerços del proveïdor se sincronitzen des de les teves
+ institucions connectades. No es poden editar aquí.
provider_title: Comerços del proveïdor
table:
actions: Accions
@@ -30,8 +47,9 @@ ca:
source: Origen
title: Comerços
unlinked_info: Aquests comerços s'han eliminat recentment de les teves transaccions.
- Desapareixeran d'aquesta llista després de 30 dies a menys que s'assignin novament a una transacció.
- unlinked_title: Recently unlinked
+ Desapareixeran d'aquesta llista al cap de 30 dies si no s'assignen novament
+ a una transacció.
+ unlinked_title: Desvinculats recentment
merchant:
confirm_accept: Elimina el comerç
confirm_body: Segur que vols eliminar aquest comerç? Si l'elimines, es desvincularan
@@ -40,29 +58,31 @@ ca:
delete: Elimina el comerç
edit: Edita el comerç
merge:
- description: Select a target merchant and the merchants to merge into it. All
- transactions from merged merchants will be reassigned to the target.
- select_target: Select target merchant...
- sources_hint: Selected merchants will be merged into the target. Family merchants
- will be deleted, provider merchants will be unlinked.
- sources_label: Merchants to merge
- submit: Merge selected
- target_label: Merge into (target)
- title: Merge merchants
+ description: Selecciona un comerç de destinació i els comerços que hi vols fusionar.
+ Totes les transaccions dels comerços fusionats es reassignaran a la destinació.
+ select_target: Selecciona el comerç de destinació...
+ sources_hint: Els comerços seleccionats es fusionaran amb el de destinació.
+ Els comerços de la família s'eliminaran, els del proveïdor es desvincularan.
+ sources_label: Comerços per fusionar
+ submit: Fusiona els seleccionats
+ target_label: Fusiona amb (destinació)
+ title: Fusiona comerços
new:
title: Nou comerç
perform_merge:
- invalid_merchants: Invalid merchants selected
- no_merchants_selected: No merchants selected to merge
- success: Successfully merged %{count} merchants
- target_not_found: Target merchant not found
+ invalid_merchants: Comerços seleccionats no vàlids
+ no_merchants_selected: No s'ha seleccionat cap comerç per fusionar
+ success:
+ one: S'ha fusionat correctament %{count} comerç
+ other: S'han fusionat correctament %{count} comerços
+ target_not_found: No s'ha trobat el comerç de destinació
provider_merchant:
- edit: Edit
- remove: Remove
- remove_confirm_body: Are you sure you want to remove %{name}? This will unlink
- all associated transactions from this merchant but will not delete the merchant
- itself.
- remove_confirm_title: Remove merchant?
+ edit: Edita
+ remove: Elimina
+ remove_confirm_body: Segur que vols eliminar %{name}? Això desvincularà totes
+ les transaccions associades d'aquest comerç, però no eliminarà el comerç en
+ si.
+ remove_confirm_title: Vols eliminar el comerç?
update:
- converted_success: Merchant converted and updated successfully
+ converted_success: Comerç convertit i actualitzat correctament
success: Comerç actualitzat correctament
diff --git a/config/locales/views/mercury_items/ca.yml b/config/locales/views/mercury_items/ca.yml
new file mode 100644
index 000000000..0f8636dd4
--- /dev/null
+++ b/config/locales/views/mercury_items/ca.yml
@@ -0,0 +1,233 @@
+---
+ca:
+ mercury_items:
+ api_error:
+ check_provider_settings: Revisa la configuració del proveïdor
+ common_issues: 'Problemes habituals:'
+ expired_credentials_desc: Genera un nou token API des de Mercury
+ expired_credentials_label: Credencials caducades
+ insufficient_permissions_desc: Assegura't que el teu token té accés només de
+ lectura
+ insufficient_permissions_label: Permisos insuficients
+ invalid_api_token_desc: Revisa el teu token API a la configuració del proveïdor
+ invalid_api_token_label: Token API no vàlid
+ network_issue_desc: Comprova la teva connexió a internet
+ network_issue_label: Problema de xarxa
+ service_down_desc: L'API de Mercury pot estar temporalment no disponible
+ service_down_label: Servei caigut
+ title: Error de connexió Mercury
+ unable_to_connect: No s'ha pogut connectar a Mercury
+ complete_account_setup:
+ all_skipped: S'han omès tots els comptes. No s'ha creat cap compte.
+ creation_failed: 'No s''han pogut crear els comptes: %{error}'
+ no_accounts: No hi ha comptes per configurar.
+ success: S'han creat correctament %{count} compte(s).
+ create:
+ success: La connexió Mercury s'ha creat correctament
+ destroy:
+ success: La connexió Mercury s'ha eliminat
+ index:
+ title: Connexions Mercury
+ link_accounts:
+ all_already_linked:
+ one: El compte seleccionat (%{names}) ja està enllaçat
+ other: 'Tots els %{count} comptes seleccionats ja estan enllaçats: %{names}'
+ api_error: 'Error de l''API: %{message}'
+ invalid_account_names:
+ one: No es pot enllaçar un compte sense nom
+ other: No es poden enllaçar %{count} comptes sense nom
+ link_failed: No s'han pogut enllaçar els comptes
+ no_accounts_selected: Selecciona almenys un compte
+ no_api_token: No s'ha trobat el token API de Mercury. Configura'l a la configuració
+ del proveïdor.
+ partial_invalid: S'han enllaçat correctament %{created_count} compte(s), %{already_linked_count}
+ ja estaven enllaçats, %{invalid_count} compte(s) tenien noms no vàlids
+ partial_success: 'S''han enllaçat correctament %{created_count} compte(s). %{already_linked_count}
+ compte(s) ja estaven enllaçats: %{already_linked_names}'
+ select_connection: Tria una connexió Mercury abans d'enllaçar comptes.
+ success:
+ one: S'ha enllaçat correctament %{count} compte
+ other: S'han enllaçat correctament %{count} comptes
+ link_existing_account:
+ account_already_linked: Aquest compte ja està enllaçat a un proveïdor
+ api_error: 'Error de l''API: %{message}'
+ invalid_account_name: No es pot enllaçar un compte sense nom
+ mercury_account_already_linked: Aquest compte Mercury ja està enllaçat a un
+ altre compte
+ mercury_account_not_found: No s'ha trobat el compte Mercury
+ missing_parameters: Falten paràmetres obligatoris
+ no_api_token: No s'ha trobat el token API de Mercury. Configura'l a la configuració
+ del proveïdor.
+ select_connection: Tria una connexió Mercury abans d'enllaçar comptes.
+ success: S'ha enllaçat correctament %{account_name} amb Mercury
+ loading:
+ loading_message: Carregant comptes Mercury...
+ loading_title: Carregant
+ mercury_item:
+ accounts_need_setup: Els comptes necessiten configuració
+ delete: Elimina la connexió
+ deletion_in_progress: eliminació en curs...
+ error: Error
+ no_accounts_description: Aquesta connexió encara no té comptes enllaçats.
+ no_accounts_title: No hi ha comptes
+ setup_action: Configura els nous comptes
+ setup_description: "%{linked} de %{total} comptes enllaçats. Tria els tipus
+ de compte per als teus nous comptes Mercury importats."
+ setup_needed: Nous comptes a punt per configurar
+ status: Sincronitzat fa %{timestamp}
+ status_never: Mai sincronitzat
+ status_with_summary: Darrera sincronització fa %{timestamp} - %{summary}
+ syncing: Sincronitzant...
+ total: Total
+ unlinked: Sense enllaç
+ mercury_item_selection_error_payload:
+ select_connection: Tria una connexió Mercury abans de carregar comptes.
+ provider_connection:
+ default_description: Connecta't al teu banc a través de Mercury
+ default_name: Mercury
+ description: Connecta amb %{name}
+ name: Mercury - %{name}
+ provider_panel:
+ add_connection: Afegeix connexió Mercury
+ base_url_label: URL base (opcional)
+ base_url_placeholder: https://api.mercury.com/api/v1 (per defecte)
+ connection_name_label: Nom de la connexió
+ connection_name_placeholder: Compte corrent d'empresa
+ default_connection_name: Connexió Mercury
+ disconnect_confirm: Vols desconnectar %{name}?
+ instructions:
+ copy_token_html: Copia el token sencer (incloent el prefix
+ secret-token:) i afegeix-lo com a connexió amb nom a continuació
+ create_token: Crea un nou token API amb accés "només de lectura"
+ open_tokens: Ves a Configuració > Desenvolupador > Tokens API
+ sign_in_html: Visita %{link} i inicia sessió al compte que vols connectar
+ whitelist_ip_html: "Important: afegeix l'adreça IP del teu
+ servidor a la llista blanca del token"
+ keep_token_placeholder: Deixa-ho en blanc per mantenir el token actual
+ sandbox_note_html: Utilitza una connexió amb nom separada per a cada inici de
+ sessió/token API de Mercury que vulguis sincronitzar. Per a proves en sandbox,
+ utilitza https://api-sandbox.mercury.com/api/v1 com a URL base.
+ Mercury requereix llistes blanques d'IP — assegura't d'afegir la teva IP al
+ panell de Mercury.
+ setup_accounts: Configura comptes
+ setup_title: 'Instruccions de configuració:'
+ sync: Sincronitza
+ token_label: Token
+ token_placeholder: Enganxa el token aquí
+ update_connection: Actualitza la connexió
+ render_mercury_item_selection_failure:
+ no_credentials_configured: Primer, configura el teu token API de Mercury a la
+ configuració del proveïdor.
+ select_connection: Tria una connexió Mercury a la configuració del proveïdor.
+ select_accounts:
+ accounts_selected: comptes seleccionats
+ api_error: 'Error de l''API: %{message}'
+ cancel: Cancel·la
+ configure_name_in_mercury: No es pot importar — configura el nom del compte
+ a Mercury
+ description: Selecciona els comptes que vols enllaçar al teu compte de %{product_name}.
+ link_accounts: Enllaça els comptes seleccionats
+ no_accounts_found: No s'han trobat comptes. Comprova la configuració del teu
+ token API.
+ no_api_token: El token API de Mercury no està configurat. Configura'l a la configuració.
+ no_credentials_configured: Primer, configura el teu token API de Mercury a la
+ configuració del proveïdor.
+ no_name_placeholder: "(Sense nom)"
+ select_connection: Tria una connexió Mercury a la configuració del proveïdor.
+ title: Selecciona comptes Mercury
+ select_existing_account:
+ account_already_linked: Aquest compte ja està enllaçat a un proveïdor
+ all_accounts_already_linked: Tots els comptes Mercury ja estan enllaçats
+ api_error: 'Error de l''API: %{message}'
+ cancel: Cancel·la
+ configure_name_in_mercury: No es pot importar — configura el nom del compte
+ a Mercury
+ description: Selecciona un compte Mercury per enllaçar-lo amb aquest compte.
+ Les transaccions es sincronitzaran i deduplicaran automàticament.
+ link_account: Enllaça compte
+ no_account_specified: No s'ha especificat cap compte
+ no_accounts_found: No s'han trobat comptes Mercury. Comprova la configuració
+ del teu token API.
+ no_api_token: El token API de Mercury no està configurat. Configura'l a la configuració.
+ no_credentials_configured: Primer, configura el teu token API de Mercury a la
+ configuració del proveïdor.
+ no_name_placeholder: "(Sense nom)"
+ select_connection: Tria una connexió Mercury a la configuració del proveïdor.
+ title: Enllaça %{account_name} amb Mercury
+ setup_accounts:
+ account_type_label: 'Tipus de compte:'
+ account_types:
+ credit_card: Targeta de crèdit
+ depository: Compte corrent o d'estalvis
+ investment: Compte d'inversió
+ loan: Préstec o hipoteca
+ other_asset: Altre actiu
+ skip: Omet aquest compte
+ all_accounts_linked: Tots els teus comptes Mercury ja s'han configurat.
+ api_error: 'Error de l''API: %{message}'
+ balance: Saldo
+ cancel: Cancel·la
+ choose_account_type: 'Tria el tipus de compte correcte per a cada compte Mercury:'
+ create_accounts: Crea comptes
+ creating_accounts: Creant comptes...
+ fetch_failed: No s'han pogut obtenir els comptes
+ historical_data_range: 'Rang de dades històriques:'
+ no_accounts_to_setup: No hi ha comptes per configurar
+ no_api_token: El token API de Mercury no està configurat. Revisa la configuració
+ de la connexió.
+ subtitle: Tria els tipus de compte correctes per als teus comptes importats
+ subtype_labels:
+ credit_card: ''
+ depository: 'Subtipus de compte:'
+ investment: 'Tipus d''inversió:'
+ loan: 'Tipus de préstec:'
+ other_asset: ''
+ subtype_messages:
+ credit_card: Les targetes de crèdit es configuraran automàticament com a comptes
+ de targeta de crèdit.
+ other_asset: No calen opcions addicionals per a altres actius.
+ subtypes:
+ depository:
+ cd: Certificat de dipòsit
+ checking: Compte corrent
+ hsa: Compte d'estalvi per a salut
+ money_market: Mercat monetari
+ savings: Estalvis
+ investment:
+ 401k: 401(k)
+ 403b: 403(b)
+ 529_plan: Pla 529
+ angel: Inversió àngel
+ brokerage: Corredoria
+ hsa: Compte d'estalvi per a salut
+ ira: IRA tradicional
+ mutual_fund: Fons d'inversió
+ pension: Pensió
+ retirement: Jubilació
+ roth_401k: Roth 401(k)
+ roth_ira: IRA Roth
+ tsp: Pla d'estalvis de jubilació (TSP)
+ loan:
+ auto: Préstec d'automòbil
+ mortgage: Hipoteca
+ other: Altre préstec
+ student: Préstec d'estudis
+ sync_start_date_help: Selecciona fins on vols sincronitzar l'historial de transaccions.
+ Hi ha un màxim de 3 anys d'historial disponible.
+ sync_start_date_label: 'Comença a sincronitzar transaccions des de:'
+ title: Configura els teus comptes Mercury
+ setup_required:
+ api_token_description: Abans d'enllaçar comptes Mercury, has de configurar el
+ teu token API de Mercury.
+ api_token_not_configured: Token API no configurat
+ go_to_provider_settings: Ves a la configuració del proveïdor
+ setup_step_1_html: Ves a Configuració > Proveïdors
+ setup_step_2_html: Localitza la secció Mercury
+ setup_step_3: Introdueix el teu token API de Mercury
+ setup_step_4: Torna aquí per enllaçar els teus comptes
+ setup_steps_title: 'Passos de configuració:'
+ title: Cal configurar Mercury
+ sync:
+ success: Sincronització iniciada
+ update:
+ success: La connexió Mercury s'ha actualitzat
diff --git a/config/locales/views/messages/ca.yml b/config/locales/views/messages/ca.yml
new file mode 100644
index 000000000..1eaca20ef
--- /dev/null
+++ b/config/locales/views/messages/ca.yml
@@ -0,0 +1,6 @@
+---
+ca:
+ messages:
+ chat_form:
+ disclaimer: Les respostes de la IA són només informatives. No són consells financers!
+ placeholder: Pregunta el que vulguis ...
diff --git a/config/locales/views/mfa/ca.yml b/config/locales/views/mfa/ca.yml
index 18cb4ffe5..e53541c1a 100644
--- a/config/locales/views/mfa/ca.yml
+++ b/config/locales/views/mfa/ca.yml
@@ -13,27 +13,36 @@ ca:
create:
invalid_code: Codi de verificació invàlid. Torna-ho a provar.
disable:
- success: L'autenticació en dos passos s'ha desactivat
+ success: L'autenticació de dos factors s'ha desactivat
new:
code_label: Codi de verificació
code_placeholder: Introdueix el codi de 6 dígits
- description: Millora la seguretat del teu compte activant l'autenticació en
- dos passos
- page_title: Configuració de l'autenticació en dos passos
+ description: Millora la seguretat del teu compte activant l'autenticació de
+ dos factors
+ page_title: Configuració de l'autenticació de dos factors
scan_description: Utilitza una app d'autenticació com Google Authenticator o
1Password per escanejar aquest codi QR
scan_title: 1. Escaneja el codi QR
secret_description: Si no pots escanejar el codi QR, introdueix aquesta clau
manualment a la teva app d'autenticació
secret_title: Codi d'entrada manual
- title: Activa l'autenticació en dos passos
+ title: Activa l'autenticació de dos factors
verify_button: Verifica i activa 2FA
verify_description: Introdueix el codi de 6 dígits de la teva app d'autenticació
verify_title: 2. Introdueix el codi de verificació
verify:
description: Introdueix el codi de la teva app d'autenticació per continuar
- page_title: Verifica l'autenticació en dos passos
- title: Autenticació en dos passos
+ or: o
+ page_title: Verifica l'autenticació de dos factors
+ title: Autenticació de dos factors
verify_button: Verifica
+ webauthn_button: Utilitza una clau d'accés o de seguretat
+ webauthn_unsupported: Aquest navegador no admet claus d'accés ni de seguretat.
verify_code:
invalid_code: Codi d'autenticació invàlid. Torna-ho a provar.
+ verify_webauthn:
+ invalid_credential: No s'ha pogut verificar aquesta clau d'accés o de seguretat.
+ Torna-ho a provar.
+ webauthn_options:
+ unavailable: No hi ha claus d'accés ni de seguretat disponibles per a aquest
+ compte.
diff --git a/config/locales/views/oidc_accounts/ca.yml b/config/locales/views/oidc_accounts/ca.yml
index 06ad64409..568f549a9 100644
--- a/config/locales/views/oidc_accounts/ca.yml
+++ b/config/locales/views/oidc_accounts/ca.yml
@@ -1,33 +1,49 @@
---
ca:
oidc_accounts:
+ create_link:
+ no_pending_oidc: No s'ha trobat cap autenticació OIDC pendent
+ create_user:
+ account_created: Benvingut/da! S'ha creat el teu compte.
+ account_creation_disabled: La creació de comptes SSO està desactivada. Contacta
+ amb un administrador.
+ no_pending_oidc: No s'ha trobat cap autenticació OIDC pendent
link:
- title_link: Enllaçar compte OIDC
- title_create: Crear compte
- verify_heading: Verificar la vostra identitat
- verify_description_html: "Per enllaçar el vostre compte %{provider}%{email_suffix}, verifiqueu la vostra identitat introduint la contrasenya."
- email_suffix_html: " (%{email})"
+ account_creation_disabled: La creació de nous comptes mitjançant inici de sessió
+ únic està desactivada. Contacta amb un administrador per crear el teu compte.
+ cancel: Cancel·la
+ create_description_html: No s'ha trobat cap compte amb el correu electrònic
+ %{email}. Fes clic a sota per crear un compte nou amb la
+ teva identitat de %{provider}.
+ create_heading: Crea un compte nou
email_label: Correu electrònic
- email_placeholder: Introduïu el vostre correu electrònic
+ email_placeholder: Introdueix el teu correu electrònic
+ email_suffix_html: " (%{email})"
+ info_email: 'Correu electrònic:'
+ info_name: 'Nom:'
+ no_pending_oidc: No s'ha trobat cap autenticació OIDC pendent
password_label: Contrasenya
- password_placeholder: Introduïu la vostra contrasenya
- verify_hint: Això garanteix que només vós pugueu enllaçar comptes externs al vostre perfil.
- submit_link: Enllaçar compte
- create_heading: Crear compte nou
- create_description_html: "No s'ha trobat cap compte amb el correu electrònic %{email}. Feu clic a baix per crear un compte nou amb la vostra identitat %{provider}."
- info_email: "Correu electrònic:"
- info_name: "Nom:"
- submit_create: Crear compte
- account_creation_disabled: La creació de comptes mitjançant l'inici de sessió únic està desactivada. Contacteu amb un administrador.
- cancel: Cancel·lar
+ password_placeholder: Introdueix la teva contrasenya
+ submit_accept_invitation: Accepta la invitació
+ submit_create: Crea el compte
+ submit_link: Enllaça el compte
+ title_create: Crea un compte
+ title_link: Enllaça el compte OIDC
+ verify_description_html: Per enllaçar el teu compte %{provider}%{email_suffix},
+ verifica la teva identitat introduint la contrasenya.
+ verify_heading: Verifica la teva identitat
+ verify_hint: Així garantim que només tu pots enllaçar comptes externs al teu
+ perfil.
new_user:
- title: Completar el compte
- heading: Crear el compte
- description: Confirmeu les vostres dades per completar la creació del compte amb la vostra identitat %{provider}.
+ cancel: Cancel·la
+ description: Confirma les teves dades per completar la creació del compte amb
+ la teva identitat de %{provider}.
email_label: Correu electrònic (del proveïdor SSO)
first_name_label: Nom
- first_name_placeholder: Introduïu el vostre nom
+ first_name_placeholder: Introdueix el teu nom
+ heading: Crea el teu compte
last_name_label: Cognom
- last_name_placeholder: Introduïu el vostre cognom
- submit: Crear compte
- cancel: Cancel·lar
\ No newline at end of file
+ last_name_placeholder: Introdueix el teu cognom
+ no_pending_oidc: No s'ha trobat cap autenticació OIDC pendent
+ submit: Crea el compte
+ title: Completa el teu compte
diff --git a/config/locales/views/onboardings/ca.yml b/config/locales/views/onboardings/ca.yml
index 9036a1efe..919d84017 100644
--- a/config/locales/views/onboardings/ca.yml
+++ b/config/locales/views/onboardings/ca.yml
@@ -1,61 +1,71 @@
---
ca:
onboardings:
+ goals:
+ ai_insights: Deixar que la IA m'ajudi a entendre les meves finances
+ budgeting: Gestionar plans financers i pressupostos
+ cashflow: Entendre el flux de caixa i les despeses
+ investments: Fer el seguiment d'inversions
+ optimization: Analitzar i optimitzar comptes
+ partner: Gestionar les finances amb la parella
+ reduce_stress: Reduir l'estrès o l'ansietat financera
+ submit: Següent
+ subtitle: Selecciona un o més objectius que tens amb %{product_name} com a eina
+ de finances personals.
+ title: Què t'ha portat aquí?
+ unified_accounts: Veure tots els meus comptes en un sol lloc
header:
- sign_out: Tancar sessió
- setup: Configuració
- preferences: Preferències
goals: Objectius
+ preferences: Preferències
+ setup: Configuració
+ sign_out: Tanca la sessió
start: Inici
logout:
- sign_out: Tancar sessió
+ sign_out: Tanca la sessió
+ preferences:
+ color_theme: Tema de color
+ currency: Divisa
+ date_format: Format de data
+ example: Compte d'exemple
+ locale: Idioma
+ preview: Previsualitza com es mostren les dades segons les preferències.
+ submit: Finalitza
+ subtitle: Configurem les teves preferències.
+ theme_dark: Fosc
+ theme_light: Clar
+ theme_system: Sistema
+ title: Configura les teves preferències
show:
- title: Configurem el teu compte
- subtitle: Primer de tot, completem el teu perfil.
+ country: País
first_name: Nom
first_name_placeholder: Nom
- last_name: Cognom
- last_name_placeholder: Cognom
+ group_name: Nom del grup
+ group_name_placeholder: Nom del grup
household_name: Nom de la llar
household_name_placeholder: Nom de la llar
- country: País
- submit: Continuar
- preferences:
- title: Configura les teves preferències
- subtitle: Configurem les teves preferències.
- example: Compte d'exemple
- preview: Previsualitza com es mostren les dades segons les preferències.
- color_theme: Tema de colors
- theme_system: Sistema
- theme_light: Clar
- theme_dark: Fosc
- locale: Idioma
- currency: Moneda
- date_format: Format de data
- submit: Completar
- goals:
- title: Què t'ha portat aquí?
- subtitle: Selecciona un o més objectius que tens amb %{product_name} com a eina de finances personals.
- unified_accounts: Veure tots els meus comptes en un sol lloc
- cashflow: Entendre el flux de caixa i les despeses
- budgeting: Gestionar plans financers i pressupostos
- partner: Gestionar finances amb la parella
- investments: Seguir les inversions
- ai_insights: Deixar que la IA m'ajudi a entendre les meves finances
- optimization: Analitzar i optimitzar comptes
- reduce_stress: Reduir l'estrès financer o l'ansietat
- submit: Següent
+ last_name: Cognom
+ last_name_placeholder: Cognom
+ moniker_family: Membres de la família (tu sol/a o amb la teva parella, fills,
+ etc.)
+ moniker_group: Grup de persones (empresa, club, associació, qualsevol altre
+ tipus)
+ moniker_prompt: Faràs servir %{product_name} amb...
+ submit: Continua
+ subtitle: Primer de tot, completem el teu perfil.
+ title: Configurem el teu compte
trial:
- title: Prova Sure durant 45 dies
+ continue_trial: Continua la prova
data_deletion: Les dades s'eliminaran després
- description_html: A partir d'avui pots provar el producte a fons. Si t'agrada, allotja'l tu mateix o contribueix per continuar usant-lo aquí.
- try_button: Provar Sure durant 45 dies
- continue_trial: Continuar la prova
- upgrade: Actualitzar
- how_it_works: Com funciona
+ description_html: A partir d'avui pots fer una bona ullada al producte. Si
+ t'agrada, autoallotja'l o contribueix per continuar fent-lo servir aquí.
+ how_it_works: Com funcionen les coses aquí
+ in_40_days: D'aquí 40 dies (%{date})
+ in_40_days_description: T'avisarem perquè recordis exportar les teves dades.
+ in_45_days: D'aquí 45 dies (%{date})
+ in_45_days_description: Eliminarem les teves dades — contribueix per continuar
+ fent servir Sure aquí!
+ title: Prova Sure durant 45 dies
today: Avui
today_description: Tindràs accés gratuït a Sure durant 45 dies al nostre AWS.
- in_40_days: En 40 dies (%{date})
- in_40_days_description: Et notificarem per recordar-te d'exportar les teves dades.
- in_45_days: En 45 dies (%{date})
- in_45_days_description: Eliminarem les teves dades — contribueix per continuar usant Sure aquí!
\ No newline at end of file
+ try_button: Prova Sure durant 45 dies
+ upgrade: Actualitza
diff --git a/config/locales/views/other_assets/ca.yml b/config/locales/views/other_assets/ca.yml
index b157b7ef7..1894503db 100644
--- a/config/locales/views/other_assets/ca.yml
+++ b/config/locales/views/other_assets/ca.yml
@@ -2,10 +2,12 @@
ca:
other_assets:
edit:
- balance_tracking_info: L'estat dels Altres Actius es segueix mitjançant valoracions manuals
- utilitzant 'Nou saldo', no transaccions. El flux de caixa no afectarà el saldo del compte.
+ balance_tracking_info: Els altres actius es segueixen mitjançant valoracions
+ manuals utilitzant 'Nou saldo', no transaccions. El flux de caixa no afectarà
+ el saldo del compte.
edit: Edita %{account}
new:
- balance_tracking_info: L'estat dels Altres Actius es segueix mitjançant valoracions manuals
- utilitzant 'Nou saldo', no transaccions. El flux de caixa no afectarà el saldo del compte.
+ balance_tracking_info: Els altres actius es segueixen mitjançant valoracions
+ manuals utilitzant 'Nou saldo', no transaccions. El flux de caixa no afectarà
+ el saldo del compte.
title: Introdueix els detalls de l'actiu
diff --git a/config/locales/views/pages/ca.yml b/config/locales/views/pages/ca.yml
index 4b0fdf4c7..13f95e886 100644
--- a/config/locales/views/pages/ca.yml
+++ b/config/locales/views/pages/ca.yml
@@ -6,8 +6,20 @@ ca:
dashboard:
balance_sheet:
add_accounts: Afegeix els teus comptes de %{name} per veure'n el detall complet
+ add_asset_accounts: Afegeix els teus comptes d'actius per veure'n el detall
+ complet
+ add_liability_accounts: Afegeix els teus comptes de passius per veure'n el
+ detall complet
+ classifications:
+ asset: Actius
+ liability: Passius
+ name: Nom
+ no_asset: Encara no hi ha actius
no_items: Encara no hi ha %{name}
+ no_liability: Encara no hi ha passius
title: Balanç patrimonial
+ value: Valor
+ weight: Pes
cashflow_sankey:
add_transaction: Afegeix una transacció
no_data_description: Afegeix transaccions per mostrar dades de flux de caixa
@@ -16,15 +28,15 @@ ca:
title: Flux de caixa
drag_to_reorder: Arrossega per reordenar la secció
investment_summary:
- add_investment: Afegeix un compte d'inversió per seguir el teu portafoli
- contributions: Contribucions
+ add_investment: Afegeix un compte d'inversió per seguir la teva cartera
+ contributions: Aportacions
holding: Posició
no_investments: No hi ha comptes d'inversió
- period_activity: "Activitat del %{period}"
+ period_activity: 'Activitat — %{period}'
return: Rendiment
title: Inversions
total_return: Rendiment total
- trades: Negocis
+ trades: Operacions
value: Valor
weight: Pes
withdrawals: Retirades
@@ -44,10 +56,50 @@ ca:
title: Encara no hi ha comptes
outflows_donut:
categories: Categories
- title: Sortides
- total_outflows: Total sortides
+ title: Sortides de caixa
+ total_outflows: Total de sortides de caixa
value: Valor
weight: Pes
subtitle: Això és el que està passant amb les teves finances
toggle_section: Commuta la visibilitat de la secció
welcome: Benvingut/da de nou, %{name}
+ feedback:
+ bug_report: Informa d'un error
+ description: Fes-nos saber si tens cap comentari específic. No dubtis a incloure
+ enllaços a vídeos o captures de pantalla.
+ discuss: Comenta %{product} amb d'altres
+ feature_request: Sol·licita una funcionalitat
+ heading: Deixa un comentari
+ title: Comentaris
+ intro:
+ coming_soon: Experiència d'introducció properament
+ description: Estem creant una experiència d'inici més rica per conèixer els
+ teus objectius, fites i necessitats diàries. De moment, ves a la barra lateral
+ del xat per iniciar una conversa amb Sure i explica'ns on et trobes al teu
+ recorregut financer.
+ not_authorized: La introducció només està disponible per a usuaris convidats.
+ start_chatting: Comença a xatejar
+ welcome: Benvingut/da!
+ privacy:
+ heading: Política de privadesa
+ placeholder: El contingut de la política de privadesa es mostrarà aquí.
+ title: Política de privadesa
+ redis_configuration_error:
+ heading: Cal configurar Redis
+ page_title: Cal configurar Redis - Sure
+ refresh_hint: Un cop hagis configurat Redis, recarrega aquesta pàgina per continuar.
+ refresh_page: Recarrega la pàgina
+ setup_guide_hint: Segueix la nostra guia completa de configuració de Docker
+ per configurar Redis
+ subheading: La teva instal·lació de Sure amb self hosting necessita Redis configurat
+ correctament.
+ view_setup_guide: Veure la guia de configuració
+ why_required_body: Sure utilitza Redis per executar les tasques en segon pla
+ de Sidekiq, com ara la sincronització de dades de comptes, el processament
+ d'importacions i altres operacions de fons que mantenen les teves dades financeres
+ actualitzades.
+ why_required_title: Per què cal Redis?
+ terms:
+ heading: Condicions del servei
+ placeholder: El contingut de les condicions del servei es mostrarà aquí.
+ title: Condicions del servei
diff --git a/config/locales/views/password_resets/ca.yml b/config/locales/views/password_resets/ca.yml
index 310a33cfa..8c91bb633 100644
--- a/config/locales/views/password_resets/ca.yml
+++ b/config/locales/views/password_resets/ca.yml
@@ -1,14 +1,18 @@
+---
ca:
password_resets:
- disabled: "El restabliment de la contrasenya a través de Sure està desactivat. Si us plau, restableix la teva contrasenya a través del teu proveïdor d'identitat."
+ disabled: El restabliment de contrasenya a través de Sure està desactivat. Restableix
+ la teva contrasenya a través del teu proveïdor d'identitat.
edit:
- title: "Restableix la contrasenya"
+ title: Restableix la contrasenya
new:
- back: "Enrere"
- requested: "Si us plau, revisa el teu correu electrònic; hi trobaràs un enllaç per restablir la contrasenya."
- submit: "Restableix la contrasenya"
- title: "Restableix la contrasenya"
- sso_only_user: "El teu compte utilitza SSO per a l'autenticació. Si us plau, contacta amb l'administrador per gestionar les teves credencials."
+ back: Enrere
+ requested: Revisa el teu correu electrònic; hi trobaràs un enllaç per restablir
+ la contrasenya.
+ submit: Restableix la contrasenya
+ title: Restableix la contrasenya
+ sso_only_user: El teu compte utilitza SSO per a l'autenticació. Contacta amb el
+ teu administrador per gestionar les credencials.
update:
- invalid_token: "El codi de verificació (token) no és vàlid."
- success: "La teva contrasenya s'ha restablert correctament."
\ No newline at end of file
+ invalid_token: El token no és vàlid.
+ success: La teva contrasenya s'ha restablert.
diff --git a/config/locales/views/passwords/ca.yml b/config/locales/views/passwords/ca.yml
index 300a17fd5..0163cb1a9 100644
--- a/config/locales/views/passwords/ca.yml
+++ b/config/locales/views/passwords/ca.yml
@@ -4,7 +4,7 @@ ca:
edit:
password: Nova contrasenya
password_challenge: Contrasenya actual
- submit: Restableix contrasenya
- title: Actualitza contrasenya
+ submit: Restableix la contrasenya
+ title: Actualitza la contrasenya
update:
success: La teva contrasenya s'ha restablert.
diff --git a/config/locales/views/pdf_import_mailer/ca.yml b/config/locales/views/pdf_import_mailer/ca.yml
new file mode 100644
index 000000000..a46919bd6
--- /dev/null
+++ b/config/locales/views/pdf_import_mailer/ca.yml
@@ -0,0 +1,21 @@
+---
+ca:
+ pdf_import_mailer:
+ next_steps:
+ document_stored_note: Aquest document s'ha desat per a la teva referència. Es
+ pot fer servir per donar context en futures converses amb la IA.
+ document_type_label: Tipus de document
+ footer_note: Aquest és un missatge automàtic. No responguis directament a aquest
+ correu electrònic.
+ greeting: Hola %{name},
+ intro: Hem acabat d'analitzar el document PDF que has pujat a %{product}.
+ next_steps_intro: 'Tens diverses opcions:'
+ next_steps_label: Què cal fer ara?
+ option_delete: Elimina aquesta importació si ja no la necessites
+ option_extract_transactions: Extreu transaccions d'aquest extracte
+ option_keep_reference: Mantén aquest document com a referència per a futures
+ converses amb la IA
+ summary_label: Resum d'IA
+ transactions_note: Sembla que aquest document conté transaccions. Ara pots extreure-les
+ i revisar-les.
+ view_import_button: Mira els detalls de la importació
diff --git a/config/locales/views/pending_duplicate_merges/ca.yml b/config/locales/views/pending_duplicate_merges/ca.yml
new file mode 100644
index 000000000..c57fdfc09
--- /dev/null
+++ b/config/locales/views/pending_duplicate_merges/ca.yml
@@ -0,0 +1,23 @@
+---
+ca:
+ pending_duplicate_merges:
+ create:
+ invalid_transaction: La transacció seleccionada per fusionar no és vàlida
+ merge_failed: No s'han pogut fusionar les transaccions
+ merge_success: Transacció pendent fusionada amb la transacció comptabilitzada
+ no_posted_selected: Selecciona una transacció comptabilitzada amb la qual fusionar
+ new:
+ next: 10 següents →
+ no_candidates: No s'ha trobat cap transacció comptabilitzada en aquest compte.
+ pending_transaction: Transacció pendent
+ previous: "← 10 anteriors"
+ select_posted: Selecciona la transacció comptabilitzada amb la qual fusionar
+ showing_range: Mostrant %{start} - %{end}
+ submit_button: Fusiona transaccions
+ title: Fusiona amb una transacció comptabilitzada
+ warning_description: Fes-ho servir per fusionar manualment una transacció pendent
+ amb la seva versió comptabilitzada. Això eliminarà la transacció pendent i
+ només es conservarà la comptabilitzada.
+ warning_title: Fusió manual de duplicats
+ set_transaction:
+ pending_only: Aquesta funció només està disponible per a transaccions pendents
diff --git a/config/locales/views/plaid_items/ca.yml b/config/locales/views/plaid_items/ca.yml
index 7b3387c70..9e8b97259 100644
--- a/config/locales/views/plaid_items/ca.yml
+++ b/config/locales/views/plaid_items/ca.yml
@@ -5,27 +5,33 @@ ca:
success: Compte enllaçat correctament. Espera mentre es sincronitzen els comptes.
destroy:
success: Comptes programats per a l'eliminació.
+ link_existing_account:
+ already_linked: Aquest compte Plaid ja està enllaçat
+ invalid_account: S'ha seleccionat un compte Plaid no vàlid
+ success: El compte s'ha enllaçat correctament a Plaid
plaid_item:
- add_new: Afegeix nova connexió
- confirm_accept: Elimina institució
+ add_new: Afegeix una connexió nova
+ confirm_accept: Elimina l'entitat
confirm_body: Això eliminarà permanentment tots els comptes d'aquest grup i
totes les dades associades.
- confirm_title: Vols eliminar la institució?
+ confirm_title: Vols eliminar l'entitat?
connection_lost: Connexió perduda
connection_lost_description: Aquesta connexió ja no és vàlida. Hauràs d'eliminar-la
i tornar-la a afegir per continuar sincronitzant dades.
delete: Elimina
error: S'ha produït un error en sincronitzar les dades
- no_accounts_description: No hem pogut carregar cap compte d'aquesta entitat
+ no_accounts_description: No s'ha pogut carregar cap compte d'aquesta entitat
financera.
no_accounts_title: No s'han trobat comptes
- requires_update: Cal tornar a autenticar
+ requires_update: Reconnecta
status: Darrera sincronització fa %{timestamp}
status_never: Cal sincronitzar dades
syncing: Sincronitzant...
- update: Actualitza la connexió
+ update: Actualitza
select_existing_account:
cancel: Cancel·la
description: Selecciona un compte Plaid per enllaçar-lo al teu compte existent
link_account: Enllaça el compte
+ no_available_accounts: No hi ha comptes Plaid disponibles per enllaçar. Primer
+ connecta un compte Plaid nou.
title: Enllaça %{account_name} amb Plaid
diff --git a/config/locales/views/properties/ca.yml b/config/locales/views/properties/ca.yml
index 496c9e355..b56b5d11b 100644
--- a/config/locales/views/properties/ca.yml
+++ b/config/locales/views/properties/ca.yml
@@ -1,6 +1,27 @@
---
ca:
properties:
+ address:
+ address_line1_label: Adreça línia 1
+ address_line1_placeholder: Carrer Major, 123
+ city_label: Ciutat
+ city_placeholder: Barcelona
+ country_label: País
+ country_placeholder: ESP
+ postal_code_label: Codi postal
+ postal_code_placeholder: '08001'
+ save: Desa
+ state_region_label: Província/Comarca
+ state_region_placeholder: BCN
+ title: Introdueix l'immoble manualment
+ balances:
+ market_value_label: Valor de mercat estimat
+ market_value_tooltip: El valor de mercat estimat del teu immoble. Aquest número
+ sovint es pot trobar a llocs com Idealista o Fotocasa, i mai és un número
+ exacte.
+ next: Següent
+ save: Desa
+ title: Introdueix l'immoble manualment
edit:
edit: Edita %{account}
form:
@@ -22,7 +43,8 @@ ca:
year_built: Any de construcció
year_built_placeholder: '2000'
new:
- title: Introdueix els detalls de l'immoble
+ next: Següent
+ title: Introdueix l'immoble manualment
overview:
living_area: Superfície habitable
market_value: Valor de mercat
@@ -30,4 +52,40 @@ ca:
trend: Tendència
unknown: Desconegut
year_built: Any de construcció
-
+ overview_fields:
+ area_label: Superfície (opcional)
+ area_placeholder: '1200'
+ area_unit_label: Unitat de superfície
+ name_label: Nom
+ name_placeholder: Segona residència
+ property_type_label: Tipus d'immoble
+ square_feet: Peus quadrats
+ square_meters: Metres quadrats
+ subtype_prompt: Selecciona el tipus
+ year_built_label: Any de construcció (opcional)
+ year_built_placeholder: '1990'
+ subtypes:
+ agri_land:
+ long: Terra agrícola
+ short: Terra agrícola
+ apartment:
+ long: Pis
+ short: Pis
+ commercial:
+ long: Immoble comercial
+ short: Comercial
+ plot:
+ long: Solar / Terreny
+ short: Solar
+ rented:
+ long: Immoble llogat
+ short: Llogat
+ tabs:
+ overview:
+ edit_account_details: Edita els detalls del compte
+ living_area: Superfície habitable
+ market_value: Valor de mercat
+ purchase_price: Preu de compra
+ trend: Tendència
+ unknown: Desconegut
+ year_built: Any de construcció
diff --git a/config/locales/views/recurring_transactions/ca.yml b/config/locales/views/recurring_transactions/ca.yml
index 0e444699b..2c74c907a 100644
--- a/config/locales/views/recurring_transactions/ca.yml
+++ b/config/locales/views/recurring_transactions/ca.yml
@@ -1,53 +1,64 @@
---
ca:
recurring_transactions:
- already_exists: A manual recurring transaction already exists for this pattern
+ already_exists: Ja existeix una transacció recurrent manual per a aquest patró
amount_range: 'Rang: %{min} a %{max}'
badges:
manual: Manual
cleaned_up: S'han netejat %{count} transaccions recurrents obsoletes
- cleanup_stale: Neteja Obsoletes
+ cleanup_stale: Neteja obsoletes
confirm_delete: Segur que vols eliminar aquesta transacció recurrent?
creation_failed: No s'ha pogut crear la transacció recurrent. Comprova els detalls
de la transacció i torna-ho a provar.
day_of_month: Dia %{day} del mes
- deleted: S'ha eliminat la transacció recurrent
+ deleted: Transacció recurrent eliminada
empty:
- description: Clica "Identifica Patrons" per detectar automàticament transaccions
+ description: Clica «Identifica patrons» per detectar automàticament transaccions
recurrents del teu historial de transaccions.
title: No s'han trobat transaccions recurrents
- expected_on: S'esperava el %{date}
+ expected_in:
+ one: S'espera d'aquí a %{count} dia
+ other: S'espera d'aquí a %{count} dies
+ expected_today: S'espera avui
identified: S'han identificat %{count} patrons de transaccions recurrents
identify_patterns: Identifica patrons
info:
- automatic_description: "L'identificació automàtica també s'executa després de:"
+ automatic_description: 'La identificació automàtica també s''executa després
+ de:'
manual_description: Pots identificar patrons manualment o netejar transaccions
recurrents obsoletes utilitzant els botons de dalt.
title: Detecció automàtica de patrons
triggers:
- - Importacions CSV completades (transaccions, operacions, comptes, etc.)
- - Sincronitzacions de proveïdors completades (Plaid, SimpleFIN, etc.)
- marked_active: S'ha marcat la transacció recurrent com a activa
- marked_as_recurring: S'ha marcat la transacció com a recurrent
- marked_inactive: S'ha marcat la transacció recurrent com a inactiva
- projected: Projectat
+ - Importacions CSV completades (transaccions, operacions, comptes, etc.)
+ - Sincronitzacions de proveïdors completades (Plaid, SimpleFIN, etc.)
+ marked_active: Transacció recurrent marcada com a activa
+ marked_as_recurring: Transacció marcada com a recurrent
+ marked_inactive: Transacció recurrent marcada com a inactiva
+ projected: Projectada
recurring: Recurrent
settings:
- enable_description: Detecta automàticament patrons de transaccions recurrents i
- mostra les transaccions projectades properes.
- enable_label: Activa Transaccions Recurrents
- settings_updated: S'han actualitzat les configuracions de transaccions recurrents
+ enable_description: Detecta automàticament patrons de transaccions recurrents
+ i mostra les properes transaccions projectades.
+ enable_label: Activa les transaccions recurrents
+ settings_updated: S'ha actualitzat la configuració de transaccions recurrents
status:
active: Activa
inactive: Inactiva
table:
actions: Accions
amount: Import
- expected_day: Dia Esperat
- last_occurrence: Última Ocurrència
+ expected_day: Dia esperat
+ last_occurrence: Última ocurrència
merchant: Nom
- next_date: Propera Data
+ next_date: Pròxima data
status: Estat
- title: Transaccions Recurrents
+ title: Transaccions recurrents
+ transfer_already_exists: Ja existeix una transferència recurrent per a aquesta
+ parella de comptes
+ transfer_creation_failed: No s'ha pogut crear la transferència recurrent. Comprova
+ els detalls de la transferència i torna-ho a provar.
+ transfer_feature_disabled: Les transaccions recurrents estan desactivades per
+ a aquesta família
+ transfer_marked_as_recurring: Transferència marcada com a recurrent
unexpected_error: S'ha produït un error inesperat en crear la transacció recurrent
- upcoming: Transaccions Recurrents Properes
+ upcoming: Properes transaccions recurrents
diff --git a/config/locales/views/registrations/ca.yml b/config/locales/views/registrations/ca.yml
index 5e977ef2f..0069cfe20 100644
--- a/config/locales/views/registrations/ca.yml
+++ b/config/locales/views/registrations/ca.yml
@@ -15,17 +15,18 @@ ca:
success: T'has registrat correctament.
new:
invitation_message: "%{inviter} t'ha convidat a unir-te com a %{role}"
- join_family_title: Uneix-te a %{family}
+ join_family_title: Uneix-te a %{family} (%{moniker})
password_placeholder: Introdueix la teva contrasenya
+ password_requirements:
+ case: Majúscules i minúscules
+ length: Mínim 8 caràcters
+ number: Un número (0-9)
+ special: 'Un caràcter especial (!, @, #, $, %, etc)'
role_admin: administrador/a
+ role_guest: convidat/da
role_member: membre
submit: Crea el compte
title: Crea el teu compte
welcome_body: Per començar, has de registrar un compte nou. Després podràs configurar
opcions addicionals dins l'aplicació.
welcome_title: Benvingut/da a Self Hosted %{product_name}!
- password_requirements:
- length: Mínim 8 caràcters
- case: Majúscules i minúscules
- number: Un número (0-9)
- special: "Un caràcter especial (!, @, #, $, %, etc)"
diff --git a/config/locales/views/reports/ca.yml b/config/locales/views/reports/ca.yml
index 144b4fbb5..517dbfbd1 100644
--- a/config/locales/views/reports/ca.yml
+++ b/config/locales/views/reports/ca.yml
@@ -6,6 +6,7 @@ ca:
no_budgets: No s'ha configurat cap categoria de pressupost per aquest mes
over_by: Superat per
remaining: Restant
+ shared: compartit
spent: Gastat
status:
good: Sota control
@@ -14,29 +15,29 @@ ca:
suggested_daily: "%{amount} suggerits al dia per a %{days} dies restants"
title: Rendiment del pressupost
empty_state:
- add_account: Afegir compte
- add_transaction: Afegir transacció
- description: Comença a fer seguiment de les teves finances afegint transaccions o connectant
- els teus comptes per veure informes complets
+ add_account: Afegeix compte
+ add_transaction: Afegeix transacció
+ description: Comença a fer seguiment de les teves finances afegint transaccions
+ o connectant els teus comptes per veure informes complets
title: No hi ha dades disponibles
google_sheets_instructions:
close: D'acord
example: Exemple
- go_to_api_keys: Anar a claus API
+ go_to_api_keys: Ves a claus API
need_key: Per importar dades a Google Sheets, necessites una clau API.
- open_sheets: Obrir Google Sheets
+ open_sheets: Obre Google Sheets
ready: La teva URL CSV (amb clau API) està preparada.
- security_warning: Aquesta URL inclou la teva clau API. Mantingues-la segura!
- step1: Anar a Configuració → Claus API
+ security_warning: Aquesta URL inclou la teva clau API. Mantén-la segura!
+ step1: Ves a Configuració → Claus API
step2: Crea una nova clau API amb permisos de "lectura"
- step3: Còpia la clau API
- step4: 'Afegeix-la a aquesta URL com: ?api_key=TEVA_CLAU'
+ step3: Copia la clau API
+ step4: 'Afegeix-la a aquesta URL com: ?api_key=LA_TEVA_CLAU'
steps: |-
Per importar a Google Sheets:
1. Crea un full de Google nou
2. A la cel·la A1, introdueix la fórmula que es mostra a continuació
- 3. Prem Enter
- then_use: Després usa l'URL completa amb =IMPORTDATA() a Google Sheets.
+ 3. Prem Retorn
+ then_use: Després fes servir l'URL completa amb =IMPORTDATA() a Google Sheets.
title_no_key: "⚠️ Es requereix clau API"
title_with_key: "✅ Copia l'URL per a Google Sheets"
index:
@@ -45,29 +46,70 @@ ca:
to: Fins a
drag_to_reorder: Arrossega per reordenar la secció
export: Exporta CSV
+ next_decade: Dècada següent
+ next_period: Període següent
+ next_year: Any següent
+ period_label:
+ last_6_months: "%{start} – %{end}"
+ past_year: "%{year}"
+ quarterly: T%{quarter} %{year}
+ ytd: Any %{year}
+ period_picker:
+ quarter: T%{quarter} %{year}
+ ytd: Any %{year}
periods:
custom: Rang personalitzat
last_6_months: Últims 6 mesos
monthly: Mensual
quarterly: Trimestral
- ytd: Any fins avui
- print_report: Imprimir informe
- showing_period: Mostrant dades des de %{start} fins a %{end}
- subtitle: Informació completa sobre la teva salut financera
+ ytd: Any en curs
+ previous_decade: Dècada anterior
+ previous_period: Període anterior
+ previous_year: Any anterior
+ print_report: Imprimeix l'informe
+ showing_period: Mostrant dades de %{start} a %{end}
+ subtitle: Visió completa de la teva salut financera
title: Informes
- toggle_section: Commutar visibilitat de la secció
- invalid_date_range: La data final no pot ser anterior a la data inicial. Les dates s'han
- canviat.
+ today: Avui
+ toggle_section: Commuta la visibilitat de la secció
+ invalid_date_range: La data final no pot ser anterior a la inicial. Les dates
+ s'han intercanviat.
+ investment_flows:
+ contributions: Aportacions
+ contributions_description: Diners afegits a inversions
+ description: Fes el seguiment dels diners que entren i surten dels teus comptes
+ d'inversió mitjançant aportacions i retirades.
+ net_flow: Flux net
+ net_flow_description: Canvi net total
+ title: Fluxos d'inversió
+ withdrawals: Retirades
+ withdrawals_description: Diners retirats de les inversions
investment_performance:
accounts: Comptes d'inversió
- contributions: Contribucions del període
- holding: Participació
- portfolio_value: Valor del portfoli
+ and_more: "+%{count} més"
+ contributions: Aportacions del període
+ gains_by_tax_treatment: Guanys per tractament fiscal
+ holding: Posició
+ holdings: Posicions
+ holdings_count:
+ one: "%{count} posició"
+ other: "%{count} posicions"
+ no_data: "-"
+ portfolio_value: Valor de la cartera
+ realized_gains: Guanys realitzats
return: Rendiment
+ sell_trades: Vendes
+ sells_count:
+ one: "%{count} venda"
+ other: "%{count} vendes"
+ taxable_realized_note: Aquests guanys poden estar subjectes a impostos
title: Rendiment de la inversió
- top_holdings: Principals participacions
+ top_holdings: Principals posicions
+ total_gains: Guanys totals
total_return: Rendiment total
+ unrealized_gains: Guanys no realitzats
value: Valor
+ view_details: Veure detalls
weight: Pes
withdrawals: Retirades del període
net_worth:
@@ -83,13 +125,13 @@ ca:
document_title: Informe financer
generated_on: Generat el %{date}
investments:
- contributions: Contribucions
- holding: Participació
- portfolio_value: Valor del portfoli
+ contributions: Aportacions
+ holding: Posició
+ portfolio_value: Valor de la cartera
return: Rendiment
this_period: aquest període
title: Inversions
- top_holdings: Principals participacions
+ top_holdings: Principals posicions
total_return: Rendiment total
value: Valor
weight: Pes
@@ -132,7 +174,7 @@ ca:
budget_performance: Rendiment del pressupost
income_minus_expenses: Ingressos menys despeses
net_savings: Estalvi net
- no_budget_data: No hi ha dades de pressupost per aquest període
+ no_budget_data: No hi ha dades de pressupost per a aquest període
of_budget_used: del pressupost utilitzat
total_expenses: Despeses totals
total_income: Ingressos totals
@@ -141,23 +183,23 @@ ca:
export:
csv: CSV
excel: Excel
- google_sheets: Obrir a Google Sheets
- label: Exportar
+ google_sheets: Obre a Google Sheets
+ label: Exporta
pdf: PDF
filters:
account: Compte
all_accounts: Tots els comptes
all_categories: Totes les categories
all_tags: Totes les etiquetes
- amount_max: Màxim import
- amount_min: Mínim import
- apply: Aplicar filtres
+ amount_max: Import màxim
+ amount_min: Import mínim
+ apply: Aplica filtres
category: Categoria
- clear: Esborrar filtres
+ clear: Neteja filtres
date_range: Rang de dates
tag: Etiqueta
title: Filtres
- no_transactions: No s'ha trobat activitat per al període i filtres seleccionats
+ no_transactions: No s'ha trobat cap activitat per al període i filtres seleccionats
pagination:
next: Següent
previous: Anterior
@@ -168,13 +210,13 @@ ca:
amount_asc: Import (baix a alt)
amount_desc: Import (alt a baix)
date_desc: Data (més recent)
- label: Ordenar per
+ label: Ordena per
table:
amount: Import
category: Categoria
entries:
- one: entrada
- other: entrades
+ one: "%{count} entrada"
+ other: "%{count} entrades"
expense: Despeses
income: Ingressos
percentage: "% del total"
@@ -189,21 +231,22 @@ ca:
current: actual
expenses: Despeses
income: Ingressos
- insight_higher_weekday: Gastes %{percent}% més per transacció en dies laborables
+ insight_higher_weekday: Gastes un %{percent}% més per transacció en dies laborables
que en caps de setmana
- insight_higher_weekend: Gastes %{percent}% més per transacció en caps de setmana
- que en dies laborables
- insight_similar: El teu gast per transacció és similar en dies laborables i caps de setmana
+ insight_higher_weekend: Gastes un %{percent}% més per transacció en caps de
+ setmana que en dies laborables
+ insight_similar: La teva despesa per transacció és similar en dies laborables
+ i caps de setmana
insight_title: Anàlisi
month: Mes
monthly_breakdown: Detall mensual
net: Net
no_data: No hi ha dades de tendències disponibles
- no_spending_data: No hi ha dades de despeses disponibles per aquest període
+ no_spending_data: No hi ha dades de despeses disponibles per a aquest període
savings_rate: Taxa d'estalvi
spending_patterns: Patrons de despesa
title: Tendències i anàlisi
total: Total
transactions: Transaccions
- weekday_spending: Despeses laborables
- weekend_spending: Despeses de cap de setmana
+ weekday_spending: Despeses en dies laborables
+ weekend_spending: Despeses en caps de setmana
diff --git a/config/locales/views/rules/ca.yml b/config/locales/views/rules/ca.yml
index b1cacb21f..4a6085dd1 100644
--- a/config/locales/views/rules/ca.yml
+++ b/config/locales/views/rules/ca.yml
@@ -1,36 +1,106 @@
---
ca:
+ rule:
+ conditions:
+ condition_group:
+ add_condition: Afegeix condició
+ all: totes
+ and_prefix: i
+ any: qualsevol
+ match: coincideixen
+ of_the_following_conditions: de les condicions següents
rules:
actions:
value_placeholder: Introdueix un valor
apply_all:
- ai_cost_message: Això utilitzarà IA per categoritzar fins a %{transactions} transaccions.
- ai_cost_title: Estimació de Cost d'IA
- button: Aplica Totes
- confirm_button: Confirma i Aplica Totes
+ ai_cost_message: Això utilitzarà IA per categoritzar fins a %{transactions}
+ transaccions.
+ ai_cost_title: Estimació de cost d'IA
+ button: Aplica-les totes
+ confirm_button: Confirma i aplica-les totes
confirm_message: Estàs a punt d'aplicar %{count} regles que afecten %{transactions}
transaccions úniques. Confirma si vols continuar.
- confirm_title: Aplica Totes les Regles
+ confirm_title: Aplica totes les regles
cost_unavailable_model: Estimació de cost no disponible per al model "%{model}".
- cost_unavailable_no_provider: Estimació de cost no disponible (no hi ha proveïdor LLM configurat).
- cost_warning: Pots tenir costos, comprova amb el proveïdor del model per als
+ cost_unavailable_no_provider: Estimació de cost no disponible (no hi ha proveïdor
+ d'LLM configurat).
+ cost_warning: Pots tenir costos. Consulta amb el proveïdor del model per als
preus més actualitzats.
estimated_cost: 'Cost estimat: ~$%{cost}'
- success: Totes les regles s'han posat a cua per a execució
- view_usage: Veure l'historial d'ús
+ success: Totes les regles s'han posat a la cua per executar-se
+ view_usage: Mostra l'historial d'ús
+ clear_ai_cache:
+ button: Buida la memòria cau d'IA
+ confirm_body: Segur que vols buidar la memòria cau d'IA? Això permetrà que les
+ regles d'IA tornin a processar totes les transaccions. Pot generar costos
+ d'API addicionals.
+ confirm_button: Buida la memòria cau
+ confirm_title: Vols buidar la memòria cau d'IA?
+ success: La memòria cau d'IA s'està netejant. Pot trigar uns instants.
+ condition_filters:
+ transaction_type:
+ equal_to: Igual a
+ expense: Despesa
+ income: Ingrés
+ transfer: Transferència
+ confirm:
+ ai_cost_no_estimate_html: Això utilitzarà IA per categoritzar %{count} transaccions.
+ ai_cost_title: Estimació de cost d'IA
+ ai_cost_with_estimate_html: 'Això utilitzarà IA per categoritzar %{count} transaccions.
+ Cost estimat: ~$%{cost}'
+ apply_notice_html: Estàs a punt d'aplicar aquesta regla a %{count} %{resource} que compleixen els criteris especificats.
+ Confirma si vols continuar amb aquest canvi.
+ confirm_changes: Confirma els canvis
+ cost_unavailable_model: Estimació de cost no disponible per al model "%{model}".
+ cost_unavailable_no_provider: Estimació de cost no disponible (no hi ha proveïdor
+ d'LLM configurat).
+ cost_warning: Pots tenir costos. Consulta amb el proveïdor del model per als
+ preus més actualitzats.
+ title: Confirma els canvis
+ title_with_name: Confirma els canvis a "%{name}"
+ view_usage_history: Mostra l'historial d'ús
+ destroy:
+ success: Regla eliminada
+ destroy_all:
+ success: Totes les regles eliminades
+ form:
+ add_action: Afegeix acció
+ add_condition: Afegeix condició
+ add_condition_group: Afegeix grup de condicions
+ all_past_and_future: Totes les %{resource} passades i futures
+ rule_name_label: Nom de la regla (opcional)
+ rule_name_placeholder: Introdueix un nom per a aquesta regla
+ starting_from: A partir de
+ then: ALESHORES
+ index:
+ ai_cost_warning: Les accions de regla amb IA tenen cost. Filtra el màxim possible
+ per evitar costos innecessaris.
+ delete_all_rules: Elimina totes les regles
+ new_rule: Nova regla
+ no_rules_description: Configura regles per executar accions a les teves transaccions
+ i altres dades a cada sincronització.
+ no_rules_title: Encara no hi ha regles
+ page_title: Regles
+ rules_heading: Regles
+ sort_by: 'Ordena per:'
+ sort_name: Nom
+ sort_updated_at: Data d'actualització
+ toggle_sort_direction: Commuta el sentit d'ordenació
no_action: Sense acció
no_condition: Sense condició
recent_runs:
columns:
date_time: Data/Hora
execution_type: Tipus
- rule_name: Nom de la Regla
+ rule_name: Nom de la regla
status: Estat
transactions_counts:
+ blocked: Bloquejades
modified: Modificades
processed: Processades
- queued: En Cua
- description: Visualitza l'historial d'execució de les teves regles incloent
+ queued: A la cua
+ description: Visualitza l'historial d'execució de les teves regles, incloent
l'estat d'èxit/fallada i els recomptes de transaccions.
execution_types:
manual: Manual
@@ -39,5 +109,21 @@ ca:
failed: Fallada
pending: Pendent
success: Èxit
- title: Execucions Recents
- unnamed_rule: Regla Sense Nom
+ title: Execucions recents
+ unnamed_rule: Regla sense nom
+ rule:
+ action_label_to: "%{label} a %{value}"
+ all_past_and_future: Totes les %{resource} passades i futures
+ and_more_actions:
+ one: i 1 acció més
+ other: i %{count} accions més
+ and_more_conditions:
+ one: i 1 condició més
+ other: i %{count} condicions més
+ delete: Elimina
+ edit: Edita
+ on_or_after: "%{resource} el %{date} o després"
+ re_apply_rule: Torna a aplicar la regla
+ then: ALESHORES
+ update:
+ success: Regla actualitzada
diff --git a/config/locales/views/securities/ca.yml b/config/locales/views/securities/ca.yml
new file mode 100644
index 000000000..629d44140
--- /dev/null
+++ b/config/locales/views/securities/ca.yml
@@ -0,0 +1,14 @@
+---
+ca:
+ securities:
+ combobox:
+ display: "%{symbol} - %{name} (%{exchange})"
+ exchange_label: "%{symbol} (%{exchange})"
+ providers:
+ alpha_vantage: Alpha Vantage
+ binance_public: Binance
+ eodhd: EODHD
+ mfapi: MFAPI.in
+ tiingo: Tiingo
+ twelve_data: Twelve Data
+ yahoo_finance: Yahoo Finance
diff --git a/config/locales/views/sessions/ca.yml b/config/locales/views/sessions/ca.yml
index 8e87f4b4a..21a73cee8 100644
--- a/config/locales/views/sessions/ca.yml
+++ b/config/locales/views/sessions/ca.yml
@@ -3,34 +3,39 @@ ca:
sessions:
create:
invalid_credentials: Correu electrònic o contrasenya incorrectes.
- local_login_disabled: L'inici de sessió amb contrasenya local està inhabilitat. Utilitza l'inici de sessió únic.
+ local_login_disabled: L'inici de sessió amb contrasenya local està desactivat.
+ Utilitza l'inici de sessió únic.
destroy:
logout_successful: Has tancat la sessió correctament.
failure:
failed: No s'ha pogut autenticar.
sso_failed: L'autenticació d'inici de sessió únic ha fallat. Torna-ho a provar.
- sso_invalid_response: S'ha rebut una resposta invàlida del proveïdor SSO. Torna-ho
+ sso_invalid_response: S'ha rebut una resposta no vàlida del proveïdor SSO. Torna-ho
a provar.
- sso_provider_unavailable: El proveïdor SSO actualment no està disponible. Torna-ho
+ sso_provider_unavailable: El proveïdor SSO no està disponible actualment. Torna-ho
a provar més tard o contacta amb un administrador.
+ mobile_sso_start:
+ redirecting_html: Redirigint a l'inici de sessió... Fes clic
+ aquí si no se't redirigeix.
new:
- demo_banner_message: Aquest és un entorn de demostració. Les credencials d'inici de sessió
- s'han omplert automàticament per teva comoditat. No introduïis informació real o sensible.
- demo_banner_title: Mode Demo Actiu
+ demo_banner_message: Aquest és un entorn de demostració. Les credencials d'inici
+ de sessió s'han omplert per comoditat. No introdueixis informació real o sensible.
+ demo_banner_title: Mode demostració actiu
email: Correu electrònic
email_placeholder: tu@exemple.com
forgot_password: Has oblidat la contrasenya?
google_auth_connect: Inicia sessió amb Google
local_login_admin_only: L'inici de sessió local està restringit als administradors.
- no_auth_methods_enabled: Actualment no hi ha cap mètode d'autenticació habilitat. Contacta
- amb un administrador.
- openid_connect: Inicia sessió amb OpenID Connect
+ no_auth_methods_enabled: Actualment no hi ha cap mètode d'autenticació habilitat.
+ Contacta amb un administrador.
oidc: Inicia sessió amb OpenID Connect
+ openid_connect: Inicia sessió amb OpenID Connect
password: Contrasenya
password_placeholder: Introdueix la teva contrasenya
submit: Inicia sessió
- title: Inicia sessió al teu compte
+ title: Sure
openid_connect:
+ account_linked: Compte enllaçat correctament a %{provider}
failed: No s'ha pogut autenticar mitjançant OpenID Connect.
post_logout:
logout_successful: Has tancat la sessió correctament.
diff --git a/config/locales/views/settings/api_keys/ca.yml b/config/locales/views/settings/api_keys/ca.yml
index f61afb43b..1082e9419 100644
--- a/config/locales/views/settings/api_keys/ca.yml
+++ b/config/locales/views/settings/api_keys/ca.yml
@@ -2,114 +2,130 @@
ca:
settings:
api_keys:
+ create:
+ success: La teva clau API s'ha creat correctament
created:
continue: Continua a la configuració de claus API
copy_key: Copia la clau API
+ copy_store_securely: Copia i desa aquesta clau de manera segura. La necessitaràs
+ per autenticar les peticions a l'API.
+ created_label: 'Creada:'
critical_warning_1: Aquesta és l'única vegada que veuràs la teva clau API
en text pla.
critical_warning_2: Copia-la i desa-la de manera segura al teu gestor de contrasenyes
o aplicació.
- critical_warning_3: Si perds aquesta clau, hauràs de crear-ne una de nova.
- critical_warning_title: "⚠️ Crític: Desa la teva clau API ara"
+ critical_warning_3: Si perds aquesta clau, n'hauràs de crear una de nova.
+ critical_warning_title: 'Crític: desa ara la teva clau API'
+ key_details_title: Detalls de la clau
key_name: Nom
+ key_name_label: 'Nom:'
+ key_ready: La teva nova clau API "%{name}" s'ha creat i està a punt per utilitzar.
+ page_title: Clau API creada
permissions: Permisos
- success_description: La teva nova clau API està llesta per utilitzar. Assegura't
- de copiar-la ara, ja que no la podràs tornar a veure.
+ permissions_label: 'Permisos:'
+ security_note_body: Aquesta és l'única vegada que es mostrarà la teva clau
+ API. Assegura't de copiar-la ara i desar-la de manera segura. Si perds aquesta
+ clau, n'hauràs de generar una de nova.
+ security_note_title: Nota de seguretat important
+ success_description: La teva nova clau API s'ha generat correctament.
success_title: Clau API creada correctament
title: Clau API creada
usage_instructions: 'Utilitza la teva clau API incloent-la a la capçalera
X-Api-Key:'
- usage_instructions_title: Guia ràpida
- your_api_key: La teva clau API
- current_api_key:
- active: Activa
- ago: fa
- created_at: Creat
- description: La teva clau API activa està llesta per utilitzar. Mantén-la
- segura i no la comparteixis mai públicament.
- expires: Caduca
- key_name: Nom
- last_used: Últim ús
- never_expires: No caduca mai
- never_used: Mai utilitzada
- permissions: Permisos
- regenerate_key: Crea nova clau
- revoke_confirmation: Segur que vols revocar aquesta clau API? Aquesta acció
- no es pot desfer i desactivarà immediatament totes les aplicacions que utilitzin
- aquesta clau.
- revoke_key: Revoca clau
- title: La teva clau API
- usage_instructions: 'Inclou la teva clau API a la capçalera X-Api-Key quan
- facis peticions a l''API de Maybe:'
usage_instructions_title: Com utilitzar la teva clau API
+ your_api_key: La teva clau API
+ destroy:
+ cannot_revoke: Aquesta clau API no es pot revocar
+ not_found: Clau API no trobada
+ revoke_failed: No s'ha pogut revocar la clau API
+ revoked_successfully: La clau API s'ha revocat correctament
new:
cancel: Cancel·la
create_key: Crea clau API
- create_new_key: Crea nova clau API
+ create_new_api_key: Crea una nova clau API
description: Configura la teva nova clau API amb un nom descriptiu i els permisos
adequats.
- name_help: Tria un nom descriptiu per identificar la finalitat d'aquesta clau.
+ name_help: Tria un nom descriptiu per ajudar-te a identificar la finalitat
+ d'aquesta clau.
+ name_help_text: Tria un nom descriptiu per ajudar-te a identificar aquesta
+ clau més endavant.
name_label: Nom de la clau API
- name_placeholder: p. ex., App Producció, Tauler d'Anàlisi
- permissions_help: Selecciona els permisos que necessita la teva clau API.
- Sempre pots crear una nova clau amb permisos diferents.
+ name_placeholder: p. ex., La meva app de pressupost, Seguidor de cartera
+ permissions_help: 'Selecciona els permisos que ha de tenir aquesta clau API:'
permissions_label: Permisos
+ save_api_key: Desa la clau API
scope_details:
- read_accounts: Veure informació de compte, saldos i dades a nivell de compte
- read_balances: Veure dades històriques de saldo i tendències de valor de
+ read_accounts: Veure informació del compte, saldos i dades a nivell de compte
+ read_balances: Veure dades històriques de saldos i tendències de valor del
compte
read_transactions: Veure dades de transaccions, categories i detalls de
transaccions
- write_transactions: Crear i actualitzar registres de transaccions (pròximament)
- security_warning: La teva clau API només es mostrarà una vegada després de
- la creació. Desa-la de manera segura i no la comparteixis mai públicament.
- Si la perds, hauràs de crear-ne una de nova.
- security_warning_title: Avís de seguretat important
+ write_transactions: Crear i actualitzar registres de transaccions (properament)
+ scope_read_only: Només lectura
+ scope_read_only_description: Veure els teus comptes, transaccions i saldos
+ scope_read_write: Lectura/Escriptura
+ scope_read_write_description: Veure les teves dades i crear noves transaccions
+ security_warning: La teva clau API només es mostrarà un cop després de la
+ creació. Desa-la de manera segura i no la comparteixis mai públicament.
+ Si la perds, n'hauràs de crear una de nova.
+ security_warning_body: La teva clau API només es mostrarà un cop després de
+ la creació. Assegura't de copiar-la i desar-la de manera segura. Qualsevol
+ persona amb accés a aquesta clau podrà accedir a les teves dades segons
+ els permisos que seleccionis.
+ security_warning_title: Avís de seguretat
+ subtitle: Genera una nova clau API per accedir a les teves dades de Sure de
+ manera programàtica.
title: Crea clau API
- no_api_key:
- create_api_key: Crea clau API
- description: Obtingues accés programàtic a les teves dades de Maybe amb una
- clau API segura.
- feature_1: Accedeix a les teves dades de compte programàticament
- feature_2: Construeix integracions i aplicacions personalitzades
- feature_3: Automatitza la recuperació i anàlisi de dades
- security_note: La teva clau API tindrà permisos restringits segons els àmbits
- seleccionats. Només pots tenir una clau API activa alhora.
- security_note_title: Seguretat primer
- title: Clau API
- what_you_can_do: 'Què pots fer amb l''API:'
show:
current_api_key:
- active: Actiu
+ active: Activa
ago: fa
- created_at: Creat
- description: La teva clau API activa està llesta per utilitzar. Mantén-la
+ copy_api_key: Copia la clau API
+ copy_store_securely: Copia i desa aquesta clau de manera segura. La necessitaràs
+ per autenticar les peticions a l'API.
+ created_ago: Creada fa %{time}
+ created_at: Creada
+ description: La teva clau API activa està a punt per utilitzar. Mantén-la
segura i no la comparteixis mai públicament.
expires: Caduca
key_name: Nom
last_used: Últim ús
+ last_used_ago: Última utilització fa %{time}
never_expires: No caduca mai
never_used: Mai utilitzada
permissions: Permisos
- regenerate_key: Crea nova clau
+ regenerate_key: Crea una nova clau
revoke_confirmation: Segur que vols revocar aquesta clau API? Aquesta acció
- no es pot desfer i desactivarà immediatament totes les aplicacions que utilitzin
- aquesta clau.
- revoke_key: Revoca clau
+ no es pot desfer i desactivarà immediatament totes les aplicacions que
+ utilitzin aquesta clau.
+ revoke_key: Revoca la clau
+ scope_read_only: Només lectura
+ scope_read_write: Lectura/Escriptura
title: La teva clau API
usage_instructions: 'Inclou la teva clau API a la capçalera X-Api-Key quan
- facis peticions a l''API de Maybe:'
+ facis peticions a l''API de %{product_name}:'
usage_instructions_title: Com utilitzar la teva clau API
+ newly_created:
+ continue: Continua a la configuració de claus API
+ copy_api_key: Copia la clau API
+ copy_store_securely: Copia i desa aquesta clau de manera segura. La necessitaràs
+ per autenticar les peticions a l'API.
+ heading: Clau API creada correctament
+ how_to_use: Com utilitzar la teva clau API
+ key_ready: La teva nova clau API "%{name}" s'ha creat i està a punt per
+ utilitzar.
+ page_title: Clau API creada correctament
+ your_api_key: La teva clau API
no_api_key:
create_api_key: Crea clau API
- description: Obtingues accés programàtic a les teves dades de Maybe amb una
- clau API segura.
- feature_1: Accedeix a les teves dades de compte programàticament
+ description: Obtén accés programàtic a les teves dades de Sure amb una clau
+ API segura.
+ feature_1: Accedeix a les dades del teu compte de manera programàtica
feature_2: Construeix integracions i aplicacions personalitzades
feature_3: Automatitza la recuperació i anàlisi de dades
- heading: Accedeix a les teves dades de compte programàticament
+ heading: Accedeix a les dades del teu compte de manera programàtica
security_note: La teva clau API tindrà permisos restringits segons els àmbits
- seleccionats. Només pots tenir una clau API activa alhora.
+ que seleccionis. Només pots tenir una clau API activa alhora.
security_note_title: Seguretat primer
title: Clau API
what_you_can_do: 'Què pots fer amb l''API:'
diff --git a/config/locales/views/settings/ca.yml b/config/locales/views/settings/ca.yml
index 5d43209eb..917d18d24 100644
--- a/config/locales/views/settings/ca.yml
+++ b/config/locales/views/settings/ca.yml
@@ -1,9 +1,5 @@
---
ca:
- views:
- settings:
- payments:
- renewal: "La teva contribució continua el %{date}."
settings:
ai_prompts:
show:
@@ -23,18 +19,126 @@ ca:
subtitle: La IA categoritza automàticament les teves transaccions segons
les categories definides
title: Categoritzador de transaccions
- payments:
+ appearances:
show:
- page_title: Pagament
- subscription_subtitle: Actualitza la teva subscripció i dades de pagament
- subscription_title: Gestiona la subscripció
+ dashboard_subtitle: Personalitza com es mostra el tauler de control
+ dashboard_title: Tauler de control
+ dashboard_two_column_description: Mostra els ginys del tauler en dues columnes
+ en pantalles grans. Si està desactivat, els ginys s'apilen en una sola columna.
+ dashboard_two_column_title: Disseny a dues columnes
+ page_title: Aparença
+ split_grouped_description: Mostra les transaccions dividides agrupades sota
+ la seva matriu a la llista de transaccions. Si està desactivat, els fills
+ apareixen com a files individuals.
+ split_grouped_title: Agrupa les transaccions dividides
+ theme_dark: Fosc
+ theme_light: Clar
+ theme_subtitle: Tria el tema preferit per a l'aplicació
+ theme_system: Sistema
+ theme_title: Tema
+ transactions_subtitle: Personalitza com es mostren les transaccions
+ transactions_title: Transaccions
+ debugs:
+ show:
+ context:
+ account: account=%{value}
+ account_provider: account_provider=%{value}
+ family: family=%{value}
+ provider: provider=%{value}
+ user: user=%{value}
+ empty: No s'han trobat esdeveniments de depuració.
+ filters:
+ account_id: ID del compte
+ account_provider_id: ID del proveïdor del compte
+ all: Tots
+ category: Categoria
+ end_date: Fins
+ family_id: ID de la família
+ level: Nivell
+ provider: Proveïdor
+ reset: Restableix
+ source: Origen
+ start_date: Des de
+ submit: Filtra
+ user_id: ID de l'usuari
+ missing_value: "-"
+ page_title: Depuració
+ subtitle: Esdeveniments operatius rellevants per a superadministradors. Els
+ més nous primer.
+ table:
+ category: Categoria
+ context: Context
+ level: Nivell
+ message: Missatge
+ metadata: Metadades
+ source: Origen
+ time: Hora
+ view_metadata: Veure
+ title: Registre d'esdeveniments de depuració
hostings:
ensure_admin:
not_authorized: No autoritzat
+ llm_usages:
+ show:
+ avg_cost_per_request: Cost mitjà/sol·licitud
+ based_on_requests: Basat en %{with_cost} de %{total} sol·licituds amb dades
+ de cost
+ col_cost: Cost
+ col_date: Data
+ col_model: Model
+ col_operation: Operació
+ col_tokens: Tokens
+ completion: completació
+ cost_by_model: Cost per model
+ cost_by_operation: Cost per operació
+ cost_estimates_description: Els costos s'estimen segons els preus d'OpenAI
+ de 2025. Els costos reals poden variar. El preu és per cada milió de tokens
+ i varia segons el model. Els models personalitzats o amb self hosting mostraran
+ "N/D" i no s'inclouen als totals de cost.
+ cost_estimates_title: Sobre les estimacions de cost
+ end_date: Data de fi
+ failed: Errades
+ filter: Filtra
+ no_usage_data: No s'han trobat dades d'ús per al període seleccionat
+ page_title: Ús i costos d'LLM
+ prompt: prompt
+ recent_usage: Ús recent
+ start_date: Data d'inici
+ subtitle: Fes el seguiment del teu ús d'IA i els costos estimats
+ total_cost: Cost total
+ total_requests: Total de sol·licituds
+ total_tokens: Total de tokens
+ payments:
+ show:
+ choose_level: Tria un nivell
+ contributions_note: Les contribucions a %{product_name} apareixeran aquí.
+ currently_on_plan: 'Actualment al pla:'
+ manage: Gestiona
+ not_contributing_emphasis: no contribueixes
+ not_contributing_prefix: Actualment
+ page_title: Pagaments
+ payment_via_stripe: Pagament a través de Stripe
+ subscription_subtitle: Actualitza les teves dades de targeta de crèdit
+ subscription_title: Gestiona contribucions
+ trial_days_left:
+ one: Les dades s'eliminaran en %{count} dia
+ other: Les dades s'eliminaran en %{count} dies
+ trialing: Actualment fas servir la demostració oberta de %{product_name}
preferences:
show:
+ additional_currencies_label: Divises addicionals
+ base_currency_badge: Divisa base
+ base_currency_label: Divisa base
+ beta:
+ description: Activa funcions en desenvolupament etiquetades com a beta o
+ canary.
+ title: Activa funcions beta
country: País
- currency: Moneda
+ currencies_more: "+%{count} més"
+ currencies_subtitle: Tria quines divises apareixen als camps de diners
+ currencies_title: Divises
+ currency: Divisa
+ currency_search_placeholder: Cerca divises
date_format: Format de data
default_account_order: Ordre de comptes per defecte
default_period: Període per defecte
@@ -42,12 +146,30 @@ ca:
general_title: General
language: Idioma
language_auto: Idioma del navegador
+ manage_currencies: Gestiona divises
+ manage_currencies_subtitle: Desmarca les divises que mai utilitzes, o redueix
+ la llista a unes poques.
+ month_start_day: El mes del pressupost comença el
+ month_start_day_hint: Estableix quan comença el teu mes pressupostari (p.
+ ex., dia de cobrament)
+ month_start_day_warning: Els teus pressupostos i càlculs MTD utilitzaran aquest
+ dia d'inici personalitzat en lloc del dia 1 de cada mes.
+ translations_notice: Tingues en compte que encara estem treballant en les traduccions
+ a diversos idiomes.
+ no_additional_currencies: Cap seleccionada
+ no_matching_currencies: No s'han trobat divises
page_title: Preferències
- theme_dark: Fosc
- theme_light: Clar
- theme_subtitle: Tria el tema preferit per a l'aplicació
- theme_system: Sistema
- theme_title: Tema
+ save_currencies: Desa les divises
+ select_all_currencies: Selecciona-ho tot
+ select_base_only: Només la divisa base
+ selected_currencies_count:
+ one: "%{count} seleccionada"
+ other: "%{count} seleccionades"
+ sharing_default_label: Compartició predeterminada per a comptes nous
+ sharing_private: Mantén privat per defecte
+ sharing_shared: Comparteix amb tots els membres
+ sharing_subtitle: Controla com es comparteixen els comptes entre els membres
+ sharing_title: Compartició de comptes
timezone: Fus horari
profiles:
destroy:
@@ -82,10 +204,13 @@ ca:
les teves dades i no es podrà desfer.
email: Correu electrònic
first_name: Nom
+ group_form_input_placeholder: Introdueix el nom del grup
+ group_form_label: Nom del grup
+ group_title: Membres del grup
household_form_input_placeholder: Introdueix el nom de la llar
household_form_label: Nom de la llar
- household_subtitle: Convida membres de la família, parelles i altres persones.
- Els convidats podran accedir al teu compte familiar i als comptes compartits.
+ household_subtitle: Els convidats poden iniciar sessió al teu compte de %{moniker}
+ i accedir als recursos compartits.
household_title: Llar
invitation_link: Enllaç d'invitació
invite_member: Afegeix membre
@@ -103,49 +228,346 @@ ca:
reset_account_with_sample_data_warning: Elimina totes les teves dades existents
i carrega dades d'exemple per explorar amb un entorn preomplert.
save: Desa
+ providers:
+ bank_sync:
+ lede: Connecta comptes externs perquè transaccions, saldos i posicions flueixin
+ automàticament a Sure.
+ page_title: Sincronització bancària
+ binance_panel:
+ api_key_label: Clau API
+ api_key_placeholder: Enganxa la teva clau API de Binance
+ api_secret_label: Secret de l'API
+ api_secret_placeholder: Enganxa el teu secret de l'API de Binance
+ connect_button: Connecta Binance
+ disconnect_confirm: Segur que vols desconnectar Binance?
+ ip_hint_body: 'Afegeix la IP de sortida del servidor de l''aplicació a la
+ llista blanca de la clau API de Binance:'
+ ip_hint_contact_admin: Contacta amb el teu administrador per obtenir la IP
+ de sortida del servidor de l'aplicació.
+ ip_hint_title: Cal incloure la IP a la llista blanca
+ no_withdraw_body: No activis permisos de retirada en crear la teva clau API
+ de Binance. Sure només necessita accés de lectura.
+ no_withdraw_title: Només clau de lectura
+ setup_instructions: 'Per connectar Binance, crea una clau API de només lectura:'
+ step1_html: Ves a Binance API
+ Management
+ step2: Crea una nova clau API només amb el permís Enable Reading
+ step3: Enganxa la teva clau API i secret a sota
+ sync: Sincronitza
+ syncing: Sincronitzant...
+ clear_filter: Neteja filtres
+ coinbase_panel:
+ api_key_label: Clau API
+ api_key_placeholder: Introdueix la teva clau API de Coinbase
+ api_secret_label: Secret de l'API
+ api_secret_placeholder: Introdueix el teu secret de l'API de Coinbase
+ connect_button: Connecta Coinbase
+ disconnect_confirm: Segur que vols desconnectar aquesta connexió de Coinbase?
+ Els teus comptes sincronitzats passaran a ser comptes manuals.
+ setup_instructions: 'Per connectar Coinbase:'
+ step1_html: Ves a Coinbase
+ API Settings
+ step2: Crea una nova clau API amb permisos de només lectura (veure comptes,
+ veure transaccions)
+ step3: Copia la teva clau API i secret de l'API i enganxa'ls a sota
+ sync: Sincronitza
+ syncing: Sincronitzant...
+ connect: Connecta
+ drawer_trust_statement: Accés només de lectura. Sure mai no pot moure diners
+ i les teves credencials s'emmagatzemen xifrades.
+ empty_filter: Cap proveïdor coincideix amb el teu filtre.
+ enable_banking_panel:
+ add_connection: Afegeix connexió
+ application_id_label: ID d'aplicació
+ application_id_placeholder_new: Introdueix l'ID d'aplicació
+ application_id_placeholder_update: Introdueix el nou ID per actualitzar
+ callback_url_instruction: Per a l'URL de retorn de trucada, fes servir %{callback_url}.
+ client_certificate_label: Certificat de client (amb clau privada)
+ config_locked_message: Desconnecta tots els bancs vinculats abans de canviar
+ aquestes credencials.
+ config_locked_title: Configuració bloquejada
+ configured: Configurat
+ connect_bank: Connecta banc
+ connected_bank: Banc connectat
+ connection: Connexió
+ connection_error: Error de connexió
+ country_label: País
+ ready_to_link: Llest per enllaçar comptes
+ reconnect: Reconnecta
+ remove: Elimina
+ remove_confirm: Segur que vols eliminar aquesta connexió?
+ save_and_connect: Desa i connecta
+ select_country: Selecciona país...
+ session_expired_reconnect: Sessió expirada — reconnecta
+ session_expires: 'La sessió expira: %{date}'
+ step_1_html: Ves a %{link} i obtén les teves credencials de desenvolupador.
+ step_2: Tria el teu país i enganxa l'ID d'aplicació + certificat de client
+ a sota.
+ step_3: Desa, després utilitza Afegeix connexió per enllaçar el teu banc.
+ sync: Sincronitza
+ syncing: Sincronitzant
+ unknown: Desconegut
+ update_connection: Actualitza connexió
+ encryption_error:
+ message: La sincronització bancària requereix Active Record encryption configurat.
+ Estableix primary_key, deterministic_key i key_derivation_salt a les teves
+ credencials de Rails o variables d'entorn.
+ title: Falten les claus de xifratge
+ groups:
+ available: Disponibles
+ empty_available: Tots els proveïdors disponibles estan connectats.
+ your_connections: Les teves connexions
+ health_strip:
+ accounts_syncing: comptes sincronitzant-se
+ connected: connectats
+ last_synced: Última sincronització fa %{time}
+ needs_attention: necessita atenció
+ ibkr_panel:
+ accounts_tab: Comptes
+ configuration:
+ all_other_options: 'Tota la resta d''opcions de configuració: "No"'
+ date_format: 'Format de data: yyyy-MM-dd'
+ date_time_separator: 'Separador de data/hora: ; (punt i coma)'
+ format: 'Format: XML'
+ models: 'Models: Opcional'
+ period: 'Període: Últims 365 dies naturals'
+ profit_and_loss: 'Pèrdues i guanys: Per defecte'
+ time_format: 'Format d''hora: HH:mm:ss'
+ disconnect_confirm: Vols desconnectar Interactive Brokers?
+ flex_query_details:
+ configuration_heading: Estableix aquestes opcions de consulta
+ eyebrow: Flex Query
+ sections_heading: Activa aquestes seccions i camps
+ summary: Expandeix per veure les seccions, camps i configuració exactes
+ que ha d'incloure la teva Flex Query d'activitat d'IBKR.
+ title: Seccions, camps i configuració
+ not_configured: No configurat.
+ query_id_label: ID de consulta
+ query_id_placeholder_existing: Deixa en blanc per mantenir l'ID actual
+ query_id_placeholder_new: Introdueix el teu ID de Flex Query d'IBKR
+ report_window_note: Els informes Flex d'IBKR estan limitats a la finestra
+ de consulta configurada a IBKR. Sure importarà les posicions actuals completes
+ més fins a 365 dies d'activitat d'aquest informe.
+ save_configuration: Desa la configuració
+ sections:
+ account_information: 'Account Information: Account ID, Currency'
+ cash_report: 'Cash Report:'
+ cash_report_fields: 'Fields: Currency, Ending Cash'
+ cash_report_options: 'Options: None'
+ cash_transactions: 'Cash Transactions:'
+ cash_transactions_fields: 'Fields: Amount, Conid, Currency, FX Rate To Base,
+ Report Date, Transaction ID, Type'
+ cash_transactions_options: 'Options: Dividends, Deposits & Withdrawals,
+ Detail'
+ change_in_position_value_summary: 'Change In Position Value Summary: Currency,
+ End Of Period Value'
+ net_asset_value: 'Net Asset Value (NAV) in Base:'
+ net_asset_value_fields: 'Fields: Currency, Report Date, Total'
+ net_asset_value_options: 'Options: None'
+ open_positions: 'Open Positions:'
+ open_positions_fields: 'Fields: Asset Class, Conid, Cost Basis Price, Currency,
+ FX Rate To Base, Mark Price, Quantity, Report Date, Security ID, Security
+ ID Type, Side, Symbol'
+ open_positions_options: 'Options: Summary'
+ trades: 'Trades:'
+ trades_fields: 'Fields: Asset Class, Buy/Sell, Conid, Currency, FX Rate
+ To Base, IB Commission, IB Commission Currency, Quantity, Symbol, Trade
+ Date, Trade ID, TradePrice, Transaction ID'
+ trades_options: 'Options: Execution'
+ status_configured_prefix: "%{summary}. Visita la"
+ status_configured_suffix: pestanya per gestionar els comptes descoberts.
+ steps:
+ step_1: Al teu IBKR Client Portal, navega a "Performance & Reports" > "Flex
+ Queries".
+ step_2: Fes clic a la icona "+" a la secció "Activity Flex Query" per crear
+ una nova consulta.
+ step_3: Anomena la teva consulta (p. ex., "Sure Sync"), després revisa els
+ detalls de la Flex Query a sota i activa les seccions, camps i opcions
+ de configuració llistades.
+ step_4: Desa la consulta, anota el teu "Query ID", després usa la icona
+ d'engranatge a la secció "Flex Web Service Configuration" per generar
+ un Token d'accés.
+ step_5: Enganxa el teu Query ID i Token a sota, desa la configuració, i
+ ves a Comptes per enllaçar els comptes d'IBKR descoberts.
+ sync: Sincronitza
+ token_label: Token
+ token_placeholder_existing: Deixa en blanc per mantenir el Token actual
+ token_placeholder_new: Introdueix el teu Token d'IBKR Flex Web Service
+ update_configuration: Actualitza la configuració
+ kraken_panel:
+ add_connection: Afegeix connexió Kraken
+ api_key_label: Clau API
+ api_key_placeholder: Enganxa la teva clau API de Kraken
+ api_secret_label: Clau privada
+ api_secret_placeholder: Enganxa la teva clau privada de Kraken
+ connection_name_label: Nom de la connexió
+ connection_name_placeholder: Kraken principal
+ default_connection_name: Kraken
+ disconnect: Desconnecta
+ disconnect_confirm: Segur que vols desconnectar %{name}?
+ keep_api_key_placeholder: Deixa en blanc per mantenir la clau API existent
+ keep_api_secret_placeholder: Deixa en blanc per mantenir la clau privada existent
+ read_only_body: No atorguis permisos de trading, cancel·lació, retirada, exportació,
+ llibre major, Earn, staking o transferència. Sure només importa saldos,
+ posicions i operacions spot.
+ read_only_title: Sincronització només de lectura amb l'exchange
+ setup_accounts: Configura compte
+ step1_html: Ves a Kraken API settings
+ step2: Crea una clau API només amb Query Funds i Query Closed Orders & Trades.
+ step3: Enganxa la clau API i la clau privada a sota.
+ sync: Sincronitza
+ syncing: Sincronitzant...
+ update_connection: Actualitza connexió
+ lunchflow_panel:
+ api_key_label: Clau API
+ api_key_placeholder_new: Enganxa la clau API aquí
+ api_key_placeholder_update: Introdueix la nova clau API per actualitzar
+ base_url_label: URL base (opcional)
+ base_url_placeholder: https://lunchflow.app/api/v1 (per defecte)
+ save_and_connect: Desa i connecta
+ step_1_html: Ves a %{link} i crea una clau API.
+ step_2: Enganxa la teva clau a sota i connecta.
+ step_3: Després ves a Comptes per enllaçar els teus comptes sincronitzats.
+ update_connection: Actualitza connexió
+ maturity:
+ alpha: Alfa
+ beta: Beta
+ meta:
+ last_synced: Sincronitzat fa %{time}
+ no_recent_sync: Sincronització vençuda
+ reconsent_needed:
+ one: Cal renovar el consentiment en 1 dia
+ other: Cal renovar el consentiment en %{count} dies
+ reconsent_required: Cal renovar el consentiment
+ registration_needed: Cal registrar-se
+ sync_error: Error de sincronització
+ not_authorized: No autoritzat
+ not_found: Proveïdor no trobat.
+ plaid_eu_panel:
+ step_1_html: Obre el %{link} i copia el teu Client ID i Secret Key d'UE.
+ plaid_panel:
+ step_1_html: Obre el %{link} i copia el teu Client ID i Secret Key.
+ step_2: Tria un entorn. Fes servir sandbox per a proves i production per a
+ comptes reals.
+ step_3: Enganxa les teves credencials a sota i connecta.
+ recently_synced: Sincronitzat recentment. Torna-ho a provar d'aquí a un moment.
+ search_filters:
+ aria_label: Cerca proveïdors
+ chips:
+ all: Tots
+ bank: Bancs
+ crypto: Cripto
+ investment: Inversions
+ placeholder: Cerca proveïdors
+ setup_steps:
+ eyebrow: Configuració
+ need_help: Necessites ajuda?
+ simplefin_panel:
+ save_and_connect: Desa i connecta
+ setup_token_label: Token de configuració
+ setup_token_placeholder: Enganxa el token de configuració de SimpleFIN
+ step_1_html: Ves a %{link} per obtenir un token d'un sol ús.
+ step_2: Enganxa el token a sota i connecta.
+ step_3: Després ves a Comptes per enllaçar els teus comptes sincronitzats.
+ status:
+ err: Error
+ off: No configurat
+ ok: Connectat
+ warn: Cal acció
+ sync_all: Sincronitza-ho tot
+ sync_all_in_progress: Sincronitzant tots els proveïdors connectats…
+ sync_all_recently: Sincronització ja en curs. Torna-ho a provar d'aquí a un
+ moment.
+ sync_provider: Sincronitza ara
+ sync_provider_in_progress: Sincronització iniciada.
+ sync_provider_no_items: No hi ha connexions disponibles per sincronitzar.
+ taglines:
+ binance: Sincronitza els teus saldos spot de Binance utilitzant una clau API
+ de només lectura.
+ brex: Sincronitza l'activitat d'efectiu i targeta corporativa de Brex amb
+ accés de només lectura.
+ coinbase: Importa les teves posicions cripto de Coinbase i fes el seguiment
+ del rendiment.
+ coinstats: Fes el seguiment de tota la teva cartera cripto a través de carteres
+ i exchanges.
+ enable_banking: Sincronitza comptes bancaris europeus mitjançant l'open banking
+ PSD2.
+ ibkr: Sincronitza comptes d'inversió d'Interactive Brokers mitjançant importacions
+ Flex Query.
+ indexa_capital: Fes el seguiment de la teva cartera d'inversió automatitzada
+ d'Indexa Capital.
+ kraken: Sincronitza saldos i operacions spot de Kraken utilitzant una clau
+ API de només lectura.
+ lunchflow: Connecta més de 20.000 bancs de més de 40 països (Regne Unit, UE,
+ EUA i més!).
+ mercury: Sincronitza automàticament els teus comptes bancaris empresarials
+ de Mercury.
+ plaid: Connecta milers d'institucions financeres dels EUA mitjançant Plaid.
+ plaid_eu: Connecta institucions financeres europees mitjançant Plaid (PSD2
+ / Open Banking).
+ simplefin: Connecta comptes bancaris dels EUA mitjançant el protocol obert
+ SimpleFIN.
+ snaptrade: Connecta comptes d'inversió mitjançant la xarxa d'agregació SnapTrade.
+ sophtron: Connecta bancs i serveis dels EUA i Canadà.
+ update:
+ no_changes: No s'ha fet cap canvi
+ updated_successfully: Configuració del proveïdor actualitzada correctament
securities:
show:
- page_title: Valor
+ page_title: Seguretat
sso_confirm_body: Segur que vols desconnectar el teu compte de %{provider}?
- Pots tornar-lo a connectar més tard iniciant sessió amb aquest proveïdor una altra vegada.
+ Pots tornar-lo a connectar més tard iniciant sessió amb aquest proveïdor
+ una altra vegada.
sso_confirm_button: Desconnecta
sso_confirm_title: Desconnectar compte?
- sso_connect_hint: Tanca sessió i inicia amb un proveïdor SSO per connectar un compte.
+ sso_connect_hint: Tanca sessió i inicia amb un proveïdor SSO per connectar
+ un compte.
sso_disconnect: Desconnecta
sso_last_used: Darrer ús
sso_never: Mai
sso_no_email: Sense correu electrònic
sso_no_identities: No hi ha comptes SSO connectats
- sso_subtitle: Gestiona les teves connexions de compte amb inici de sessió únic
+ sso_subtitle: Gestiona les teves connexions de compte amb inici de sessió
+ únic
sso_title: Comptes connectats
- sso_warning_message: Aquesta és la teva única mètode d'inici de sessió. Hauries de configurar una contrasenya
- a la teva configuració de seguretat abans de desconnectar-te, altrament podries quedar blocat
- fora del teu compte.
+ sso_warning_message: Aquesta és l'única forma d'inici de sessió. Hauries de
+ configurar una contrasenya a la teva configuració de seguretat abans de
+ desconnectar, altrament podries quedar bloquejat/da fora del teu compte.
settings_nav:
accounts_label: Comptes
advanced_section_title: Avançat
ai_prompts_label: Prompts d'IA
api_key_label: Clau API
api_keys_label: Clau API
+ appearance_label: Aparença
bank_sync_label: Sincronització bancària
- payment_label: Pagament
categories_label: Categories
+ debug_label: Depuració
+ exports_label: Exportacions
feedback_label: Feedback
general_section_title: General
- imports_label: Importacions
- exports_label: Exportacions
guides_label: Guies
+ imports_label: Importacions
+ llm_usage_label: Ús d'LLM
logout: Tanca la sessió
merchants_label: Comerços
other_section_title: Més
+ payment_label: Pagament
preferences_label: Preferències
profile_label: Informació del perfil
+ providers_label: Proveïdors
recurring_transactions_label: Recurrent
rules_label: Regles
security_label: Seguretat
- self_hosting_label: Autoallotjament
+ self_hosting_label: Self hosting
+ sso_providers_label: Proveïdors SSO
+ statement_vault_label: Arxiu d'extractes
tags_label: Etiquetes
transactions_section_title: Transaccions
+ users_label: Usuaris
whats_new_label: Novetats
settings_nav_link_large:
next: Següent
@@ -153,5 +575,10 @@ ca:
user_avatar_field:
accepted_formats: JPG o PNG. Màxim 5MB.
change: Canvia la foto
- choose: Pujar foto
+ choose: Puja una foto
choose_label: "(opcional)"
+ views:
+ settings:
+ payments:
+ cancellation: La teva contribució finalitza el %{date}.
+ renewal: La teva contribució continua el %{date}.
diff --git a/config/locales/views/settings/en.yml b/config/locales/views/settings/en.yml
index 2c4435988..9b1b24dc7 100644
--- a/config/locales/views/settings/en.yml
+++ b/config/locales/views/settings/en.yml
@@ -131,6 +131,7 @@ en:
month_start_day: Budget month starts on
month_start_day_hint: Set when your budget month starts (e.g., payday)
month_start_day_warning: Your budgets and MTD calculations will use this custom start day instead of the 1st of each month.
+ translations_notice: Please note, we are still working on translations for various languages.
currencies_title: "%{moniker} Currencies"
currencies_subtitle: Choose which currencies appear in money fields for your %{moniker}
base_currency_label: Base currency
diff --git a/config/locales/views/settings/hostings/ca.yml b/config/locales/views/settings/hostings/ca.yml
index e435ab6ea..02b1a6282 100644
--- a/config/locales/views/settings/hostings/ca.yml
+++ b/config/locales/views/settings/hostings/ca.yml
@@ -2,61 +2,185 @@
ca:
settings:
hostings:
+ alpha_vantage_settings:
+ description: Introdueix la clau API d'Alpha Vantage. Admet ETF europeus a
+ London Stock Exchange, XETRA i altres mercats.
+ env_configured_message: Configurat correctament mitjançant la variable d'entorn
+ ALPHA_VANTAGE_API_KEY.
+ label: Clau API
+ no_health_check_note: La comprovació de l'estat de la connexió no està disponible
+ per a aquest proveïdor a causa del límit estricte de sol·licituds.
+ placeholder: Introdueix aquí la teva clau API d'Alpha Vantage
+ rate_limit_warning: El nivell gratuït d'Alpha Vantage està limitat a 25 crides
+ d'API al dia. Útil com a proveïdor complementari per a ETF europeus no disponibles
+ en altres proveïdors.
+ show_details: "(mostra detalls)"
+ step_1_html: Visita alphavantage.co
+ i obté la teva clau API gratuïta.
+ step_2: Copia la clau API i enganxa-la a sota.
+ title: Alpha Vantage
+ assistant_settings:
+ agent_id_help: Encamina cap a un agent específic quan el proveïdor n'allotja
+ diversos. Deixa-ho en blanc per al predeterminat.
+ agent_id_label: ID de l'agent (opcional)
+ agent_id_placeholder: main (predeterminat)
+ confirm_disconnect:
+ body: Això eliminarà l'URL desat, el token i l'ID de l'agent, i canviarà
+ a l'assistent integrat. Pots reconnectar més tard introduint credencials
+ noves.
+ title: Desconnectar l'assistent extern?
+ description: Tria com respon l'assistent del xat. Integrat utilitza el teu
+ proveïdor d'LLM configurat directament. Extern delega en un agent d'IA remot
+ que pot retrucar a les eines financeres de Sure via MCP.
+ disconnect_button: Desconnecta
+ disconnect_description: Elimina la connexió a l'assistent extern i torna a
+ l'assistent integrat.
+ disconnect_title: Connexió externa
+ env_configured_external: Configurat correctament mitjançant variables d'entorn.
+ env_notice: El tipus d'assistent està fixat a '%{type}' mitjançant la variable
+ d'entorn ASSISTANT_TYPE.
+ external_configured: Configurat
+ external_not_configured: No configurat. Introdueix l'URL i el token a sota,
+ o estableix les variables d'entorn EXTERNAL_ASSISTANT_URL i EXTERNAL_ASSISTANT_TOKEN.
+ external_status: Endpoint de l'assistent extern
+ title: Assistent d'IA
+ token_help: El token d'autenticació proporcionat pel teu agent extern. S'envia
+ com a Bearer token a cada sol·licitud.
+ token_label: Token d'API
+ token_placeholder: Introdueix el token del teu proveïdor d'agent
+ type_builtin: Integrat (LLM directe)
+ type_external: Extern (agent remot)
+ type_label: Tipus d'assistent
+ url_help: L'URL complet de l'endpoint d'API del teu agent. El teu proveïdor
+ d'agent te'l donarà.
+ url_label: URL de l'endpoint
+ url_placeholder: https://your-agent-host/v1/chat
brand_fetch_settings:
description: Introdueix el Client ID proporcionat per Brand Fetch
+ env_configured_message: Has configurat correctament el teu Client ID de Brand
+ Fetch mitjançant la variable d'entorn BRAND_FETCH_CLIENT_ID.
+ high_res_description: Quan està activat, els logotips es recuperaran amb resolució
+ 120×120 en lloc de 40×40. Això proporciona imatges més nítides en pantalles
+ d'alta densitat.
+ high_res_label: Activa logotips d'alta resolució
label: Client ID
placeholder: Introdueix aquí el teu Client ID
- title: Brand Fetch
+ setup_step_1_html: Visita brandfetch.com i crea un
+ compte de desenvolupador gratuït de Brand Fetch.
+ setup_step_2_html: Ves a la pàgina Logo API.
+ setup_step_3: Toca la icona de l'ull a la secció "Your Client ID" per revelar
+ el teu Client ID i enganxa'l a sota.
+ show_details: "(mostra detalls)"
+ title: Configuració de Brand Fetch
clear_cache:
- cache_cleared: La memòria cau de dades s'ha netejat. Això pot trigar uns instants
+ cache_cleared: La memòria cau de dades s'ha netejat. Pot trigar uns instants
a completar-se.
+ disconnect_external_assistant:
+ external_assistant_disconnected: Assistent extern desconnectat
+ ensure_super_admin_for_onboarding:
+ not_authorized: No estàs autoritzat/da a fer aquesta acció
+ eodhd_settings:
+ description: Introdueix el token d'API proporcionat per EODHD. Admet ETF europeus
+ a LSE, XETRA i altres mercats internacionals.
+ env_configured_message: Configurat correctament mitjançant la variable d'entorn
+ EODHD_API_KEY.
+ label: Token d'API
+ placeholder: Introdueix aquí el teu token d'API d'EODHD
+ rate_limit_warning: El nivell gratuït d'EODHD està limitat a 20 crides d'API
+ al dia. Útil com a proveïdor complementari per a ETF europeus no disponibles
+ en altres proveïdors.
+ show_details: "(mostra detalls)"
+ step_1_html: Visita eodhd.com i crea un compte gratuït.
+ step_2_html: Ves al teu tauler per trobar el teu
+ token d'API.
+ step_3: Copia el teu token d'API i enganxa'l a sota.
+ title: EODHD
invite_code_settings:
- description: Cada nou usuari que s'uneixi a la teva instància de %{product}
- només ho podrà fer mitjançant un codi d'invitació
+ default_family_description: Posa els nous usuaris en aquesta família/grup
+ només si no tenen invitació.
+ default_family_none: Cap (crear nova família)
+ default_family_title: Família predeterminada per a nous usuaris
+ description: Controla com es registra la gent a la teva instància de %{product}.
email_confirmation_description: Quan està activat, els usuaris hauran de confirmar
el seu correu electrònic quan el canviïn.
email_confirmation_title: Requereix confirmació de correu electrònic
- generate_tokens: Genera nou codi
+ generate_tokens: Genera un nou codi
generated_tokens: Codis generats
states:
closed: Tancat
invite_only: Només per invitació
open: Obert
- title: Requereix codi d'invitació per registrar-se
- not_authorized: No estàs autoritzat/da per realitzar aquesta acció
+ title: Inici de sessió
+ not_authorized: No estàs autoritzat/da a fer aquesta acció
openai_settings:
access_token_label: Token d'accés
access_token_placeholder: Introdueix aquí el teu token d'accés
+ budget_description: S'aplica a totes les crides d'LLM — historial de xat,
+ autocategorització, detecció de comerç i processament de PDF. Els valors
+ predeterminats són conservadors per a models locals amb context reduït.
+ Augmenta'ls per a models al núvol amb finestres de context més grans.
+ budget_heading: Pressupost de tokens
+ context_window_help: 'Tokens totals que el model acceptarà. Per defecte: 2048
+ — puja a 8192+ per a OpenAI al núvol o models locals amb context gran.'
+ context_window_label: Finestra de context (opcional)
description: Introdueix el token d'accés i, opcionalment, configura un proveïdor
- OpenAI compatible personalitzat
+ compatible amb OpenAI personalitzat
env_configured_message: Configurat correctament mitjançant variables d'entorn.
json_mode_auto: Auto (recomanat)
json_mode_help: El mode estricte funciona millor amb models de pensament (qwen-thinking,
- deepseek-reasoner). El mode None funciona millor amb models estàndard (llama, mistral,
- gpt-oss).
- json_mode_json_object: JSON Object
+ deepseek-reasoner). El mode None funciona millor amb models estàndard (llama,
+ mistral, gpt-oss).
+ json_mode_json_object: Objecte JSON
json_mode_label: Mode JSON
- json_mode_none: None (millor per models estàndard)
- json_mode_strict: Estrict (millor per models de pensament)
+ json_mode_none: Cap (millor per a models estàndard)
+ json_mode_strict: Estricte (millor per a models de pensament)
+ max_items_per_call_help: 'Límit superior per als lots d''autocategorització
+ / detecció de comerç. Per defecte: 25. Els lots més grans es divideixen
+ automàticament per encabir-se a la finestra de context.'
+ max_items_per_call_label: Màxim d'elements per lot (opcional)
+ max_response_tokens_help: 'Tokens reservats per a la resposta del model. Per
+ defecte: 512. Redueix per alliberar espai per a un historial més llarg.'
+ max_response_tokens_label: Màxim de tokens de resposta (opcional)
model_label: Model (opcional)
model_placeholder: gpt-4.1 (per defecte)
title: OpenAI
uri_base_label: URL base de l'API (opcional)
uri_base_placeholder: https://api.openai.com/v1 (per defecte)
provider_selection:
- description: Tria quin servei utilitzar per obtenir tipus de canvi i preus de
- valors. Yahoo Finance és gratuït i no requereix clau API. Twelve Data
- requereix una clau API gratuïta però pot oferir més cobertura de dades.
- env_configured_message: La selecció de proveïdor està inhabilitada perquè les variables
- d'entorn (EXCHANGE_RATE_PROVIDER o SECURITIES_PROVIDER) estan configurades. Per habilitar
- la selecció aquí, elimina aquestes variables d'entorn de la teva configuració.
- exchange_rate_provider_label: Proveïdor de Tipus de Canvi
+ binance_public_hint: gratuït, sense clau API — només cripto (BTC, ETH, etc.)
+ description: Tria un únic proveïdor per obtenir tipus de canvi de divisa.
+ env_configured_message: La selecció de proveïdor està desactivada perquè hi
+ ha variables d'entorn configurades. Per activar la selecció aquí, elimina
+ aquestes variables d'entorn de la teva configuració.
+ exchange_rate_description: Tria un únic proveïdor per obtenir tipus de canvi
+ de divisa.
+ exchange_rate_provider_label: Proveïdor de tipus de canvi
+ exchange_rate_title: Proveïdor de tipus de canvi
+ mfapi_hint: gratuït, sense clau API — només fons mutus indis
providers:
+ alpha_vantage: Alpha Vantage
+ binance_public: Binance
+ eodhd: EODHD
+ mfapi: MFAPI.in
+ tiingo: Tiingo
twelve_data: Twelve Data
yahoo_finance: Yahoo Finance
- securities_provider_label: Proveïdor de Valors (Preus d'Accions)
- title: Selecció de Proveïdor
+ requires_api_key: requereix clau API
+ requires_api_key_alpha_vantage: requereix clau API, límit de 25 crides/dia
+ requires_api_key_eodhd: requereix clau API, límit de 20 crides/dia
+ securities_description: Activa un o més proveïdors per obtenir preus d'accions,
+ ETF i fons d'inversió. En cercar, es consulten tots els proveïdors activats
+ i es combinen els resultats.
+ securities_title: Proveïdors de valors
+ twelve_data_hint: requereix clau API, 800 crèdits/dia
+ yahoo_finance_hint: gratuït, no cal clau API
show:
+ ai_assistant: Assistent d'IA
clear_cache: Neteja la memòria cau de dades
clear_cache_warning: Netejar la memòria cau de dades eliminarà tots els tipus
de canvi, preus de valors, saldos de comptes i altres dades. Això no eliminarà
@@ -65,50 +189,82 @@ ca:
body: Segur que vols netejar la memòria cau de dades? Això eliminarà tots
els tipus de canvi, preus de valors, saldos de comptes i altres dades.
Aquesta acció no es pot desfer.
- title: Neteja la memòria cau de dades?
+ title: Netejar la memòria cau de dades?
danger_zone: Zona perillosa
- financial_data_providers: Proveïdors de Dades Financeres
- general: Serveis externs
+ financial_data_providers: Proveïdors de dades financeres
+ general: Configuració general
invites: Codis d'invitació
- sync_settings: Configuració de Sincronització
- title: Autoallotjament
+ sync_settings: Configuració de sincronització
+ title: Self hosting
+ sync_auto_sync_scheduler!:
+ scheduler_sync_failed: La configuració s'ha desat, però no s'ha pogut actualitzar
+ la planificació de sincronització. Torna-ho a provar o revisa els registres
+ del servidor.
sync_settings:
auto_sync_description: Quan està activat, tots els comptes es sincronitzaran
- automàticament diàriament a l'hora especificada.
+ automàticament cada dia a l'hora especificada.
auto_sync_label: Activa la sincronització automàtica
- auto_sync_time_description: Especifica l'hora del dia quan hauria de produir-se
+ auto_sync_time_description: Especifica l'hora del dia en què s'ha de produir
la sincronització automàtica.
auto_sync_time_label: Hora de sincronització (HH:MM)
- env_configured_message: Aquesta configuració està inhabilitada perquè una variable
- d'entorn del proveïdor (SIMPLEFIN_INCLUDE_PENDING o PLAID_INCLUDE_PENDING) està configurada. Elimina
- per habilitar aquesta configuració.
- include_pending_description: Quan està activat, les transaccions pendents (no liquidades)
- s'importaran i es reconciliaran automàticament quan es publiquin. Inhabilita si
- el teu banc proporciona dades pendents no fiables.
+ env_configured_message: Aquesta configuració està desactivada perquè una variable
+ d'entorn del proveïdor (SIMPLEFIN_INCLUDE_PENDING o PLAID_INCLUDE_PENDING)
+ està establerta. Elimina-la per activar aquesta opció.
+ include_pending_description: Quan està activat, les transaccions pendents
+ (no liquidades) s'importaran i es reconciliaran automàticament quan es publiquin.
+ Desactiva-ho si el teu banc proporciona dades pendents poc fiables.
include_pending_label: Inclou transaccions pendents
+ tiingo_settings:
+ description: Introdueix el token d'API proporcionat per Tiingo. El nivell
+ gratuït admet 50 símbols únics per hora amb més de 30 anys d'historial.
+ env_configured_message: Configurat correctament mitjançant la variable d'entorn
+ TIINGO_API_KEY.
+ label: Token d'API
+ placeholder: Introdueix aquí el teu token d'API de Tiingo
+ show_details: "(mostra detalls)"
+ step_1_html: Visita tiingo.com i crea un compte gratuït.
+ step_2_html: Ves a la pàgina Token d'API.
+ step_3: Copia el teu token d'API i enganxa'l a sota.
+ title: Tiingo
twelve_data_settings:
- api_calls_used: "%{used} / %{limit} crides diàries a l'API utilitzades (%{percentage})"
+ api_calls_used: "%{used} / %{limit} crides diàries d'API utilitzades (%{percentage})"
description: Introdueix la clau API proporcionada per Twelve Data
env_configured_message: Configurat correctament mitjançant la variable d'entorn
TWELVE_DATA_API_KEY.
label: Clau API
placeholder: Introdueix aquí la teva clau API
plan: Pla %{plan}
+ plan_upgrade_warning_description: Els següents símbols de la teva cartera
+ no poden sincronitzar preus amb el teu pla actual de Twelve Data.
+ plan_upgrade_warning_title: Alguns símbols requereixen un pla de pagament
+ requires_plan: requereix el pla %{plan}
+ show_details: "(mostra detalls)"
+ step_1_html: Visita twelvedata.com i crea un
+ compte de desenvolupador gratuït de Twelve Data.
+ step_2_html: Ves a la pàgina claus d'API.
+ step_3: Revela la teva Secret Key i enganxa-la a sota.
title: Twelve Data
+ view_pricing: Veure preus de Twelve Data
update:
failure: Valor de configuració invàlid
- invalid_onboarding_state: Estat d'incorporació invàlid
- invalid_sync_time: Format d'hora de sincronització invàlid. Utilitza el format HH:MM (p. ex.,
- 02:30).
- scheduler_sync_failed: S'ha desat la configuració, però no s'ha pogut actualitzar el programa de sincronització.
- Torna-ho a provar o revisa els registres del servidor.
+ invalid_llm_budget: "%{field} ha de ser un nombre enter ≥ %{minimum}."
+ invalid_onboarding_state: Estat d'inici de sessió invàlid
+ invalid_sync_time: Format d'hora de sincronització invàlid. Utilitza el format
+ HH:MM (p. ex., 02:30).
+ scheduler_sync_failed: La configuració s'ha desat, però no s'ha pogut actualitzar
+ la planificació de sincronització. Torna-ho a provar o revisa els registres
+ del servidor.
success: Configuració actualitzada
yahoo_finance_settings:
connection_failed: No s'ha pogut connectar amb Yahoo Finance
- description: Yahoo Finance ofereix accés gratuït a preus d'accions, tipus de canvi
- i dades financeres sense requerir clau API.
+ description: Yahoo Finance ofereix accés gratuït a preus d'accions, tipus
+ de canvi i dades financeres sense necessitat de clau API.
status_active: Yahoo Finance està actiu i funcionant
status_inactive: La connexió a Yahoo Finance ha fallat
title: Yahoo Finance
- troubleshooting: Comprova la connexió a Internet i la configuració del tallafocs. És possible que
- Yahoo Finance estigui temporalment no disponible.
+ troubleshooting: Comprova la connexió a Internet i la configuració del tallafoc.
+ És possible que Yahoo Finance estigui temporalment no disponible.
diff --git a/config/locales/views/settings/securities/ca.yml b/config/locales/views/settings/securities/ca.yml
index c75c90bac..2fd509e4b 100644
--- a/config/locales/views/settings/securities/ca.yml
+++ b/config/locales/views/settings/securities/ca.yml
@@ -3,10 +3,40 @@ ca:
settings:
securities:
show:
- disable_mfa: Desactiva 2FA
+ disable_mfa: Desactiva la 2FA
disable_mfa_confirm: Segur que vols desactivar l'autenticació en dos passos?
Això farà que el teu compte sigui menys segur.
- enable_mfa: Activa 2FA
+ enable_mfa: Activa la 2FA
mfa_description: Afegeix una capa extra de seguretat al teu compte requerint
un codi de la teva app d'autenticació en iniciar sessió
+ mfa_disabled_description: Activa la 2FA per afegir una capa extra de seguretat
+ al teu compte.
+ mfa_disabled_status_html: L'autenticació en dos passos està desactivada
+ mfa_enabled_description: El teu compte està protegit amb una capa addicional
+ de seguretat.
+ mfa_enabled_status_html: L'autenticació en dos passos està activada
mfa_title: Autenticació en dos passos
+ webauthn_add: Afegeix passkey o clau de seguretat
+ webauthn_added: Afegida el %{date}
+ webauthn_description: Utilitza una passkey, Touch ID, Windows Hello o una
+ clau de seguretat de maquinari com a segon factor en iniciar sessió.
+ webauthn_empty: Encara no hi ha cap passkey o clau de seguretat registrada.
+ webauthn_last_used: Última utilització fa %{time_ago}
+ webauthn_name_label: Nom de la clau
+ webauthn_name_placeholder: Touch ID MacBook, YubiKey, etc.
+ webauthn_remove: Elimina
+ webauthn_remove_confirm: Segur que vols eliminar aquesta passkey o clau de
+ seguretat?
+ webauthn_remove_confirm_body: Hauràs de tornar a registrar aquesta passkey
+ o clau de seguretat abans de poder utilitzar-la per a la verificació d'inici
+ de sessió.
+ webauthn_title: Passkeys i claus de seguretat
+ webauthn_unsupported: Aquest navegador no admet passkeys ni claus de seguretat.
+ webauthn_credentials:
+ default_name: Clau de seguretat
+ failure: No s'ha pogut desar aquesta passkey o clau de seguretat. Torna-ho a provar.
+ mfa_required: Activa l'autenticació en dos passos abans d'afegir una passkey o
+ clau de seguretat.
+ success: Passkey o clau de seguretat eliminada.
diff --git a/config/locales/views/settings/sso_identities/ca.yml b/config/locales/views/settings/sso_identities/ca.yml
index 08fe9fd6e..0c84ad741 100644
--- a/config/locales/views/settings/sso_identities/ca.yml
+++ b/config/locales/views/settings/sso_identities/ca.yml
@@ -3,5 +3,5 @@ ca:
settings:
sso_identities:
destroy:
- cannot_unlink_last: No es pot desvincular l'últim
+ cannot_unlink_last: No es pot desvincular l'última identitat
success: Èxit
diff --git a/config/locales/views/shared/ca.yml b/config/locales/views/shared/ca.yml
index 7dcbd7a99..b1f9457d7 100644
--- a/config/locales/views/shared/ca.yml
+++ b/config/locales/views/shared/ca.yml
@@ -1,19 +1,34 @@
---
ca:
+ concerns:
+ self_hostable:
+ redis_configured: Redis ja està configurat correctament! Ara pots configurar
+ la teva aplicació Sure.
shared:
+ cancel: Cancel·la
confirm_modal:
accept: Confirma
body_html: "
No podràs desfer aquesta acció
"
cancel: Cancel·la
title: Segur que vols continuar?
- money_field:
- label: Import
+ custom_confirm:
+ default_body: Aquesta acció no es pot desfer.
+ default_btn_text: Confirma
+ default_title: Segur que vols continuar?
exchange_rate_tabs:
calculate_rate_tab: Calcular la taxa FX
convert_tab: Convertir amb la taxa FX
destination_amount: Quantitat de destinació
exchange_rate: Taxa de canvi
- exchange_rate_help: Trieu com introduir la quantitat.
+ exchange_rate_help: Tria com introduir la quantitat.
+ family_moniker:
+ group_plural: Grups
+ group_singular: Grup
+ plural: Famílies
+ singular: Família
+ money_field:
+ label: Import
+ require_admin: Només els administradors poden fer aquesta acció
syncing_notice:
syncing: S'estan sincronitzant les dades dels comptes...
transaction_tabs:
diff --git a/config/locales/views/shared/en.yml b/config/locales/views/shared/en.yml
index 75d0dff32..6acc96633 100644
--- a/config/locales/views/shared/en.yml
+++ b/config/locales/views/shared/en.yml
@@ -25,8 +25,10 @@ en:
default_body: "This is not reversible."
default_btn_text: "Confirm"
family_moniker:
- singular: Family
+ group_plural: Groups
+ group_singular: Group
plural: Families
+ singular: Family
trend_change:
no_change: "no change"
cancel: Cancel
diff --git a/config/locales/views/simplefin_items/ca.yml b/config/locales/views/simplefin_items/ca.yml
index addb9cb72..7e882f3e5 100644
--- a/config/locales/views/simplefin_items/ca.yml
+++ b/config/locales/views/simplefin_items/ca.yml
@@ -2,39 +2,59 @@
ca:
simplefin_items:
complete_account_setup:
- all_skipped: S'han ignorat tots els comptes. No s'ha creat cap compte.
+ all_skipped: S'han omès tots els comptes. No s'ha creat cap compte.
no_accounts: No hi ha comptes per configurar.
stale_accounts_errors:
- one: "L'acció del compte obsolet ha fallat: %{count}. Consulta els registres per a més detalls."
- other: "Les accions dels comptes obsolets han fallat: %{count}. Consulta els registres per a més detalls."
- stale_accounts_processed: 'Comptes obsolets: %{deleted} eliminats, %{moved} moguts.'
- success: Els comptes SimpleFIN s'han configurat correctament! Les teves transaccions
- i posicions s'estan important en segon pla.
+ one: "%{count} acció de compte obsolet ha fallat. Consulta els registres per
+ a més detalls."
+ other: "%{count} accions de comptes obsolets han fallat. Consulta els registres
+ per a més detalls."
+ stale_accounts_processed: 'Comptes obsolets: %{deleted} eliminats, %{moved}
+ moguts.'
+ success:
+ one: S'ha creat correctament %{count} compte SimpleFIN! Les teves transaccions
+ i posicions s'estan important en segon pla.
+ other: S'han creat correctament %{count} comptes SimpleFIN! Les teves transaccions
+ i posicions s'estan important en segon pla.
create:
errors:
blank_token: Introdueix un token de configuració SimpleFIN.
create_failed: 'No s''ha pogut connectar: %{message}'
- invalid_token: Token de configuració invàlid. Comprova que has copiat el token
- complet des de SimpleFIN Bridge.
+ invalid_token: Token de configuració no vàlid. Comprova que has copiat el
+ token complet des de SimpleFIN Bridge.
token_compromised: El token de configuració pot estar compromès, caducat o
ja utilitzat. Crea'n un de nou.
- unexpected: S'ha produït un error inesperat. Torna-ho a provar o contacta
- amb el suport.
+ unexpected: S'ha produït un error inesperat. Torna-ho a provar.
success: Connexió SimpleFIN afegida correctament! Els teus comptes apareixeran
en breu mentre es sincronitzen en segon pla.
destroy:
success: La connexió SimpleFIN s'eliminarà
+ dismiss_replacement_suggestion:
+ dismissed: Suggeriment de substitució descartat
edit:
+ cancel: Cancel·la
+ connection_needs_update: 'La teva connexió SimpleFIN necessita actualització:'
+ header_subtitle: Obtén un nou token de configuració per reconnectar el teu compte
+ SimpleFIN
setup_token:
help_text: El token ha de ser una cadena llarga que comenci amb lletres i
números
label: 'Token de configuració SimpleFIN:'
placeholder: Enganxa aquí el teu token de configuració SimpleFIN...
+ step_1_html: Visita SimpleFIN Bridge per crear un nou token de configuració
+ step_2: Copia el token i enganxa'l a continuació
+ step_3: Fes clic a "Actualitza" per restaurar l'accés
+ title: Actualitza la connexió SimpleFIN
+ update: Actualitza
link_existing_account:
errors:
- invalid_simplefin_account: S'ha seleccionat un compte SimpleFIN invàlid
- only_manual: Només es poden enllaçar comptes manuals
- success: S'ha enllaçat el compte correctament amb SimpleFIN
+ different_provider: Aquest compte està enllaçat a un altre proveïdor. Desenllaça'l
+ primer d'aquell proveïdor i després enllaça'l a SimpleFIN.
+ invalid_simplefin_account: S'ha seleccionat un compte SimpleFIN no vàlid
+ only_manual: Només els comptes manuals es poden enllaçar
+ success: El compte s'ha enllaçat correctament a SimpleFIN
new:
cancel: Cancel·la
connect: Connecta
@@ -45,55 +65,117 @@ ca:
message:
one: "%{count} transacció pendent duplicada conciliada"
other: "%{count} transaccions pendents duplicades conciliades"
+ replacement_prompt:
+ confirm_body: "“%{account_name}” s'enllaçarà a “%{new_name}”. El teu historial
+ de transaccions es manté; les transaccions futures vindran de la nova targeta."
+ confirm_title: Vols tornar a enllaçar a la nova targeta?
+ description: "“%{account_name}” està enllaçat a “%{old_name}”, que no ha tingut
+ activitat recent i té saldo zero. Una nova targeta, “%{new_name}”, està activa
+ a la mateixa entitat. Torna a enllaçar-la per mantenir l'historial intacte."
+ dismiss_aria: Descarta el suggeriment de substitució
+ relink: Torna a enllaçar a la nova targeta
+ title: La teva targeta de %{institution} pot haver estat substituïda
select_existing_account:
- all_accounts_already_linked: Sembla que ja s'han enllaçat tots els comptes de SimpleFIN.
+ all_accounts_already_linked: Sembla que tots els comptes SimpleFIN ja estan
+ enllaçats.
cancel: Cancel·la
- check_provider_health: Comprova l'estat del proveïdor
+ check_provider_health: Comprova que la teva connexió SimpleFIN està activa a
+ Configuració → Proveïdors.
currently_linked_to: 'Actualment enllaçat a: %{account_name}'
description: Selecciona un compte SimpleFIN per enllaçar-lo al teu compte existent
link_account: Enllaça el compte
- no_accounts_found: No s'han trobat comptes SimpleFIN per a aquesta família.
+ no_accounts_found: No s'han trobat comptes SimpleFIN per a %{moniker}.
title: Enllaça %{account_name} amb SimpleFIN
- unlink_to_move: Per moure un enllaç, primer des-enllaça'l del menú d'accions del compte.
- wait_for_sync: Si acabes de connectar o sincronitzar, torna-ho a provar després que la sincronització completi.
+ unlink_to_move: Per moure un enllaç, primer desenllaça'l del menú d'accions
+ del compte.
+ wait_for_sync: Si acabes de connectar o sincronitzar, torna-ho a provar després
+ que la sincronització acabi.
setup_accounts:
+ account_card:
+ balance: Saldo
+ account_type_checking_savings: Corrent o estalvis
+ account_type_checking_savings_desc: Comptes bancaris habituals
+ account_type_credit_card: Targeta de crèdit
+ account_type_credit_card_desc: Comptes de targeta de crèdit
+ account_type_investment: Inversió
+ account_type_investment_desc: Corredoria, comptes 401(k), IRA
+ account_type_label: 'Tipus de compte:'
+ account_type_loan: Préstec o hipoteca
+ account_type_loan_desc: Comptes de deute
+ account_type_other_asset: Altre actiu
+ account_type_other_asset_desc: Tota la resta
+ activity:
+ days_ago:
+ one: fa 1 dia
+ other: fa %{count} dies
+ dormant: Sense activitat en %{days} dies
+ empty: Encara no s'han importat transaccions
+ likely_closed: Sense activitat recent i saldo zero — pot ser una targeta tancada
+ o substituïda
+ recent:
+ one: 1 transacció • darrera %{when}
+ other: "%{count} transaccions • darrera %{when}"
+ today: avui
+ yesterday: ahir
+ cancel: Cancel·la
+ choose_account_type: 'Tria el tipus de compte correcte per a cada compte SimpleFIN:'
+ create_accounts: Crea comptes
+ creating_accounts: Creant comptes...
+ header_subtitle: Tria els tipus de compte correctes per als teus comptes importats
stale_accounts:
action_delete: Elimina el compte i totes les transaccions
action_move: 'Mou les transaccions a:'
action_prompt: Què vols fer?
action_skip: Omet ara
- description: Aquests comptes existeixen a la teva base de dades però ja no s'ofereixen
- per SimpleFIN. Això pot passar quan les configuracions del compte canvien a nivell superior.
+ description: Aquests comptes existeixen a la teva base de dades, però ja no
+ els ofereix SimpleFIN. Això pot passar quan la configuració del compte canvia
+ al proveïdor.
title: Comptes ja no disponibles a SimpleFIN
transaction_count:
one: "%{count} transacció"
other: "%{count} transaccions"
+ title: Configura els teus comptes SimpleFIN
+ transaction_history_description_html: SimpleFIN normalment proporciona 60-90
+ dies d'historial de transaccions, segons el teu banc. Després de
+ la configuració inicial, les noves transaccions es sincronitzaran automàticament.
+ La disponibilitat de les dades històriques varia segons l'entitat i el tipus
+ de compte.
+ transaction_history_title: 'Historial de transaccions:'
simplefin_item:
- add_new: Afegeix nova connexió
+ accounts_skipped_label: 'Omesos: %{count}'
+ accounts_skipped_tooltip: S'han omès alguns comptes per errors durant la sincronització
+ add_new: Afegeix una connexió nova
confirm_accept: Elimina la connexió
confirm_body: Això eliminarà permanentment tots els comptes d'aquest grup i
totes les dades associades.
confirm_title: Vols eliminar la connexió SimpleFIN?
delete: Elimina
deletion_in_progress: "(eliminació en curs...)"
- duplicate_accounts_skipped: S'han omès alguns comptes perquè eren duplicats — utilitza 'Enllaça
- comptes existents' per fusionar-los.
+ duplicate_accounts_skipped: S'han omès alguns comptes perquè eren duplicats
+ — utilitza 'Enllaça comptes existents' per fusionar-los.
error: S'ha produït un error en sincronitzar les dades
+ more_accounts_available:
+ one: "%{count} compte més disponible per configurar"
+ other: "%{count} comptes més disponibles per configurar"
no_accounts_description: Aquesta connexió encara no té cap compte sincronitzat.
no_accounts_title: No s'han trobat comptes
- reconciled_details_note: "(consulta el resum de la sincronització per a més detalls)"
- requires_update: Cal tornar a autenticar
- setup_action: Configura nous comptes
+ rate_limited_ago: Límit de velocitat aplicat (fa %{time})
+ rate_limited_recently: Límit de velocitat aplicat recentment
+ reconciled_details_note: "(consulta el resum de la sincronització per a més
+ detalls)"
+ requires_update: Reconnecta
+ setup_accounts_menu: Configura comptes
+ setup_action: Configura els nous comptes
setup_description: Tria els tipus de compte per als teus nous comptes SimpleFIN
importats.
- setup_needed: Nous comptes llestos per configurar
+ setup_needed: Nous comptes a punt per configurar
stale_pending_accounts: 'a: %{accounts}'
stale_pending_note: "(exclòs dels pressupostos)"
status: Darrera sincronització fa %{timestamp}
status_never: Mai sincronitzat
status_with_summary: Darrera sincronització fa %{timestamp} • %{summary}
syncing: Sincronitzant...
- update: Actualitza la connexió
+ update: Actualitza
stale_pending_status:
message:
one: "%{count} transacció pendent anterior a %{days} dies"
@@ -101,12 +183,11 @@ ca:
update:
errors:
blank_token: Introdueix un token de configuració SimpleFIN.
- invalid_token: Token de configuració invàlid. Comprova que has copiat el token
- complet des de SimpleFIN Bridge.
+ invalid_token: Token de configuració no vàlid. Comprova que has copiat el
+ token complet des de SimpleFIN Bridge.
token_compromised: El token de configuració pot estar compromès, caducat o
ja utilitzat. Crea'n un de nou.
- unexpected: S'ha produït un error inesperat. Torna-ho a provar o contacta
- amb el suport.
+ unexpected: S'ha produït un error inesperat. Torna-ho a provar.
update_failed: 'No s''ha pogut actualitzar la connexió: %{message}'
success: Connexió SimpleFIN actualitzada correctament! Els teus comptes s'estan
tornant a connectar.
diff --git a/config/locales/views/snaptrade_items/ca.yml b/config/locales/views/snaptrade_items/ca.yml
new file mode 100644
index 000000000..d270af3cf
--- /dev/null
+++ b/config/locales/views/snaptrade_items/ca.yml
@@ -0,0 +1,209 @@
+---
+ca:
+ providers:
+ snaptrade:
+ accounts_count:
+ one: "%{count} compte"
+ other: "%{count} comptes"
+ client_id_label: Client ID
+ client_id_placeholder: Introdueix el teu Client ID de SnapTrade
+ client_id_update_placeholder: Introdueix un nou Client ID per actualitzar
+ connect_button: Connecta un broker
+ connected_brokerages: 'Connectats:'
+ connection_description: Connecta't al teu broker a través de SnapTrade (25+
+ brokers admesos)
+ connections_error: 'No s''han pogut carregar les connexions: %{message}'
+ consumer_key_label: Consumer Key
+ consumer_key_placeholder: Introdueix la teva Consumer Key de SnapTrade
+ consumer_key_update_placeholder: Introdueix un nou Consumer Key per actualitzar
+ delete_connection: Elimina
+ delete_connection_body: Això eliminarà permanentment la connexió de %{brokerage}
+ de SnapTrade. Tots els comptes d'aquest broker quedaran sense enllaçar. Hauràs
+ de reconnectar per sincronitzar aquests comptes de nou.
+ delete_connection_confirm: Elimina la connexió
+ delete_connection_title: Vols eliminar la connexió amb el broker?
+ delete_orphaned_user: Elimina
+ delete_orphaned_user_body: Això eliminarà permanentment aquest usuari orfe de
+ SnapTrade i totes les seves connexions de broker, alliberant places de connexió.
+ delete_orphaned_user_confirm: Elimina el registre
+ delete_orphaned_user_title: Vols eliminar el registre orfe?
+ description: SnapTrade connecta amb més de 25 brokers importants (Fidelity,
+ Vanguard, Schwab, Robinhood, etc.) i proporciona l'historial complet d'operacions
+ amb etiquetes d'activitat i cost base.
+ free_tier_warning: El nivell gratuït de SnapTrade cobreix 5 connexions de broker.
+ Per a més, amplia el teu pla a SnapTrade.
+ loading_connections: Carregant connexions...
+ manage_connections: Gestiona connexions
+ name: SnapTrade
+ needs_linking: necessita enllaç
+ needs_setup:
+ one: "%{count} necessita configuració"
+ other: "%{count} necessiten configuració"
+ no_connections: No s'han trobat connexions de broker.
+ orphaned_connection: Connexió orfe (no sincronitzada localment)
+ orphaned_user: Registre orfe
+ orphaned_users_description: Aquests són registres d'usuari de SnapTrade anteriors
+ que ocupen places de connexió. Elimina'ls per alliberar places.
+ orphaned_users_title:
+ one: "%{count} registre orfe"
+ other: "%{count} registres orfes"
+ save_button: Desa la configuració
+ setup_accounts_button: Configura comptes
+ setup_title: 'Instruccions de configuració:'
+ status_connected:
+ one: "%{count} compte de SnapTrade"
+ other: "%{count} comptes de SnapTrade"
+ status_needs_registration: Credencials desades. Finalitza la configuració per
+ connectar un broker.
+ status_ready: Llest per connectar brokers
+ step_1_html: Crea un compte a dashboard.snaptrade.com
+ step_2: Copia el teu Client ID i Consumer Key des del panell
+ step_3: Introdueix les teves credencials a continuació i fes clic a Desa
+ step_4: Ves a la pàgina de comptes i utilitza 'Connecta un altre broker' per
+ enllaçar els teus comptes d'inversió
+ update_button: Actualitza la configuració
+ snaptrade_item:
+ brokerage_summary:
+ count:
+ one: "%{count} broker"
+ other: "%{count} brokers"
+ none: No hi ha brokers connectats
+ institution_summary:
+ count:
+ one: "%{count} entitat"
+ other: "%{count} entitats"
+ none: No hi ha entitats connectades
+ sync_status:
+ no_accounts: No s'han trobat comptes
+ synced:
+ one: "%{count} compte sincronitzat"
+ other: "%{count} comptes sincronitzats"
+ synced_with_setup: "%{linked} sincronitzats, %{unlinked} necessiten configuració"
+ syncer:
+ activities_fetching_async: Les activitats s'estan obtenint en segon pla. Pot
+ trigar fins a un minut per a connexions de broker noves.
+ calculating: Calculant saldos...
+ checking_config: Comprovant la configuració dels comptes...
+ discovering: Descobrint comptes...
+ importing: Important comptes des de SnapTrade...
+ needs_setup: "%{count} comptes necessiten configuració..."
+ processing: Processant posicions i activitats...
+ snaptrade_items:
+ callback:
+ no_item: No s'ha trobat la configuració de SnapTrade.
+ success: Broker connectat! Selecciona quins comptes vols enllaçar.
+ complete_account_setup:
+ link_failed: 'No s''han pogut enllaçar els comptes: %{errors}'
+ no_accounts: No s'ha seleccionat cap compte per enllaçar.
+ partial_success:
+ one: S'ha enllaçat %{count} compte. %{failed_count} no s'han pogut enllaçar.
+ other: S'han enllaçat %{count} comptes. %{failed_count} no s'han pogut enllaçar.
+ success:
+ one: S'ha enllaçat correctament %{count} compte.
+ other: S'han enllaçat correctament %{count} comptes.
+ connect:
+ connection_failed: 'No s''ha pogut connectar a SnapTrade: %{message}'
+ decryption_failed: No s'han pogut llegir les credencials de SnapTrade. Elimina
+ aquesta connexió i torna-la a crear.
+ connections:
+ unknown_brokerage: Broker desconegut
+ create:
+ success: SnapTrade s'ha configurat correctament.
+ default_name: Connexió SnapTrade
+ delete_connection:
+ api_deletion_failed: No s'ha pogut eliminar la connexió de SnapTrade — falten
+ les credencials. La connexió encara pot existir al teu compte SnapTrade.
+ failed: 'No s''ha pogut eliminar la connexió: %{message}'
+ missing_authorization_id: Falta l'ID d'autorització
+ success: La connexió s'ha eliminat correctament. S'ha alliberat una plaça.
+ delete_orphaned_user:
+ failed: No s'ha pogut eliminar el registre orfe.
+ success: El registre orfe s'ha eliminat correctament.
+ destroy:
+ success: S'ha programat la connexió SnapTrade per a la seva eliminació.
+ link_accounts:
+ use_setup_flow: Utilitza en el seu lloc el flux de configuració de comptes
+ link_existing_account:
+ failed: 'No s''ha pogut enllaçar el compte: %{message}'
+ not_found: No s'ha trobat el compte.
+ success: S'ha enllaçat correctament al compte SnapTrade.
+ preload_accounts:
+ not_configured: SnapTrade no està configurat.
+ select_accounts:
+ not_configured: SnapTrade no està configurat.
+ select_existing_account:
+ balance_label: 'Saldo:'
+ cancel_button: Cancel·la
+ connect_hint: Pot ser que hagis de connectar primer un broker.
+ header: Enllaça un compte existent
+ link_button: Enllaça
+ linking_to: 'Enllaçant al compte:'
+ no_accounts: No hi ha comptes SnapTrade sense enllaçar disponibles.
+ not_found: No s'ha trobat el compte o la configuració de SnapTrade.
+ settings_link: Ves a la configuració del proveïdor
+ subtitle: Selecciona un compte SnapTrade per enllaçar
+ title: Enllaça amb un compte SnapTrade
+ setup_accounts:
+ account_number: 'Compte:'
+ available_accounts: Comptes disponibles
+ back_to_settings: Torna a la configuració
+ balance_label: 'Saldo:'
+ cancel_button: Cancel·la
+ create_button: Crea els comptes seleccionats
+ creating: Creant comptes...
+ done_button: Fet
+ free_tier_note: El nivell gratuït de SnapTrade permet 5 connexions de broker.
+ Revisa el teu panell de SnapTrade per veure l'ús actual.
+ header: Configura els teus comptes SnapTrade
+ info_activities: Historial d'operacions amb etiquetes d'activitat (Compra, Venda,
+ Dividend, etc.)
+ info_cost_basis: Cost base per posició (quan estigui disponible)
+ info_history: Fins a 3 anys d'historial de transaccions
+ info_holdings: Posicions amb preus i quantitats actuals
+ info_title: Dades d'inversió SnapTrade
+ link_button: Enllaça
+ linked_accounts: Ja enllaçats
+ linked_to: 'Enllaçat a:'
+ loading: Obtenint comptes des de SnapTrade...
+ loading_hint: Fes clic a Actualitza per comprovar si hi ha comptes.
+ no_accounts_message: No s'ha trobat cap compte de broker. Això pot passar si
+ has cancel·lat la connexió o si el teu broker no està admès.
+ no_accounts_title: No s'han trobat comptes
+ or_link_existing: 'O enllaça a un compte existent en lloc de crear-ne un de
+ nou:'
+ refresh: Actualitza
+ select_account: Selecciona un compte...
+ subtitle: Selecciona quins comptes de broker vols enllaçar
+ sync_start_date_help: Deixa-ho en blanc per a tot l'historial disponible
+ sync_start_date_label: 'Importa transaccions des de:'
+ syncing: Obtenint els teus comptes...
+ title: Configura comptes SnapTrade
+ try_again: Connecta un broker
+ snaptrade_item:
+ accounts_need_setup:
+ one: "%{count} compte necessita configuració"
+ other: "%{count} comptes necessiten configuració"
+ add_another_brokerage: Connecta un altre broker
+ connect_brokerage: Connecta un broker
+ delete: Elimina
+ deletion_in_progress: Eliminació en curs...
+ error: Error de sincronització
+ manage_connections: Gestiona connexions
+ more_accounts_available:
+ one: "%{count} compte més disponible per configurar"
+ other: "%{count} comptes més disponibles per configurar"
+ no_accounts_description: Connecta un broker per importar els teus comptes d'inversió.
+ no_accounts_title: No s'han descobert comptes
+ reconnect: Reconnecta
+ requires_update: La connexió necessita actualització
+ setup_accounts_menu: Configura comptes
+ setup_action: Configura comptes
+ setup_description: Alguns comptes de SnapTrade necessiten ser enllaçats a comptes
+ de Sure.
+ setup_needed: Els comptes necessiten configuració
+ status: Darrera sincronització fa %{timestamp} - %{summary}
+ status_never: Mai sincronitzat
+ syncing: Sincronitzant...
+ update:
+ success: La configuració de SnapTrade s'ha actualitzat correctament.
diff --git a/config/locales/views/sophtron_items/ca.yml b/config/locales/views/sophtron_items/ca.yml
new file mode 100644
index 000000000..3b5321b74
--- /dev/null
+++ b/config/locales/views/sophtron_items/ca.yml
@@ -0,0 +1,365 @@
+---
+ca:
+ sophtron_items:
+ api_error:
+ bad_credentials: 'Credencials bancàries: comprova que el nom d''usuari i la
+ contrasenya són correctes'
+ check_provider_settings: Revisa la configuració del proveïdor
+ common_issues_title: 'Problemes habituals:'
+ expired_credentials: 'Credencials caducades: genera un nou ID d''usuari i clau
+ d''accés des de Sophtron'
+ incorrect_user_id: 'ID d''usuari incorrecte: verifica el teu ID d''usuari a
+ la configuració del proveïdor'
+ institution_timeout: 'Temps esgotat de l''entitat: la pàgina d''inici de sessió
+ del banc no ha acabat a temps'
+ institution_unable_to_connect: No s'ha pogut connectar amb l'entitat
+ invalid_access_key: 'Clau d''accés no vàlida: revisa la teva clau d''accés a
+ la configuració del proveïdor'
+ network_issue: 'Problema de xarxa: comprova la teva connexió a internet'
+ service_down: 'Servei caigut: l''API de Sophtron pot estar temporalment no disponible'
+ title: Error de connexió amb Sophtron
+ try_again: Torna a intentar la connexió
+ unable_to_connect: No s'ha pogut connectar a Sophtron
+ unsupported_mfa: 'Compatibilitat MFA: Sophtron pot no donar suport al flux de
+ verificació actual d''aquesta entitat'
+ verification_code: 'Codi de verificació: assegura''t que has introduït l''últim
+ codi abans que caduqui'
+ complete_account_setup:
+ all_skipped: S'han omès tots els comptes. No s'ha creat cap compte.
+ api_error: Error de connexió amb l'API
+ creation_failed: No s'han pogut crear els comptes
+ no_accounts: No hi ha comptes per configurar.
+ success: S'han creat correctament %{count} compte(s).
+ unexpected_error: S'ha produït un error inesperat
+ connect:
+ cancel: Cancel·la
+ captcha: Captcha
+ connect: Connecta
+ institution_search_label: Entitat
+ institution_search_placeholder: Cerca pel nom del banc
+ no_institutions: No s'han trobat entitats coincidents.
+ password: Contrasenya
+ search: Cerca
+ search_too_short: Introdueix almenys dos caràcters per cercar.
+ title: Connecta una entitat Sophtron
+ username: Nom d'usuari
+ connect_institution:
+ api_error: 'La connexió Sophtron ha fallat: %{message}'
+ missing_parameters: Selecciona una entitat i introdueix les teves credencials
+ d'inici de sessió bancari.
+ connection_status:
+ api_error: 'Error de connexió amb l''API: %{message}'
+ attempt: Intent %{attempt} de %{max}
+ check_again: Torna a comprovar
+ failed: Sophtron no ha pogut completar la connexió amb aquesta entitat.
+ failed_timeout: Sophtron ha esgotat el temps mentre l'entitat completava l'inici
+ de sessió.
+ timeout: Sophtron no ha completat la connexió dins del temps previst. Pots tornar
+ a comprovar-ho o intentar reconnectar més tard.
+ title: Connectant Sophtron
+ waiting: Sophtron encara s'està connectant a la teva entitat.
+ create:
+ success: La connexió Sophtron s'ha creat correctament
+ defaults:
+ name: Connexió Sophtron
+ destroy:
+ success: La connexió Sophtron s'ha eliminat
+ edit:
+ access_key:
+ help_text: La clau d'accés ha de ser una cadena llarga que comenci amb lletres
+ i números
+ label: 'Clau d''accés de Sophtron:'
+ placeholder: Enganxa aquí la teva clau d'accés de Sophtron...
+ user_id:
+ help_text: L'ID d'usuari ha de ser una cadena llarga que comenci amb lletres
+ i números
+ label: 'ID d''usuari de Sophtron:'
+ placeholder: Enganxa aquí el teu ID d'usuari de Sophtron...
+ index:
+ title: Connexions Sophtron
+ link_accounts:
+ all_already_linked:
+ one: El compte seleccionat (%{names}) ja està enllaçat
+ other: 'Tots els %{count} comptes seleccionats ja estan enllaçats: %{names}'
+ api_error: Error de connexió amb l'API
+ invalid_account_names:
+ one: No es pot enllaçar un compte sense nom
+ other: No es poden enllaçar %{count} comptes sense nom
+ link_failed: No s'han pogut enllaçar els comptes
+ no_access_key: La clau d'accés de Sophtron no està configurada. Configura-la
+ a la configuració.
+ no_accounts_found: No s'han trobat comptes. Comprova la configuració de la teva
+ clau API.
+ no_accounts_selected: Selecciona almenys un compte
+ no_credentials_configured: Primer, configura el teu ID d'usuari i clau d'accés
+ de Sophtron a la configuració del proveïdor.
+ no_institution_connected: Primer connecta una entitat bancària amb Sophtron.
+ no_user_id: L'ID d'usuari de Sophtron no està configurat. Configura'l a la configuració.
+ partial_invalid: S'han enllaçat correctament %{created_count} compte(s), %{already_linked_count}
+ ja estaven enllaçats, %{invalid_count} compte(s) tenien noms no vàlids
+ partial_success: 'S''han enllaçat correctament %{created_count} compte(s). %{already_linked_count}
+ compte(s) ja estaven enllaçats: %{already_linked_names}'
+ success:
+ one: S'ha enllaçat correctament %{count} compte
+ other: S'han enllaçat correctament %{count} comptes
+ link_existing_account:
+ account_already_linked: Aquest compte ja està enllaçat a un proveïdor
+ api_error: Error de connexió amb l'API
+ invalid_account_name: No es pot enllaçar un compte sense nom
+ missing_parameters: Falten paràmetres obligatoris
+ no_institution_connected: Primer connecta una entitat bancària amb Sophtron.
+ sophtron_account_already_linked: Aquest compte Sophtron ja està enllaçat a un
+ altre compte
+ sophtron_account_not_found: No s'ha trobat el compte Sophtron
+ success: S'ha enllaçat correctament %{account_name} amb Sophtron
+ unexpected_error: S'ha produït un error inesperat
+ loading:
+ loading_message: Carregant comptes de Sophtron...
+ loading_title: Carregant
+ manual_sync_complete:
+ close: Tanca
+ description: Els saldos dels comptes acabaran d'actualitzar-se en segon pla.
+ message: S'han descarregat les transaccions després de la verificació de Sophtron.
+ title: Sincronització Sophtron iniciada
+ mfa:
+ captcha: Text del captcha
+ captcha_alt: Captcha de Sophtron
+ phone_confirmed: He confirmat per telèfon
+ submit: Envia
+ title: Verificació Sophtron
+ token: Codi de verificació
+ new:
+ access_key: Clau d'accés
+ access_key_placeholder: enganxa la teva clau d'accés de Sophtron
+ cancel: Cancel·la
+ connect: Connecta
+ title: Connecta Sophtron
+ user_id: ID d'usuari
+ user_id_placeholder: enganxa el teu ID d'usuari de Sophtron
+ preload_accounts:
+ api_error: Error de connexió amb l'API
+ no_access_key: La clau d'accés de Sophtron no està configurada. Configura-la
+ a la configuració.
+ no_accounts_found: No s'han trobat comptes. Comprova la configuració de la teva
+ clau API.
+ no_credentials_configured: Primer, configura el teu ID d'usuari i clau d'accés
+ de Sophtron a la configuració del proveïdor.
+ no_user_id: L'ID d'usuari de Sophtron no està configurat. Configura'l a la configuració.
+ preload_accounts: precarrega els comptes
+ unexpected_error: S'ha produït un error inesperat
+ redirect_after_account_link:
+ all_already_linked:
+ one: El compte seleccionat ja està enllaçat
+ other: Tots els %{count} comptes seleccionats ja estan enllaçats
+ invalid_account_names:
+ one: No es pot enllaçar %{count} compte sense nom
+ other: No es poden enllaçar %{count} comptes sense nom
+ link_failed: No s'han pogut enllaçar els comptes
+ partial_invalid: S'han enllaçat %{created_count} compte(s). %{already_linked_count}
+ ja estaven enllaçats, %{invalid_count} tenien noms no vàlids.
+ partial_success: S'han enllaçat %{created_count} compte(s). %{already_linked_count}
+ compte(s) ja estaven enllaçats.
+ success:
+ one: S'ha enllaçat correctament %{count} compte.
+ other: S'han enllaçat correctament %{count} comptes.
+ render_connection_timeout:
+ timeout: S'ha esgotat el temps de connexió. Torna-ho a provar.
+ select_accounts:
+ accounts_selected: comptes seleccionats
+ api_error: Error de connexió amb l'API
+ cancel: Cancel·la
+ configure_name_in_sophtron: No es pot importar — configura el nom del compte
+ a Sophtron
+ description: Selecciona els comptes que vols enllaçar al teu compte de %{product_name}.
+ link_accounts: Enllaça els comptes seleccionats
+ no_access_key: La clau d'accés de Sophtron no està configurada. Configura-la
+ a la configuració.
+ no_accounts_found: No s'han trobat comptes. Comprova la configuració de la teva
+ clau API.
+ no_credentials_configured: Primer, configura el teu ID d'usuari i clau d'accés
+ de Sophtron a la configuració del proveïdor.
+ no_institution_connected: Primer connecta una entitat bancària amb Sophtron.
+ no_name_placeholder: "(Sense nom)"
+ no_user_id: L'ID d'usuari de Sophtron no està configurat. Configura'l a la configuració.
+ title: Selecciona comptes Sophtron
+ unexpected_error: S'ha produït un error inesperat
+ select_existing_account:
+ account_already_linked: Aquest compte ja està enllaçat a un proveïdor
+ all_accounts_already_linked: Tots els comptes Sophtron ja estan enllaçats
+ api_error: Error de connexió amb l'API
+ cancel: Cancel·la
+ configure_name_in_sophtron: No es pot importar — configura el nom del compte
+ a Sophtron
+ description: Selecciona un compte Sophtron per enllaçar-lo amb aquest compte.
+ Les transaccions es sincronitzaran i deduplicaran automàticament.
+ link_account: Enllaça compte
+ no_access_key: La clau d'accés de Sophtron no està configurada. Configura-la
+ a la configuració.
+ no_account_specified: No s'ha especificat cap compte
+ no_accounts_found: No s'han trobat comptes Sophtron. Comprova la configuració
+ de la teva clau API.
+ no_institution_connected: Primer connecta una entitat bancària amb Sophtron.
+ no_name_placeholder: "(Sense nom)"
+ no_user_id: L'ID d'usuari de Sophtron no està configurat. Configura'l a la configuració.
+ title: Enllaça %{account_name} amb Sophtron
+ unexpected_error: S'ha produït un error inesperat
+ select_option: Selecciona %{type}
+ setup_accounts:
+ account_type_label: 'Tipus de compte:'
+ account_types:
+ credit_card: Targeta de crèdit
+ depository: Compte corrent o d'estalvis
+ investment: Compte d'inversió
+ loan: Préstec o hipoteca
+ other_asset: Altre actiu
+ skip: Omet aquest compte
+ all_accounts_linked: Tots els teus comptes Sophtron ja s'han configurat.
+ api_error: Error de connexió amb l'API
+ balance: Saldo
+ cancel: Cancel·la
+ choose_account_type: 'Tria el tipus de compte correcte per a cada compte Sophtron:'
+ create_accounts: Crea comptes
+ creating_accounts: Creant comptes...
+ fetch_failed: No s'han pogut obtenir els comptes
+ historical_data_range: 'Rang de dades històriques:'
+ no_access_key: La clau d'accés de Sophtron no està configurada. Revisa la configuració
+ de la connexió.
+ no_accounts_to_setup: No hi ha comptes per configurar
+ no_institution_connected: L'entitat Sophtron encara no està connectada.
+ no_user_id: L'ID d'usuari de Sophtron no està configurat. Revisa la configuració
+ de la connexió.
+ subtitle: Tria els tipus de compte correctes per als teus comptes importats
+ subtype_labels:
+ credit_card: ''
+ depository: 'Subtipus de compte:'
+ investment: 'Tipus d''inversió:'
+ loan: 'Tipus de préstec:'
+ other_asset: ''
+ subtype_messages:
+ credit_card: Les targetes de crèdit es configuraran automàticament com a comptes
+ de targeta de crèdit.
+ other_asset: No calen opcions addicionals per a altres actius.
+ sync_start_date_help: Selecciona fins on vols sincronitzar l'historial de transaccions.
+ Hi ha un màxim de 3 anys d'historial disponible.
+ sync_start_date_label: 'Comença a sincronitzar transaccions des de:'
+ title: Configura els teus comptes Sophtron
+ unexpected_error: S'ha produït un error inesperat
+ sophtron_entry:
+ processor:
+ unknown_transaction: Transacció desconeguda
+ sophtron_item:
+ accounts_need_setup: Els comptes necessiten configuració
+ automatic_sync: Utilitza la sincronització automàtica
+ automatic_sync_for: Utilitza la sincronització automàtica per a %{institution}
+ delete: Elimina la connexió
+ deletion_in_progress: eliminació en curs...
+ error: Error
+ manual_sync: Sincronització manual
+ manual_sync_action: Requereix sincronització manual
+ manual_sync_action_for: Requereix sincronització manual per a %{institution}
+ no_accounts_description: Aquesta connexió encara no té comptes enllaçats.
+ no_accounts_title: No hi ha comptes
+ setup_action: Configura els nous comptes
+ setup_description: "%{linked} de %{total} comptes enllaçats. Tria els tipus
+ de compte per als teus nous comptes Sophtron importats."
+ setup_needed: Nous comptes a punt per configurar
+ status: Sincronitzat fa %{timestamp}
+ status_never: Mai sincronitzat
+ status_with_summary: Darrera sincronització fa %{timestamp} • %{summary}
+ sync_now: Sincronitza ara
+ syncing: Sincronitzant...
+ total: Total
+ unlinked: Sense enllaç
+ sophtron_panel:
+ field_descriptions:
+ access_key_html: "Clau d'accés: la teva credencial de clau
+ d'accés de Sophtron"
+ base_url_html: "URL base: l'URL de l'endpoint de l'API de
+ Sophtron, normalment https://api.sophtron.com/api"
+ user_id_html: "ID d'usuari: la teva credencial d'ID d'usuari
+ de Sophtron"
+ field_descriptions_title: 'Descripció dels camps:'
+ fields:
+ access_key:
+ label: Clau d'accés
+ placeholder_edit: "••••••••"
+ placeholder_new: Enganxa la teva clau d'accés de Sophtron
+ base_url:
+ label: URL base
+ placeholder: https://api.sophtron.com/api
+ user_id:
+ label: ID d'usuari
+ placeholder_edit: "••••••••"
+ placeholder_new: Enganxa el teu ID d'usuari de Sophtron
+ save: Desa la configuració
+ setup_instructions:
+ step_1_html: Visita Sophtron per obtenir les teves credencials API
+ step_2: Copia el teu ID d'usuari i clau d'accés des de la configuració del
+ teu compte Sophtron
+ step_3: Enganxa les credencials a continuació i fes clic a Desa; Sure crearà
+ o reutilitzarà el teu ID de client de Sophtron automàticament
+ setup_instructions_title: 'Instruccions de configuració:'
+ update: Actualitza la configuració
+ sophtron_setup_required:
+ description: Abans d'enllaçar comptes Sophtron, has de configurar el teu ID
+ d'usuari i clau d'accés de Sophtron.
+ go_to_provider_settings: Ves a la configuració del proveïdor
+ heading: ID d'usuari i clau d'accés sense configurar
+ message: Per completar la configuració de la teva connexió Sophtron, ves a la
+ pàgina de configuració del proveïdor i segueix les instruccions per autoritzar
+ i configurar la teva connexió Sophtron.
+ setup_steps_title: 'Passos de configuració:'
+ step_1_html: Ves a Configuració → Proveïdors de sincronització bancària
+ step_2_html: Localitza la secció Sophtron
+ step_3_html: Introdueix el teu ID d'usuari i clau d'accés de Sophtron
+ step_4: Torna aquí per enllaçar els teus comptes
+ title: Cal configurar Sophtron
+ start_manual_sync:
+ already_running: Ja s'està executant una sincronització.
+ api_error: 'Error de l''API: %{message}'
+ no_linked_accounts: No hi ha comptes enllaçats disponibles per sincronitzar.
+ start_manual_sync_for_account:
+ failed: No s'ha pogut sincronitzar el compte
+ submit_mfa:
+ api_error: 'La verificació ha fallat: %{message}'
+ invalid_security_answers: Les respostes de seguretat falten o són massa llargues.
+ unknown_challenge: Pas de verificació Sophtron desconegut.
+ subtype: subtipus
+ sync:
+ already_running: La sincronització manual de Sophtron ja s'està executant.
+ api_error: 'La sincronització manual de Sophtron ha fallat: %{message}'
+ failed: La sincronització manual de Sophtron ha fallat
+ no_linked_accounts: Aquesta entitat Sophtron no té cap compte enllaçat per sincronitzar.
+ processing_failed: La sincronització manual de Sophtron no ha pogut processar
+ les transaccions actualitzades.
+ success: Sincronització iniciada
+ syncer:
+ accounts_need_setup: "%{count} compte(s) necessiten configuració"
+ calculating_balances: Calculant saldos per als comptes enllaçats...
+ checking_account_configuration: Comprovant la configuració dels comptes...
+ importing_accounts: Important comptes des de Sophtron...
+ manual_sync_required: Cal sincronització manual de Sophtron per a aquesta entitat;
+ els seus comptes s'ometen durant la sincronització automàtica.
+ processing_transactions: Processant transaccions per als comptes enllaçats...
+ toggle_manual_sync:
+ success_disabled: L'entitat Sophtron se sincronitzarà automàticament.
+ success_enabled: L'entitat Sophtron ara requereix sincronització manual.
+ type: tipus
+ update:
+ errors:
+ access_key_compromised: La clau d'accés pot estar compromesa, caducada o ja
+ utilitzada. Crea'n una de nova.
+ blank_access_key: Introdueix una clau d'accés de Sophtron.
+ blank_user_id: Introdueix un ID d'usuari de Sophtron.
+ invalid_access_key: Clau d'accés no vàlida. Comprova que has copiat la clau
+ d'accés completa des de Sophtron.
+ invalid_user_id: ID d'usuari no vàlid. Comprova que has copiat l'ID d'usuari
+ complet des de Sophtron.
+ unexpected: S'ha produït un error inesperat. Torna-ho a provar o contacta
+ amb el suport.
+ update_failed: 'No s''ha pogut actualitzar la connexió: %{message}'
+ user_id_compromised: L'ID d'usuari pot estar compromès, caducat o ja utilitzat.
+ Crea'n un de nou.
+ success: La connexió Sophtron s'ha actualitzat correctament! Els teus comptes
+ s'estan tornant a connectar.
diff --git a/config/locales/views/splits/ca.yml b/config/locales/views/splits/ca.yml
new file mode 100644
index 000000000..437a7280d
--- /dev/null
+++ b/config/locales/views/splits/ca.yml
@@ -0,0 +1,51 @@
+---
+ca:
+ splits:
+ child:
+ description: Aquesta entrada forma part d'una transacció dividida.
+ edit_split: Edita la divisió
+ title: Part d'una divisió
+ unsplit: Desfés la divisió
+ create:
+ not_splittable: Aquesta transacció no es pot dividir.
+ success: Transacció dividida correctament
+ destroy:
+ success: Divisió desfeta correctament
+ edit:
+ description: Modifica les entrades de la divisió d'aquesta transacció.
+ not_split: Aquesta transacció no està dividida.
+ submit: Actualitza la divisió
+ title: Edita la divisió
+ new:
+ add_row: Afegeix divisió
+ amount_label: Import
+ amounts_must_match: La suma dels imports de la divisió ha de ser igual a l'import
+ original de la transacció.
+ cancel: Cancel·la
+ category_label: Categoria
+ description: Divideix aquesta transacció en diverses entrades amb categories
+ i imports diferents.
+ name_label: Nom
+ name_placeholder: Nom de la divisió
+ original_amount: Import
+ original_date: 'Data:'
+ original_name: 'Nom:'
+ remaining: Restant
+ remove_row: Elimina
+ split_number: 'Divisió #%{number}'
+ submit: Divideix la transacció
+ title: Divideix la transacció
+ uncategorized: "(sense categoria)"
+ show:
+ button: Divideix
+ button_description: Divideix aquesta transacció en diverses entrades amb categories
+ i imports diferents.
+ button_title: Divideix la transacció
+ description: Aquesta transacció s'ha dividit en les entrades següents.
+ title: Entrades de la divisió
+ unsplit_button: Desfés la divisió
+ unsplit_confirm: Això eliminarà totes les entrades de la divisió i restaurarà
+ la transacció original.
+ unsplit_title: Desfés la divisió
+ update:
+ success: Divisió actualitzada correctament
diff --git a/config/locales/views/subscriptions/ca.yml b/config/locales/views/subscriptions/ca.yml
index eb162c4ca..521b8124b 100644
--- a/config/locales/views/subscriptions/ca.yml
+++ b/config/locales/views/subscriptions/ca.yml
@@ -1,14 +1,26 @@
---
ca:
subscriptions:
+ create:
+ trial_already_used: Ja has començat o completat una prova. Actualitza per continuar.
+ welcome: Benvingut/da a Sure!
self_hosted_alert: "%{product_name} no està disponible en mode autoallotjat."
+ success:
+ contribution_failed: Alguna cosa ha anat malament en processar la teva contribució.
+ Torna-ho a provar.
+ welcome_with_contribution: Benvingut/da a Sure! Agraïm la teva contribució.
upgrade:
- contribute_and_support_sure: "Contribuir i donar suport a Sure"
- cta: "Continua donant suport al desenvolupament d'aquest codi!"
+ account_settings: Configuració del compte
+ already_contributing: Ja hi estàs contribuint. Gràcies!
+ contribute_and_support_sure: Contribueix i dona suport a Sure
+ cta: Continua donant suport al desenvolupament d'aquest codi!
header:
- support: "Suport"
- sure: "Sure"
- today: "avui"
- redirect_to_stripe: "En el proper pas, se us redirigirà a Stripe, que gestiona les targetes de crèdit per nosaltres."
- trialing: "Les teves dades s'eliminaran en %{days} dies"
- trial_over: "El teu període de prova ha acabat"
\ No newline at end of file
+ support: Dona suport a
+ sure: Sure
+ today: avui
+ page_title: Actualitza
+ redirect_to_stripe: Al pas següent, se't redirigirà a Stripe, que gestiona les
+ targetes de crèdit per a nosaltres.
+ sign_out: Tanca la sessió
+ trial_over: El teu període de prova ha acabat
+ trialing: Les teves dades s'eliminaran d'aquí %{days} dies
diff --git a/config/locales/views/tag/deletions/ca.yml b/config/locales/views/tag/deletions/ca.yml
index 21559e806..e9e59777d 100644
--- a/config/locales/views/tag/deletions/ca.yml
+++ b/config/locales/views/tag/deletions/ca.yml
@@ -6,6 +6,7 @@ ca:
deleted: Etiqueta eliminada
new:
delete_and_leave_uncategorized: Elimina "%{tag_name}"
+ delete_and_reassign: Elimina i reassigna
delete_and_recategorize: Elimina "%{tag_name}" i assigna una nova etiqueta
delete_tag: Vols eliminar l'etiqueta?
explanation: "%{tag_name} s'eliminarà de les transaccions i altres entitats
diff --git a/config/locales/views/tags/ca.yml b/config/locales/views/tags/ca.yml
index c34489679..95a611a80 100644
--- a/config/locales/views/tags/ca.yml
+++ b/config/locales/views/tags/ca.yml
@@ -6,11 +6,14 @@ ca:
error: 'Error en crear l''etiqueta: %{error}'
destroy:
deleted: Etiqueta eliminada
+ destroy_all:
+ all_deleted: Totes les etiquetes eliminades
edit:
edit: Edita l'etiqueta
form:
placeholder: Nom de l'etiqueta
index:
+ delete_all: Elimina-les totes
empty: Encara no hi ha etiquetes
new: Nova etiqueta
tags: Etiquetes
diff --git a/config/locales/views/trades/ca.yml b/config/locales/views/trades/ca.yml
index ef908c4df..be167ae6d 100644
--- a/config/locales/views/trades/ca.yml
+++ b/config/locales/views/trades/ca.yml
@@ -5,15 +5,26 @@ ca:
account: Compte de transferència (opcional)
account_prompt: Cerca compte
amount: Import
+ dividend_requires_security: El valor és obligatori per als dividends
+ fee: Comissió de la transacció
holding: Símbol del valor
+ holding_optional: Símbol del valor (opcional)
price: Preu per acció
qty: Quantitat
- submit: Afegeix transacció
+ submit: Afegeix la transacció
ticker_placeholder: AAPL
type: Tipus
+ type_buy: Compra
+ type_deposit: Dipòsit
+ type_dividend: Dividend
+ type_interest: Interès
+ type_sell: Venda
+ type_withdrawal: Retirada
header:
buy: Compra
current_market_price_label: Preu de mercat actual
+ dividend: Dividend
+ interest: Interès
overview: Resum
purchase_price_label: Preu de compra
purchase_qty_label: Quantitat comprada
@@ -24,17 +35,25 @@ ca:
title: Nova transacció
show:
additional: Addicional
+ amount_label: Import
+ buy: Compra
category_label: Categoria
cost_per_share_label: Cost per acció
date_label: Data
delete: Elimina
delete_subtitle: Aquesta acció no es pot desfer
- delete_title: Elimina operació
+ delete_title: Elimina l'operació
details: Detalls
- exclude_subtitle: Aquesta operació no s'inclourà en informes ni càlculs
+ exclude_subtitle: Aquesta operació no s'inclourà als informes ni als càlculs
exclude_title: Exclou de l'analítica
+ fee_label: Comissió de la transacció
no_category: Sense categoria
note_label: Nota
note_placeholder: Afegeix aquí qualsevol nota addicional...
+ provider_disabled_warning: Actualitzacions de preu en pausa — el proveïdor %{provider}
+ està desactivat. Torna a activar-lo a la configuració o reassigna la posició
+ a un altre proveïdor.
quantity_label: Quantitat
+ sell: Venda
settings: Configuració
+ type_label: Tipus
diff --git a/config/locales/views/transactions/ca.yml b/config/locales/views/transactions/ca.yml
index dc3b94981..e147de78d 100644
--- a/config/locales/views/transactions/ca.yml
+++ b/config/locales/views/transactions/ca.yml
@@ -1,6 +1,148 @@
---
ca:
transactions:
+ activity_labels:
+ buy: Compra
+ contribution: Aportació
+ dividend: Dividend
+ exchange: Bescanvi
+ fee: Comissió
+ interest: Interès
+ other: Altres
+ reinvestment: Reinversió
+ sell: Venda
+ sweep_in: Sweep entrant
+ sweep_out: Sweep sortint
+ transfer: Transferència
+ withdrawal: Retirada
+ attachments:
+ attachment_deleted: Adjunt eliminat correctament
+ browse_to_add: Cerca per afegir fitxers
+ cannot_exceed: No es poden superar %{count} adjunts per transacció
+ delete_failed: No s'ha pogut eliminar l'adjunt. Torna-ho a provar o contacta
+ amb suport.
+ failed_delete: 'No s''ha pogut eliminar l''adjunt: %{error}'
+ failed_upload: 'No s''ha pogut pujar l''adjunt: %{error}'
+ files:
+ one: Fitxer (1)
+ other: Fitxers (%{count})
+ max_reached: S'ha arribat al límit de fitxers (%{count}/%{max}). Elimina un
+ fitxer existent per pujar-ne un altre.
+ no_attachments: Encara no hi ha adjunts
+ no_files_selected: No s'ha seleccionat cap fitxer per pujar
+ select_up_to: Selecciona fins a %{count} fitxers (imatges o PDF, màx %{size}MB
+ cadascun) • %{used} d'%{count} utilitzats
+ upload: Puja
+ upload_failed: No s'ha pogut pujar l'adjunt. Torna-ho a provar o contacta amb
+ suport.
+ uploaded_many: "%{count} adjunts pujats correctament"
+ uploaded_one: Adjunt pujat correctament
+ bulk_updates:
+ new:
+ cancel: Cancel·la
+ category_label: Categoria
+ category_prompt: Selecciona una categoria
+ date_label: Data
+ header_title: Edita transaccions
+ merchant_label: Comerç
+ merchant_prompt: Selecciona un comerç
+ name_label: Nom
+ name_placeholder: Introdueix un nom que s'aplicarà a les transaccions seleccionades
+ none: "(cap)"
+ notes_label: Notes
+ notes_placeholder: Introdueix una nota que s'aplicarà a les transaccions seleccionades
+ overview: Resum
+ save: Desa
+ tags_label: Etiquetes
+ transactions_section: Transaccions
+ categorizes:
+ create:
+ categorized:
+ one: 1 transacció categoritzada
+ other: "%{count} transaccions categoritzades"
+ rule_creation_failed: Transaccions categoritzades, però no s'ha pogut crear
+ la regla (potser ja existeix).
+ entry_row:
+ assign_category_select: Assigna categoria per a %{name}
+ include_checkbox: Inclou %{name}
+ show:
+ all_done: Totes les transaccions estan categoritzades
+ assign_category: Assigna una categoria
+ assign_category_prompt: "→ assigna"
+ col_amount: Import
+ col_category: Categoria
+ col_date: Data
+ col_transaction: Transacció
+ create_rule_label: Crea regla de categorització
+ exit: Surt
+ filter_placeholder: Cerca categories...
+ no_categories: No hi ha categories coincidents
+ remaining:
+ one: Queda 1 transacció sense categoritzar
+ other: Queden %{count} transaccions sense categoritzar
+ rule_description_prefix: Les futures transaccions de tipus %{type} amb nom
+ que contingui
+ rule_description_suffix: també haurien de rebre aquesta categoria.
+ skip: Omet
+ transaction_count:
+ one: 1 transacció
+ other: "%{count} transaccions"
+ transactions_hint: Desmarca per excloure una transacció, o assigna-li una
+ categoria diferent directament a la seva fila.
+ type_expense: Despesa
+ type_income: Ingrés
+ convert_to_trade:
+ account_label: 'Compte:'
+ amount_label: 'Import:'
+ cancel: Cancel·la
+ conversion_note: 'Convertit de la transacció: %{original_name} (%{original_date})'
+ date_label: 'Data:'
+ description: Converteix aquesta transacció en una operació amb detalls de valor
+ errors:
+ already_converted: Aquesta transacció ja s'ha convertit o exclòs
+ conversion_failed: 'No s''ha pogut convertir la transacció: %{error}'
+ enter_qty_or_price: Introdueix la quantitat o el preu per acció. L'altre es
+ calcularà a partir de l'import de la transacció.
+ enter_ticker: Introdueix un símbol de cotització
+ invalid_qty_or_price: Quantitat o preu invàlids. Introdueix valors positius
+ vàlids.
+ not_investment_account: Només es poden convertir en operacions les transaccions
+ de comptes d'inversió
+ security_not_found: El valor seleccionat ja no existeix. Selecciona'n un altre.
+ select_security: Selecciona o introdueix un valor
+ unexpected_error: 'Error inesperat durant la conversió: %{error}'
+ exchange_hint: Deixa-ho en blanc per detectar-ho automàticament
+ exchange_label: Mercat (opcional)
+ exchange_placeholder: XNAS
+ price_hint: Preu per acció (%{currency})
+ price_label: Preu per acció
+ price_mismatch_message: El teu preu (%{entered_price}/acció) difereix significativament
+ del preu de mercat actual de %{ticker} (%{market_price}). Si sembla incorrecte,
+ potser has seleccionat el valor equivocat — prova "Introdueix una cotització
+ personalitzada" per especificar el correcte.
+ price_mismatch_title: El preu pot no coincidir
+ price_placeholder: p. ex. 52,15
+ qty_or_price_hint: Introdueix com a mínim la quantitat O el preu. L'altre es
+ calcularà a partir de l'import de la transacció (%{amount}).
+ quantity_hint: Nombre d'accions operades
+ quantity_label: Quantitat (accions)
+ quantity_placeholder: p. ex. 20
+ security_custom: "+ Introdueix un ticker personalitzat"
+ security_label: Valor
+ security_not_listed_hint: No veus el teu valor? Selecciona "Introdueix un ticker
+ personalitzat" al final de la llista.
+ security_prompt: Selecciona un valor...
+ submit: Converteix en operació
+ success: Transacció convertida en operació
+ ticker_hint: Introdueix el símbol del valor (p. ex. AAPL, MSFT)
+ ticker_placeholder: AAPL
+ ticker_search_hint: Cerca per símbol o nom d'empresa, o escriu un símbol personalitzat
+ ticker_search_placeholder: Cerca un símbol...
+ title: Converteix en operació de valors
+ trade_type_hint: Compra o ven accions d'un valor
+ trade_type_label: Tipus d'operació
+ create:
+ created: Transacció creada
dismiss_duplicate:
failure: No s'ha pogut rebutjar la suggerència de duplicat
success: Mantingudes com a transaccions separades
@@ -9,6 +151,7 @@ ca:
account_prompt: Selecciona un compte
amount: Import
category: Categoria
+ category_label: Categoria
category_prompt: Selecciona una categoria
date: Data
description: Descripció
@@ -16,6 +159,7 @@ ca:
details: Detalls
expense: Despesa
income: Ingrés
+ merchant_label: Comerç
none: "(cap)"
note_label: Notes
note_placeholder: Introdueix una nota
@@ -25,25 +169,57 @@ ca:
header:
edit_categories: Edita categories
edit_imports: Edita importacions
- edit_merchants: Edita comerciants
+ edit_merchants: Edita comerços
edit_tags: Edita etiquetes
import: Importa
index:
+ categorize_button:
+ one: Categoritza (1)
+ other: Categoritza (%{count})
+ edit_categories: Edita categories
+ edit_imports: Edita importacions
+ edit_merchants: Edita comerços
+ edit_rules: Edita regles
+ edit_tags: Edita etiquetes
import: Importa
+ new_rule: Nova regla
+ new_transaction: Nova transacció
+ title: Transaccions
transaction: transacció
transactions: transaccions
+ keep_both: 'No, mantén-les totes dues'
+ list:
+ drag_drop_subtitle: Puja transaccions directament
+ drag_drop_title: Deixa anar el CSV per importar
+ transaction: transacció
+ transactions: transaccions
+ mark_recurring: Marca com a recurrent
+ mark_recurring_subtitle: Segueix-ho com a transacció recurrent. La variància d'import
+ es calcula automàticament a partir dels últims 6 mesos de transaccions similars.
+ mark_recurring_title: Transacció recurrent
merge_duplicate:
failure: No s'han pogut fusionar les transaccions
success: Les transaccions s'han fusionat correctament
new:
new_transaction: Nova transacció
+ pending_duplicate_merge:
+ confirm_title: Fusiona amb la transacció publicada (%{posted_amount})
+ possible_duplicate: Duplicat?
+ possible_duplicate_short: Dup?
+ reject_title: Mantén com a transaccions separades
+ review_recommended: Revisa
+ review_recommended_short: Rev
+ potential_duplicate_description: Aquesta transacció pendent pot ser la mateixa
+ que la transacció publicada a sota. Si és així, fusiona-les per evitar comptabilitzar
+ dues vegades.
+ potential_duplicate_title: S'ha detectat un duplicat possible
search:
filters:
account: Compte
amount: Import
category: Categoria
date: Data
- merchant: Comerciant
+ merchant: Comerç
status: Estat
tag: Etiqueta
type: Tipus
@@ -62,6 +238,9 @@ ca:
on_or_before: el %{date} o abans
pending: Pendent
transfer: Transferència
+ date_filter:
+ end_date: Data de fi
+ start_date: Data d'inici
status_filter:
confirmed: Confirmada
pending: Pendent
@@ -70,6 +249,8 @@ ca:
income: Ingrés
transfer: Transferència
form:
+ filter: Filtra
+ search_placeholder: Cerca transaccions...
toggle_selection_checkboxes: Commuta totes les caselles
menu:
account_filter: Compte
@@ -79,7 +260,7 @@ ca:
category_filter: Categoria
clear_filters: Neteja filtres
date_filter: Data
- merchant_filter: Comerciant
+ merchant_filter: Comerç
status_filter: Estat
tag_filter: Etiqueta
type_filter: Tipus
@@ -87,45 +268,102 @@ ca:
equal_to: igual a
greater_than: major que
less_than: menor que
+ selection_bar:
+ duplicate: Duplica
+ edit: Edita
+ selected: seleccionades
show:
account_label: Compte
+ activity_type: Tipus d'activitat
+ activity_type_description: Tipus d'activitat d'inversió (compra, venda, dividend,
+ etc.). Detectat automàticament o establert manualment.
+ additional_details: Detalls addicionals
amount: Import
+ attachments: Adjunts
category_label: Categoria
+ convert: Converteix
+ convert_to_trade_button: Converteix en operació
+ convert_to_trade_description: Converteix aquesta transacció en una operació
+ de compra o venda amb detalls de valor per al seguiment de la cartera.
+ convert_to_trade_title: Converteix en operació de valors
date_label: Data
delete: Elimina
delete_subtitle: Això eliminarà permanentment la transacció, afectarà els teus
saldos històrics i no es podrà desfer.
- delete_title: Eliminar transacció
+ delete_title: Elimina la transacció
+ description: Descripció
details: Detalls
- keep_both: No, mantenir ambdós
- mark_recurring: Marcar com a recurrent
- mark_recurring_subtitle: Segueix-ho com a transacció recurrent. La variància d'import
- es calcula automàticament a partir dels últims 6 mesos de transaccions similars.
+ exclude: Exclou
+ exclude_description: Les transaccions excloses es retiraran dels càlculs i informes
+ de pressupost.
+ keep_both: 'No, mantén-les totes dues'
+ loan_payment: Pagament de préstec
+ mark_recurring: Marca com a recurrent
+ mark_recurring_subtitle: Segueix-ho com a transacció recurrent. La variància
+ d'import es calcula automàticament a partir dels últims 6 mesos de transaccions
+ similars.
mark_recurring_title: Transacció recurrent
- merchant_label: Comerciant
+ memo: Memo
+ merchant_label: Comerç
merge_duplicate: Sí, fusiona-les
name_label: Nom
nature: Tipus
none: "(cap)"
note_label: Notes
note_placeholder: Introdueix una nota
+ one_time_description: Les transaccions puntuals s'exclouran de determinats càlculs
+ i informes de pressupost per ajudar-te a veure el que realment és important.
+ one_time_title: "%{type} puntual"
+ open_matcher: Obre l'aparellador
overview: Resum
- potential_duplicate_description: Aquesta transacció pendent pot ser la mateixa que
- la transacció publicada a sota. Si és així, fusiona-les per evitar comptabilitzar dues vegades.
- potential_duplicate_title: S'ha detectat duplicat possible
+ payee: Beneficiari
+ pending_duplicate_merger_button: Obre el fusionador
+ pending_duplicate_merger_description: Fusiona manualment aquesta transacció
+ pendent amb la seva versió publicada.
+ pending_duplicate_merger_title: Duplicat d'una transacció publicada?
+ potential_duplicate_description: Aquesta transacció pendent pot ser la mateixa
+ que la transacció publicada a sota. Si és així, fusiona-les per evitar comptabilitzar
+ dues vegades.
+ potential_duplicate_title: S'ha detectat un duplicat possible
+ provider_extras: Extres del proveïdor
settings: Configuració
+ tab_transactions: Transaccions
+ tab_upcoming: Properes
tags_label: Etiquetes
- uncategorized: "(sense categoritzar)"
- loan_payment: Pagament de préstec
transfer: Transferència
+ transfer_matcher_description: Connecta aquesta transacció amb la seva contrapart
+ en un altre compte.
+ transfer_or_debt_payment: Transferència o pagament de deute?
+ uncategorized: "(sense categoritzar)"
+ split_parent_row:
+ split_label: Divisió
+ transfer_match:
+ auto_matched: Aparellada
+ auto_matched_short: A/A
+ confirm_match: Confirma la coincidència
+ payment_confirmed: Pagament confirmat
+ reject_match: Rebutja la coincidència
+ transfer_confirmed: Transferència confirmada
+ summary:
+ expenses: Despeses
+ income: Ingressos
+ inflow: Entrada
+ outflow: Sortida
+ total_transactions: Total de transaccions
toggle_recurring_section: Mostra/Amaga les transaccions recurrents properes
transaction:
+ activity_type_tooltip: Tipus d'activitat d'inversió
+ linked_with_provider: Vinculat amb %{provider}
pending: Pendent
pending_tooltip: Transacció pendent — pot canviar quan es publiqui
- linked_with_provider: Vinculat amb %{provider}
possible_duplicate: Duplicat?
potential_duplicate_tooltip: Això pot ser un duplicat d'una altra transacció
review_recommended: Revisa
review_recommended_tooltip: Diferència d'import important — es recomana revisar
per comprovar si és un duplicat
+ split: Divisió
+ split_child_tooltip: Part d'una transacció dividida
+ split_tooltip: Aquesta transacció s'ha dividit en múltiples entrades
unknown_name: Transacció desconeguda
+ update:
+ updated: Transacció actualitzada
diff --git a/config/locales/views/transactions/en.yml b/config/locales/views/transactions/en.yml
index e1f248a9c..d051ef130 100644
--- a/config/locales/views/transactions/en.yml
+++ b/config/locales/views/transactions/en.yml
@@ -126,6 +126,13 @@ en:
keep_both: No, keep both
split_parent_row:
split_label: "Split"
+ transfer_match:
+ auto_matched: Auto-matched
+ auto_matched_short: A/M
+ confirm_match: Confirm match
+ payment_confirmed: Payment is confirmed
+ reject_match: Reject match
+ transfer_confirmed: Transfer is confirmed
transaction:
pending: Pending
pending_tooltip: Pending transaction — may change when posted
diff --git a/config/locales/views/transfer_matches/ca.yml b/config/locales/views/transfer_matches/ca.yml
new file mode 100644
index 000000000..b4890ec6e
--- /dev/null
+++ b/config/locales/views/transfer_matches/ca.yml
@@ -0,0 +1,27 @@
+---
+ca:
+ transfer_matches:
+ create:
+ success: Transferència creada
+ matching_fields:
+ create_new_transaction: Crea una nova transacció
+ match_existing_recommended: Aparella amb una transacció existent (recomanat)
+ matching_method: Mètode d'aparellament
+ matching_transaction: Transacció coincident
+ no_matching_transactions: No s'ha trobat cap transacció que coincideixi amb
+ la dels teus altres comptes. Selecciona un compte i et crearem una nova transacció
+ d'entrada.
+ select_method: Selecciona un mètode per aparellar les teves transaccions.
+ target_account: Compte de destinació
+ new:
+ create_transfer_match: Crea l'aparellament de transferència
+ from_account: Compte d'origen
+ from_account_named: 'Compte d''origen: %{name}'
+ header:
+ subtitle: Aparella la transacció corresponent a un altre compte o crea'n una
+ de nova si no existeix.
+ title: Aparella la transferència o el pagament
+ inflow_transaction: Transacció d'entrada
+ outflow_transaction: Transacció de sortida
+ to_account: Compte de destinació
+ to_account_named: 'Compte de destinació: %{name}'
diff --git a/config/locales/views/transfers/ca.yml b/config/locales/views/transfers/ca.yml
index d94033ceb..dcce62762 100644
--- a/config/locales/views/transfers/ca.yml
+++ b/config/locales/views/transfers/ca.yml
@@ -7,25 +7,43 @@ ca:
success: Transferència eliminada
form:
amount: Import
+ calculate_rate_tab: Calcula la taxa de canvi
+ convert_tab: Converteix amb la taxa de canvi
date: Data
+ destination_amount: Import rebut
+ destination_amount_display: 'Import rebut: %{amount}'
+ exchange_rate: Taxa de canvi
+ exchange_rate_display: 'Taxa de canvi: %{rate}'
+ exchange_rate_help: Tria com introduir l'import de la transferència.
expense: Despesa
from: Des de
income: Ingrés
select_account: Selecciona un compte
+ source_amount: Import enviat
submit: Crea transferència
- to: Fins a
+ to: A
transfer: Transferència
new:
title: Nova transferència
show:
+ amount: Import
+ category: Categoria
+ date: Data
delete: Elimina transferència
- delete_subtitle: Això eliminarà la transferència. No s'eliminaran les transaccions
+ delete_subtitle: Això elimina la transferència. No s'eliminaran les transaccions
associades.
delete_title: Vols eliminar la transferència?
details: Detalls
+ from: Des de
+ mark_recurring: Marca com a recurrent
+ mark_recurring_subtitle: Fes el seguiment d'aquesta transferència com a patró
+ recurrent al feed de properes i a la pàgina de recurrents.
+ mark_recurring_title: Marca la transferència com a recurrent
note_label: Notes
note_placeholder: Afegeix una nota a aquesta transferència
overview: Resum
settings: Configuració
+ to: A
+ uncategorized: Sense categoria
update:
success: Transferència actualitzada
diff --git a/config/locales/views/users/ca.yml b/config/locales/views/users/ca.yml
index fa1cef12c..972c53999 100644
--- a/config/locales/views/users/ca.yml
+++ b/config/locales/views/users/ca.yml
@@ -1,21 +1,31 @@
---
ca:
- no_pending_change: No hi ha canvis pendents
users:
destroy:
success: El teu compte s'ha eliminat.
resend_confirmation_email:
- no_pending_change: No hi ha canvi de correu electrònic actualment pendent!
- success: S'ha posat a cua un nou correu electrònic de confirmació per ser enviat.
+ no_pending_change: Actualment no hi ha cap canvi de correu electrònic pendent!
+ success: S'ha posat a la cua un nou correu electrònic de confirmació per enviar-se.
reset:
success: El teu compte s'ha restablert. Les dades s'eliminaran en segon pla
- en uns instants.
- unauthorized: No estàs autoritzat/da per realitzar aquesta acció.
+ d'aquí a una estona.
+ unauthorized: No estàs autoritzat/da per fer aquesta acció
reset_with_sample_data:
success: El teu compte s'ha restablert i s'estan preparant dades de mostra.
- Veureu dades de demostració en breu.
+ Veuràs les dades de demostració d'aquí a poc.
update:
email_change_failed: No s'ha pogut canviar l'adreça de correu electrònic.
- email_change_initiated: Revisa el teu nou correu electrònic per instruccions
+ email_change_initiated: Revisa el teu nou correu electrònic per veure les instruccions
de confirmació.
success: El teu perfil s'ha actualitzat.
+ roles:
+ admin: Administrador/a
+ member: Membre
+ super_admin: Superadministrador/a
+ user_menu:
+ changelog: Registre de canvis
+ contact: Contacte
+ feedback: Comentaris
+ log_out: Tanca la sessió
+ settings: Configuració
+ version: Versió
diff --git a/config/locales/views/users/en.yml b/config/locales/views/users/en.yml
index a10da27c5..56bb4992d 100644
--- a/config/locales/views/users/en.yml
+++ b/config/locales/views/users/en.yml
@@ -16,6 +16,10 @@ en:
unauthorized: You are not authorized to perform this action
reset_with_sample_data:
success: Your account has been reset and sample data is being prepared. You’ll see demo data shortly.
+ roles:
+ admin: Admin
+ member: Member
+ super_admin: Super admin
user_menu:
version: Version
settings: Settings
diff --git a/config/locales/views/valuations/ca.yml b/config/locales/views/valuations/ca.yml
index c16d76481..a7e6b567d 100644
--- a/config/locales/views/valuations/ca.yml
+++ b/config/locales/views/valuations/ca.yml
@@ -1,6 +1,31 @@
---
ca:
valuations:
+ confirmation_contents:
+ account_balance: saldo del compte
+ asset_value: valor de l'actiu
+ balance: saldo
+ brokerage_cash: Efectiu del compte de valors
+ change: canvi
+ credit_card_balance: saldo de la targeta de crèdit
+ crypto_balance: saldo de cripto
+ holdings_value: Valor de les posicions
+ liability_balance: saldo del passiu
+ loan_balance: saldo del préstec
+ 'on': el
+ property_value: valor de l'immoble
+ recalculate_notice: Totes les transaccions i saldos futurs es recalcularan segons
+ aquest %{change_or_update}.
+ this_will: Això %{action_verb} el valor del compte el
+ to: a
+ to_colon: 'a:'
+ total_account_value: Valor total del compte
+ update: actualització
+ vehicle_value: valor del vehicle
+ create:
+ account_updated: Compte actualitzat
+ errors:
+ amount_required: L'import és obligatori
form:
amount: Import
submit: Afegeix actualització de saldo
@@ -10,7 +35,7 @@ ca:
change: canvi
date: data
new_entry: Nova entrada
- no_valuations: Encara no hi ha valoracions per aquest compte
+ no_valuations: Encara no hi ha valoracions per a aquest compte
valuations: Valor
value: valor
new:
@@ -19,14 +44,20 @@ ca:
title: Nou saldo
show:
amount: Import
+ amount_label: Valor del compte en la data
date_label: Data
delete: Elimina
delete_subtitle: Aquesta acció no es pot desfer
delete_title: Elimina entrada
details: Detalls
name_label: Nom
- name_placeholder: Introdueix un nom per aquesta entrada
+ name_placeholder: Introdueix un nom per a aquesta entrada
note_label: Notes
note_placeholder: Afegeix qualsevol detall addicional sobre aquesta entrada
+ opening_balance: Saldo inicial
overview: Resum
settings: Configuració
+ update_value: Actualitza el valor
+ update:
+ account_updated: Compte actualitzat
+ entry_updated: Entrada actualitzada
diff --git a/config/locales/views/vehicles/ca.yml b/config/locales/views/vehicles/ca.yml
index cda63ed3f..1f5d7d43e 100644
--- a/config/locales/views/vehicles/ca.yml
+++ b/config/locales/views/vehicles/ca.yml
@@ -23,4 +23,13 @@ ca:
trend: Tendència
unknown: Desconegut
year: Any
-
+ tabs:
+ overview:
+ current_price: Preu actual
+ edit_account_details: Edita els detalls del compte
+ make_model: Marca i model
+ mileage: Quilometratge
+ purchase_price: Preu de compra
+ trend: Tendència
+ unknown: Desconegut
+ year: Any
diff --git a/test/lib/catalan_pluralization_test.rb b/test/lib/catalan_pluralization_test.rb
new file mode 100644
index 000000000..d9cda5c18
--- /dev/null
+++ b/test/lib/catalan_pluralization_test.rb
@@ -0,0 +1,23 @@
+require "test_helper"
+require "securerandom"
+
+class CatalanPluralizationTest < ActiveSupport::TestCase
+ test "uses rails i18n plural rules for catalan" do
+ translation_key = "test_pluralization_#{SecureRandom.hex(6)}"
+
+ I18n.backend.store_translations(:ca, translation_key => {
+ sample: {
+ one: "one",
+ other: "other"
+ }
+ })
+
+ path = "#{translation_key}.sample"
+
+ assert_equal "other", I18n.t(path, locale: :ca, count: 0)
+ assert_equal "one", I18n.t(path, locale: :ca, count: 1)
+ assert_equal "other", I18n.t(path, locale: :ca, count: 2)
+ assert_equal "other", I18n.t(path, locale: :ca, count: 5)
+ assert_equal "other", I18n.t(path, locale: :ca, count: 100)
+ end
+end
From 65bed0db2fb0e4e8a36c0cb9a255d92917de55c2 Mon Sep 17 00:00:00 2001
From: Guillem Arias Fauste
Date: Tue, 19 May 2026 14:31:10 +0200
Subject: [PATCH 10/33] i18n(en): hardcode 'One error' in sso_providers
errors_title singular form (#1854)
* i18n(en): drop %{count} interpolation in sso_providers errors_title 'one' branch
Per @jjmata review feedback on #1830: when count == 1, English reads
more naturally as 'One error prohibited...' than '1 error prohibited...'.
The 'other' branch keeps %{count} so '2 errors...', '3 errors...' still
interpolate.
* Update en.yml
Signed-off-by: Guillem Arias Fauste
---------
Signed-off-by: Guillem Arias Fauste
---
config/locales/views/admin/sso_providers/en.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/locales/views/admin/sso_providers/en.yml b/config/locales/views/admin/sso_providers/en.yml
index 5dd727796..bca7ac709 100644
--- a/config/locales/views/admin/sso_providers/en.yml
+++ b/config/locales/views/admin/sso_providers/en.yml
@@ -94,7 +94,7 @@ en:
create_provider: "Create Provider"
update_provider: "Update Provider"
errors_title:
- one: "%{count} error prohibited this provider from being saved:"
+ one: "An error prohibited this provider from being saved:"
other: "%{count} errors prohibited this provider from being saved:"
provisioning_title: "User Provisioning"
default_role_label: "Default Role for New Users"
From e8ce28648db2ff4216fe1ddc9511cef4f08513e4 Mon Sep 17 00:00:00 2001
From: Guillem Arias Fauste
Date: Tue, 19 May 2026 14:41:02 +0200
Subject: [PATCH 11/33] refactor: rename beta features gate to preview features
(#1837)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* refactor: rename beta features gate to preview features
Renames the opt-in gate introduced in PR #1829 from "beta" to "preview".
Same shape (per-user JSONB toggle, `before_action` concern, marker pill)
just retitled so the surface speaks the language Sure uses elsewhere
("preview" reads as in-progress, "beta" had baggage with provider
maturity copy and external testing programs).
Renames:
- BetaGateable -> PreviewGateable
- require_beta_features! -> require_preview_features!
- beta_features_enabled? -> preview_features_enabled?
- preferences["beta_features_enabled"] -> preferences["preview_features_enabled"]
- DS::Pill default label "Beta" -> "Preview"
- Settings -> Preferences toggle copy "beta features" -> "preview features"
- config/locales/views/beta/ -> config/locales/views/preview/
- docs/llm-guides/gating-a-beta-feature.md -> gating-a-preview-feature.md
Includes a data migration that copies any existing
`beta_features_enabled` JSONB key into `preview_features_enabled` so early
opt-ins survive the rename, then removes the old key. The migration is
fully reversible.
Provider maturity copy ("maturity.beta = Beta" under Settings -> Bank
sync) is intentionally untouched - that's a separate concept describing
a provider's integration stability, not Sure's feature gate.
* review: apply CodeRabbit findings on PR #1837
- Settings::PreferencesController#update now routes the
`preview_features_enabled` input through strong params and casts via
ActiveModel::Type::Boolean instead of reading raw params and string-
comparing to "1". Matches Sure's controller convention for permitted
params and avoids stringly-typed boolean handling.
- Rename migration now wraps the destination JSONB key write in COALESCE
so a row that somehow ends up with both keys keeps the destination
value instead of having it overwritten by the source. Up and down
paths get the same defensive shape.
* 📝 CodeRabbit Chat: Implement requested code changes
* 📝 CodeRabbit Chat: Implement requested code changes
* fix: restore all missing translation keys; rename beta→preview label
* fix: restore all missing sections (appearances, debugs, llm_usages, providers, etc.); rename beta→preview
* fix: restore missing keys (member_removal_failed, confirm_delete, etc.); add preview section
* fix(i18n/ca): use 'està en vista prèvia' instead of 'és una vista prèvia'
* fix(i18n/ca): use 'en desenvolupament'; drop article in preview title
* fix(i18n/es): use 'en desarrollo' instead of 'en progreso'
* fix(i18n/ca): use 'funcions experimentals' instead of 'vista prèvia'
* fix(i18n/es): use 'funciones experimentales' instead of 'vista previa'
* fix(i18n/ca): use 'funcions experimentals' in preferences.show.preview
* fix(i18n/es): use 'funciones experimentales' in preferences.show.preview
* fix(i18n/ca): use 'Experimental' pill label instead of 'Vista prèvia'
* fix(i18n/es): use 'Experimental' pill label instead of 'Vista previa'
---------
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
---
app/controllers/application_controller.rb | 2 +-
app/controllers/concerns/beta_gateable.rb | 20 ---
app/controllers/concerns/preview_gateable.rb | 20 +++
.../settings/preferences_controller.rb | 7 +-
app/models/user.rb | 4 +-
app/views/settings/preferences/show.html.erb | 22 +--
config/locales/views/beta/en.yml | 4 -
config/locales/views/components/ca.yml | 2 +-
config/locales/views/components/en.yml | 2 +-
config/locales/views/components/es.yml | 6 +-
config/locales/views/preview/ca.yml | 4 +
config/locales/views/preview/en.yml | 4 +
config/locales/views/preview/es.yml | 4 +
config/locales/views/settings/ca.yml | 7 +-
config/locales/views/settings/en.yml | 6 +-
config/locales/views/settings/es.yml | 3 +
...rename_beta_features_enabled_preference.rb | 30 ++++
db/schema.rb | 2 +-
docs/llm-guides/gating-a-beta-feature.md | 128 ------------------
docs/llm-guides/gating-a-preview-feature.md | 128 ++++++++++++++++++
.../previews/pill_component_preview.rb | 2 +-
.../settings/preferences_controller_test.rb | 22 +--
test/models/user_test.rb | 20 +--
23 files changed, 248 insertions(+), 201 deletions(-)
delete mode 100644 app/controllers/concerns/beta_gateable.rb
create mode 100644 app/controllers/concerns/preview_gateable.rb
delete mode 100644 config/locales/views/beta/en.yml
create mode 100644 config/locales/views/preview/ca.yml
create mode 100644 config/locales/views/preview/en.yml
create mode 100644 config/locales/views/preview/es.yml
create mode 100644 db/migrate/20260519092118_rename_beta_features_enabled_preference.rb
delete mode 100644 docs/llm-guides/gating-a-beta-feature.md
create mode 100644 docs/llm-guides/gating-a-preview-feature.md
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 1d1389487..7306d504f 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -2,7 +2,7 @@ class ApplicationController < ActionController::Base
include RestoreLayoutPreferences, Onboardable, Localize, AutoSync, Authentication, Invitable,
SelfHostable, StoreLocation, Impersonatable, Breadcrumbable,
FeatureGuardable, Notifiable, SafePagination, AccountAuthorizable,
- BetaGateable
+ PreviewGateable
include Pundit::Authorization
include Pagy::Backend
diff --git a/app/controllers/concerns/beta_gateable.rb b/app/controllers/concerns/beta_gateable.rb
deleted file mode 100644
index 4268baaa6..000000000
--- a/app/controllers/concerns/beta_gateable.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-module BetaGateable
- extend ActiveSupport::Concern
-
- included do
- helper_method :beta_features_enabled?
- end
-
- def beta_features_enabled?
- Current.user&.beta_features_enabled? == true
- end
-
- # Use as a `before_action` on controllers that gate a beta feature.
- # Redirects non-beta users to the dashboard with a flash explaining the
- # feature is opt-in. Self-served via Settings → Preferences.
- def require_beta_features!
- return if beta_features_enabled?
-
- redirect_to root_path, alert: I18n.t("beta.not_enabled")
- end
-end
diff --git a/app/controllers/concerns/preview_gateable.rb b/app/controllers/concerns/preview_gateable.rb
new file mode 100644
index 000000000..7ae25ce8f
--- /dev/null
+++ b/app/controllers/concerns/preview_gateable.rb
@@ -0,0 +1,20 @@
+module PreviewGateable
+ extend ActiveSupport::Concern
+
+ included do
+ helper_method :preview_features_enabled?
+ end
+
+ def preview_features_enabled?
+ Current.user&.preview_features_enabled? == true
+ end
+
+ # Use as a `before_action` on controllers that gate a preview feature.
+ # Redirects users without preview access to the dashboard with a flash
+ # explaining the feature is opt-in. Self-served via Settings → Preferences.
+ def require_preview_features!
+ return if preview_features_enabled?
+
+ redirect_to root_path, alert: I18n.t("preview.not_enabled")
+ end
+end
diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb
index d5bf9d75a..5798c573e 100644
--- a/app/controllers/settings/preferences_controller.rb
+++ b/app/controllers/settings/preferences_controller.rb
@@ -11,11 +11,14 @@ class Settings::PreferencesController < ApplicationController
# UsersController#update flow (which expects a full user form payload).
def update
@user = Current.user
+ user_params = params.permit(user: [ :preview_features_enabled ]).fetch(:user, {})
+
@user.transaction do
@user.lock!
updated_prefs = (@user.preferences || {}).deep_dup
- if params.dig(:user, :beta_features_enabled)
- updated_prefs["beta_features_enabled"] = params.dig(:user, :beta_features_enabled) == "1"
+ if user_params.key?(:preview_features_enabled)
+ updated_prefs["preview_features_enabled"] =
+ ActiveModel::Type::Boolean.new.cast(user_params[:preview_features_enabled])
end
@user.update!(preferences: updated_prefs)
end
diff --git a/app/models/user.rb b/app/models/user.rb
index bcaa1446b..b1c40bb76 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -365,8 +365,8 @@ class User < ApplicationRecord
preferences&.dig("dashboard_two_column") == true
end
- def beta_features_enabled?
- preferences&.dig("beta_features_enabled") == true
+ def preview_features_enabled?
+ preferences&.dig("preview_features_enabled") == true
end
def update_transactions_preferences(prefs)
diff --git a/app/views/settings/preferences/show.html.erb b/app/views/settings/preferences/show.html.erb
index 6c5410fbf..67c04b44a 100644
--- a/app/views/settings/preferences/show.html.erb
+++ b/app/views/settings/preferences/show.html.erb
@@ -207,26 +207,26 @@
<% end %>
<% end %>
-<%# Beta features toggle — visible to all users, not just admins. Lives at the
- bottom of Preferences as a standalone card (no section header) so the toggle
- row is the entire surface. Posts directly to settings#preferences#update via
- the Settings::PreferencesController, matching the auto-submit pattern used
- on the Appearance page. %>
+<%# Preview features toggle — visible to all users, not just admins. Lives at
+ the bottom of Preferences as a standalone card (no section header) so the
+ toggle row is the entire surface. Posts directly to
+ settings#preferences#update via the Settings::PreferencesController,
+ matching the auto-submit pattern used on the Appearance page. %>
<%= form_with url: settings_preferences_path, method: :patch,
data: { controller: "auto-submit-form" } do |f| %>
<%# Wrapping the row in makes the title + description
themselves a click target for the toggle, so the cursor-pointer
affordance on the container is honest. %>
-
+
-
<%= t(".beta.title") %>
-
<%= t(".beta.description") %>
+
<%= t(".preview.title") %>
+
<%= t(".preview.description") %>
<%= render DS::Toggle.new(
- id: "user_beta_features_enabled",
- name: "user[beta_features_enabled]",
- checked: @user.beta_features_enabled?,
+ id: "user_preview_features_enabled",
+ name: "user[preview_features_enabled]",
+ checked: @user.preview_features_enabled?,
data: { auto_submit_form_target: "auto" }
) %>
diff --git a/config/locales/views/beta/en.yml b/config/locales/views/beta/en.yml
deleted file mode 100644
index bb9bcb8d3..000000000
--- a/config/locales/views/beta/en.yml
+++ /dev/null
@@ -1,4 +0,0 @@
----
-en:
- beta:
- not_enabled: This feature is in beta. Enable beta features in Settings → Preferences to try it.
diff --git a/config/locales/views/components/ca.yml b/config/locales/views/components/ca.yml
index 41dfa8c3d..adc046526 100644
--- a/config/locales/views/components/ca.yml
+++ b/config/locales/views/components/ca.yml
@@ -92,7 +92,7 @@ ca:
close: Tanca
pill:
aria_label: "%{label}"
- default_label: Beta
+ default_label: Experimental
provider_sync_summary:
accounts:
institutions: 'Institucions: %{count}'
diff --git a/config/locales/views/components/en.yml b/config/locales/views/components/en.yml
index cc74d1051..a7c14bd2b 100644
--- a/config/locales/views/components/en.yml
+++ b/config/locales/views/components/en.yml
@@ -86,7 +86,7 @@ en:
destructive: Error
pill:
aria_label: "%{label}"
- default_label: Beta
+ default_label: Preview
dialog:
close: Close
provider_sync_summary:
diff --git a/config/locales/views/components/es.yml b/config/locales/views/components/es.yml
index 4587a0088..639beff3f 100644
--- a/config/locales/views/components/es.yml
+++ b/config/locales/views/components/es.yml
@@ -63,4 +63,8 @@ es:
other: "%{count} transacciones"
data_warnings: "Avisos de datos: %{count}"
notices: "Avisos: %{count}"
- view_data_quality: Ver detalles de calidad de datos
\ No newline at end of file
+ view_data_quality: Ver detalles de calidad de datos
+ ds:
+ pill:
+ aria_label: "%{label}"
+ default_label: Experimental
\ No newline at end of file
diff --git a/config/locales/views/preview/ca.yml b/config/locales/views/preview/ca.yml
new file mode 100644
index 000000000..ae13dbd34
--- /dev/null
+++ b/config/locales/views/preview/ca.yml
@@ -0,0 +1,4 @@
+---
+ca:
+ preview:
+ not_enabled: Aquesta funció és experimental. Activa les funcions experimentals a Configuració → Preferències per provar-la.
\ No newline at end of file
diff --git a/config/locales/views/preview/en.yml b/config/locales/views/preview/en.yml
new file mode 100644
index 000000000..9adb55036
--- /dev/null
+++ b/config/locales/views/preview/en.yml
@@ -0,0 +1,4 @@
+---
+en:
+ preview:
+ not_enabled: This feature is in preview. Enable preview features in Settings → Preferences to try it.
diff --git a/config/locales/views/preview/es.yml b/config/locales/views/preview/es.yml
new file mode 100644
index 000000000..bf85bfd41
--- /dev/null
+++ b/config/locales/views/preview/es.yml
@@ -0,0 +1,4 @@
+---
+es:
+ preview:
+ not_enabled: Esta función es experimental. Activa las funciones experimentales en Configuración → Preferencias para probarla.
\ No newline at end of file
diff --git a/config/locales/views/settings/ca.yml b/config/locales/views/settings/ca.yml
index 917d18d24..9df987673 100644
--- a/config/locales/views/settings/ca.yml
+++ b/config/locales/views/settings/ca.yml
@@ -129,10 +129,9 @@ ca:
additional_currencies_label: Divises addicionals
base_currency_badge: Divisa base
base_currency_label: Divisa base
- beta:
- description: Activa funcions en desenvolupament etiquetades com a beta o
- canary.
- title: Activa funcions beta
+ preview:
+ description: Activa funcions en desenvolupament etiquetades com a experimentals o canary.
+ title: Activa funcions experimentals
country: País
currencies_more: "+%{count} més"
currencies_subtitle: Tria quines divises apareixen als camps de diners
diff --git a/config/locales/views/settings/en.yml b/config/locales/views/settings/en.yml
index 9b1b24dc7..9a7968fe9 100644
--- a/config/locales/views/settings/en.yml
+++ b/config/locales/views/settings/en.yml
@@ -154,9 +154,9 @@ en:
sharing_default_label: Default sharing for new accounts
sharing_shared: Share with all members
sharing_private: Keep private by default
- beta:
- title: Enable beta features
- description: Opt in to in-progress features tagged beta or canary.
+ preview:
+ title: Enable preview features
+ description: Opt in to in-progress features tagged preview or canary.
profiles:
destroy:
cannot_remove_self: You cannot remove yourself from the account.
diff --git a/config/locales/views/settings/es.yml b/config/locales/views/settings/es.yml
index e8cf7fb0c..1ff5af650 100644
--- a/config/locales/views/settings/es.yml
+++ b/config/locales/views/settings/es.yml
@@ -47,6 +47,9 @@ es:
month_start_day: El mes de presupuesto comienza el
month_start_day_hint: Establece cuándo empieza tu mes financiero (ej. el día de cobro)
month_start_day_warning: Tus presupuestos y cálculos del mes en curso utilizarán este día personalizado en lugar del día 1 de cada mes.
+ preview:
+ title: Habilitar funciones experimentales
+ description: Activa las funciones en desarrollo etiquetadas como experimentales o canary.
profiles:
destroy:
cannot_remove_self: No puedes eliminarte a ti mismo de la cuenta.
diff --git a/db/migrate/20260519092118_rename_beta_features_enabled_preference.rb b/db/migrate/20260519092118_rename_beta_features_enabled_preference.rb
new file mode 100644
index 000000000..6e9f36ea3
--- /dev/null
+++ b/db/migrate/20260519092118_rename_beta_features_enabled_preference.rb
@@ -0,0 +1,30 @@
+class RenameBetaFeaturesEnabledPreference < ActiveRecord::Migration[7.2]
+ # Renames the JSONB preference key `beta_features_enabled` to
+ # `preview_features_enabled` for every user that has the old key set.
+ # The gate was introduced in PR #1829 and never moved past the Goals
+ # rollout, so opt-in counts are small — but copying the value across keeps
+ # any early adopters opted in after the rename.
+ def up
+ execute(<<~SQL)
+ UPDATE users
+ SET preferences = (preferences - 'beta_features_enabled')
+ || jsonb_build_object(
+ 'preview_features_enabled',
+ COALESCE(preferences->'preview_features_enabled', preferences->'beta_features_enabled')
+ )
+ WHERE preferences ? 'beta_features_enabled'
+ SQL
+ end
+
+ def down
+ execute(<<~SQL)
+ UPDATE users
+ SET preferences = (preferences - 'preview_features_enabled')
+ || jsonb_build_object(
+ 'beta_features_enabled',
+ COALESCE(preferences->'beta_features_enabled', preferences->'preview_features_enabled')
+ )
+ WHERE preferences ? 'preview_features_enabled'
+ SQL
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index dcd00bdf8..f2e1a0cc7 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema[7.2].define(version: 2026_05_17_122500) do
+ActiveRecord::Schema[7.2].define(version: 2026_05_19_092118) do
# These are extensions that must be enabled in order to support this database
enable_extension "pgcrypto"
enable_extension "plpgsql"
diff --git a/docs/llm-guides/gating-a-beta-feature.md b/docs/llm-guides/gating-a-beta-feature.md
deleted file mode 100644
index dc6c90979..000000000
--- a/docs/llm-guides/gating-a-beta-feature.md
+++ /dev/null
@@ -1,128 +0,0 @@
-# Gating a beta feature
-
-Sure ships beta features behind a single per-user toggle. Users opt in via Settings → Preferences. Opted-in users see your feature; everyone else doesn't. This guide is for hooking a new feature into the gate.
-
-The intent is to ship in-progress work without blocking smaller PRs on a "feels finished" bar. You gate the entry points (routes, nav, anything that links into your feature) and iterate behind them. Once stable, you remove the gate in a small follow-up PR.
-
-## How the gate works
-
-The state lives on `users.preferences["beta_features_enabled"]`, a key inside the existing JSONB column. It defaults to `false`. Reading it goes through `User#beta_features_enabled?`.
-
-`ApplicationController` includes the `BetaGateable` concern, which exposes two methods to every controller:
-
-- `beta_features_enabled?`. Returns a boolean. `false` for logged-out callers.
-- `require_beta_features!`. A `before_action` helper. Redirects non-beta users to `/` with a flash that points them at Settings → Preferences.
-
-The concern also registers `beta_features_enabled?` as a helper method, so views can call it directly.
-
-Key files:
-
-- `app/controllers/concerns/beta_gateable.rb`. The concern.
-- `app/models/user.rb`. The `beta_features_enabled?` predicate.
-- `app/views/settings/preferences/show.html.erb`. The toggle UI users see.
-- `app/components/DS/pill.rb`. The `Beta` / `Canary` marker pill.
-- `config/locales/views/beta/en.yml`. The redirect flash copy.
-
-## Gating a controller
-
-Add `require_beta_features!` as a `before_action`. That's it.
-
-```ruby
-class GoalsController < ApplicationController
- before_action :require_beta_features!
-end
-```
-
-Routes stay defined; the gate runs per-request. Non-beta users hitting `/goals` get redirected with a flash. Beta users pass through.
-
-If only some actions are gated, scope the `before_action`:
-
-```ruby
-class TransactionsController < ApplicationController
- before_action :require_beta_features!, only: %i[forecast scenarios]
-end
-```
-
-## Gating a view
-
-Wrap the relevant fragment in the helper:
-
-```erb
-<% if beta_features_enabled? %>
-
- <%= link_to t(".nav.goals"), goals_path %>
-
-<% end %>
-```
-
-Same pattern works for dashboard widgets, scoreboard cards, anything that surfaces beta data alongside non-beta data. The helper resolves on every request and reflects the current user's preference.
-
-## Marking the feature in the UI
-
-When a beta surface renders for an opted-in user, mark it. The pill component lives in the design system:
-
-```erb
-<%# Next to a page header. The md size pairs with h1 / h2. %>
-<%= render DS::Pill.new(label: "Beta", size: :md) %>
-
-<%# Next to a sidebar nav label or section title. sm is the default. %>
-<%= render DS::Pill.new(label: "Beta") %>
-
-<%# Same shape, fuchsia tone, for canary / experimental surfaces. %>
-<%= render DS::Pill.new(label: "Canary", tone: :fuchsia) %>
-
-<%# Sidebar icon rail has no room for a label. The dot-only mode keeps the tone semantics without the text. %>
-<%= render DS::Pill.new(tone: :violet, dot_only: true, title: "Beta") %>
-```
-
-Default tone is violet. Tones available: `violet`, `indigo`, `fuchsia`, `amber`, `gray`. Styles: `soft` (default), `filled`, `outline`. Sizes: `sm` (default), `md`. The Lookbook preview at `/design-system` (look for `PillComponentPreview#default`) flips every option, so you can see what your call site renders without a round trip to Rails.
-
-## Tests
-
-Gated controllers should test both states. The pattern:
-
-```ruby
-class GoalsControllerTest < ActionDispatch::IntegrationTest
- setup do
- sign_in @user = users(:family_admin)
- end
-
- test "redirects users without beta access" do
- @user.update!(preferences: (@user.preferences || {}).merge("beta_features_enabled" => false))
-
- get goals_url
-
- assert_redirected_to root_path
- assert_match(/beta/i, flash[:alert])
- end
-
- test "renders for users with beta access" do
- @user.update!(preferences: (@user.preferences || {}).merge("beta_features_enabled" => true))
-
- get goals_url
-
- assert_response :success
- end
-end
-```
-
-If you write a system test, flip the preference in setup the same way before the visit.
-
-## Removing the gate when the feature ships GA
-
-When a feature moves from beta to general availability, removing the gate is a small mechanical PR:
-
-1. Drop the `before_action :require_beta_features!` line from the controller.
-2. Unwrap the `if beta_features_enabled?` blocks in views.
-3. Drop the `DS::Pill` markers from headers, nav, and section titles.
-4. Delete the controller / view tests that exercise the redirect.
-
-Grep for `require_beta_features!` and `beta_features_enabled?` near your feature to confirm nothing's left behind.
-
-## Notes
-
-The flag is per-user, not per-family. Two users in the same family can see different versions of the product if one opts in and the other doesn't. That's intentional. Data is family-scoped, but visibility is a personal preference. If you write a feature that creates family-shared data (goals, budgets, etc.), the data persists when a user toggles beta off. The UI just disappears from their view while still showing up for opted-in family members.
-
-The gate does nothing for background jobs. If your feature has a Sidekiq cron job, it runs regardless of who has beta enabled. That's usually correct (data should keep flowing), but if the job sends notifications or emails, gate those at the send site too.
-
-The redirect target is `/`. If you want gated controllers to land somewhere else (a docs page, an opt-in nudge), override `require_beta_features!` in the controller, or write a thin custom `before_action` that calls `beta_features_enabled?` directly.
diff --git a/docs/llm-guides/gating-a-preview-feature.md b/docs/llm-guides/gating-a-preview-feature.md
new file mode 100644
index 000000000..008513ed3
--- /dev/null
+++ b/docs/llm-guides/gating-a-preview-feature.md
@@ -0,0 +1,128 @@
+# Gating a preview feature
+
+Sure ships preview features behind a single per-user toggle. Users opt in via Settings → Preferences. Opted-in users see your feature; everyone else doesn't. This guide is for hooking a new feature into the gate.
+
+The intent is to ship in-progress work without blocking smaller PRs on a "feels finished" bar. You gate the entry points (routes, nav, anything that links into your feature) and iterate behind them. Once stable, you remove the gate in a small follow-up PR.
+
+## How the gate works
+
+The state lives on `users.preferences["preview_features_enabled"]`, a key inside the existing JSONB column. It defaults to `false`. Reading it goes through `User#preview_features_enabled?`.
+
+`ApplicationController` includes the `PreviewGateable` concern, which exposes two methods to every controller:
+
+- `preview_features_enabled?`. Returns a boolean. `false` for logged-out callers.
+- `require_preview_features!`. A `before_action` helper. Redirects users without preview access to `/` with a flash that points them at Settings → Preferences.
+
+The concern also registers `preview_features_enabled?` as a helper method, so views can call it directly.
+
+Key files:
+
+- `app/controllers/concerns/preview_gateable.rb`. The concern.
+- `app/models/user.rb`. The `preview_features_enabled?` predicate.
+- `app/views/settings/preferences/show.html.erb`. The toggle UI users see.
+- `app/components/DS/pill.rb`. The `Preview` / `Canary` marker pill.
+- `config/locales/views/preview/en.yml`. The redirect flash copy.
+
+## Gating a controller
+
+Add `require_preview_features!` as a `before_action`. That's it.
+
+```ruby
+class GoalsController < ApplicationController
+ before_action :require_preview_features!
+end
+```
+
+Routes stay defined; the gate runs per-request. Users without preview access hitting `/goals` get redirected with a flash. Preview users pass through.
+
+If only some actions are gated, scope the `before_action`:
+
+```ruby
+class TransactionsController < ApplicationController
+ before_action :require_preview_features!, only: %i[forecast scenarios]
+end
+```
+
+## Gating a view
+
+Wrap the relevant fragment in the helper:
+
+```erb
+<% if preview_features_enabled? %>
+
+ <%= link_to t(".nav.goals"), goals_path %>
+
+<% end %>
+```
+
+Same pattern works for dashboard widgets, scoreboard cards, anything that surfaces preview data alongside non-preview data. The helper resolves on every request and reflects the current user's preference.
+
+## Marking the feature in the UI
+
+When a preview surface renders for an opted-in user, mark it. The pill component lives in the design system:
+
+```erb
+<%# Next to a page header. The md size pairs with h1 / h2. %>
+<%= render DS::Pill.new(label: "Preview", size: :md) %>
+
+<%# Next to a sidebar nav label or section title. sm is the default. %>
+<%= render DS::Pill.new(label: "Preview") %>
+
+<%# Same shape, fuchsia tone, for canary / experimental surfaces. %>
+<%= render DS::Pill.new(label: "Canary", tone: :fuchsia) %>
+
+<%# Sidebar icon rail has no room for a label. The dot-only mode keeps the tone semantics without the text. %>
+<%= render DS::Pill.new(tone: :violet, dot_only: true, title: "Preview") %>
+```
+
+Default tone is violet. Tones available: `violet`, `indigo`, `fuchsia`, `amber`, `gray`. Styles: `soft` (default), `filled`, `outline`. Sizes: `sm` (default), `md`. The Lookbook preview at `/design-system` (look for `PillComponentPreview#default`) flips every option, so you can see what your call site renders without a round trip to Rails.
+
+## Tests
+
+Gated controllers should test both states. The pattern:
+
+```ruby
+class GoalsControllerTest < ActionDispatch::IntegrationTest
+ setup do
+ sign_in @user = users(:family_admin)
+ end
+
+ test "redirects users without preview access" do
+ @user.update!(preferences: (@user.preferences || {}).merge("preview_features_enabled" => false))
+
+ get goals_url
+
+ assert_redirected_to root_path
+ assert_match(/preview/i, flash[:alert])
+ end
+
+ test "renders for users with preview access" do
+ @user.update!(preferences: (@user.preferences || {}).merge("preview_features_enabled" => true))
+
+ get goals_url
+
+ assert_response :success
+ end
+end
+```
+
+If you write a system test, flip the preference in setup the same way before the visit.
+
+## Removing the gate when the feature ships GA
+
+When a feature moves from preview to general availability, removing the gate is a small mechanical PR:
+
+1. Drop the `before_action :require_preview_features!` line from the controller.
+2. Unwrap the `if preview_features_enabled?` blocks in views.
+3. Drop the `DS::Pill` markers from headers, nav, and section titles.
+4. Delete the controller / view tests that exercise the redirect.
+
+Grep for `require_preview_features!` and `preview_features_enabled?` near your feature to confirm nothing's left behind.
+
+## Notes
+
+The flag is per-user, not per-family. Two users in the same family can see different versions of the product if one opts in and the other doesn't. That's intentional. Data is family-scoped, but visibility is a personal preference. If you write a feature that creates family-shared data (goals, budgets, etc.), the data persists when a user toggles preview off. The UI just disappears from their view while still showing up for opted-in family members.
+
+The gate does nothing for background jobs. If your feature has a Sidekiq cron job, it runs regardless of who has preview enabled. That's usually correct (data should keep flowing), but if the job sends notifications or emails, gate those at the send site too.
+
+The redirect target is `/`. If you want gated controllers to land somewhere else (a docs page, an opt-in nudge), override `require_preview_features!` in the controller, or write a thin custom `before_action` that calls `preview_features_enabled?` directly.
diff --git a/test/components/previews/pill_component_preview.rb b/test/components/previews/pill_component_preview.rb
index 05c1258a0..88a7aa93f 100644
--- a/test/components/previews/pill_component_preview.rb
+++ b/test/components/previews/pill_component_preview.rb
@@ -5,7 +5,7 @@ class PillComponentPreview < ViewComponent::Preview
# @param label text
# @param show_dot toggle
# @param dot_only toggle
- def default(tone: "violet", style: "soft", size: "sm", label: "Beta", show_dot: true, dot_only: false)
+ def default(tone: "violet", style: "soft", size: "sm", label: "Preview", show_dot: true, dot_only: false)
render DS::Pill.new(
label: label,
tone: tone.to_sym,
diff --git a/test/controllers/settings/preferences_controller_test.rb b/test/controllers/settings/preferences_controller_test.rb
index 8f300d914..5d49f9ee0 100644
--- a/test/controllers/settings/preferences_controller_test.rb
+++ b/test/controllers/settings/preferences_controller_test.rb
@@ -22,32 +22,32 @@ class Settings::PreferencesControllerTest < ActionDispatch::IntegrationTest
assert_select "select[name='user[family_attributes][currency]']", count: 0
end
- test "renders beta features toggle for non-admin users too" do
+ test "renders preview features toggle for non-admin users too" do
sign_in users(:family_member)
get settings_preferences_url
assert_response :success
- assert_includes response.body, "Enable beta features"
+ assert_includes response.body, "Enable preview features"
end
- test "update toggles beta_features_enabled on" do
+ test "update toggles preview_features_enabled on" do
user = users(:family_admin)
- assert_not user.beta_features_enabled?
+ assert_not user.preview_features_enabled?
- patch settings_preferences_url, params: { user: { beta_features_enabled: "1" } }
+ patch settings_preferences_url, params: { user: { preview_features_enabled: "1" } }
assert_redirected_to settings_preferences_url
- assert user.reload.beta_features_enabled?
+ assert user.reload.preview_features_enabled?
end
- test "update toggles beta_features_enabled off" do
+ test "update toggles preview_features_enabled off" do
user = users(:family_admin)
- user.update!(preferences: (user.preferences || {}).merge("beta_features_enabled" => true))
- assert user.beta_features_enabled?
+ user.update!(preferences: (user.preferences || {}).merge("preview_features_enabled" => true))
+ assert user.preview_features_enabled?
- patch settings_preferences_url, params: { user: { beta_features_enabled: "0" } }
+ patch settings_preferences_url, params: { user: { preview_features_enabled: "0" } }
assert_redirected_to settings_preferences_url
- assert_not user.reload.beta_features_enabled?
+ assert_not user.reload.preview_features_enabled?
end
end
diff --git a/test/models/user_test.rb b/test/models/user_test.rb
index 600cbb72f..5139fff09 100644
--- a/test/models/user_test.rb
+++ b/test/models/user_test.rb
@@ -660,21 +660,21 @@ class UserTest < ActiveSupport::TestCase
assert_equal "custom_role", User.role_for_new_family_creator(fallback_role: "custom_role")
end
- # Beta features preference tests
- test "beta_features_enabled? defaults to false" do
+ # Preview features preference tests
+ test "preview_features_enabled? defaults to false" do
@user.update!(preferences: {})
- assert_not @user.beta_features_enabled?
+ assert_not @user.preview_features_enabled?
end
- test "beta_features_enabled? true only when explicitly true" do
- @user.update!(preferences: { "beta_features_enabled" => true })
- assert @user.beta_features_enabled?
+ test "preview_features_enabled? true only when explicitly true" do
+ @user.update!(preferences: { "preview_features_enabled" => true })
+ assert @user.preview_features_enabled?
- @user.update!(preferences: { "beta_features_enabled" => false })
- assert_not @user.beta_features_enabled?
+ @user.update!(preferences: { "preview_features_enabled" => false })
+ assert_not @user.preview_features_enabled?
- @user.update!(preferences: { "beta_features_enabled" => "yes" })
- assert_not @user.beta_features_enabled?, "truthy non-boolean should not enable"
+ @user.update!(preferences: { "preview_features_enabled" => "yes" })
+ assert_not @user.preview_features_enabled?, "truthy non-boolean should not enable"
end
# ActiveStorage attachment cleanup tests
From 04ba4dd28f482352f3af489e732de38e34af699d Mon Sep 17 00:00:00 2001
From: Guillem Arias Fauste
Date: Wed, 20 May 2026 07:18:33 +0200
Subject: [PATCH 12/33] fix(design-system): bump --color-success for WCAG
1.4.11 contrast (#1838)
Light: green-600 (#10A861) -> green-700 (#078C52). Lifts the
success icon on `bg-success/10` from 2.77:1 to 3.77:1, clearing
the WCAG 1.4.11 3:1 minimum for non-text UI components.
Dark: green-500 (#12B76A) -> green-400 (#32D583), keeping the
warning/destructive 600-light/400-dark step pattern intact and
moving from 5.95 to 7.90.
Source change in design/tokens/sure.tokens.json; _generated.css
regenerated via `npm run tokens:build`.
Closes #1735. Resolves #1736 child #4.
---
app/assets/tailwind/sure-design-system/_generated.css | 4 ++--
design/tokens/sure.tokens.json | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/app/assets/tailwind/sure-design-system/_generated.css b/app/assets/tailwind/sure-design-system/_generated.css
index 105b788e4..8acbaaa4f 100644
--- a/app/assets/tailwind/sure-design-system/_generated.css
+++ b/app/assets/tailwind/sure-design-system/_generated.css
@@ -9,7 +9,7 @@
--font-mono: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
--color-white: #ffffff;
--color-black: #0B0B0B;
- --color-success: var(--color-green-600);
+ --color-success: var(--color-green-700);
--color-warning: var(--color-yellow-600);
--color-destructive: var(--color-red-600);
--color-info: var(--color-blue-600);
@@ -197,7 +197,7 @@
@layer base {
[data-theme="dark"] {
- --color-success: var(--color-green-500);
+ --color-success: var(--color-green-400);
--color-warning: var(--color-yellow-400);
--color-destructive: var(--color-red-400);
--color-info: var(--color-blue-500);
diff --git a/design/tokens/sure.tokens.json b/design/tokens/sure.tokens.json
index 5d899749b..8602a5a83 100644
--- a/design/tokens/sure.tokens.json
+++ b/design/tokens/sure.tokens.json
@@ -18,7 +18,7 @@
"white": { "$value": "#ffffff", "$type": "color" },
"black": { "$value": "#0B0B0B", "$type": "color" },
- "success": { "$value": "{color.green.600}", "$type": "color", "$extensions": { "sure.dark": "{color.green.500}" } },
+ "success": { "$value": "{color.green.700}", "$type": "color", "$extensions": { "sure.dark": "{color.green.400}" } },
"warning": { "$value": "{color.yellow.600}", "$type": "color", "$extensions": { "sure.dark": "{color.yellow.400}" } },
"destructive": { "$value": "{color.red.600}", "$type": "color", "$extensions": { "sure.dark": "{color.red.400}" } },
"info": { "$value": "{color.blue.600}", "$type": "color", "$extensions": { "sure.dark": "{color.blue.500}" } },
From e56ad3de42c55eaf2d7dcdaae1995030c5747efc Mon Sep 17 00:00:00 2001
From: Guillem Arias Fauste
Date: Wed, 20 May 2026 18:08:46 +0200
Subject: [PATCH 13/33] fix(design-system): DS::Toggle focus ring, role=switch,
and semantic tokens (#1843)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* fix(design-system): DS::Toggle a11y + token swaps
Closes #1746. Four fixes on the toggle primitive (visual switch
backed by a sr-only checkbox).
1. **Focus ring (WCAG 2.4.7)** — the `` is `sr-only`, so the
browser-default focus ring lands on an invisible 0px element.
The label (the track) had no focus styling, meaning the
component had **no visible focus indicator at all**. Add
`peer-focus-visible:ring-2 ring-offset-2 ring-gray-900` with
`theme-dark:peer-focus-visible:ring-white` so the ring appears
on the visible track when the underlying checkbox receives
keyboard focus.
2. **Role semantics** — visual is a switch, but the element was
announced as "checkbox, checked" because the native input is
a checkbox. Add `role="switch"` so AT users hear "switch, on"
/ "switch, off". `aria-checked` is inherited from the
checkbox's checked state, no manual wiring needed.
3. **Token swaps** — replace raw palette references with semantic
tokens:
- Track `bg-gray-100 theme-dark:bg-gray-700` → `bg-surface-inset`
- Checked `peer-checked:bg-green-600` → `peer-checked:bg-success`
Picks up the contrast bump from #1735 automatically.
4. **Motion safety (WCAG 2.3.3)** — gate the bg color +
thumb-translate transitions behind `motion-safe:`. Reduced-motion
users see an instant state snap; everyone else gets the
existing 300ms ease.
API unchanged. Existing 8 callsites (settings/preferences,
settings/appearances, account_sharings, budgets/edit,
recurring_transactions, styled_form_builder bridge) work without
changes.
* fix(review): use alpha tokens for Toggle focus ring
Swap raw palette (ring-gray-900 / theme-dark:ring-white) on the
DS::Toggle focus ring to ring-alpha-black-300 / ring-alpha-white-300
to match the focus-ring token pattern already used by
form-field, provider_card, and shared/_badge.
Closes AI review feedback on #1843.
---
app/components/DS/toggle.html.erb | 5 ++++-
app/components/DS/toggle.rb | 17 ++++++++++++-----
2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/app/components/DS/toggle.html.erb b/app/components/DS/toggle.html.erb
index 6845686c4..5b9fe94de 100644
--- a/app/components/DS/toggle.html.erb
+++ b/app/components/DS/toggle.html.erb
@@ -1,5 +1,8 @@
<%= hidden_field_tag name, unchecked_value, id: nil %>
- <%= check_box_tag name, checked_value, checked, class: "sr-only peer", disabled: disabled, id: id, **opts %>
+ <%# `role="switch"` upgrades the underlying checkbox so AT users hear
+ "switch, on" / "switch, off" instead of "checkbox, checked". The
+ visual already reads as a switch — semantics now match. %>
+ <%= check_box_tag name, checked_value, checked, class: "sr-only peer", disabled: disabled, id: id, role: "switch", **opts %>
<%= label_tag name, " ".html_safe, class: label_classes, for: id %>
diff --git a/app/components/DS/toggle.rb b/app/components/DS/toggle.rb
index c384a2969..a795574d8 100644
--- a/app/components/DS/toggle.rb
+++ b/app/components/DS/toggle.rb
@@ -13,13 +13,20 @@ class DS::Toggle < DesignSystemComponent
def label_classes
class_names(
- "block w-9 h-5 cursor-pointer",
- "rounded-full bg-gray-100 theme-dark:bg-gray-700",
- "transition-colors duration-300",
+ "relative block w-9 h-5 cursor-pointer",
+ "rounded-full bg-surface-inset",
+ # `motion-safe:` gates the bg + thumb-translate transitions on
+ # `prefers-reduced-motion`; reduced-motion users get a snap.
+ "motion-safe:transition-colors motion-safe:duration-300",
"after:content-[''] after:block after:bg-white after:absolute after:rounded-full",
"after:top-0.5 after:left-0.5 after:w-4 after:h-4",
- "after:transition-transform after:duration-300 after:ease-in-out",
- "peer-checked:bg-green-600 peer-checked:after:translate-x-4",
+ "motion-safe:after:transition-transform motion-safe:after:duration-300 motion-safe:after:ease-in-out",
+ "peer-checked:bg-success peer-checked:after:translate-x-4",
+ # Focus ring driven from the sr-only input via `peer-focus-visible:`.
+ # Offset places the ring outside the track so it lands on the
+ # surrounding chrome regardless of theme.
+ "peer-focus-visible:ring-2 peer-focus-visible:ring-offset-2",
+ "peer-focus-visible:ring-alpha-black-300 theme-dark:peer-focus-visible:ring-alpha-white-300",
"peer-disabled:opacity-70 peer-disabled:cursor-not-allowed"
)
end
From 51b03362622f1650463955264bd1675f0548f189 Mon Sep 17 00:00:00 2001
From: Guillem Arias Fauste
Date: Wed, 20 May 2026 18:08:58 +0200
Subject: [PATCH 14/33] fix(design-system): DS::FilledIcon
decorative-vs-meaningful API (#1842)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* fix(design-system): DS::FilledIcon decorative-vs-meaningful API
Closes #1742. `DS::FilledIcon` is mostly used as a decorative
visual indicator next to a textual label (transaction merchant
avatar, recurring-transaction icon, payment-method tile, etc.).
The wrapper was rendering without any aria scaffolding, so screen
readers had to traverse the inner `