From 578141d6ef360340160e4510e299bf6698992cae Mon Sep 17 00:00:00 2001 From: Francesc Leveque Date: Fri, 19 Jun 2026 21:00:28 +0200 Subject: [PATCH 1/8] refactor(ai): move chat tools to Quantic.AI.PortfolioTools MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The seven scoped portfolio tools have no Telegram coupling but lived in the Telegram namespace. Move them to Quantic.AI.PortfolioTools so both the Telegram bot and the (incoming) web chat widget can share them, and add payout_ratio to the tool quote context — the key dividend sustainability signal the per-stock summary already uses. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../{telegram/tools.ex => ai/portfolio_tools.ex} | 15 ++++++++++----- lib/quantic/telegram/handler.ex | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) rename lib/quantic/{telegram/tools.ex => ai/portfolio_tools.ex} (95%) diff --git a/lib/quantic/telegram/tools.ex b/lib/quantic/ai/portfolio_tools.ex similarity index 95% rename from lib/quantic/telegram/tools.ex rename to lib/quantic/ai/portfolio_tools.ex index 9ffcfdb..49c215a 100644 --- a/lib/quantic/telegram/tools.ex +++ b/lib/quantic/ai/portfolio_tools.ex @@ -1,10 +1,14 @@ -defmodule Quantic.Telegram.Tools do +defmodule Quantic.AI.PortfolioTools do @moduledoc """ - The bot's tool registry (← legacy `TelegramBot::Tools` + the seven - tool classes, collapsed onto the contexts' public APIs). Every tool - closes over the linked user's scope, so the LLM can only ever touch - that user's own data — the privacy property the system prompt + The shared tool registry for AI chat (← legacy `TelegramBot::Tools` + + the seven tool classes, collapsed onto the contexts' public APIs). + Every tool closes over the user's scope, so the LLM can only ever + touch that user's own data — the privacy property the system prompt promises. + + Pure context-API plumbing with two front doors: the Telegram bot + (`Quantic.Telegram.Handler`) and the web chat widget + (`QuanticWeb.AskLive`). """ alias Quantic.Accounts.Scope @@ -286,6 +290,7 @@ defmodule Quantic.Telegram.Tools do defp quote_context(quote) do %{ dividend_yield: quote.dividend_yield, + payout_ratio: quote.payout_ratio, pe_ratio: quote.pe_ratio, ma_200: quote.ma200, fifty_two_week_high: quote.fifty_two_week_high, diff --git a/lib/quantic/telegram/handler.ex b/lib/quantic/telegram/handler.ex index 4f8aacb..f411c43 100644 --- a/lib/quantic/telegram/handler.ex +++ b/lib/quantic/telegram/handler.ex @@ -19,9 +19,9 @@ defmodule Quantic.Telegram.Handler do alias Quantic.Accounts.Scope alias Quantic.AI + alias Quantic.AI.PortfolioTools, as: Tools alias Quantic.Telegram alias Quantic.Telegram.Client - alias Quantic.Telegram.Tools @system_prompt """ You are Quantic's dividend-investing assistant, embedded in Telegram. The user has connected their Quantic account, so you can answer questions about their personal radar (watchlist), holdings (portfolio), and dividends. From 60098370f01883848d72ea5907b353816616eff0 Mon Sep 17 00:00:00 2001 From: Francesc Leveque Date: Fri, 19 Jun 2026 21:00:47 +0200 Subject: [PATCH 2/8] feat(ai): always-present Ask Quantic chat widget MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A sticky nested LiveView mounted once in Layouts.app, so a conversational assistant is present on every signed-in page and its conversation survives navigation. Reuses Quantic.AI.chat_as/3 + PortfolioTools (the same engine as the Telegram bot) — no new AI infrastructure. - Persists open state + conversation to localStorage (survives refresh and cross-session navigation). - Page-aware via a handle_params on_mount hook (QuanticWeb.AskContext). - Brand-emerald styling matching the logo gradient; attention pulse. - Demo accounts get a canned reply — never a paid provider call. - Informational framing only: describes a stock on dividend criteria, never a buy/sell recommendation, with an in-widget 'not financial advice' note. Seven languages. - HomePage showcase card + README/architecture docs. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 2 +- docs/architecture.md | 8 +- lib/quantic_web/ask_context.ex | 44 ++ lib/quantic_web/components/home_components.ex | 36 ++ lib/quantic_web/components/layouts.ex | 11 + lib/quantic_web/live/ask_live.ex | 438 ++++++++++++++++++ lib/quantic_web/live/buy_plan_live.ex | 2 +- .../live/community_dashboard_live.ex | 2 +- lib/quantic_web/live/dividends_live.ex | 2 +- lib/quantic_web/live/faq_live.ex | 2 +- lib/quantic_web/live/home_live.ex | 3 +- lib/quantic_web/live/path_to_freedom_live.ex | 2 +- lib/quantic_web/live/portfolio_live.ex | 2 +- lib/quantic_web/live/public_portfolio_live.ex | 2 +- lib/quantic_web/live/public_radar_live.ex | 2 +- lib/quantic_web/live/settings_live.ex | 2 +- lib/quantic_web/router.ex | 6 +- priv/gettext/ca/LC_MESSAGES/default.po | 380 +++++++++------ priv/gettext/de/LC_MESSAGES/default.po | 380 +++++++++------ priv/gettext/default.pot | 380 +++++++++------ priv/gettext/en/LC_MESSAGES/default.po | 380 +++++++++------ priv/gettext/es/LC_MESSAGES/default.po | 380 +++++++++------ priv/gettext/fr/LC_MESSAGES/default.po | 380 +++++++++------ priv/gettext/it/LC_MESSAGES/default.po | 380 +++++++++------ priv/gettext/pt/LC_MESSAGES/default.po | 380 +++++++++------ test/quantic_web/live/ask_live_test.exs | 185 ++++++++ 26 files changed, 2640 insertions(+), 1151 deletions(-) create mode 100644 lib/quantic_web/ask_context.ex create mode 100644 lib/quantic_web/live/ask_live.ex create mode 100644 test/quantic_web/live/ask_live_test.exs diff --git a/README.md b/README.md index 684b885..ad511ce 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Built on Elixir + Phoenix LiveView. Consolidates a previous multi-stack ecosyste - **Dividends** — a cash ledger with IBKR / MyInvestor statement import, per-currency charts (12-month + full-history), a payment calendar, and upcoming ex-dividend tracking. - **Path to Freedom** — a FIRE projection (three capital pools, inflation, adaptive drawdown) with live sensitivity levers. - **Community** — opt-in public portfolio (`/p/:slug`) and radar (`/r/:slug`) pages with share images, plus a `/community` dashboard and trending. -- **AI** — portfolio/radar insights and per-stock summaries (Gemini, provider-agnostic), with a per-user daily quota. +- **AI** — portfolio/radar insights and per-stock summaries, plus **Ask Quantic**, an always-present chat widget that answers natural-language questions about your portfolio, radar, and dividends (it calls the same scoped tools as the Telegram bot). Gemini, provider-agnostic, with a per-user daily quota. - **Telegram** — an account-linked bot (queries + a daily digest of ex-divs, dividends, and target hits). - **Seven languages** — en, es, ca, pt, de, fr, it. - **Demo mode** — "Try a sample portfolio" seeds a real, ephemeral account so every feature is visible without signing up. diff --git a/docs/architecture.md b/docs/architecture.md index 3f7eae9..6ecb427 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -16,7 +16,7 @@ lib/ community/ # public surface (← pulse): /p/:slug, /r/:slug, /community + visit analytics events/ # time-series ingest + read API (← trends) logos/ # logo cache + serving + acquisition pipeline (GitHub → Wikidata → LLM) - ai/ # provider-agnostic AI (insights, summaries) + per-user quota + Telegram bot + daily digest + ai/ # provider-agnostic AI (insights, summaries) + per-user quota + scoped chat tools (Telegram bot + Ask widget) + daily digest content/ # founder social-post drafts (← legacy content_drafts): topic select → build → generate demo/ # ephemeral seeded demo users + nightly sweep quantic_web/ # web layer: LiveViews, controllers, layouts @@ -127,11 +127,13 @@ Stock **enrichment** (sector/industry + inferred dividend payment schedule) runs Every scoped call (`chat_as/3`, `generate_json_as/4`) enforces a **per-user daily quota** (`ai_requests` table, 3/day UTC, config-overridable) recorded *before* the call (a failed LLM call still costs money), with one ordering invariant pinned by test: the **cache probe runs before the quota check**, so a rate-limited user still sees cached results. **Admins bypass the quota** (legacy `AiRateLimiter` parity). System-initiated calls (`generate_json/3`, logo LLM resolver, content drafts) bypass the quota entirely. -Features: portfolio/radar **insights** and per-stock **summaries** (`AI.Insights`, 6h input-digest cache), the **Telegram bot's brain**, and **content drafts** (below). All need `GEMINI_API_KEY` to light up; without it each AI feature degrades independently. +Features: portfolio/radar **insights** and per-stock **summaries** (`AI.Insights`, 6h input-digest cache), the **Ask Quantic chat widget** (`QuanticWeb.AskLive`), the **Telegram bot's brain**, and **content drafts** (below). All need `GEMINI_API_KEY` to light up; without it each AI feature degrades independently. + +The chat tools live in `Quantic.AI.PortfolioTools` (`all_for/1`) — seven user-scoped tools over the contexts' public APIs, closing over the caller's `Scope` so the LLM can only ever read that user's own data. They have **two front doors**: the Telegram bot and `AskLive`. The web widget is a **sticky nested LiveView** mounted once in `Layouts.app`, so its conversation survives `live_navigate` across the authenticated pages; a `handle_params` `on_mount` hook (`QuanticWeb.AskContext`) broadcasts the current page over the internal `ask_context:` PubSub topic the widget subscribes to, giving each answer page context. No new AI infrastructure — it reuses `chat_as/3` (quota, tool loop) wholesale. ## Telegram -`Quantic.Telegram` ports legacy's bot (`Handler`/`Nlu`/`Tools`/`Client`) + linking lifecycle (`user_telegram_links`, one-shot expiring codes → `/start `). Seven user-scoped tools close over the linked user's data (the privacy property the system prompt promises). A **daily digest** (Oban cron, 06:30 UTC) sends upcoming ex-divs, dividends received, and throttled radar target-hit alerts, in the user's profile locale. +`Quantic.Telegram` ports legacy's bot (`Handler`/`Nlu`/`Client`) + linking lifecycle (`user_telegram_links`, one-shot expiring codes → `/start `). Its NLU tools now live in `Quantic.AI.PortfolioTools` (shared with the web chat widget); the seven user-scoped tools close over the linked user's data (the privacy property the system prompt promises). A **daily digest** (Oban cron, 06:30 UTC) sends upcoming ex-divs, dividends received, and throttled radar target-hit alerts, in the user's profile locale. **Ships dormant**: the monolith never registers the webhook on boot (doing so on the shared prod bot token would detach legacy's webhook), and the notifier is config-gated off. The one explicit cutover step — `Telegram.Client.register_webhook/1` + `TELEGRAM_NOTIFICATIONS=true` — attaches the bot to the monolith. Same bot token everywhere; verified by simulated-update tests since beta can't exercise it live. diff --git a/lib/quantic_web/ask_context.ex b/lib/quantic_web/ask_context.ex new file mode 100644 index 0000000..8ef80cd --- /dev/null +++ b/lib/quantic_web/ask_context.ex @@ -0,0 +1,44 @@ +defmodule QuanticWeb.AskContext do + @moduledoc """ + Tells the always-present AI chat widget (`QuanticWeb.AskLive`) which + page is on screen, so it can label the conversation context and bias + ambiguous questions toward it. + + Attached as an `on_mount` hook in the authenticated `live_session`: it + installs a `handle_params` hook that, on every navigation, broadcasts + the current page to the user's `ask_context:` PubSub topic — the + same internal-PubSub pattern the rest of the app uses for cross-process + coordination. The sticky widget subscribes to that topic. + """ + + use Gettext, backend: QuanticWeb.Gettext + + def on_mount(:default, _params, _session, socket) do + socket = + Phoenix.LiveView.attach_hook(socket, :ask_context, :handle_params, fn _params, + _uri, + socket -> + broadcast_page(socket) + {:cont, socket} + end) + + {:cont, socket} + end + + defp broadcast_page(socket) do + with %{user: %{id: user_id}} <- socket.assigns[:current_scope], + label when is_binary(label) <- page_label(socket.view) do + Phoenix.PubSub.broadcast(Quantic.PubSub, "ask_context:#{user_id}", {:current_page, label}) + end + + :ok + end + + defp page_label(QuanticWeb.PortfolioLive), do: gettext("Portfolio") + defp page_label(QuanticWeb.RadarLive), do: gettext("Radar") + defp page_label(QuanticWeb.BuyPlanLive), do: gettext("Buy plan") + defp page_label(QuanticWeb.PathToFreedomLive), do: gettext("Path to Freedom") + defp page_label(QuanticWeb.DividendsLive), do: gettext("Dividends") + defp page_label(QuanticWeb.SettingsLive), do: gettext("Settings") + defp page_label(_other), do: nil +end diff --git a/lib/quantic_web/components/home_components.ex b/lib/quantic_web/components/home_components.ex index 92fddf2..b4c2b8e 100644 --- a/lib/quantic_web/components/home_components.ex +++ b/lib/quantic_web/components/home_components.ex @@ -267,6 +267,42 @@ defmodule QuanticWeb.HomeComponents do """ end + @doc """ + The Ask Quantic pitch card: the always-present AI chat that answers + questions about a user's own portfolio, radar, and dividends. + """ + def ask_showcase(assigns) do + ~H""" +
+
+
+
+ <.icon name="hero-chat-bubble-left-right" class="size-5 text-sky-600 dark:text-sky-400" /> +

{gettext("Ask Quantic")}

+
+

+ {gettext( + "An AI assistant on every page. Ask about your portfolio, radar, and dividends in plain language — it reads your own data to answer." + )} +

+
    +
  • • {gettext("\"Which of my stocks are below my target?\"")}
  • +
  • • {gettext("\"What dividends did I get this month?\"")}
  • +
  • • {gettext("\"What's my biggest holding?\"")}
  • +
  • • {gettext("\"Any ex-dividends this week?\"")}
  • +
+
+ <.link + navigate={~p"/login"} + class="btn bg-sky-600 hover:bg-sky-700 text-white border-0 shrink-0" + > + {gettext("Try it")} <.icon name="hero-arrow-right" class="size-3.5" /> + +
+
+ """ + end + @doc """ The community pitch card. Adapts legacy's Pulse banner: pulse is now this app's own `/community` page, so the external link + preview diff --git a/lib/quantic_web/components/layouts.ex b/lib/quantic_web/components/layouts.ex index e1d0211..197e941 100644 --- a/lib/quantic_web/components/layouts.ex +++ b/lib/quantic_web/components/layouts.ex @@ -31,6 +31,10 @@ defmodule QuanticWeb.Layouts do default: nil, doc: "the current [scope](https://hexdocs.pm/phoenix/scopes.html)" + attr :socket, :map, + default: nil, + doc: "the LiveView socket — pass it on authenticated pages to mount the AI chat widget" + slot :inner_block, required: true def app(assigns) do @@ -188,6 +192,13 @@ defmodule QuanticWeb.Layouts do <.app_footer /> + <%!-- Always-present AI chat: a sticky nested LiveView, so the + conversation survives navigation between authenticated pages. + Only mounted when a socket is passed (authenticated pages). --%> + <%= if @current_scope && @current_scope.user && @socket do %> + {live_render(@socket, QuanticWeb.AskLive, id: "ask-widget", sticky: true)} + <% end %> + <.flash_group flash={@flash} /> """ end diff --git a/lib/quantic_web/live/ask_live.ex b/lib/quantic_web/live/ask_live.ex new file mode 100644 index 0000000..3eadcf5 --- /dev/null +++ b/lib/quantic_web/live/ask_live.ex @@ -0,0 +1,438 @@ +defmodule QuanticWeb.AskLive do + @moduledoc """ + The always-present AI chat widget (Step 7 follow-up): a floating + panel, mounted once in `Layouts.app` as a **sticky** nested LiveView + so its conversation survives `live_navigate` between the authenticated + pages (portfolio → radar → dividends → …). + + It reuses the native chat engine end to end — `Quantic.AI.chat_as/3` + (quota + provider tool loop) over `Quantic.AI.PortfolioTools`, the + same seven scoped tools the Telegram bot uses. No new AI + infrastructure; this is a second front door onto the existing one. + + Conversation state is kept twice on purpose: `:history` is the plain + message list handed to the provider (streams aren't enumerable), and + `:messages` is the render-only stream. + """ + + use QuanticWeb, :live_view + + import QuanticWeb.AIComponents, only: [ai_mark: 1] + + alias Quantic.AI + alias Quantic.AI.ChatResult + alias Quantic.AI.PortfolioTools + + on_mount {QuanticWeb.UserAuth, :mount_current_scope} + on_mount QuanticWeb.Locale + + @impl true + def mount(_params, _session, socket) do + scope = socket.assigns[:current_scope] + + if connected?(socket) && scope do + Phoenix.PubSub.subscribe(Quantic.PubSub, "ask_context:#{scope.user.id}") + end + + {:ok, + socket + |> stream_configure(:messages, dom_id: &"msg-#{&1.id}") + |> stream(:messages, []) + |> assign( + history: [], + conversation_empty: true, + open: false, + thinking: false, + error: nil, + current_page: nil, + quota: quota_for(scope), + form: to_form(%{"text" => ""}, as: :chat) + )} + end + + @impl true + def handle_event("toggle", _params, socket) do + # Refresh the quota each time the panel opens — another tab (or the + # Telegram bot) may have spent it since mount. + open? = not socket.assigns.open + quota = if open?, do: quota_for(socket.assigns[:current_scope]), else: socket.assigns.quota + {:noreply, socket |> assign(open: open?, quota: quota) |> persist()} + end + + # Rehydrate from the browser on (re)mount: a refresh or a cross-session + # navigation gives us a fresh process, so replay the saved conversation + # and open state. Roles are mapped explicitly (never String.to_atom on + # client input). + def handle_event("restore", %{"history" => history} = payload, socket) do + restored = + for %{"role" => role, "text" => text} <- history, + role in ["user", "assistant"], + is_binary(text) do + %{role: String.to_existing_atom(role), text: text} + end + + socket = + Enum.reduce(restored, socket, fn msg, acc -> + stream_insert(acc, :messages, %{id: next_id(), role: msg.role, text: msg.text}) + end) + + {:noreply, + socket + |> assign( + history: restored, + conversation_empty: restored == [], + open: payload["open"] == true + )} + end + + def handle_event("restore", _payload, socket), do: {:noreply, socket} + + def handle_event("ask-example", %{"text" => text}, socket) do + # Example-prompt buttons in the empty state reuse the send path. + handle_event("send", %{"chat" => %{"text" => text}}, socket) + end + + def handle_event("send", %{"chat" => %{"text" => text}}, socket) do + text = String.trim(text) + scope = socket.assigns[:current_scope] + + cond do + text == "" or socket.assigns.thinking -> + {:noreply, socket} + + is_nil(scope) -> + {:noreply, socket} + + socket.assigns.quota.remaining <= 0 -> + {:noreply, assign(socket, error: :rate_limited, open: true)} + + true -> + # The async closure needs the new user turn included; append it + # to the LLM history *before* spawning the call. + history = socket.assigns.history ++ [%{role: :user, text: text}] + page = socket.assigns.current_page + + {:noreply, + socket + |> assign( + history: history, + conversation_empty: false, + thinking: true, + error: nil, + open: true + ) + |> assign(:form, to_form(%{"text" => ""}, as: :chat)) + |> stream_insert(:messages, %{id: next_id(), role: :user, text: text}) + |> persist() + |> start_async(:chat, chat_task(scope, history, page))} + end + end + + @impl true + def handle_async(:chat, {:ok, {:ok, %ChatResult{text: text}}}, socket) when text != "" do + {:noreply, + socket + |> assign(:history, socket.assigns.history ++ [%{role: :assistant, text: text}]) + |> assign(thinking: false, quota: quota_for(socket.assigns[:current_scope])) + |> stream_insert(:messages, %{id: next_id(), role: :assistant, text: text}) + |> persist()} + end + + def handle_async(:chat, {:ok, {:error, {:rate_limited, quota}}}, socket) do + {:noreply, assign(socket, thinking: false, error: :rate_limited, quota: quota)} + end + + # Empty reply or any provider error/crash → the generic failure notice. + def handle_async(:chat, {:ok, _other}, socket) do + {:noreply, assign(socket, thinking: false, error: :failed)} + end + + def handle_async(:chat, {:exit, _reason}, socket) do + {:noreply, assign(socket, thinking: false, error: :failed)} + end + + # Pushed by `QuanticWeb.AskContext` on every navigation within the + # authenticated session, so the widget knows which page is on screen. + @impl true + def handle_info({:current_page, label}, socket) do + {:noreply, assign(socket, :current_page, label)} + end + + @impl true + def render(assigns) do + ~H""" +
+ +
+
+
+ <.ai_mark /> + {gettext("Ask Quantic")} + + {gettext("on %{page}", page: @current_page)} + +
+ + {gettext("%{remaining}/%{limit} left", remaining: @quota.remaining, limit: @quota.limit)} + +
+ +
+ + +
+
+ {msg.text} +
+
+
+ +
+ {gettext("Thinking…")} +
+

+ {gettext("You've used today's %{limit} AI requests — your quota resets at midnight UTC.", + limit: @quota.limit + )} +

+

+ {gettext("Something went wrong — please try again.")} +

+ + <.form + for={@form} + id="ask-form" + phx-submit="send" + class="flex items-center gap-2 border-t border-base-200 p-3" + > + + + + +

+ {gettext("Informational only — not financial advice.")} +

+
+ + +
+ """ + end + + ## Helpers + + # Push the conversation + open state to the browser hook, which mirrors + # it into localStorage so a refresh or cross-session navigation can + # restore it. Capped to the most recent turns to keep the payload small. + defp persist(socket) do + history = + socket.assigns.history + |> Enum.take(-50) + |> Enum.map(&%{role: to_string(&1.role), text: &1.text}) + + push_event(socket, "ask:persist", %{history: history, open: socket.assigns.open}) + end + + # Demo accounts are ephemeral showcase users — they should see and play + # with the chat, but must NEVER trigger a paid provider call. They get a + # canned reply (no quota spent, no money), real accounts get the live + # tool-driven answer. + defp chat_task(%{user: %{demo: true}}, _history, _page) do + fn -> {:ok, %ChatResult{text: demo_reply()}} end + end + + defp chat_task(scope, history, page) do + fn -> + AI.chat_as(scope, history, + feature: "portfolio_chat", + tools: PortfolioTools.all_for(scope), + system: system_prompt(page), + locale: scope.user.locale + ) + end + end + + defp demo_reply do + gettext( + "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" + ) + end + + defp next_id, do: System.unique_integer([:positive]) |> Integer.to_string() + + defp quota_for(nil), + do: %{allowed: false, remaining: 0, limit: AI.daily_limit(), resets_at: nil} + + defp quota_for(scope), do: AI.quota(scope) + + defp examples do + [ + gettext("What's my biggest holding?"), + gettext("What do you think of KO?"), + gettext("Which stocks are below my target?"), + gettext("Dividends this month?") + ] + end + + # The web chat's system prompt. It is a dividend-investing *analyst* + # (same lens as the per-stock AI summary in `Quantic.AI.Insights`), not + # a passive tool-runner — so "what do you think of X?" gets a real + # assessment instead of a refusal. Web-plain formatting (not Telegram + # HTML); same non-negotiable privacy contract. + defp system_prompt(page) do + """ + You are Quantic's dividend-investing analyst, embedded in the Quantic web app. The user is signed in, so you can answer questions about their personal radar (watchlist), holdings (portfolio), and dividends — and assess individual stocks for dividend investing. + + ## What you can answer (default to trying first, never decline preemptively) + + Use the provided tools. Most natural-language questions map cleanly: + - "show my radar" / "what's on my watchlist" → get_radar + - "show my portfolio" / "what am I holding" → get_holdings + - "which of my stocks are below my target price?" → get_radar, filter by status="below_target" + - "near 52-week low?" → get_holdings/get_radar, compare price to fifty_two_week_low + - "what dividends did I get this month?" → get_dividend_summary period:"this_month" + - "last few dividend payments" → get_recent_dividends + - "any ex-divs this week?" → get_upcoming_ex_divs days:7 + - "income next month?" → get_dividend_calendar month_offset:1 + - "what's the price of MSFT?" / "what do you think of MSFT?" / "how does KO look for dividends?" → get_stock, then describe the data + + ## Describing a stock — give information, NEVER a recommendation + + When asked about a specific stock ("what do you think of X", "how does X look", "overview of X"), call get_stock and describe how it looks on dividend-investing criteria — as information for the user to weigh, not as advice: + - Summarise the relevant data: dividend yield, payout ratio (and whether it looks comfortable or stretched), P/E (valuation context), price vs its 200-day average (trend), and where the price sits in its 52-week range. + - State strengths and risks factually ("a ~90% payout ratio leaves little cushion if earnings dip"), not as a suggestion. + - If the stock is on the user's radar, you may note how the price compares to THEIR target (the price they chose to act at). + - get_stock works for any ticker, not only owned/watched ones. + + Hard rules: do NOT tell the user to buy, sell, hold, or avoid; do NOT rate a stock or call it a "good"/"bad" buy; do NOT claim it suits their situation. Present the facts and trade-offs and let them decide. If asked "should I buy X?", explain the factors a dividend investor would weigh and note that this is general information, not personalised financial advice. + + ## When to decline + + Decline what is genuinely out of scope: short-term price predictions or market timing, breaking news, and tax or legal advice. Say so in one line and offer something you can do instead. + + ## Privacy — non-negotiable + + You ONLY have access to the currently signed-in user's own data. There are no tools to look up other users, accounts, emails or portfolios. If asked about another person, politely say you can only see their own data. Never invent figures — if a tool returns no value for a field, say it's unavailable. + #{page_hint(page)} + ## Reply formatting + + Reply in plain text — no Markdown, no HTML, no tables. Use short paragraphs or simple "•" bullet lines. Escape nothing; the client renders plain text. Keep currency symbols with amounts ("$48.50 net"). + + ## Reply style + + Short. Lead with the answer (for a stock, lead with the headline figure or the key trade-off — never a verdict). No "Sure!" prefaces. Reply in the user's language. + """ + end + + defp page_hint(nil), do: "" + + defp page_hint(page), + do: + "\nThe user is currently viewing the #{page} page — when a question is ambiguous, bias toward that.\n" +end diff --git a/lib/quantic_web/live/buy_plan_live.ex b/lib/quantic_web/live/buy_plan_live.ex index e52667e..76df7a9 100644 --- a/lib/quantic_web/live/buy_plan_live.ex +++ b/lib/quantic_web/live/buy_plan_live.ex @@ -228,7 +228,7 @@ defmodule QuanticWeb.BuyPlanLive do @impl true def render(assigns) do ~H""" - +

{gettext("Buy plan")}

diff --git a/lib/quantic_web/live/community_dashboard_live.ex b/lib/quantic_web/live/community_dashboard_live.ex index e75e8f4..294f968 100644 --- a/lib/quantic_web/live/community_dashboard_live.ex +++ b/lib/quantic_web/live/community_dashboard_live.ex @@ -46,7 +46,7 @@ defmodule QuanticWeb.CommunityDashboardLive do @impl true def render(assigns) do ~H""" - +

<%!-- Hero with a pinging "live" indicator (← pulse). --%>
diff --git a/lib/quantic_web/live/dividends_live.ex b/lib/quantic_web/live/dividends_live.ex index 52b8506..f6e1826 100644 --- a/lib/quantic_web/live/dividends_live.ex +++ b/lib/quantic_web/live/dividends_live.ex @@ -316,7 +316,7 @@ defmodule QuanticWeb.DividendsLive do @impl true def render(assigns) do ~H""" - +
diff --git a/lib/quantic_web/live/faq_live.ex b/lib/quantic_web/live/faq_live.ex index ebd2449..2152277 100644 --- a/lib/quantic_web/live/faq_live.ex +++ b/lib/quantic_web/live/faq_live.ex @@ -23,7 +23,7 @@ defmodule QuanticWeb.FaqLive do @impl true def render(assigns) do ~H""" - +

{@chrome.title}

{@chrome.subtitle}

diff --git a/lib/quantic_web/live/home_live.ex b/lib/quantic_web/live/home_live.ex index 7dfd68e..332a558 100644 --- a/lib/quantic_web/live/home_live.ex +++ b/lib/quantic_web/live/home_live.ex @@ -58,6 +58,7 @@ defmodule QuanticWeb.HomeLive do <.community_strip stocks={@stats.most_held_stocks} framing={:discover} /> <.how_it_works /> <.freedom_showcase /> + <.ask_showcase /> <.community_banner /> <.telegram_banner variant={:anon} /> <.top_rated_showcase stocks={@stats.top_rated_stocks} /> @@ -71,7 +72,7 @@ defmodule QuanticWeb.HomeLive do def render(assigns) do ~H""" - +
<.greeting name={@display_name} diff --git a/lib/quantic_web/live/path_to_freedom_live.ex b/lib/quantic_web/live/path_to_freedom_live.ex index 0e2f3c5..28006ed 100644 --- a/lib/quantic_web/live/path_to_freedom_live.ex +++ b/lib/quantic_web/live/path_to_freedom_live.ex @@ -86,7 +86,7 @@ defmodule QuanticWeb.PathToFreedomLive do @impl true def render(assigns) do ~H""" - +

{gettext("Path to Freedom")}

diff --git a/lib/quantic_web/live/portfolio_live.ex b/lib/quantic_web/live/portfolio_live.ex index 91f303d..9fa31c8 100644 --- a/lib/quantic_web/live/portfolio_live.ex +++ b/lib/quantic_web/live/portfolio_live.ex @@ -256,7 +256,7 @@ defmodule QuanticWeb.PortfolioLive do @impl true def render(assigns) do ~H""" - +

{gettext("Portfolio")}

diff --git a/lib/quantic_web/live/public_portfolio_live.ex b/lib/quantic_web/live/public_portfolio_live.ex index e2ae211..920b039 100644 --- a/lib/quantic_web/live/public_portfolio_live.ex +++ b/lib/quantic_web/live/public_portfolio_live.ex @@ -78,7 +78,7 @@ defmodule QuanticWeb.PublicPortfolioLive do @impl true def render(assigns) do ~H""" - +
<.icon name="hero-briefcase" class="size-16 mx-auto text-base-content/20 mb-4" /> diff --git a/lib/quantic_web/live/public_radar_live.ex b/lib/quantic_web/live/public_radar_live.ex index 551ff64..c7e4ad7 100644 --- a/lib/quantic_web/live/public_radar_live.ex +++ b/lib/quantic_web/live/public_radar_live.ex @@ -56,7 +56,7 @@ defmodule QuanticWeb.PublicRadarLive do @impl true def render(assigns) do ~H""" - +
<.icon name="hero-eye" class="size-16 mx-auto text-base-content/20 mb-4" /> diff --git a/lib/quantic_web/live/settings_live.ex b/lib/quantic_web/live/settings_live.ex index 92094a8..547ebed 100644 --- a/lib/quantic_web/live/settings_live.ex +++ b/lib/quantic_web/live/settings_live.ex @@ -152,7 +152,7 @@ defmodule QuanticWeb.SettingsLive do @impl true def render(assigns) do ~H""" - +

{gettext("Settings")}

diff --git a/lib/quantic_web/router.ex b/lib/quantic_web/router.ex index eed6a20..098af0f 100644 --- a/lib/quantic_web/router.ex +++ b/lib/quantic_web/router.ex @@ -50,7 +50,11 @@ defmodule QuanticWeb.Router do end live_session :authenticated, - on_mount: [{QuanticWeb.UserAuth, :ensure_authenticated}, QuanticWeb.Locale] do + on_mount: [ + {QuanticWeb.UserAuth, :ensure_authenticated}, + QuanticWeb.Locale, + QuanticWeb.AskContext + ] do live "/portfolio", PortfolioLive, :index live "/radar", RadarLive, :index live "/buy-plan", BuyPlanLive, :index diff --git a/priv/gettext/ca/LC_MESSAGES/default.po b/priv/gettext/ca/LC_MESSAGES/default.po index 77af96c..29c40a0 100644 --- a/priv/gettext/ca/LC_MESSAGES/default.po +++ b/priv/gettext/ca/LC_MESSAGES/default.po @@ -17,22 +17,23 @@ msgstr "" msgid "Actions" msgstr "Opcions" -#: lib/quantic_web/components/layouts.ex:455 -#: lib/quantic_web/components/layouts.ex:467 +#: lib/quantic_web/components/layouts.ex:466 +#: lib/quantic_web/components/layouts.ex:478 #, elixir-autogen, elixir-format msgid "Attempting to reconnect" msgstr "Intentant reconnectar" -#: lib/quantic_web/components/layouts.ex:65 -#: lib/quantic_web/components/layouts.ex:272 +#: lib/quantic_web/ask_context.ex:39 +#: lib/quantic_web/components/layouts.ex:69 +#: lib/quantic_web/components/layouts.ex:283 #: lib/quantic_web/live/buy_plan_live.ex:26 #: lib/quantic_web/live/buy_plan_live.ex:233 #, elixir-autogen, elixir-format msgid "Buy plan" msgstr "Pla de compra" -#: lib/quantic_web/components/layouts.ex:81 -#: lib/quantic_web/components/layouts.ex:303 +#: lib/quantic_web/components/layouts.ex:85 +#: lib/quantic_web/components/layouts.ex:314 #: lib/quantic_web/live/admin_dashboard_live.ex:211 #: lib/quantic_web/live/community_dashboard_live.ex:27 #: lib/quantic_web/live/community_dashboard_live.ex:65 @@ -40,8 +41,9 @@ msgstr "Pla de compra" msgid "Community" msgstr "Comunitat" -#: lib/quantic_web/components/layouts.ex:70 -#: lib/quantic_web/components/layouts.ex:282 +#: lib/quantic_web/ask_context.ex:41 +#: lib/quantic_web/components/layouts.ex:74 +#: lib/quantic_web/components/layouts.ex:293 #: lib/quantic_web/components/stock_card_components.ex:589 #: lib/quantic_web/components/stock_card_components.ex:806 #: lib/quantic_web/components/stock_card_components.ex:1267 @@ -52,36 +54,38 @@ msgstr "Comunitat" msgid "Dividends" msgstr "Dividends" -#: lib/quantic_web/components/layouts.ex:75 -#: lib/quantic_web/components/layouts.ex:292 +#: lib/quantic_web/components/layouts.ex:79 +#: lib/quantic_web/components/layouts.ex:303 #, elixir-autogen, elixir-format msgid "Freedom" msgstr "Llibertat" -#: lib/quantic_web/components/layouts.ex:55 -#: lib/quantic_web/components/layouts.ex:252 +#: lib/quantic_web/ask_context.ex:37 +#: lib/quantic_web/components/layouts.ex:59 +#: lib/quantic_web/components/layouts.ex:263 #: lib/quantic_web/live/path_to_freedom_live.ex:300 #: lib/quantic_web/live/portfolio_live.ex:262 #, elixir-autogen, elixir-format msgid "Portfolio" msgstr "Cartera" -#: lib/quantic_web/components/home_components.ex:879 -#: lib/quantic_web/components/layouts.ex:60 -#: lib/quantic_web/components/layouts.ex:262 +#: lib/quantic_web/ask_context.ex:38 +#: lib/quantic_web/components/home_components.ex:915 +#: lib/quantic_web/components/layouts.ex:64 +#: lib/quantic_web/components/layouts.ex:273 #: lib/quantic_web/live/admin_dashboard_live.ex:362 #: lib/quantic_web/live/public_radar_live.ex:105 -#: lib/quantic_web/live/radar_live.ex:254 +#: lib/quantic_web/live/radar_live.ex:269 #, elixir-autogen, elixir-format msgid "Radar" msgstr "Radar" -#: lib/quantic_web/components/layouts.ex:462 +#: lib/quantic_web/components/layouts.ex:473 #, elixir-autogen, elixir-format msgid "Something went wrong!" msgstr "Alguna cosa ha anat malament!" -#: lib/quantic_web/components/layouts.ex:450 +#: lib/quantic_web/components/layouts.ex:461 #, elixir-autogen, elixir-format msgid "We can't find the internet" msgstr "No trobem internet" @@ -91,7 +95,7 @@ msgstr "No trobem internet" msgid "close" msgstr "tancar" -#: lib/quantic_web/components/home_components.ex:565 +#: lib/quantic_web/components/home_components.ex:601 #: lib/quantic_web/live/public_portfolio_live.ex:123 #, elixir-autogen, elixir-format msgid "%{count} holding" @@ -182,12 +186,12 @@ msgstr "Afegeix primer posicions o accions al radar — apareixeran aquí, orden msgid "Add to portfolio" msgstr "Afegir a la cartera" -#: lib/quantic_web/live/radar_live.ex:294 +#: lib/quantic_web/live/radar_live.ex:289 #, elixir-autogen, elixir-format msgid "Add to radar" msgstr "Afegir al radar" -#: lib/quantic_web/live/radar_live.ex:75 +#: lib/quantic_web/live/radar_live.ex:80 #, elixir-autogen, elixir-format msgid "Added %{symbol} to your radar." msgstr "Hem afegit %{symbol} al teu radar." @@ -313,7 +317,7 @@ msgstr "Sectors de la comunitat" msgid "Community sharing" msgstr "Compartir amb la comunitat" -#: lib/quantic_web/components/home_components.ex:331 +#: lib/quantic_web/components/home_components.ex:367 #: lib/quantic_web/live/community_dashboard_live.ex:101 #, elixir-autogen, elixir-format msgid "Community value" @@ -435,7 +439,7 @@ msgstr "Ha fallat" msgid "Fill price" msgstr "Preu d'execució" -#: lib/quantic_web/components/home_components.ex:752 +#: lib/quantic_web/components/home_components.ex:788 #: lib/quantic_web/live/path_to_freedom_live.ex:346 #, elixir-autogen, elixir-format msgid "Freedom in" @@ -446,7 +450,7 @@ msgstr "Llibertat en" msgid "Full history" msgstr "Històric complet" -#: lib/quantic_web/components/home_components.ex:656 +#: lib/quantic_web/components/home_components.ex:692 #, elixir-autogen, elixir-format msgid "Go to portfolio" msgstr "Vés a la cartera" @@ -528,13 +532,13 @@ msgstr "Tipus d'interès %" msgid "It expires in 15 minutes." msgstr "Caduca en 15 minuts." -#: lib/quantic_web/components/layouts.ex:91 +#: lib/quantic_web/components/layouts.ex:95 #: lib/quantic_web/live/settings_live.ex:174 #, elixir-autogen, elixir-format msgid "Language" msgstr "Idioma" -#: lib/quantic_web/components/home_components.ex:698 +#: lib/quantic_web/components/home_components.ex:734 #: lib/quantic_web/live/dividends_live.ex:356 #, elixir-autogen, elixir-format msgid "Last 12 months" @@ -542,7 +546,7 @@ msgstr "Últims 12 mesos" #: lib/quantic_web/live/dividends_live.ex:80 #: lib/quantic_web/live/portfolio_live.ex:105 -#: lib/quantic_web/live/radar_live.ex:86 +#: lib/quantic_web/live/radar_live.ex:91 #, elixir-autogen, elixir-format msgid "Market-data provider is unreachable right now. Please try again." msgstr "El proveïdor de dades de mercat no respon ara mateix. Torna-ho a provar." @@ -621,8 +625,9 @@ msgstr "Objectiu" msgid "Other capital (bonds, savings, index funds)" msgstr "Altre capital (bons, estalvi, fons indexats)" +#: lib/quantic_web/ask_context.ex:40 #: lib/quantic_web/components/home_components.ex:245 -#: lib/quantic_web/components/home_components.ex:745 +#: lib/quantic_web/components/home_components.ex:781 #: lib/quantic_web/live/path_to_freedom_live.ex:24 #: lib/quantic_web/live/path_to_freedom_live.ex:91 #, elixir-autogen, elixir-format @@ -661,7 +666,7 @@ msgstr "No s'ha trobat la cartera" msgid "Portfolio value" msgstr "Valor de la cartera" -#: lib/quantic_web/components/home_components.ex:337 +#: lib/quantic_web/components/home_components.ex:373 #: lib/quantic_web/live/admin_dashboard_live.ex:151 #: lib/quantic_web/live/community_dashboard_live.ex:74 #: lib/quantic_web/live/community_dashboard_live.ex:81 @@ -784,7 +789,7 @@ msgstr "Vols eliminar aquesta posició?" msgid "Remove this stock from your radar?" msgstr "Vols treure aquesta acció del teu radar?" -#: lib/quantic_web/live/radar_live.ex:196 +#: lib/quantic_web/live/radar_live.ex:212 #, elixir-autogen, elixir-format msgid "Removed %{symbol} from your radar." msgstr "Hem tret %{symbol} del teu radar." @@ -822,14 +827,15 @@ msgstr "Desar compartició" msgid "Saved!" msgstr "Desat!" -#: lib/quantic_web/components/home_components.ex:622 +#: lib/quantic_web/components/home_components.ex:658 #: lib/quantic_web/live/portfolio_live.ex:440 #: lib/quantic_web/live/public_portfolio_live.ex:166 #, elixir-autogen, elixir-format msgid "Sectors" msgstr "Sectors" -#: lib/quantic_web/components/layouts.ex:340 +#: lib/quantic_web/ask_context.ex:42 +#: lib/quantic_web/components/layouts.ex:351 #: lib/quantic_web/live/community_dashboard_live.ex:372 #: lib/quantic_web/live/settings_live.ex:157 #, elixir-autogen, elixir-format @@ -922,6 +928,7 @@ msgstr "Accions seguides" #: lib/quantic_web/components/stock_card_components.ex:924 #: lib/quantic_web/live/dividends_live.ex:396 #: lib/quantic_web/live/portfolio_live.ex:565 +#: lib/quantic_web/live/radar_live.ex:502 #, elixir-autogen, elixir-format msgid "Symbol" msgstr "Símbol" @@ -996,7 +1003,7 @@ msgid "Underweight position" msgstr "Posició infraponderada" #: lib/quantic_web/live/portfolio_live.ex:188 -#: lib/quantic_web/live/radar_live.ex:138 +#: lib/quantic_web/live/radar_live.ex:154 #, elixir-autogen, elixir-format msgid "Updated %{symbol}." msgstr "Hem actualitzat %{symbol}." @@ -1013,7 +1020,7 @@ msgstr "Veure radar" #: lib/quantic_web/live/dividends_live.ex:73 #: lib/quantic_web/live/portfolio_live.ex:98 -#: lib/quantic_web/live/radar_live.ex:79 +#: lib/quantic_web/live/radar_live.ex:84 #, elixir-autogen, elixir-format msgid "We couldn't find that symbol on the market." msgstr "No hem trobat aquest símbol al mercat." @@ -1114,18 +1121,18 @@ msgstr "el que la cartera paga avui, abans de noves aportacions" msgid "← Back to home" msgstr "← Tornar a l'inici" -#: lib/quantic_web/components/layouts.ex:180 +#: lib/quantic_web/components/layouts.ex:184 #, elixir-autogen, elixir-format msgid "Sign up to start your own" msgstr "Registra't per crear la teva" -#: lib/quantic_web/components/layouts.ex:176 +#: lib/quantic_web/components/layouts.ex:180 #, elixir-autogen, elixir-format msgid "You're exploring a demo portfolio — changes are yours to play with and expire in 24h." msgstr "Estàs explorant una cartera de demostració — els canvis són teus per experimentar i caduquen en 24h." #: lib/quantic_web/live/portfolio_live.ex:369 -#: lib/quantic_web/live/radar_live.ex:270 +#: lib/quantic_web/live/radar_live.ex:303 #, elixir-autogen, elixir-format msgid "AI insights" msgstr "Anàlisi amb IA" @@ -1149,42 +1156,22 @@ msgstr "Resum IA" msgid "Analyzing your stocks…" msgstr "Analitzant les teves accions…" -#: lib/quantic_web/components/ai_components.ex:179 -#, elixir-autogen, elixir-format -msgid "Avoid" -msgstr "Evitar" - -#: lib/quantic_web/components/ai_components.ex:176 -#, elixir-autogen, elixir-format -msgid "Buy" -msgstr "Comprar" - #: lib/quantic_web/components/ai_components.ex:86 #, elixir-autogen, elixir-format msgid "Buying opportunities" msgstr "Oportunitats de compra" -#: lib/quantic_web/components/ai_components.ex:178 -#, elixir-autogen, elixir-format -msgid "Caution" -msgstr "Precaució" - #: lib/quantic_web/components/ai_components.ex:104 #, elixir-autogen, elixir-format msgid "Dividend coverage" msgstr "Cobertura de dividends" -#: lib/quantic_web/components/ai_components.ex:177 -#, elixir-autogen, elixir-format -msgid "Hold" -msgstr "Mantenir" - #: lib/quantic_web/live/portfolio_live.ex:393 #, elixir-autogen, elixir-format msgid "Portfolio AI insights" msgstr "Anàlisi IA de la cartera" -#: lib/quantic_web/live/radar_live.ex:300 +#: lib/quantic_web/live/radar_live.ex:320 #, elixir-autogen, elixir-format msgid "Radar AI insights" msgstr "Anàlisi IA del radar" @@ -1199,12 +1186,8 @@ msgstr "Senyals de risc" msgid "Strengths" msgstr "Punts forts" -#: lib/quantic_web/components/ai_components.ex:175 -#, elixir-autogen, elixir-format -msgid "Strong buy" -msgstr "Compra forta" - -#: lib/quantic_web/components/ai_components.ex:162 +#: lib/quantic_web/components/ai_components.ex:157 +#: lib/quantic_web/live/ask_live.ex:259 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — your quota resets at midnight UTC." msgstr "Has fet servir les %{limit} consultes d'IA d'avui — el teu límit es restableix a mitjanit UTC." @@ -1219,7 +1202,7 @@ msgstr "Pregunta'm coses com:\n• què hi ha al meu radar?\n• dividends aques msgid "Ask the bot about your portfolio, radar and dividends." msgstr "Pregunta al bot per la teva cartera, radar i dividends." -#: lib/quantic_web/components/home_components.ex:408 +#: lib/quantic_web/components/home_components.ex:444 #: lib/quantic_web/live/settings_live.ex:307 #, elixir-autogen, elixir-format msgid "Connect Telegram" @@ -1293,7 +1276,8 @@ msgid "Refresh status" msgstr "Actualitzar estat" #: lib/quantic/telegram/handler.ex:79 -#: lib/quantic/telegram/handler.ex:201 +#: lib/quantic/telegram/handler.ex:204 +#: lib/quantic_web/live/ask_live.ex:264 #, elixir-autogen, elixir-format msgid "Something went wrong — please try again." msgstr "Alguna cosa ha anat malament — torna-ho a provar." @@ -1323,7 +1307,7 @@ msgstr "Ordre desconeguda — prova /help." msgid "Use /notifications on|off to change." msgstr "Fes servir /notifications on|off per canviar-ho." -#: lib/quantic/telegram/handler.ex:195 +#: lib/quantic/telegram/handler.ex:198 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — quota resets at midnight UTC." msgstr "Has fet servir les %{limit} consultes d'IA d'avui — el límit es restableix a mitjanit UTC." @@ -1368,38 +1352,38 @@ msgstr "• %{symbol} va pagar %{amount} %{currency} nets" msgid "📊 Your Quantic daily digest" msgstr "📊 El teu resum diari de Quantic" -#: lib/quantic_web/components/layouts.ex:408 +#: lib/quantic_web/components/layouts.ex:419 #, elixir-autogen, elixir-format msgid "Built with Elixir, Phoenix LiveView, and Tailwind CSS" msgstr "Fet amb Elixir, Phoenix LiveView i Tailwind CSS" -#: lib/quantic_web/components/layouts.ex:227 +#: lib/quantic_web/components/layouts.ex:238 #, elixir-autogen, elixir-format msgid "Close menu" msgstr "Tancar el menú" -#: lib/quantic_web/components/layouts.ex:313 +#: lib/quantic_web/components/layouts.ex:324 #, elixir-autogen, elixir-format msgid "FAQ" msgstr "FAQ" -#: lib/quantic_web/components/layouts.ex:421 +#: lib/quantic_web/components/layouts.ex:432 #, elixir-autogen, elixir-format msgid "Frequently Asked Questions" msgstr "Preguntes freqüents" -#: lib/quantic_web/components/layouts.ex:241 +#: lib/quantic_web/components/layouts.ex:252 #, elixir-autogen, elixir-format msgid "Home" msgstr "Inici" -#: lib/quantic_web/components/layouts.ex:158 -#: lib/quantic_web/components/layouts.ex:223 +#: lib/quantic_web/components/layouts.ex:162 +#: lib/quantic_web/components/layouts.ex:234 #, elixir-autogen, elixir-format msgid "Menu" msgstr "Menú" -#: lib/quantic_web/components/layouts.ex:218 +#: lib/quantic_web/components/layouts.ex:229 #, elixir-autogen, elixir-format msgid "Navigation menu" msgstr "Menú de navegació" @@ -1409,42 +1393,42 @@ msgstr "Menú de navegació" msgid "New here? Signing in creates your account automatically." msgstr "Ets nou aquí? En iniciar sessió, el teu compte es crea automàticament." -#: lib/quantic_web/components/layouts.ex:149 -#: lib/quantic_web/components/layouts.ex:355 +#: lib/quantic_web/components/layouts.ex:153 +#: lib/quantic_web/components/layouts.ex:366 #, elixir-autogen, elixir-format msgid "Sign in" msgstr "Iniciar sessió" -#: lib/quantic_web/components/layouts.ex:345 +#: lib/quantic_web/components/layouts.ex:356 #, elixir-autogen, elixir-format msgid "Sign out" msgstr "Tancar sessió" -#: lib/quantic_web/components/layouts.ex:398 +#: lib/quantic_web/components/layouts.ex:409 #, elixir-autogen, elixir-format msgid "The information on Quantic is provided for informational and educational purposes only. It is general in nature, does not take into account your personal financial situation, and does not constitute investment, financial, tax, or legal advice — nor a recommendation to buy or sell any security. Investing involves risk, including possible loss of principal; past performance is not a reliable indicator of future results. Market data comes from third-party providers and may be delayed or inaccurate. Before making any investment decision, consider your objectives, time horizon, risk tolerance, and diversification, and consult a qualified financial professional. Quantic is not a registered investment adviser or broker-dealer." msgstr "La informació de Quantic es proporciona únicament amb finalitats informatives i educatives. És de caràcter general, no té en compte la teva situació financera personal i no constitueix assessorament d'inversió, financer, fiscal o legal — ni una recomanació per comprar o vendre cap valor. Invertir comporta riscos, inclosa la possible pèrdua del capital; els resultats passats no són un indicador fiable dels resultats futurs. Les dades de mercat provenen de proveïdors tercers i poden estar endarrerides o ser inexactes. Abans de prendre qualsevol decisió d'inversió, considera els teus objectius, l'horitzó temporal, la tolerància al risc i la diversificació, i consulta un professional financer qualificat. Quantic no és un assessor d'inversions registrat ni un corredor de borsa." -#: lib/quantic_web/components/home_components.ex:397 +#: lib/quantic_web/components/home_components.ex:433 #, elixir-autogen, elixir-format msgid "\"what dividends did I get this month?\" · \"show my radar\" · \"any ex-divs this week?\"" msgstr "\"quins dividends he cobrat aquest mes?\" · \"mostra el meu radar\" · \"cap ex-div aquesta setmana?\"" -#: lib/quantic_web/components/home_components.ex:568 +#: lib/quantic_web/components/home_components.ex:604 #, elixir-autogen, elixir-format msgid "%{count} on radar" msgid_plural "%{count} on radar" msgstr[0] "%{count} al radar" msgstr[1] "%{count} al radar" -#: lib/quantic_web/components/home_components.ex:721 +#: lib/quantic_web/components/home_components.ex:757 #, elixir-autogen, elixir-format msgid "+ %{count} more currency" msgid_plural "+ %{count} more currencies" msgstr[0] "+ %{count} moneda més" msgstr[1] "+ %{count} monedes més" -#: lib/quantic_web/components/home_components.ex:289 +#: lib/quantic_web/components/home_components.ex:325 #, elixir-autogen, elixir-format msgid "A live community of dividend investors. Browse what others hold, what they target, and how they structure their portfolios." msgstr "Una comunitat en directe d'inversors en dividends. Explora què tenen els altres, quins objectius es marquen i com estructuren les seves carteres." @@ -1459,12 +1443,12 @@ msgstr "Inversió en dividends potenciada amb IA. Crea la teva llista de seguime msgid "Add stocks with target prices. We track price, score, and ex-div dates." msgstr "Afegeix accions amb preus objectiu. Seguim el preu, la puntuació i les dates ex-dividend." -#: lib/quantic_web/components/home_components.ex:648 +#: lib/quantic_web/components/home_components.ex:684 #, elixir-autogen, elixir-format msgid "Add your first holding" msgstr "Afegeix la teva primera posició" -#: lib/quantic_web/components/home_components.ex:392 +#: lib/quantic_web/components/home_components.ex:428 #, elixir-autogen, elixir-format msgid "Ask your portfolio anything in natural language — ex-divs, totals, target prices — right from Telegram." msgstr "Pregunta el que vulguis a la teva cartera en llenguatge natural — ex-dividends, totals, preus objectiu — directament des de Telegram." @@ -1479,22 +1463,22 @@ msgstr "Construeix el teu radar" msgid "Create your plan" msgstr "Crea el teu pla" -#: lib/quantic_web/components/home_components.ex:616 +#: lib/quantic_web/components/home_components.ex:652 #, elixir-autogen, elixir-format msgid "Current yield" msgstr "Rendibilitat actual" -#: lib/quantic_web/components/home_components.ex:678 +#: lib/quantic_web/components/home_components.ex:714 #, elixir-autogen, elixir-format msgid "Dividend income" msgstr "Ingressos per dividends" -#: lib/quantic_web/components/home_components.ex:862 +#: lib/quantic_web/components/home_components.ex:898 #, elixir-autogen, elixir-format msgid "Ex-dividend dates in the next %{days} days" msgstr "Dates ex-dividend en els propers %{days} dies" -#: lib/quantic_web/components/home_components.ex:954 +#: lib/quantic_web/components/home_components.ex:990 #: lib/quantic_web/components/stock_card_components.ex:143 #: lib/quantic_web/live/buy_plan_live.ex:546 #, elixir-autogen, elixir-format @@ -1506,7 +1490,7 @@ msgstr "Acceptable" msgid "Free · No broker connection required · Open source" msgstr "Gratuït · Sense connexió amb el bròquer · Codi obert" -#: lib/quantic_web/components/home_components.ex:515 +#: lib/quantic_web/components/home_components.ex:551 #, elixir-autogen, elixir-format msgid "Free, no broker connection required. Try a sample portfolio or sign up to build your own." msgstr "Gratuït, sense connexió amb el bròquer. Prova una cartera d'exemple o registra't per crear la teva." @@ -1521,17 +1505,17 @@ msgstr "De la llista de seguiment als ingressos per dividends en 3 passos" msgid "Get AI insights" msgstr "Obtén anàlisi amb IA" -#: lib/quantic_web/components/home_components.ex:557 +#: lib/quantic_web/components/home_components.ex:593 #, elixir-autogen, elixir-format msgid "Good afternoon, %{name}" msgstr "Bona tarda, %{name}" -#: lib/quantic_web/components/home_components.ex:559 +#: lib/quantic_web/components/home_components.ex:595 #, elixir-autogen, elixir-format msgid "Good evening, %{name}" msgstr "Bon vespre, %{name}" -#: lib/quantic_web/components/home_components.ex:555 +#: lib/quantic_web/components/home_components.ex:591 #, elixir-autogen, elixir-format msgid "Good morning, %{name}" msgstr "Bon dia, %{name}" @@ -1546,32 +1530,32 @@ msgstr "En directe" msgid "Log holdings to get live yield, sector mix, and dividend forecast." msgstr "Registra les teves posicions per obtenir rendibilitat en directe, distribució per sectors i previsió de dividends." -#: lib/quantic_web/live/home_live.ex:120 +#: lib/quantic_web/live/home_live.ex:121 #, elixir-autogen, elixir-format msgid "Most Added to Radar" msgstr "Més afegides al radar" -#: lib/quantic_web/live/home_live.ex:125 +#: lib/quantic_web/live/home_live.ex:126 #, elixir-autogen, elixir-format msgid "Most Held in Portfolios" msgstr "Més presents a les carteres" -#: lib/quantic_web/components/home_components.ex:572 +#: lib/quantic_web/components/home_components.ex:608 #, elixir-autogen, elixir-format msgid "Next ex-div: %{symbol} in %{days}d" msgstr "Proper ex-div: %{symbol} en %{days}d" -#: lib/quantic_web/components/home_components.ex:480 +#: lib/quantic_web/components/home_components.ex:516 #, elixir-autogen, elixir-format msgid "No stocks found." msgstr "No s'han trobat accions." -#: lib/quantic_web/components/home_components.ex:577 +#: lib/quantic_web/components/home_components.ex:613 #, elixir-autogen, elixir-format msgid "No upcoming ex-div dates" msgstr "Cap data ex-dividend propera" -#: lib/quantic_web/components/home_components.ex:793 +#: lib/quantic_web/components/home_components.ex:829 #, elixir-autogen, elixir-format msgid "Open my plan" msgstr "Obrir el meu pla" @@ -1581,32 +1565,32 @@ msgstr "Obrir el meu pla" msgid "Plain-language analysis of your portfolio and radar — risks, gaps, opportunities." msgstr "Anàlisi en llenguatge planer de la teva cartera i el teu radar — riscos, mancances, oportunitats." -#: lib/quantic_web/components/home_components.ex:608 +#: lib/quantic_web/components/home_components.ex:644 #, elixir-autogen, elixir-format msgid "Portfolio stats" msgstr "Estadístiques de la cartera" -#: lib/quantic_web/components/home_components.ex:388 +#: lib/quantic_web/components/home_components.ex:424 #, elixir-autogen, elixir-format msgid "Quantic in Telegram" msgstr "Quantic a Telegram" -#: lib/quantic_web/live/home_live.ex:130 +#: lib/quantic_web/live/home_live.ex:131 #, elixir-autogen, elixir-format msgid "Recently Updated" msgstr "Actualitzats recentment" -#: lib/quantic_web/components/home_components.ex:298 +#: lib/quantic_web/components/home_components.ex:334 #, elixir-autogen, elixir-format msgid "See the community" msgstr "Explora la comunitat" -#: lib/quantic_web/components/home_components.ex:285 +#: lib/quantic_web/components/home_components.ex:321 #, elixir-autogen, elixir-format msgid "Share your portfolio with the community" msgstr "Comparteix la teva cartera amb la comunitat" -#: lib/quantic_web/components/home_components.ex:529 +#: lib/quantic_web/components/home_components.ex:565 #, elixir-autogen, elixir-format msgid "Sign up" msgstr "Registra't" @@ -1616,39 +1600,39 @@ msgstr "Registra't" msgid "Sign up free" msgstr "Registra't gratis" -#: lib/quantic_web/components/home_components.ex:410 +#: lib/quantic_web/components/home_components.ex:446 #, elixir-autogen, elixir-format msgid "Sign up to connect" msgstr "Registra't per connectar" -#: lib/quantic_web/components/home_components.ex:304 +#: lib/quantic_web/components/home_components.ex:340 #, elixir-autogen, elixir-format msgid "Sign up to share yours" msgstr "Registra't per compartir la teva" -#: lib/quantic_web/components/home_components.ex:512 +#: lib/quantic_web/components/home_components.ex:548 #, elixir-autogen, elixir-format msgid "Start your radar in 30 seconds" msgstr "Comença el teu radar en 30 segons" -#: lib/quantic_web/components/home_components.ex:953 +#: lib/quantic_web/components/home_components.ex:989 #: lib/quantic_web/components/stock_card_components.ex:142 #: lib/quantic_web/live/buy_plan_live.ex:545 #, elixir-autogen, elixir-format msgid "Strong" msgstr "Fort" -#: lib/quantic_web/components/home_components.ex:690 +#: lib/quantic_web/components/home_components.ex:726 #, elixir-autogen, elixir-format msgid "This month" msgstr "Aquest mes" -#: lib/quantic_web/components/home_components.ex:435 +#: lib/quantic_web/components/home_components.ex:471 #, elixir-autogen, elixir-format msgid "Top Dividend Scores" msgstr "Millors puntuacions de dividend" -#: lib/quantic_web/components/home_components.ex:650 +#: lib/quantic_web/components/home_components.ex:686 #, elixir-autogen, elixir-format msgid "Track real yield, dividend forecast, and sector mix. Takes a minute." msgstr "Controla rendibilitat real, previsió de dividends i distribució per sectors. Es fa en un minut." @@ -1673,17 +1657,17 @@ msgstr "Tendències a la comunitat" msgid "Try a sample portfolio" msgstr "Prova una cartera d'exemple" -#: lib/quantic_web/components/home_components.ex:526 +#: lib/quantic_web/components/home_components.ex:562 #, elixir-autogen, elixir-format msgid "Try the demo" msgstr "Prova la demo" -#: lib/quantic_web/components/home_components.ex:821 +#: lib/quantic_web/components/home_components.ex:857 #, elixir-autogen, elixir-format msgid "View full buy plan" msgstr "Veure el pla de compra complet" -#: lib/quantic_web/components/home_components.ex:955 +#: lib/quantic_web/components/home_components.ex:991 #: lib/quantic_web/components/stock_card_components.ex:144 #: lib/quantic_web/live/buy_plan_live.ex:547 #, elixir-autogen, elixir-format @@ -1695,12 +1679,12 @@ msgstr "Feble" msgid "What investors are watching" msgstr "El que vigilen els inversors" -#: lib/quantic_web/components/home_components.ex:612 +#: lib/quantic_web/components/home_components.ex:648 #, elixir-autogen, elixir-format msgid "Yield on cost" msgstr "Yield on Cost" -#: lib/quantic_web/components/home_components.ex:815 +#: lib/quantic_web/components/home_components.ex:851 #, elixir-autogen, elixir-format msgid "Your next picks" msgstr "Les teves properes compres" @@ -1715,13 +1699,13 @@ msgstr "dividends" msgid "ex-div dates" msgstr "dies ex-dividend" -#: lib/quantic_web/components/home_components.ex:900 +#: lib/quantic_web/components/home_components.ex:936 #, elixir-autogen, elixir-format msgid "in %{days}d" msgstr "en %{days}d" -#: lib/quantic_web/live/home_live.ex:199 -#: lib/quantic_web/live/home_live.ex:210 +#: lib/quantic_web/live/home_live.ex:200 +#: lib/quantic_web/live/home_live.ex:211 #, elixir-autogen, elixir-format msgid "investor" msgstr "inversor" @@ -1731,12 +1715,12 @@ msgstr "inversor" msgid "radar targets" msgstr "objectius del radar" -#: lib/quantic_web/components/home_components.ex:896 +#: lib/quantic_web/components/home_components.ex:932 #, elixir-autogen, elixir-format msgid "today" msgstr "avui" -#: lib/quantic_web/components/home_components.ex:898 +#: lib/quantic_web/components/home_components.ex:934 #, elixir-autogen, elixir-format msgid "tomorrow" msgstr "demà" @@ -1756,17 +1740,17 @@ msgstr "%{percentage}% per sobre de l'objectiu" msgid "%{percentage}% below target" msgstr "%{percentage}% per sota de l'objectiu" -#: lib/quantic_web/live/radar_live.ex:430 +#: lib/quantic_web/live/radar_live.ex:450 #, elixir-autogen, elixir-format msgid "200-day average" msgstr "Mitjana de 200 dies" -#: lib/quantic_web/live/radar_live.ex:436 +#: lib/quantic_web/live/radar_live.ex:456 #, elixir-autogen, elixir-format msgid "50-day average" msgstr "Mitjana de 50 dies" -#: lib/quantic_web/live/radar_live.ex:424 +#: lib/quantic_web/live/radar_live.ex:444 #, elixir-autogen, elixir-format msgid "52-week midpoint" msgstr "Punt mitjà de 52 setmanes" @@ -1798,7 +1782,7 @@ msgstr "Esborrar la cerca" msgid "Click to edit" msgstr "Fes clic per editar" -#: lib/quantic_web/live/radar_live.ex:418 +#: lib/quantic_web/live/radar_live.ex:438 #, elixir-autogen, elixir-format msgid "Community average" msgstr "Mitjana de la comunitat" @@ -1808,7 +1792,7 @@ msgstr "Mitjana de la comunitat" msgid "Compact view" msgstr "Vista compacta" -#: lib/quantic_web/live/radar_live.ex:182 +#: lib/quantic_web/live/radar_live.ex:198 #, elixir-autogen, elixir-format msgid "Could not apply that target price." msgstr "No s'ha pogut aplicar aquest preu objectiu." @@ -1863,12 +1847,12 @@ msgstr "En cartera" msgid "Market value" msgstr "Valor de mercat" -#: lib/quantic_web/live/radar_live.ex:446 +#: lib/quantic_web/live/radar_live.ex:466 #, elixir-autogen, elixir-format msgid "Needs 3+ community targets (%{count} so far)" msgstr "Calen 3+ objectius de la comunitat (%{count} de moment)" -#: lib/quantic_web/live/radar_live.ex:448 +#: lib/quantic_web/live/radar_live.ex:468 #, elixir-autogen, elixir-format msgid "No community targets yet" msgstr "Encara no hi ha objectius de la comunitat" @@ -1894,13 +1878,13 @@ msgstr "Sense dades de calendari" msgid "No target set" msgstr "Sense objectiu definit" -#: lib/quantic_web/live/radar_live.ex:313 -#: lib/quantic_web/live/radar_live.ex:328 +#: lib/quantic_web/live/radar_live.ex:333 +#: lib/quantic_web/live/radar_live.ex:348 #, elixir-autogen, elixir-format msgid "Nothing on your radar yet. Search above to add your first stock." msgstr "Encara no hi ha res al teu radar. Cerca a dalt per afegir la teva primera acció." -#: lib/quantic_web/live/radar_live.ex:285 +#: lib/quantic_web/live/radar_live.ex:280 #, elixir-autogen, elixir-format msgid "On radar" msgstr "Al radar" @@ -1916,7 +1900,7 @@ msgid "Position" msgstr "Posició" #: lib/quantic_web/live/portfolio_live.ex:377 -#: lib/quantic_web/live/radar_live.ex:262 +#: lib/quantic_web/live/radar_live.ex:311 #, elixir-autogen, elixir-format msgid "Public page" msgstr "Pàgina pública" @@ -1928,7 +1912,7 @@ msgid "Score" msgstr "Puntuació" #: lib/quantic_web/live/portfolio_live.ex:306 -#: lib/quantic_web/live/radar_live.ex:280 +#: lib/quantic_web/live/radar_live.ex:275 #, elixir-autogen, elixir-format msgid "Search by ticker or company name…" msgstr "Cerca per ticker o nom d'empresa…" @@ -1956,12 +1940,12 @@ msgstr "Estat" msgid "Suggest a target" msgstr "Suggerir un objectiu" -#: lib/quantic_web/live/radar_live.ex:175 +#: lib/quantic_web/live/radar_live.ex:191 #, elixir-autogen, elixir-format msgid "Target for %{symbol} set to %{price}." msgstr "Objectiu de %{symbol} fixat en %{price}." -#: lib/quantic_web/live/radar_live.ex:90 +#: lib/quantic_web/live/radar_live.ex:95 #, elixir-autogen, elixir-format msgid "That stock is already on your radar." msgstr "Aquesta acció ja és al teu radar." @@ -2078,7 +2062,7 @@ msgstr "Beta" #: lib/quantic_web/live/admin_content_drafts_live.ex:272 #: lib/quantic_web/live/portfolio_live.ex:447 -#: lib/quantic_web/live/radar_live.ex:342 +#: lib/quantic_web/live/radar_live.ex:362 #, elixir-autogen, elixir-format msgid "Dividend calendar" msgstr "Calendari de dividends" @@ -2334,7 +2318,7 @@ msgstr "Aportació mensual" msgid "Monthly dividend goal (today's money)" msgstr "Objectiu mensual de dividends (diners d'avui)" -#: lib/quantic_web/components/home_components.ex:762 +#: lib/quantic_web/components/home_components.ex:798 #: lib/quantic_web/live/path_to_freedom_live.ex:379 #, elixir-autogen, elixir-format msgid "Not in reach yet" @@ -2440,7 +2424,7 @@ msgstr "El teu objectiu queda fora d'abast dins de l'horitzó." msgid "Your journey to freedom" msgstr "El teu camí cap a la llibertat" -#: lib/quantic_web/components/home_components.ex:757 +#: lib/quantic_web/components/home_components.ex:793 #: lib/quantic_web/live/path_to_freedom_live.ex:353 #: lib/quantic_web/live/path_to_freedom_live.ex:856 #: lib/quantic_web/live/path_to_freedom_live.ex:1066 @@ -2494,7 +2478,7 @@ msgstr "¾ del teu objectiu" msgid "✓ today" msgstr "✓ avui" -#: lib/quantic_web/components/home_components.ex:765 +#: lib/quantic_web/components/home_components.ex:801 #, elixir-autogen, elixir-format msgid "Keep going — see what changes it" msgstr "Continua — mira què ho canvia" @@ -2524,7 +2508,7 @@ msgstr "Digues-nos el teu objectiu de dividends mensuals. Et direm l'any — i l msgid "The year, and your age, when dividends cover your goal" msgstr "L'any, i la teva edat, en què els dividends cobreixen el teu objectiu" -#: lib/quantic_web/components/home_components.ex:783 +#: lib/quantic_web/components/home_components.ex:819 #, elixir-autogen, elixir-format msgid "per month" msgstr "al mes" @@ -2741,7 +2725,7 @@ msgstr "Usuaris actius — últimes 8 setmanes" msgid "Activity" msgstr "Activitat" -#: lib/quantic_web/components/layouts.ex:330 +#: lib/quantic_web/components/layouts.ex:341 #: lib/quantic_web/live/admin_content_drafts_live.ex:112 #: lib/quantic_web/live/admin_dashboard_live.ex:18 #: lib/quantic_web/live/admin_dashboard_live.ex:64 @@ -3189,3 +3173,115 @@ msgstr "Els teus enllaços seran:" #, elixir-autogen, elixir-format msgid "Your public link" msgstr "El teu enllaç públic" + +#: lib/quantic_web/components/home_components.ex:292 +#, elixir-autogen, elixir-format +msgid "\"Any ex-dividends this week?\"" +msgstr "«Algun ex-dividend aquesta setmana?»" + +#: lib/quantic_web/components/home_components.ex:290 +#, elixir-autogen, elixir-format +msgid "\"What dividends did I get this month?\"" +msgstr "«Quins dividends he cobrat aquest mes?»" + +#: lib/quantic_web/components/home_components.ex:291 +#, elixir-autogen, elixir-format +msgid "\"What's my biggest holding?\"" +msgstr "«Quina és la meva posició més gran?»" + +#: lib/quantic_web/components/home_components.ex:289 +#, elixir-autogen, elixir-format +msgid "\"Which of my stocks are below my target?\"" +msgstr "«Quines de les meves accions estan per sota del meu preu objectiu?»" + +#: lib/quantic_web/live/ask_live.ex:208 +#, elixir-autogen, elixir-format +msgid "%{remaining}/%{limit} left" +msgstr "%{remaining}/%{limit} restants" + +#: lib/quantic_web/components/home_components.ex:284 +#, elixir-autogen, elixir-format +msgid "An AI assistant on every page. Ask about your portfolio, radar, and dividends in plain language — it reads your own data to answer." +msgstr "Un assistent d'IA a cada pàgina. Pregunta sobre la teva cartera, radar i dividends en llenguatge natural: llegeix les teves pròpies dades per respondre." + +#: lib/quantic_web/components/home_components.ex:281 +#: lib/quantic_web/live/ask_live.ex:196 +#: lib/quantic_web/live/ask_live.ex:303 +#, elixir-autogen, elixir-format +msgid "Ask Quantic" +msgstr "Pregunta a Quantic" + +#: lib/quantic_web/live/ask_live.ex:279 +#, elixir-autogen, elixir-format +msgid "Ask a question…" +msgstr "Escriu una pregunta…" + +#: lib/quantic_web/live/ask_live.ex:217 +#, elixir-autogen, elixir-format +msgid "Ask me about your portfolio, radar or dividends." +msgstr "Pregunta'm sobre la teva cartera, radar o dividends." + +#: lib/quantic_web/live/ask_live.ex:379 +#, elixir-autogen, elixir-format +msgid "Dividends this month?" +msgstr "Dividends aquest mes?" + +#: lib/quantic_web/live/ask_live.ex:288 +#, elixir-autogen, elixir-format +msgid "Send" +msgstr "Envia" + +#: lib/quantic_web/live/ask_live.ex:256 +#, elixir-autogen, elixir-format +msgid "Thinking…" +msgstr "Pensant…" + +#: lib/quantic_web/components/home_components.ex:299 +#, elixir-autogen, elixir-format +msgid "Try it" +msgstr "Prova-ho" + +#: lib/quantic_web/live/ask_live.ex:376 +#, elixir-autogen, elixir-format +msgid "What's my biggest holding?" +msgstr "Quina és la meva posició més gran?" + +#: lib/quantic_web/live/ask_live.ex:378 +#, elixir-autogen, elixir-format +msgid "Which stocks are below my target?" +msgstr "Quines accions estan per sota del meu objectiu?" + +#: lib/quantic_web/live/ask_live.ex:201 +#, elixir-autogen, elixir-format +msgid "on %{page}" +msgstr "a %{page}" + +#: lib/quantic_web/live/ask_live.ex:377 +#, elixir-autogen, elixir-format +msgid "What do you think of KO?" +msgstr "Què en penses de KO?" + +#: lib/quantic_web/live/ask_live.ex:295 +#, elixir-autogen, elixir-format +msgid "Informational only — not financial advice." +msgstr "Només informatiu — no és assessorament financer." + +#: lib/quantic_web/live/radar_live.ex:504 +#, elixir-autogen, elixir-format +msgid "Dividend score" +msgstr "Puntuació de dividend" + +#: lib/quantic_web/live/radar_live.ex:503 +#, elixir-autogen, elixir-format +msgid "Dividend yield" +msgstr "Rendibilitat per dividend" + +#: lib/quantic_web/live/radar_live.ex:501 +#, elixir-autogen, elixir-format +msgid "Opportunity" +msgstr "Oportunitat" + +#: lib/quantic_web/live/ask_live.ex:362 +#, elixir-autogen, elixir-format +msgid "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" +msgstr "Estàs explorant una demo, així que aquesta és una resposta d'exemple en lloc d'una resposta real (així la demo continua sent gratuïta). Amb el teu propi compte llegeixo les teves posicions, el teu radar i els teus dividends reals per respondre preguntes com aquesta. Registra't per provar-ho de debò!" diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index 6ce428e..35b3a0c 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -17,22 +17,23 @@ msgstr "" msgid "Actions" msgstr "Aktionen" -#: lib/quantic_web/components/layouts.ex:455 -#: lib/quantic_web/components/layouts.ex:467 +#: lib/quantic_web/components/layouts.ex:466 +#: lib/quantic_web/components/layouts.ex:478 #, elixir-autogen, elixir-format msgid "Attempting to reconnect" msgstr "Verbindung wird wiederhergestellt" -#: lib/quantic_web/components/layouts.ex:65 -#: lib/quantic_web/components/layouts.ex:272 +#: lib/quantic_web/ask_context.ex:39 +#: lib/quantic_web/components/layouts.ex:69 +#: lib/quantic_web/components/layouts.ex:283 #: lib/quantic_web/live/buy_plan_live.ex:26 #: lib/quantic_web/live/buy_plan_live.ex:233 #, elixir-autogen, elixir-format msgid "Buy plan" msgstr "Kaufplan" -#: lib/quantic_web/components/layouts.ex:81 -#: lib/quantic_web/components/layouts.ex:303 +#: lib/quantic_web/components/layouts.ex:85 +#: lib/quantic_web/components/layouts.ex:314 #: lib/quantic_web/live/admin_dashboard_live.ex:211 #: lib/quantic_web/live/community_dashboard_live.ex:27 #: lib/quantic_web/live/community_dashboard_live.ex:65 @@ -40,8 +41,9 @@ msgstr "Kaufplan" msgid "Community" msgstr "Community" -#: lib/quantic_web/components/layouts.ex:70 -#: lib/quantic_web/components/layouts.ex:282 +#: lib/quantic_web/ask_context.ex:41 +#: lib/quantic_web/components/layouts.ex:74 +#: lib/quantic_web/components/layouts.ex:293 #: lib/quantic_web/components/stock_card_components.ex:589 #: lib/quantic_web/components/stock_card_components.ex:806 #: lib/quantic_web/components/stock_card_components.ex:1267 @@ -52,36 +54,38 @@ msgstr "Community" msgid "Dividends" msgstr "Dividenden" -#: lib/quantic_web/components/layouts.ex:75 -#: lib/quantic_web/components/layouts.ex:292 +#: lib/quantic_web/components/layouts.ex:79 +#: lib/quantic_web/components/layouts.ex:303 #, elixir-autogen, elixir-format msgid "Freedom" msgstr "Freiheit" -#: lib/quantic_web/components/layouts.ex:55 -#: lib/quantic_web/components/layouts.ex:252 +#: lib/quantic_web/ask_context.ex:37 +#: lib/quantic_web/components/layouts.ex:59 +#: lib/quantic_web/components/layouts.ex:263 #: lib/quantic_web/live/path_to_freedom_live.ex:300 #: lib/quantic_web/live/portfolio_live.ex:262 #, elixir-autogen, elixir-format msgid "Portfolio" msgstr "Portfolio" -#: lib/quantic_web/components/home_components.ex:879 -#: lib/quantic_web/components/layouts.ex:60 -#: lib/quantic_web/components/layouts.ex:262 +#: lib/quantic_web/ask_context.ex:38 +#: lib/quantic_web/components/home_components.ex:915 +#: lib/quantic_web/components/layouts.ex:64 +#: lib/quantic_web/components/layouts.ex:273 #: lib/quantic_web/live/admin_dashboard_live.ex:362 #: lib/quantic_web/live/public_radar_live.ex:105 -#: lib/quantic_web/live/radar_live.ex:254 +#: lib/quantic_web/live/radar_live.ex:269 #, elixir-autogen, elixir-format msgid "Radar" msgstr "Radar" -#: lib/quantic_web/components/layouts.ex:462 +#: lib/quantic_web/components/layouts.ex:473 #, elixir-autogen, elixir-format msgid "Something went wrong!" msgstr "Etwas ist schiefgelaufen!" -#: lib/quantic_web/components/layouts.ex:450 +#: lib/quantic_web/components/layouts.ex:461 #, elixir-autogen, elixir-format msgid "We can't find the internet" msgstr "Wir finden das Internet nicht" @@ -91,7 +95,7 @@ msgstr "Wir finden das Internet nicht" msgid "close" msgstr "schließen" -#: lib/quantic_web/components/home_components.ex:565 +#: lib/quantic_web/components/home_components.ex:601 #: lib/quantic_web/live/public_portfolio_live.ex:123 #, elixir-autogen, elixir-format msgid "%{count} holding" @@ -182,12 +186,12 @@ msgstr "Füge zuerst Positionen oder Radar-Aktien hinzu — sie erscheinen hier, msgid "Add to portfolio" msgstr "Zum Portfolio hinzufügen" -#: lib/quantic_web/live/radar_live.ex:294 +#: lib/quantic_web/live/radar_live.ex:289 #, elixir-autogen, elixir-format msgid "Add to radar" msgstr "Zum Radar hinzufügen" -#: lib/quantic_web/live/radar_live.ex:75 +#: lib/quantic_web/live/radar_live.ex:80 #, elixir-autogen, elixir-format msgid "Added %{symbol} to your radar." msgstr "%{symbol} wurde zu deinem Radar hinzugefügt." @@ -313,7 +317,7 @@ msgstr "Community-Sektoren" msgid "Community sharing" msgstr "Teilen mit der Community" -#: lib/quantic_web/components/home_components.ex:331 +#: lib/quantic_web/components/home_components.ex:367 #: lib/quantic_web/live/community_dashboard_live.ex:101 #, elixir-autogen, elixir-format msgid "Community value" @@ -435,7 +439,7 @@ msgstr "Fehlgeschlagen" msgid "Fill price" msgstr "Ausführungspreis" -#: lib/quantic_web/components/home_components.ex:752 +#: lib/quantic_web/components/home_components.ex:788 #: lib/quantic_web/live/path_to_freedom_live.ex:346 #, elixir-autogen, elixir-format msgid "Freedom in" @@ -446,7 +450,7 @@ msgstr "Freiheit in" msgid "Full history" msgstr "Gesamte Historie" -#: lib/quantic_web/components/home_components.ex:656 +#: lib/quantic_web/components/home_components.ex:692 #, elixir-autogen, elixir-format msgid "Go to portfolio" msgstr "Zum Portfolio" @@ -528,13 +532,13 @@ msgstr "Zinssatz %" msgid "It expires in 15 minutes." msgstr "Er läuft in 15 Minuten ab." -#: lib/quantic_web/components/layouts.ex:91 +#: lib/quantic_web/components/layouts.ex:95 #: lib/quantic_web/live/settings_live.ex:174 #, elixir-autogen, elixir-format msgid "Language" msgstr "Sprache" -#: lib/quantic_web/components/home_components.ex:698 +#: lib/quantic_web/components/home_components.ex:734 #: lib/quantic_web/live/dividends_live.ex:356 #, elixir-autogen, elixir-format msgid "Last 12 months" @@ -542,7 +546,7 @@ msgstr "Letzte 12 Monate" #: lib/quantic_web/live/dividends_live.ex:80 #: lib/quantic_web/live/portfolio_live.ex:105 -#: lib/quantic_web/live/radar_live.ex:86 +#: lib/quantic_web/live/radar_live.ex:91 #, elixir-autogen, elixir-format msgid "Market-data provider is unreachable right now. Please try again." msgstr "Der Marktdaten-Anbieter ist gerade nicht erreichbar. Bitte versuche es erneut." @@ -621,8 +625,9 @@ msgstr "Ziel" msgid "Other capital (bonds, savings, index funds)" msgstr "Sonstiges Kapital (Anleihen, Sparguthaben, Indexfonds)" +#: lib/quantic_web/ask_context.ex:40 #: lib/quantic_web/components/home_components.ex:245 -#: lib/quantic_web/components/home_components.ex:745 +#: lib/quantic_web/components/home_components.ex:781 #: lib/quantic_web/live/path_to_freedom_live.ex:24 #: lib/quantic_web/live/path_to_freedom_live.ex:91 #, elixir-autogen, elixir-format @@ -661,7 +666,7 @@ msgstr "Portfolio nicht gefunden" msgid "Portfolio value" msgstr "Portfoliowert" -#: lib/quantic_web/components/home_components.ex:337 +#: lib/quantic_web/components/home_components.ex:373 #: lib/quantic_web/live/admin_dashboard_live.ex:151 #: lib/quantic_web/live/community_dashboard_live.ex:74 #: lib/quantic_web/live/community_dashboard_live.ex:81 @@ -784,7 +789,7 @@ msgstr "Diese Position entfernen?" msgid "Remove this stock from your radar?" msgstr "Diese Aktie von deinem Radar entfernen?" -#: lib/quantic_web/live/radar_live.ex:196 +#: lib/quantic_web/live/radar_live.ex:212 #, elixir-autogen, elixir-format msgid "Removed %{symbol} from your radar." msgstr "%{symbol} von deinem Radar entfernt." @@ -822,14 +827,15 @@ msgstr "Teilen speichern" msgid "Saved!" msgstr "Gespeichert!" -#: lib/quantic_web/components/home_components.ex:622 +#: lib/quantic_web/components/home_components.ex:658 #: lib/quantic_web/live/portfolio_live.ex:440 #: lib/quantic_web/live/public_portfolio_live.ex:166 #, elixir-autogen, elixir-format msgid "Sectors" msgstr "Sektoren" -#: lib/quantic_web/components/layouts.ex:340 +#: lib/quantic_web/ask_context.ex:42 +#: lib/quantic_web/components/layouts.ex:351 #: lib/quantic_web/live/community_dashboard_live.ex:372 #: lib/quantic_web/live/settings_live.ex:157 #, elixir-autogen, elixir-format @@ -922,6 +928,7 @@ msgstr "Beobachtete Aktien" #: lib/quantic_web/components/stock_card_components.ex:924 #: lib/quantic_web/live/dividends_live.ex:396 #: lib/quantic_web/live/portfolio_live.ex:565 +#: lib/quantic_web/live/radar_live.ex:502 #, elixir-autogen, elixir-format msgid "Symbol" msgstr "Symbol" @@ -996,7 +1003,7 @@ msgid "Underweight position" msgstr "Untergewichtete Position" #: lib/quantic_web/live/portfolio_live.ex:188 -#: lib/quantic_web/live/radar_live.ex:138 +#: lib/quantic_web/live/radar_live.ex:154 #, elixir-autogen, elixir-format msgid "Updated %{symbol}." msgstr "%{symbol} aktualisiert." @@ -1013,7 +1020,7 @@ msgstr "Radar ansehen" #: lib/quantic_web/live/dividends_live.ex:73 #: lib/quantic_web/live/portfolio_live.ex:98 -#: lib/quantic_web/live/radar_live.ex:79 +#: lib/quantic_web/live/radar_live.ex:84 #, elixir-autogen, elixir-format msgid "We couldn't find that symbol on the market." msgstr "Wir konnten dieses Symbol am Markt nicht finden." @@ -1114,18 +1121,18 @@ msgstr "was das Portfolio heute zahlt, vor neuen Einzahlungen" msgid "← Back to home" msgstr "← Zurück zur Startseite" -#: lib/quantic_web/components/layouts.ex:180 +#: lib/quantic_web/components/layouts.ex:184 #, elixir-autogen, elixir-format msgid "Sign up to start your own" msgstr "Registriere dich für dein eigenes" -#: lib/quantic_web/components/layouts.ex:176 +#: lib/quantic_web/components/layouts.ex:180 #, elixir-autogen, elixir-format msgid "You're exploring a demo portfolio — changes are yours to play with and expire in 24h." msgstr "Du erkundest ein Demo-Portfolio — Änderungen gehören dir zum Ausprobieren und verfallen nach 24h." #: lib/quantic_web/live/portfolio_live.ex:369 -#: lib/quantic_web/live/radar_live.ex:270 +#: lib/quantic_web/live/radar_live.ex:303 #, elixir-autogen, elixir-format msgid "AI insights" msgstr "KI-Analyse" @@ -1149,42 +1156,22 @@ msgstr "KI-Zusammenfassung" msgid "Analyzing your stocks…" msgstr "Deine Aktien werden analysiert…" -#: lib/quantic_web/components/ai_components.ex:179 -#, elixir-autogen, elixir-format -msgid "Avoid" -msgstr "Meiden" - -#: lib/quantic_web/components/ai_components.ex:176 -#, elixir-autogen, elixir-format -msgid "Buy" -msgstr "Kaufen" - #: lib/quantic_web/components/ai_components.ex:86 #, elixir-autogen, elixir-format msgid "Buying opportunities" msgstr "Kaufgelegenheiten" -#: lib/quantic_web/components/ai_components.ex:178 -#, elixir-autogen, elixir-format -msgid "Caution" -msgstr "Vorsicht" - #: lib/quantic_web/components/ai_components.ex:104 #, elixir-autogen, elixir-format msgid "Dividend coverage" msgstr "Dividendenabdeckung" -#: lib/quantic_web/components/ai_components.ex:177 -#, elixir-autogen, elixir-format -msgid "Hold" -msgstr "Halten" - #: lib/quantic_web/live/portfolio_live.ex:393 #, elixir-autogen, elixir-format msgid "Portfolio AI insights" msgstr "KI-Analyse des Portfolios" -#: lib/quantic_web/live/radar_live.ex:300 +#: lib/quantic_web/live/radar_live.ex:320 #, elixir-autogen, elixir-format msgid "Radar AI insights" msgstr "KI-Analyse des Radars" @@ -1199,12 +1186,8 @@ msgstr "Risikohinweise" msgid "Strengths" msgstr "Stärken" -#: lib/quantic_web/components/ai_components.ex:175 -#, elixir-autogen, elixir-format -msgid "Strong buy" -msgstr "Starker Kauf" - -#: lib/quantic_web/components/ai_components.ex:162 +#: lib/quantic_web/components/ai_components.ex:157 +#: lib/quantic_web/live/ask_live.ex:259 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — your quota resets at midnight UTC." msgstr "Du hast die %{limit} KI-Anfragen für heute verbraucht — dein Kontingent wird um Mitternacht UTC zurückgesetzt." @@ -1219,7 +1202,7 @@ msgstr "Frag mich z. B.:\n• was ist auf meinem Radar?\n• Dividenden diesen M msgid "Ask the bot about your portfolio, radar and dividends." msgstr "Frag den Bot nach Portfolio, Radar und Dividenden." -#: lib/quantic_web/components/home_components.ex:408 +#: lib/quantic_web/components/home_components.ex:444 #: lib/quantic_web/live/settings_live.ex:307 #, elixir-autogen, elixir-format msgid "Connect Telegram" @@ -1293,7 +1276,8 @@ msgid "Refresh status" msgstr "Status aktualisieren" #: lib/quantic/telegram/handler.ex:79 -#: lib/quantic/telegram/handler.ex:201 +#: lib/quantic/telegram/handler.ex:204 +#: lib/quantic_web/live/ask_live.ex:264 #, elixir-autogen, elixir-format msgid "Something went wrong — please try again." msgstr "Etwas ist schiefgelaufen — bitte versuche es erneut." @@ -1323,7 +1307,7 @@ msgstr "Unbekannter Befehl — versuche /help." msgid "Use /notifications on|off to change." msgstr "Nutze /notifications on|off zum Ändern." -#: lib/quantic/telegram/handler.ex:195 +#: lib/quantic/telegram/handler.ex:198 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — quota resets at midnight UTC." msgstr "Du hast die %{limit} KI-Anfragen für heute verbraucht — das Kontingent wird um Mitternacht UTC zurückgesetzt." @@ -1368,38 +1352,38 @@ msgstr "• %{symbol} zahlte %{amount} %{currency} netto" msgid "📊 Your Quantic daily digest" msgstr "📊 Deine tägliche Quantic-Zusammenfassung" -#: lib/quantic_web/components/layouts.ex:408 +#: lib/quantic_web/components/layouts.ex:419 #, elixir-autogen, elixir-format msgid "Built with Elixir, Phoenix LiveView, and Tailwind CSS" msgstr "Erstellt mit Elixir, Phoenix LiveView und Tailwind CSS" -#: lib/quantic_web/components/layouts.ex:227 +#: lib/quantic_web/components/layouts.ex:238 #, elixir-autogen, elixir-format msgid "Close menu" msgstr "Menü schließen" -#: lib/quantic_web/components/layouts.ex:313 +#: lib/quantic_web/components/layouts.ex:324 #, elixir-autogen, elixir-format msgid "FAQ" msgstr "FAQ" -#: lib/quantic_web/components/layouts.ex:421 +#: lib/quantic_web/components/layouts.ex:432 #, elixir-autogen, elixir-format msgid "Frequently Asked Questions" msgstr "Häufig gestellte Fragen" -#: lib/quantic_web/components/layouts.ex:241 +#: lib/quantic_web/components/layouts.ex:252 #, elixir-autogen, elixir-format msgid "Home" msgstr "Startseite" -#: lib/quantic_web/components/layouts.ex:158 -#: lib/quantic_web/components/layouts.ex:223 +#: lib/quantic_web/components/layouts.ex:162 +#: lib/quantic_web/components/layouts.ex:234 #, elixir-autogen, elixir-format msgid "Menu" msgstr "Menü" -#: lib/quantic_web/components/layouts.ex:218 +#: lib/quantic_web/components/layouts.ex:229 #, elixir-autogen, elixir-format msgid "Navigation menu" msgstr "Navigationsmenü" @@ -1409,42 +1393,42 @@ msgstr "Navigationsmenü" msgid "New here? Signing in creates your account automatically." msgstr "Neu hier? Beim Anmelden wird dein Konto automatisch erstellt." -#: lib/quantic_web/components/layouts.ex:149 -#: lib/quantic_web/components/layouts.ex:355 +#: lib/quantic_web/components/layouts.ex:153 +#: lib/quantic_web/components/layouts.ex:366 #, elixir-autogen, elixir-format msgid "Sign in" msgstr "Anmelden" -#: lib/quantic_web/components/layouts.ex:345 +#: lib/quantic_web/components/layouts.ex:356 #, elixir-autogen, elixir-format msgid "Sign out" msgstr "Abmelden" -#: lib/quantic_web/components/layouts.ex:398 +#: lib/quantic_web/components/layouts.ex:409 #, elixir-autogen, elixir-format msgid "The information on Quantic is provided for informational and educational purposes only. It is general in nature, does not take into account your personal financial situation, and does not constitute investment, financial, tax, or legal advice — nor a recommendation to buy or sell any security. Investing involves risk, including possible loss of principal; past performance is not a reliable indicator of future results. Market data comes from third-party providers and may be delayed or inaccurate. Before making any investment decision, consider your objectives, time horizon, risk tolerance, and diversification, and consult a qualified financial professional. Quantic is not a registered investment adviser or broker-dealer." msgstr "Die Informationen auf Quantic dienen ausschließlich Informations- und Bildungszwecken. Sie sind allgemeiner Natur, berücksichtigen nicht deine persönliche finanzielle Situation und stellen keine Anlage-, Finanz-, Steuer- oder Rechtsberatung dar — und auch keine Empfehlung zum Kauf oder Verkauf von Wertpapieren. Investieren ist mit Risiken verbunden, einschließlich des möglichen Verlusts des eingesetzten Kapitals; die Wertentwicklung der Vergangenheit ist kein verlässlicher Indikator für zukünftige Ergebnisse. Marktdaten stammen von Drittanbietern und können verzögert oder ungenau sein. Berücksichtige vor jeder Anlageentscheidung deine Ziele, deinen Anlagehorizont, deine Risikotoleranz und Diversifikation und konsultiere eine qualifizierte Finanzfachperson. Quantic ist kein registrierter Anlageberater und kein Broker-Dealer." -#: lib/quantic_web/components/home_components.ex:397 +#: lib/quantic_web/components/home_components.ex:433 #, elixir-autogen, elixir-format msgid "\"what dividends did I get this month?\" · \"show my radar\" · \"any ex-divs this week?\"" msgstr "\"welche Dividenden habe ich diesen Monat bekommen?\" · \"zeig mein Radar\" · \"Ex-Tage diese Woche?\"" -#: lib/quantic_web/components/home_components.ex:568 +#: lib/quantic_web/components/home_components.ex:604 #, elixir-autogen, elixir-format msgid "%{count} on radar" msgid_plural "%{count} on radar" msgstr[0] "%{count} auf dem Radar" msgstr[1] "%{count} auf dem Radar" -#: lib/quantic_web/components/home_components.ex:721 +#: lib/quantic_web/components/home_components.ex:757 #, elixir-autogen, elixir-format msgid "+ %{count} more currency" msgid_plural "+ %{count} more currencies" msgstr[0] "+ %{count} weitere Währung" msgstr[1] "+ %{count} weitere Währungen" -#: lib/quantic_web/components/home_components.ex:289 +#: lib/quantic_web/components/home_components.ex:325 #, elixir-autogen, elixir-format msgid "A live community of dividend investors. Browse what others hold, what they target, and how they structure their portfolios." msgstr "Eine lebendige Community von Dividenden-Investoren. Sieh dir an, was andere halten, welche Zielkurse sie setzen und wie sie ihre Portfolios aufbauen." @@ -1459,12 +1443,12 @@ msgstr "KI-gestütztes Dividenden-Investieren. Baue deine Watchlist auf, verfolg msgid "Add stocks with target prices. We track price, score, and ex-div dates." msgstr "Füge Aktien mit Zielkursen hinzu. Wir verfolgen Kurs, Score und Ex-Dividenden-Termine." -#: lib/quantic_web/components/home_components.ex:648 +#: lib/quantic_web/components/home_components.ex:684 #, elixir-autogen, elixir-format msgid "Add your first holding" msgstr "Füge deine erste Position hinzu" -#: lib/quantic_web/components/home_components.ex:392 +#: lib/quantic_web/components/home_components.ex:428 #, elixir-autogen, elixir-format msgid "Ask your portfolio anything in natural language — ex-divs, totals, target prices — right from Telegram." msgstr "Stell deinem Portfolio jede Frage in natürlicher Sprache — Ex-Tage, Summen, Zielkurse — direkt aus Telegram." @@ -1479,22 +1463,22 @@ msgstr "Baue dein Radar auf" msgid "Create your plan" msgstr "Erstelle deinen Plan" -#: lib/quantic_web/components/home_components.ex:616 +#: lib/quantic_web/components/home_components.ex:652 #, elixir-autogen, elixir-format msgid "Current yield" msgstr "Aktuelle Rendite" -#: lib/quantic_web/components/home_components.ex:678 +#: lib/quantic_web/components/home_components.ex:714 #, elixir-autogen, elixir-format msgid "Dividend income" msgstr "Dividendeneinkommen" -#: lib/quantic_web/components/home_components.ex:862 +#: lib/quantic_web/components/home_components.ex:898 #, elixir-autogen, elixir-format msgid "Ex-dividend dates in the next %{days} days" msgstr "Ex-Dividenden-Termine in den nächsten %{days} Tagen" -#: lib/quantic_web/components/home_components.ex:954 +#: lib/quantic_web/components/home_components.ex:990 #: lib/quantic_web/components/stock_card_components.ex:143 #: lib/quantic_web/live/buy_plan_live.ex:546 #, elixir-autogen, elixir-format @@ -1506,7 +1490,7 @@ msgstr "Solide" msgid "Free · No broker connection required · Open source" msgstr "Kostenlos · Keine Broker-Verbindung nötig · Open Source" -#: lib/quantic_web/components/home_components.ex:515 +#: lib/quantic_web/components/home_components.ex:551 #, elixir-autogen, elixir-format msgid "Free, no broker connection required. Try a sample portfolio or sign up to build your own." msgstr "Kostenlos, keine Broker-Verbindung nötig. Probiere ein Beispiel-Portfolio aus oder registriere dich und baue dein eigenes auf." @@ -1521,17 +1505,17 @@ msgstr "Von der Watchlist zum Dividendeneinkommen in 3 Schritten" msgid "Get AI insights" msgstr "Hol dir KI-Analysen" -#: lib/quantic_web/components/home_components.ex:557 +#: lib/quantic_web/components/home_components.ex:593 #, elixir-autogen, elixir-format msgid "Good afternoon, %{name}" msgstr "Guten Tag, %{name}" -#: lib/quantic_web/components/home_components.ex:559 +#: lib/quantic_web/components/home_components.ex:595 #, elixir-autogen, elixir-format msgid "Good evening, %{name}" msgstr "Guten Abend, %{name}" -#: lib/quantic_web/components/home_components.ex:555 +#: lib/quantic_web/components/home_components.ex:591 #, elixir-autogen, elixir-format msgid "Good morning, %{name}" msgstr "Guten Morgen, %{name}" @@ -1546,32 +1530,32 @@ msgstr "Live" msgid "Log holdings to get live yield, sector mix, and dividend forecast." msgstr "Erfasse Positionen und erhalte Live-Rendite, Sektor-Mix und Dividendenprognose." -#: lib/quantic_web/live/home_live.ex:120 +#: lib/quantic_web/live/home_live.ex:121 #, elixir-autogen, elixir-format msgid "Most Added to Radar" msgstr "Am häufigsten zum Radar hinzugefügt" -#: lib/quantic_web/live/home_live.ex:125 +#: lib/quantic_web/live/home_live.ex:126 #, elixir-autogen, elixir-format msgid "Most Held in Portfolios" msgstr "Am häufigsten in Portfolios gehalten" -#: lib/quantic_web/components/home_components.ex:572 +#: lib/quantic_web/components/home_components.ex:608 #, elixir-autogen, elixir-format msgid "Next ex-div: %{symbol} in %{days}d" msgstr "Nächster Ex-Tag: %{symbol} in %{days}T" -#: lib/quantic_web/components/home_components.ex:480 +#: lib/quantic_web/components/home_components.ex:516 #, elixir-autogen, elixir-format msgid "No stocks found." msgstr "Keine Aktien gefunden." -#: lib/quantic_web/components/home_components.ex:577 +#: lib/quantic_web/components/home_components.ex:613 #, elixir-autogen, elixir-format msgid "No upcoming ex-div dates" msgstr "Keine anstehenden Ex-Dividenden-Termine" -#: lib/quantic_web/components/home_components.ex:793 +#: lib/quantic_web/components/home_components.ex:829 #, elixir-autogen, elixir-format msgid "Open my plan" msgstr "Meinen Plan öffnen" @@ -1581,32 +1565,32 @@ msgstr "Meinen Plan öffnen" msgid "Plain-language analysis of your portfolio and radar — risks, gaps, opportunities." msgstr "Verständliche Analyse deines Portfolios und Radars — Risiken, Lücken, Gelegenheiten." -#: lib/quantic_web/components/home_components.ex:608 +#: lib/quantic_web/components/home_components.ex:644 #, elixir-autogen, elixir-format msgid "Portfolio stats" msgstr "Portfolio-Statistiken" -#: lib/quantic_web/components/home_components.ex:388 +#: lib/quantic_web/components/home_components.ex:424 #, elixir-autogen, elixir-format msgid "Quantic in Telegram" msgstr "Quantic in Telegram" -#: lib/quantic_web/live/home_live.ex:130 +#: lib/quantic_web/live/home_live.ex:131 #, elixir-autogen, elixir-format msgid "Recently Updated" msgstr "Kürzlich aktualisiert" -#: lib/quantic_web/components/home_components.ex:298 +#: lib/quantic_web/components/home_components.ex:334 #, elixir-autogen, elixir-format msgid "See the community" msgstr "Community entdecken" -#: lib/quantic_web/components/home_components.ex:285 +#: lib/quantic_web/components/home_components.ex:321 #, elixir-autogen, elixir-format msgid "Share your portfolio with the community" msgstr "Teile dein Portfolio mit der Community" -#: lib/quantic_web/components/home_components.ex:529 +#: lib/quantic_web/components/home_components.ex:565 #, elixir-autogen, elixir-format msgid "Sign up" msgstr "Registrieren" @@ -1616,39 +1600,39 @@ msgstr "Registrieren" msgid "Sign up free" msgstr "Kostenlos registrieren" -#: lib/quantic_web/components/home_components.ex:410 +#: lib/quantic_web/components/home_components.ex:446 #, elixir-autogen, elixir-format msgid "Sign up to connect" msgstr "Registriere dich zum Verbinden" -#: lib/quantic_web/components/home_components.ex:304 +#: lib/quantic_web/components/home_components.ex:340 #, elixir-autogen, elixir-format msgid "Sign up to share yours" msgstr "Registriere dich und teile deins" -#: lib/quantic_web/components/home_components.ex:512 +#: lib/quantic_web/components/home_components.ex:548 #, elixir-autogen, elixir-format msgid "Start your radar in 30 seconds" msgstr "Starte dein Radar in 30 Sekunden" -#: lib/quantic_web/components/home_components.ex:953 +#: lib/quantic_web/components/home_components.ex:989 #: lib/quantic_web/components/stock_card_components.ex:142 #: lib/quantic_web/live/buy_plan_live.ex:545 #, elixir-autogen, elixir-format msgid "Strong" msgstr "Stark" -#: lib/quantic_web/components/home_components.ex:690 +#: lib/quantic_web/components/home_components.ex:726 #, elixir-autogen, elixir-format msgid "This month" msgstr "Diesen Monat" -#: lib/quantic_web/components/home_components.ex:435 +#: lib/quantic_web/components/home_components.ex:471 #, elixir-autogen, elixir-format msgid "Top Dividend Scores" msgstr "Top-Dividenden-Scores" -#: lib/quantic_web/components/home_components.ex:650 +#: lib/quantic_web/components/home_components.ex:686 #, elixir-autogen, elixir-format msgid "Track real yield, dividend forecast, and sector mix. Takes a minute." msgstr "Verfolge echte Rendite, Dividendenprognose und Sektor-Mix. Dauert eine Minute." @@ -1673,17 +1657,17 @@ msgstr "In der Community im Trend" msgid "Try a sample portfolio" msgstr "Beispiel-Portfolio ausprobieren" -#: lib/quantic_web/components/home_components.ex:526 +#: lib/quantic_web/components/home_components.ex:562 #, elixir-autogen, elixir-format msgid "Try the demo" msgstr "Demo ausprobieren" -#: lib/quantic_web/components/home_components.ex:821 +#: lib/quantic_web/components/home_components.ex:857 #, elixir-autogen, elixir-format msgid "View full buy plan" msgstr "Ganzen Kaufplan ansehen" -#: lib/quantic_web/components/home_components.ex:955 +#: lib/quantic_web/components/home_components.ex:991 #: lib/quantic_web/components/stock_card_components.ex:144 #: lib/quantic_web/live/buy_plan_live.ex:547 #, elixir-autogen, elixir-format @@ -1695,12 +1679,12 @@ msgstr "Schwach" msgid "What investors are watching" msgstr "Was Investoren beobachten" -#: lib/quantic_web/components/home_components.ex:612 +#: lib/quantic_web/components/home_components.ex:648 #, elixir-autogen, elixir-format msgid "Yield on cost" msgstr "Yield on Cost" -#: lib/quantic_web/components/home_components.ex:815 +#: lib/quantic_web/components/home_components.ex:851 #, elixir-autogen, elixir-format msgid "Your next picks" msgstr "Deine nächsten Kandidaten" @@ -1715,13 +1699,13 @@ msgstr "Dividenden" msgid "ex-div dates" msgstr "Ex-Dividenden-Termine" -#: lib/quantic_web/components/home_components.ex:900 +#: lib/quantic_web/components/home_components.ex:936 #, elixir-autogen, elixir-format msgid "in %{days}d" msgstr "in %{days}T" -#: lib/quantic_web/live/home_live.ex:199 -#: lib/quantic_web/live/home_live.ex:210 +#: lib/quantic_web/live/home_live.ex:200 +#: lib/quantic_web/live/home_live.ex:211 #, elixir-autogen, elixir-format msgid "investor" msgstr "Investor" @@ -1731,12 +1715,12 @@ msgstr "Investor" msgid "radar targets" msgstr "Radar-Ziele" -#: lib/quantic_web/components/home_components.ex:896 +#: lib/quantic_web/components/home_components.ex:932 #, elixir-autogen, elixir-format msgid "today" msgstr "heute" -#: lib/quantic_web/components/home_components.ex:898 +#: lib/quantic_web/components/home_components.ex:934 #, elixir-autogen, elixir-format msgid "tomorrow" msgstr "morgen" @@ -1756,17 +1740,17 @@ msgstr "%{percentage}% über Zielkurs" msgid "%{percentage}% below target" msgstr "%{percentage}% unter Zielkurs" -#: lib/quantic_web/live/radar_live.ex:430 +#: lib/quantic_web/live/radar_live.ex:450 #, elixir-autogen, elixir-format msgid "200-day average" msgstr "200-Tage-Durchschnitt" -#: lib/quantic_web/live/radar_live.ex:436 +#: lib/quantic_web/live/radar_live.ex:456 #, elixir-autogen, elixir-format msgid "50-day average" msgstr "50-Tage-Durchschnitt" -#: lib/quantic_web/live/radar_live.ex:424 +#: lib/quantic_web/live/radar_live.ex:444 #, elixir-autogen, elixir-format msgid "52-week midpoint" msgstr "52-Wochen-Mitte" @@ -1798,7 +1782,7 @@ msgstr "Suche leeren" msgid "Click to edit" msgstr "Zum Bearbeiten klicken" -#: lib/quantic_web/live/radar_live.ex:418 +#: lib/quantic_web/live/radar_live.ex:438 #, elixir-autogen, elixir-format msgid "Community average" msgstr "Community-Durchschnitt" @@ -1808,7 +1792,7 @@ msgstr "Community-Durchschnitt" msgid "Compact view" msgstr "Kompaktansicht" -#: lib/quantic_web/live/radar_live.ex:182 +#: lib/quantic_web/live/radar_live.ex:198 #, elixir-autogen, elixir-format msgid "Could not apply that target price." msgstr "Dieser Zielkurs konnte nicht übernommen werden." @@ -1863,12 +1847,12 @@ msgstr "Im Portfolio" msgid "Market value" msgstr "Marktwert" -#: lib/quantic_web/live/radar_live.ex:446 +#: lib/quantic_web/live/radar_live.ex:466 #, elixir-autogen, elixir-format msgid "Needs 3+ community targets (%{count} so far)" msgstr "Braucht mindestens 3 Community-Zielkurse (bisher %{count})" -#: lib/quantic_web/live/radar_live.ex:448 +#: lib/quantic_web/live/radar_live.ex:468 #, elixir-autogen, elixir-format msgid "No community targets yet" msgstr "Noch keine Community-Zielkurse" @@ -1894,13 +1878,13 @@ msgstr "Keine Kalenderdaten" msgid "No target set" msgstr "Kein Ziel festgelegt" -#: lib/quantic_web/live/radar_live.ex:313 -#: lib/quantic_web/live/radar_live.ex:328 +#: lib/quantic_web/live/radar_live.ex:333 +#: lib/quantic_web/live/radar_live.ex:348 #, elixir-autogen, elixir-format msgid "Nothing on your radar yet. Search above to add your first stock." msgstr "Noch nichts auf deinem Radar. Suche oben, um deine erste Aktie hinzuzufügen." -#: lib/quantic_web/live/radar_live.ex:285 +#: lib/quantic_web/live/radar_live.ex:280 #, elixir-autogen, elixir-format msgid "On radar" msgstr "Auf dem Radar" @@ -1916,7 +1900,7 @@ msgid "Position" msgstr "Position" #: lib/quantic_web/live/portfolio_live.ex:377 -#: lib/quantic_web/live/radar_live.ex:262 +#: lib/quantic_web/live/radar_live.ex:311 #, elixir-autogen, elixir-format msgid "Public page" msgstr "Öffentliche Seite" @@ -1928,7 +1912,7 @@ msgid "Score" msgstr "Score" #: lib/quantic_web/live/portfolio_live.ex:306 -#: lib/quantic_web/live/radar_live.ex:280 +#: lib/quantic_web/live/radar_live.ex:275 #, elixir-autogen, elixir-format msgid "Search by ticker or company name…" msgstr "Suche nach Ticker oder Firmenname…" @@ -1956,12 +1940,12 @@ msgstr "Status" msgid "Suggest a target" msgstr "Ziel vorschlagen" -#: lib/quantic_web/live/radar_live.ex:175 +#: lib/quantic_web/live/radar_live.ex:191 #, elixir-autogen, elixir-format msgid "Target for %{symbol} set to %{price}." msgstr "Ziel für %{symbol} auf %{price} gesetzt." -#: lib/quantic_web/live/radar_live.ex:90 +#: lib/quantic_web/live/radar_live.ex:95 #, elixir-autogen, elixir-format msgid "That stock is already on your radar." msgstr "Diese Aktie ist bereits auf deinem Radar." @@ -2078,7 +2062,7 @@ msgstr "Beta" #: lib/quantic_web/live/admin_content_drafts_live.ex:272 #: lib/quantic_web/live/portfolio_live.ex:447 -#: lib/quantic_web/live/radar_live.ex:342 +#: lib/quantic_web/live/radar_live.ex:362 #, elixir-autogen, elixir-format msgid "Dividend calendar" msgstr "Dividendenkalender" @@ -2334,7 +2318,7 @@ msgstr "Monatliche Sparrate" msgid "Monthly dividend goal (today's money)" msgstr "Monatliches Dividendenziel (heutiges Geld)" -#: lib/quantic_web/components/home_components.ex:762 +#: lib/quantic_web/components/home_components.ex:798 #: lib/quantic_web/live/path_to_freedom_live.ex:379 #, elixir-autogen, elixir-format msgid "Not in reach yet" @@ -2440,7 +2424,7 @@ msgstr "Dein Ziel bleibt innerhalb des Horizonts unerreichbar." msgid "Your journey to freedom" msgstr "Deine Reise zur Freiheit" -#: lib/quantic_web/components/home_components.ex:757 +#: lib/quantic_web/components/home_components.ex:793 #: lib/quantic_web/live/path_to_freedom_live.ex:353 #: lib/quantic_web/live/path_to_freedom_live.ex:856 #: lib/quantic_web/live/path_to_freedom_live.ex:1066 @@ -2494,7 +2478,7 @@ msgstr "¾ deines Ziels" msgid "✓ today" msgstr "✓ heute" -#: lib/quantic_web/components/home_components.ex:765 +#: lib/quantic_web/components/home_components.ex:801 #, elixir-autogen, elixir-format msgid "Keep going — see what changes it" msgstr "Mach weiter — sieh, was es verändert" @@ -2524,7 +2508,7 @@ msgstr "Nenne uns dein monatliches Dividendenziel. Wir sagen dir das Jahr — un msgid "The year, and your age, when dividends cover your goal" msgstr "Das Jahr und dein Alter, in dem Dividenden dein Ziel decken" -#: lib/quantic_web/components/home_components.ex:783 +#: lib/quantic_web/components/home_components.ex:819 #, elixir-autogen, elixir-format msgid "per month" msgstr "pro Monat" @@ -2741,7 +2725,7 @@ msgstr "Aktive Nutzer — letzte 8 Wochen" msgid "Activity" msgstr "Aktivität" -#: lib/quantic_web/components/layouts.ex:330 +#: lib/quantic_web/components/layouts.ex:341 #: lib/quantic_web/live/admin_content_drafts_live.ex:112 #: lib/quantic_web/live/admin_dashboard_live.ex:18 #: lib/quantic_web/live/admin_dashboard_live.ex:64 @@ -3189,3 +3173,115 @@ msgstr "Deine Links lauten:" #, elixir-autogen, elixir-format msgid "Your public link" msgstr "Dein öffentlicher Link" + +#: lib/quantic_web/components/home_components.ex:292 +#, elixir-autogen, elixir-format +msgid "\"Any ex-dividends this week?\"" +msgstr "„Diese Woche Ex-Dividenden?“" + +#: lib/quantic_web/components/home_components.ex:290 +#, elixir-autogen, elixir-format +msgid "\"What dividends did I get this month?\"" +msgstr "„Welche Dividenden habe ich diesen Monat erhalten?“" + +#: lib/quantic_web/components/home_components.ex:291 +#, elixir-autogen, elixir-format +msgid "\"What's my biggest holding?\"" +msgstr "„Was ist meine größte Position?“" + +#: lib/quantic_web/components/home_components.ex:289 +#, elixir-autogen, elixir-format +msgid "\"Which of my stocks are below my target?\"" +msgstr "„Welche meiner Aktien liegen unter meinem Zielkurs?“" + +#: lib/quantic_web/live/ask_live.ex:208 +#, elixir-autogen, elixir-format +msgid "%{remaining}/%{limit} left" +msgstr "%{remaining}/%{limit} übrig" + +#: lib/quantic_web/components/home_components.ex:284 +#, elixir-autogen, elixir-format +msgid "An AI assistant on every page. Ask about your portfolio, radar, and dividends in plain language — it reads your own data to answer." +msgstr "Ein KI-Assistent auf jeder Seite. Frag in natürlicher Sprache nach deinem Portfolio, Radar und deinen Dividenden – er liest deine eigenen Daten, um zu antworten." + +#: lib/quantic_web/components/home_components.ex:281 +#: lib/quantic_web/live/ask_live.ex:196 +#: lib/quantic_web/live/ask_live.ex:303 +#, elixir-autogen, elixir-format +msgid "Ask Quantic" +msgstr "Quantic fragen" + +#: lib/quantic_web/live/ask_live.ex:279 +#, elixir-autogen, elixir-format +msgid "Ask a question…" +msgstr "Stell eine Frage…" + +#: lib/quantic_web/live/ask_live.ex:217 +#, elixir-autogen, elixir-format +msgid "Ask me about your portfolio, radar or dividends." +msgstr "Frag mich zu deinem Portfolio, Radar oder deinen Dividenden." + +#: lib/quantic_web/live/ask_live.ex:379 +#, elixir-autogen, elixir-format +msgid "Dividends this month?" +msgstr "Dividenden diesen Monat?" + +#: lib/quantic_web/live/ask_live.ex:288 +#, elixir-autogen, elixir-format +msgid "Send" +msgstr "Senden" + +#: lib/quantic_web/live/ask_live.ex:256 +#, elixir-autogen, elixir-format +msgid "Thinking…" +msgstr "Denkt nach…" + +#: lib/quantic_web/components/home_components.ex:299 +#, elixir-autogen, elixir-format +msgid "Try it" +msgstr "Ausprobieren" + +#: lib/quantic_web/live/ask_live.ex:376 +#, elixir-autogen, elixir-format +msgid "What's my biggest holding?" +msgstr "Was ist meine größte Position?" + +#: lib/quantic_web/live/ask_live.ex:378 +#, elixir-autogen, elixir-format +msgid "Which stocks are below my target?" +msgstr "Welche Aktien liegen unter meinem Ziel?" + +#: lib/quantic_web/live/ask_live.ex:201 +#, elixir-autogen, elixir-format +msgid "on %{page}" +msgstr "auf %{page}" + +#: lib/quantic_web/live/ask_live.ex:377 +#, elixir-autogen, elixir-format +msgid "What do you think of KO?" +msgstr "Was hältst du von KO?" + +#: lib/quantic_web/live/ask_live.ex:295 +#, elixir-autogen, elixir-format +msgid "Informational only — not financial advice." +msgstr "Nur zur Information – keine Finanzberatung." + +#: lib/quantic_web/live/radar_live.ex:504 +#, elixir-autogen, elixir-format +msgid "Dividend score" +msgstr "Dividenden-Score" + +#: lib/quantic_web/live/radar_live.ex:503 +#, elixir-autogen, elixir-format +msgid "Dividend yield" +msgstr "Dividendenrendite" + +#: lib/quantic_web/live/radar_live.ex:501 +#, elixir-autogen, elixir-format +msgid "Opportunity" +msgstr "Chance" + +#: lib/quantic_web/live/ask_live.ex:362 +#, elixir-autogen, elixir-format +msgid "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" +msgstr "Du testest eine Demo, daher ist dies eine Beispielantwort statt einer echten Antwort (so bleibt die Demo kostenlos). Mit deinem eigenen Konto lese ich deine echten Positionen, deinen Radar und deine Dividenden, um solche Fragen zu beantworten. Registriere dich, um es wirklich auszuprobieren!" diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 4d73072..c536475 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -17,22 +17,23 @@ msgstr "" msgid "Actions" msgstr "" -#: lib/quantic_web/components/layouts.ex:455 -#: lib/quantic_web/components/layouts.ex:467 +#: lib/quantic_web/components/layouts.ex:466 +#: lib/quantic_web/components/layouts.ex:478 #, elixir-autogen, elixir-format msgid "Attempting to reconnect" msgstr "" -#: lib/quantic_web/components/layouts.ex:65 -#: lib/quantic_web/components/layouts.ex:272 +#: lib/quantic_web/ask_context.ex:39 +#: lib/quantic_web/components/layouts.ex:69 +#: lib/quantic_web/components/layouts.ex:283 #: lib/quantic_web/live/buy_plan_live.ex:26 #: lib/quantic_web/live/buy_plan_live.ex:233 #, elixir-autogen, elixir-format msgid "Buy plan" msgstr "" -#: lib/quantic_web/components/layouts.ex:81 -#: lib/quantic_web/components/layouts.ex:303 +#: lib/quantic_web/components/layouts.ex:85 +#: lib/quantic_web/components/layouts.ex:314 #: lib/quantic_web/live/admin_dashboard_live.ex:211 #: lib/quantic_web/live/community_dashboard_live.ex:27 #: lib/quantic_web/live/community_dashboard_live.ex:65 @@ -40,8 +41,9 @@ msgstr "" msgid "Community" msgstr "" -#: lib/quantic_web/components/layouts.ex:70 -#: lib/quantic_web/components/layouts.ex:282 +#: lib/quantic_web/ask_context.ex:41 +#: lib/quantic_web/components/layouts.ex:74 +#: lib/quantic_web/components/layouts.ex:293 #: lib/quantic_web/components/stock_card_components.ex:589 #: lib/quantic_web/components/stock_card_components.ex:806 #: lib/quantic_web/components/stock_card_components.ex:1267 @@ -52,36 +54,38 @@ msgstr "" msgid "Dividends" msgstr "" -#: lib/quantic_web/components/layouts.ex:75 -#: lib/quantic_web/components/layouts.ex:292 +#: lib/quantic_web/components/layouts.ex:79 +#: lib/quantic_web/components/layouts.ex:303 #, elixir-autogen, elixir-format msgid "Freedom" msgstr "" -#: lib/quantic_web/components/layouts.ex:55 -#: lib/quantic_web/components/layouts.ex:252 +#: lib/quantic_web/ask_context.ex:37 +#: lib/quantic_web/components/layouts.ex:59 +#: lib/quantic_web/components/layouts.ex:263 #: lib/quantic_web/live/path_to_freedom_live.ex:300 #: lib/quantic_web/live/portfolio_live.ex:262 #, elixir-autogen, elixir-format msgid "Portfolio" msgstr "" -#: lib/quantic_web/components/home_components.ex:879 -#: lib/quantic_web/components/layouts.ex:60 -#: lib/quantic_web/components/layouts.ex:262 +#: lib/quantic_web/ask_context.ex:38 +#: lib/quantic_web/components/home_components.ex:915 +#: lib/quantic_web/components/layouts.ex:64 +#: lib/quantic_web/components/layouts.ex:273 #: lib/quantic_web/live/admin_dashboard_live.ex:362 #: lib/quantic_web/live/public_radar_live.ex:105 -#: lib/quantic_web/live/radar_live.ex:254 +#: lib/quantic_web/live/radar_live.ex:269 #, elixir-autogen, elixir-format msgid "Radar" msgstr "" -#: lib/quantic_web/components/layouts.ex:462 +#: lib/quantic_web/components/layouts.ex:473 #, elixir-autogen, elixir-format msgid "Something went wrong!" msgstr "" -#: lib/quantic_web/components/layouts.ex:450 +#: lib/quantic_web/components/layouts.ex:461 #, elixir-autogen, elixir-format msgid "We can't find the internet" msgstr "" @@ -91,7 +95,7 @@ msgstr "" msgid "close" msgstr "" -#: lib/quantic_web/components/home_components.ex:565 +#: lib/quantic_web/components/home_components.ex:601 #: lib/quantic_web/live/public_portfolio_live.ex:123 #, elixir-autogen, elixir-format msgid "%{count} holding" @@ -182,12 +186,12 @@ msgstr "" msgid "Add to portfolio" msgstr "" -#: lib/quantic_web/live/radar_live.ex:294 +#: lib/quantic_web/live/radar_live.ex:289 #, elixir-autogen, elixir-format msgid "Add to radar" msgstr "" -#: lib/quantic_web/live/radar_live.ex:75 +#: lib/quantic_web/live/radar_live.ex:80 #, elixir-autogen, elixir-format msgid "Added %{symbol} to your radar." msgstr "" @@ -313,7 +317,7 @@ msgstr "" msgid "Community sharing" msgstr "" -#: lib/quantic_web/components/home_components.ex:331 +#: lib/quantic_web/components/home_components.ex:367 #: lib/quantic_web/live/community_dashboard_live.ex:101 #, elixir-autogen, elixir-format msgid "Community value" @@ -435,7 +439,7 @@ msgstr "" msgid "Fill price" msgstr "" -#: lib/quantic_web/components/home_components.ex:752 +#: lib/quantic_web/components/home_components.ex:788 #: lib/quantic_web/live/path_to_freedom_live.ex:346 #, elixir-autogen, elixir-format msgid "Freedom in" @@ -446,7 +450,7 @@ msgstr "" msgid "Full history" msgstr "" -#: lib/quantic_web/components/home_components.ex:656 +#: lib/quantic_web/components/home_components.ex:692 #, elixir-autogen, elixir-format msgid "Go to portfolio" msgstr "" @@ -528,13 +532,13 @@ msgstr "" msgid "It expires in 15 minutes." msgstr "" -#: lib/quantic_web/components/layouts.ex:91 +#: lib/quantic_web/components/layouts.ex:95 #: lib/quantic_web/live/settings_live.ex:174 #, elixir-autogen, elixir-format msgid "Language" msgstr "" -#: lib/quantic_web/components/home_components.ex:698 +#: lib/quantic_web/components/home_components.ex:734 #: lib/quantic_web/live/dividends_live.ex:356 #, elixir-autogen, elixir-format msgid "Last 12 months" @@ -542,7 +546,7 @@ msgstr "" #: lib/quantic_web/live/dividends_live.ex:80 #: lib/quantic_web/live/portfolio_live.ex:105 -#: lib/quantic_web/live/radar_live.ex:86 +#: lib/quantic_web/live/radar_live.ex:91 #, elixir-autogen, elixir-format msgid "Market-data provider is unreachable right now. Please try again." msgstr "" @@ -621,8 +625,9 @@ msgstr "" msgid "Other capital (bonds, savings, index funds)" msgstr "" +#: lib/quantic_web/ask_context.ex:40 #: lib/quantic_web/components/home_components.ex:245 -#: lib/quantic_web/components/home_components.ex:745 +#: lib/quantic_web/components/home_components.ex:781 #: lib/quantic_web/live/path_to_freedom_live.ex:24 #: lib/quantic_web/live/path_to_freedom_live.ex:91 #, elixir-autogen, elixir-format @@ -661,7 +666,7 @@ msgstr "" msgid "Portfolio value" msgstr "" -#: lib/quantic_web/components/home_components.ex:337 +#: lib/quantic_web/components/home_components.ex:373 #: lib/quantic_web/live/admin_dashboard_live.ex:151 #: lib/quantic_web/live/community_dashboard_live.ex:74 #: lib/quantic_web/live/community_dashboard_live.ex:81 @@ -784,7 +789,7 @@ msgstr "" msgid "Remove this stock from your radar?" msgstr "" -#: lib/quantic_web/live/radar_live.ex:196 +#: lib/quantic_web/live/radar_live.ex:212 #, elixir-autogen, elixir-format msgid "Removed %{symbol} from your radar." msgstr "" @@ -822,14 +827,15 @@ msgstr "" msgid "Saved!" msgstr "" -#: lib/quantic_web/components/home_components.ex:622 +#: lib/quantic_web/components/home_components.ex:658 #: lib/quantic_web/live/portfolio_live.ex:440 #: lib/quantic_web/live/public_portfolio_live.ex:166 #, elixir-autogen, elixir-format msgid "Sectors" msgstr "" -#: lib/quantic_web/components/layouts.ex:340 +#: lib/quantic_web/ask_context.ex:42 +#: lib/quantic_web/components/layouts.ex:351 #: lib/quantic_web/live/community_dashboard_live.ex:372 #: lib/quantic_web/live/settings_live.ex:157 #, elixir-autogen, elixir-format @@ -922,6 +928,7 @@ msgstr "" #: lib/quantic_web/components/stock_card_components.ex:924 #: lib/quantic_web/live/dividends_live.ex:396 #: lib/quantic_web/live/portfolio_live.ex:565 +#: lib/quantic_web/live/radar_live.ex:502 #, elixir-autogen, elixir-format msgid "Symbol" msgstr "" @@ -996,7 +1003,7 @@ msgid "Underweight position" msgstr "" #: lib/quantic_web/live/portfolio_live.ex:188 -#: lib/quantic_web/live/radar_live.ex:138 +#: lib/quantic_web/live/radar_live.ex:154 #, elixir-autogen, elixir-format msgid "Updated %{symbol}." msgstr "" @@ -1013,7 +1020,7 @@ msgstr "" #: lib/quantic_web/live/dividends_live.ex:73 #: lib/quantic_web/live/portfolio_live.ex:98 -#: lib/quantic_web/live/radar_live.ex:79 +#: lib/quantic_web/live/radar_live.ex:84 #, elixir-autogen, elixir-format msgid "We couldn't find that symbol on the market." msgstr "" @@ -1114,18 +1121,18 @@ msgstr "" msgid "← Back to home" msgstr "" -#: lib/quantic_web/components/layouts.ex:180 +#: lib/quantic_web/components/layouts.ex:184 #, elixir-autogen, elixir-format msgid "Sign up to start your own" msgstr "" -#: lib/quantic_web/components/layouts.ex:176 +#: lib/quantic_web/components/layouts.ex:180 #, elixir-autogen, elixir-format msgid "You're exploring a demo portfolio — changes are yours to play with and expire in 24h." msgstr "" #: lib/quantic_web/live/portfolio_live.ex:369 -#: lib/quantic_web/live/radar_live.ex:270 +#: lib/quantic_web/live/radar_live.ex:303 #, elixir-autogen, elixir-format msgid "AI insights" msgstr "" @@ -1149,42 +1156,22 @@ msgstr "" msgid "Analyzing your stocks…" msgstr "" -#: lib/quantic_web/components/ai_components.ex:179 -#, elixir-autogen, elixir-format -msgid "Avoid" -msgstr "" - -#: lib/quantic_web/components/ai_components.ex:176 -#, elixir-autogen, elixir-format -msgid "Buy" -msgstr "" - #: lib/quantic_web/components/ai_components.ex:86 #, elixir-autogen, elixir-format msgid "Buying opportunities" msgstr "" -#: lib/quantic_web/components/ai_components.ex:178 -#, elixir-autogen, elixir-format -msgid "Caution" -msgstr "" - #: lib/quantic_web/components/ai_components.ex:104 #, elixir-autogen, elixir-format msgid "Dividend coverage" msgstr "" -#: lib/quantic_web/components/ai_components.ex:177 -#, elixir-autogen, elixir-format -msgid "Hold" -msgstr "" - #: lib/quantic_web/live/portfolio_live.ex:393 #, elixir-autogen, elixir-format msgid "Portfolio AI insights" msgstr "" -#: lib/quantic_web/live/radar_live.ex:300 +#: lib/quantic_web/live/radar_live.ex:320 #, elixir-autogen, elixir-format msgid "Radar AI insights" msgstr "" @@ -1199,12 +1186,8 @@ msgstr "" msgid "Strengths" msgstr "" -#: lib/quantic_web/components/ai_components.ex:175 -#, elixir-autogen, elixir-format -msgid "Strong buy" -msgstr "" - -#: lib/quantic_web/components/ai_components.ex:162 +#: lib/quantic_web/components/ai_components.ex:157 +#: lib/quantic_web/live/ask_live.ex:259 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — your quota resets at midnight UTC." msgstr "" @@ -1219,7 +1202,7 @@ msgstr "" msgid "Ask the bot about your portfolio, radar and dividends." msgstr "" -#: lib/quantic_web/components/home_components.ex:408 +#: lib/quantic_web/components/home_components.ex:444 #: lib/quantic_web/live/settings_live.ex:307 #, elixir-autogen, elixir-format msgid "Connect Telegram" @@ -1293,7 +1276,8 @@ msgid "Refresh status" msgstr "" #: lib/quantic/telegram/handler.ex:79 -#: lib/quantic/telegram/handler.ex:201 +#: lib/quantic/telegram/handler.ex:204 +#: lib/quantic_web/live/ask_live.ex:264 #, elixir-autogen, elixir-format msgid "Something went wrong — please try again." msgstr "" @@ -1323,7 +1307,7 @@ msgstr "" msgid "Use /notifications on|off to change." msgstr "" -#: lib/quantic/telegram/handler.ex:195 +#: lib/quantic/telegram/handler.ex:198 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — quota resets at midnight UTC." msgstr "" @@ -1368,38 +1352,38 @@ msgstr "" msgid "📊 Your Quantic daily digest" msgstr "" -#: lib/quantic_web/components/layouts.ex:408 +#: lib/quantic_web/components/layouts.ex:419 #, elixir-autogen, elixir-format msgid "Built with Elixir, Phoenix LiveView, and Tailwind CSS" msgstr "" -#: lib/quantic_web/components/layouts.ex:227 +#: lib/quantic_web/components/layouts.ex:238 #, elixir-autogen, elixir-format msgid "Close menu" msgstr "" -#: lib/quantic_web/components/layouts.ex:313 +#: lib/quantic_web/components/layouts.ex:324 #, elixir-autogen, elixir-format msgid "FAQ" msgstr "" -#: lib/quantic_web/components/layouts.ex:421 +#: lib/quantic_web/components/layouts.ex:432 #, elixir-autogen, elixir-format msgid "Frequently Asked Questions" msgstr "" -#: lib/quantic_web/components/layouts.ex:241 +#: lib/quantic_web/components/layouts.ex:252 #, elixir-autogen, elixir-format msgid "Home" msgstr "" -#: lib/quantic_web/components/layouts.ex:158 -#: lib/quantic_web/components/layouts.ex:223 +#: lib/quantic_web/components/layouts.ex:162 +#: lib/quantic_web/components/layouts.ex:234 #, elixir-autogen, elixir-format msgid "Menu" msgstr "" -#: lib/quantic_web/components/layouts.ex:218 +#: lib/quantic_web/components/layouts.ex:229 #, elixir-autogen, elixir-format msgid "Navigation menu" msgstr "" @@ -1409,42 +1393,42 @@ msgstr "" msgid "New here? Signing in creates your account automatically." msgstr "" -#: lib/quantic_web/components/layouts.ex:149 -#: lib/quantic_web/components/layouts.ex:355 +#: lib/quantic_web/components/layouts.ex:153 +#: lib/quantic_web/components/layouts.ex:366 #, elixir-autogen, elixir-format msgid "Sign in" msgstr "" -#: lib/quantic_web/components/layouts.ex:345 +#: lib/quantic_web/components/layouts.ex:356 #, elixir-autogen, elixir-format msgid "Sign out" msgstr "" -#: lib/quantic_web/components/layouts.ex:398 +#: lib/quantic_web/components/layouts.ex:409 #, elixir-autogen, elixir-format msgid "The information on Quantic is provided for informational and educational purposes only. It is general in nature, does not take into account your personal financial situation, and does not constitute investment, financial, tax, or legal advice — nor a recommendation to buy or sell any security. Investing involves risk, including possible loss of principal; past performance is not a reliable indicator of future results. Market data comes from third-party providers and may be delayed or inaccurate. Before making any investment decision, consider your objectives, time horizon, risk tolerance, and diversification, and consult a qualified financial professional. Quantic is not a registered investment adviser or broker-dealer." msgstr "" -#: lib/quantic_web/components/home_components.ex:397 +#: lib/quantic_web/components/home_components.ex:433 #, elixir-autogen, elixir-format msgid "\"what dividends did I get this month?\" · \"show my radar\" · \"any ex-divs this week?\"" msgstr "" -#: lib/quantic_web/components/home_components.ex:568 +#: lib/quantic_web/components/home_components.ex:604 #, elixir-autogen, elixir-format msgid "%{count} on radar" msgid_plural "%{count} on radar" msgstr[0] "" msgstr[1] "" -#: lib/quantic_web/components/home_components.ex:721 +#: lib/quantic_web/components/home_components.ex:757 #, elixir-autogen, elixir-format msgid "+ %{count} more currency" msgid_plural "+ %{count} more currencies" msgstr[0] "" msgstr[1] "" -#: lib/quantic_web/components/home_components.ex:289 +#: lib/quantic_web/components/home_components.ex:325 #, elixir-autogen, elixir-format msgid "A live community of dividend investors. Browse what others hold, what they target, and how they structure their portfolios." msgstr "" @@ -1459,12 +1443,12 @@ msgstr "" msgid "Add stocks with target prices. We track price, score, and ex-div dates." msgstr "" -#: lib/quantic_web/components/home_components.ex:648 +#: lib/quantic_web/components/home_components.ex:684 #, elixir-autogen, elixir-format msgid "Add your first holding" msgstr "" -#: lib/quantic_web/components/home_components.ex:392 +#: lib/quantic_web/components/home_components.ex:428 #, elixir-autogen, elixir-format msgid "Ask your portfolio anything in natural language — ex-divs, totals, target prices — right from Telegram." msgstr "" @@ -1479,22 +1463,22 @@ msgstr "" msgid "Create your plan" msgstr "" -#: lib/quantic_web/components/home_components.ex:616 +#: lib/quantic_web/components/home_components.ex:652 #, elixir-autogen, elixir-format msgid "Current yield" msgstr "" -#: lib/quantic_web/components/home_components.ex:678 +#: lib/quantic_web/components/home_components.ex:714 #, elixir-autogen, elixir-format msgid "Dividend income" msgstr "" -#: lib/quantic_web/components/home_components.ex:862 +#: lib/quantic_web/components/home_components.ex:898 #, elixir-autogen, elixir-format msgid "Ex-dividend dates in the next %{days} days" msgstr "" -#: lib/quantic_web/components/home_components.ex:954 +#: lib/quantic_web/components/home_components.ex:990 #: lib/quantic_web/components/stock_card_components.ex:143 #: lib/quantic_web/live/buy_plan_live.ex:546 #, elixir-autogen, elixir-format @@ -1506,7 +1490,7 @@ msgstr "" msgid "Free · No broker connection required · Open source" msgstr "" -#: lib/quantic_web/components/home_components.ex:515 +#: lib/quantic_web/components/home_components.ex:551 #, elixir-autogen, elixir-format msgid "Free, no broker connection required. Try a sample portfolio or sign up to build your own." msgstr "" @@ -1521,17 +1505,17 @@ msgstr "" msgid "Get AI insights" msgstr "" -#: lib/quantic_web/components/home_components.ex:557 +#: lib/quantic_web/components/home_components.ex:593 #, elixir-autogen, elixir-format msgid "Good afternoon, %{name}" msgstr "" -#: lib/quantic_web/components/home_components.ex:559 +#: lib/quantic_web/components/home_components.ex:595 #, elixir-autogen, elixir-format msgid "Good evening, %{name}" msgstr "" -#: lib/quantic_web/components/home_components.ex:555 +#: lib/quantic_web/components/home_components.ex:591 #, elixir-autogen, elixir-format msgid "Good morning, %{name}" msgstr "" @@ -1546,32 +1530,32 @@ msgstr "" msgid "Log holdings to get live yield, sector mix, and dividend forecast." msgstr "" -#: lib/quantic_web/live/home_live.ex:120 +#: lib/quantic_web/live/home_live.ex:121 #, elixir-autogen, elixir-format msgid "Most Added to Radar" msgstr "" -#: lib/quantic_web/live/home_live.ex:125 +#: lib/quantic_web/live/home_live.ex:126 #, elixir-autogen, elixir-format msgid "Most Held in Portfolios" msgstr "" -#: lib/quantic_web/components/home_components.ex:572 +#: lib/quantic_web/components/home_components.ex:608 #, elixir-autogen, elixir-format msgid "Next ex-div: %{symbol} in %{days}d" msgstr "" -#: lib/quantic_web/components/home_components.ex:480 +#: lib/quantic_web/components/home_components.ex:516 #, elixir-autogen, elixir-format msgid "No stocks found." msgstr "" -#: lib/quantic_web/components/home_components.ex:577 +#: lib/quantic_web/components/home_components.ex:613 #, elixir-autogen, elixir-format msgid "No upcoming ex-div dates" msgstr "" -#: lib/quantic_web/components/home_components.ex:793 +#: lib/quantic_web/components/home_components.ex:829 #, elixir-autogen, elixir-format msgid "Open my plan" msgstr "" @@ -1581,32 +1565,32 @@ msgstr "" msgid "Plain-language analysis of your portfolio and radar — risks, gaps, opportunities." msgstr "" -#: lib/quantic_web/components/home_components.ex:608 +#: lib/quantic_web/components/home_components.ex:644 #, elixir-autogen, elixir-format msgid "Portfolio stats" msgstr "" -#: lib/quantic_web/components/home_components.ex:388 +#: lib/quantic_web/components/home_components.ex:424 #, elixir-autogen, elixir-format msgid "Quantic in Telegram" msgstr "" -#: lib/quantic_web/live/home_live.ex:130 +#: lib/quantic_web/live/home_live.ex:131 #, elixir-autogen, elixir-format msgid "Recently Updated" msgstr "" -#: lib/quantic_web/components/home_components.ex:298 +#: lib/quantic_web/components/home_components.ex:334 #, elixir-autogen, elixir-format msgid "See the community" msgstr "" -#: lib/quantic_web/components/home_components.ex:285 +#: lib/quantic_web/components/home_components.ex:321 #, elixir-autogen, elixir-format msgid "Share your portfolio with the community" msgstr "" -#: lib/quantic_web/components/home_components.ex:529 +#: lib/quantic_web/components/home_components.ex:565 #, elixir-autogen, elixir-format msgid "Sign up" msgstr "" @@ -1616,39 +1600,39 @@ msgstr "" msgid "Sign up free" msgstr "" -#: lib/quantic_web/components/home_components.ex:410 +#: lib/quantic_web/components/home_components.ex:446 #, elixir-autogen, elixir-format msgid "Sign up to connect" msgstr "" -#: lib/quantic_web/components/home_components.ex:304 +#: lib/quantic_web/components/home_components.ex:340 #, elixir-autogen, elixir-format msgid "Sign up to share yours" msgstr "" -#: lib/quantic_web/components/home_components.ex:512 +#: lib/quantic_web/components/home_components.ex:548 #, elixir-autogen, elixir-format msgid "Start your radar in 30 seconds" msgstr "" -#: lib/quantic_web/components/home_components.ex:953 +#: lib/quantic_web/components/home_components.ex:989 #: lib/quantic_web/components/stock_card_components.ex:142 #: lib/quantic_web/live/buy_plan_live.ex:545 #, elixir-autogen, elixir-format msgid "Strong" msgstr "" -#: lib/quantic_web/components/home_components.ex:690 +#: lib/quantic_web/components/home_components.ex:726 #, elixir-autogen, elixir-format msgid "This month" msgstr "" -#: lib/quantic_web/components/home_components.ex:435 +#: lib/quantic_web/components/home_components.ex:471 #, elixir-autogen, elixir-format msgid "Top Dividend Scores" msgstr "" -#: lib/quantic_web/components/home_components.ex:650 +#: lib/quantic_web/components/home_components.ex:686 #, elixir-autogen, elixir-format msgid "Track real yield, dividend forecast, and sector mix. Takes a minute." msgstr "" @@ -1673,17 +1657,17 @@ msgstr "" msgid "Try a sample portfolio" msgstr "" -#: lib/quantic_web/components/home_components.ex:526 +#: lib/quantic_web/components/home_components.ex:562 #, elixir-autogen, elixir-format msgid "Try the demo" msgstr "" -#: lib/quantic_web/components/home_components.ex:821 +#: lib/quantic_web/components/home_components.ex:857 #, elixir-autogen, elixir-format msgid "View full buy plan" msgstr "" -#: lib/quantic_web/components/home_components.ex:955 +#: lib/quantic_web/components/home_components.ex:991 #: lib/quantic_web/components/stock_card_components.ex:144 #: lib/quantic_web/live/buy_plan_live.ex:547 #, elixir-autogen, elixir-format @@ -1695,12 +1679,12 @@ msgstr "" msgid "What investors are watching" msgstr "" -#: lib/quantic_web/components/home_components.ex:612 +#: lib/quantic_web/components/home_components.ex:648 #, elixir-autogen, elixir-format msgid "Yield on cost" msgstr "" -#: lib/quantic_web/components/home_components.ex:815 +#: lib/quantic_web/components/home_components.ex:851 #, elixir-autogen, elixir-format msgid "Your next picks" msgstr "" @@ -1715,13 +1699,13 @@ msgstr "" msgid "ex-div dates" msgstr "" -#: lib/quantic_web/components/home_components.ex:900 +#: lib/quantic_web/components/home_components.ex:936 #, elixir-autogen, elixir-format msgid "in %{days}d" msgstr "" -#: lib/quantic_web/live/home_live.ex:199 -#: lib/quantic_web/live/home_live.ex:210 +#: lib/quantic_web/live/home_live.ex:200 +#: lib/quantic_web/live/home_live.ex:211 #, elixir-autogen, elixir-format msgid "investor" msgstr "" @@ -1731,12 +1715,12 @@ msgstr "" msgid "radar targets" msgstr "" -#: lib/quantic_web/components/home_components.ex:896 +#: lib/quantic_web/components/home_components.ex:932 #, elixir-autogen, elixir-format msgid "today" msgstr "" -#: lib/quantic_web/components/home_components.ex:898 +#: lib/quantic_web/components/home_components.ex:934 #, elixir-autogen, elixir-format msgid "tomorrow" msgstr "" @@ -1756,17 +1740,17 @@ msgstr "" msgid "%{percentage}% below target" msgstr "" -#: lib/quantic_web/live/radar_live.ex:430 +#: lib/quantic_web/live/radar_live.ex:450 #, elixir-autogen, elixir-format msgid "200-day average" msgstr "" -#: lib/quantic_web/live/radar_live.ex:436 +#: lib/quantic_web/live/radar_live.ex:456 #, elixir-autogen, elixir-format msgid "50-day average" msgstr "" -#: lib/quantic_web/live/radar_live.ex:424 +#: lib/quantic_web/live/radar_live.ex:444 #, elixir-autogen, elixir-format msgid "52-week midpoint" msgstr "" @@ -1798,7 +1782,7 @@ msgstr "" msgid "Click to edit" msgstr "" -#: lib/quantic_web/live/radar_live.ex:418 +#: lib/quantic_web/live/radar_live.ex:438 #, elixir-autogen, elixir-format msgid "Community average" msgstr "" @@ -1808,7 +1792,7 @@ msgstr "" msgid "Compact view" msgstr "" -#: lib/quantic_web/live/radar_live.ex:182 +#: lib/quantic_web/live/radar_live.ex:198 #, elixir-autogen, elixir-format msgid "Could not apply that target price." msgstr "" @@ -1863,12 +1847,12 @@ msgstr "" msgid "Market value" msgstr "" -#: lib/quantic_web/live/radar_live.ex:446 +#: lib/quantic_web/live/radar_live.ex:466 #, elixir-autogen, elixir-format msgid "Needs 3+ community targets (%{count} so far)" msgstr "" -#: lib/quantic_web/live/radar_live.ex:448 +#: lib/quantic_web/live/radar_live.ex:468 #, elixir-autogen, elixir-format msgid "No community targets yet" msgstr "" @@ -1894,13 +1878,13 @@ msgstr "" msgid "No target set" msgstr "" -#: lib/quantic_web/live/radar_live.ex:313 -#: lib/quantic_web/live/radar_live.ex:328 +#: lib/quantic_web/live/radar_live.ex:333 +#: lib/quantic_web/live/radar_live.ex:348 #, elixir-autogen, elixir-format msgid "Nothing on your radar yet. Search above to add your first stock." msgstr "" -#: lib/quantic_web/live/radar_live.ex:285 +#: lib/quantic_web/live/radar_live.ex:280 #, elixir-autogen, elixir-format msgid "On radar" msgstr "" @@ -1916,7 +1900,7 @@ msgid "Position" msgstr "" #: lib/quantic_web/live/portfolio_live.ex:377 -#: lib/quantic_web/live/radar_live.ex:262 +#: lib/quantic_web/live/radar_live.ex:311 #, elixir-autogen, elixir-format msgid "Public page" msgstr "" @@ -1928,7 +1912,7 @@ msgid "Score" msgstr "" #: lib/quantic_web/live/portfolio_live.ex:306 -#: lib/quantic_web/live/radar_live.ex:280 +#: lib/quantic_web/live/radar_live.ex:275 #, elixir-autogen, elixir-format msgid "Search by ticker or company name…" msgstr "" @@ -1956,12 +1940,12 @@ msgstr "" msgid "Suggest a target" msgstr "" -#: lib/quantic_web/live/radar_live.ex:175 +#: lib/quantic_web/live/radar_live.ex:191 #, elixir-autogen, elixir-format msgid "Target for %{symbol} set to %{price}." msgstr "" -#: lib/quantic_web/live/radar_live.ex:90 +#: lib/quantic_web/live/radar_live.ex:95 #, elixir-autogen, elixir-format msgid "That stock is already on your radar." msgstr "" @@ -2078,7 +2062,7 @@ msgstr "" #: lib/quantic_web/live/admin_content_drafts_live.ex:272 #: lib/quantic_web/live/portfolio_live.ex:447 -#: lib/quantic_web/live/radar_live.ex:342 +#: lib/quantic_web/live/radar_live.ex:362 #, elixir-autogen, elixir-format msgid "Dividend calendar" msgstr "" @@ -2334,7 +2318,7 @@ msgstr "" msgid "Monthly dividend goal (today's money)" msgstr "" -#: lib/quantic_web/components/home_components.ex:762 +#: lib/quantic_web/components/home_components.ex:798 #: lib/quantic_web/live/path_to_freedom_live.ex:379 #, elixir-autogen, elixir-format msgid "Not in reach yet" @@ -2440,7 +2424,7 @@ msgstr "" msgid "Your journey to freedom" msgstr "" -#: lib/quantic_web/components/home_components.ex:757 +#: lib/quantic_web/components/home_components.ex:793 #: lib/quantic_web/live/path_to_freedom_live.ex:353 #: lib/quantic_web/live/path_to_freedom_live.ex:856 #: lib/quantic_web/live/path_to_freedom_live.ex:1066 @@ -2494,7 +2478,7 @@ msgstr "" msgid "✓ today" msgstr "" -#: lib/quantic_web/components/home_components.ex:765 +#: lib/quantic_web/components/home_components.ex:801 #, elixir-autogen, elixir-format msgid "Keep going — see what changes it" msgstr "" @@ -2524,7 +2508,7 @@ msgstr "" msgid "The year, and your age, when dividends cover your goal" msgstr "" -#: lib/quantic_web/components/home_components.ex:783 +#: lib/quantic_web/components/home_components.ex:819 #, elixir-autogen, elixir-format msgid "per month" msgstr "" @@ -2741,7 +2725,7 @@ msgstr "" msgid "Activity" msgstr "" -#: lib/quantic_web/components/layouts.ex:330 +#: lib/quantic_web/components/layouts.ex:341 #: lib/quantic_web/live/admin_content_drafts_live.ex:112 #: lib/quantic_web/live/admin_dashboard_live.ex:18 #: lib/quantic_web/live/admin_dashboard_live.ex:64 @@ -3189,3 +3173,115 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Your public link" msgstr "" + +#: lib/quantic_web/components/home_components.ex:292 +#, elixir-autogen, elixir-format +msgid "\"Any ex-dividends this week?\"" +msgstr "" + +#: lib/quantic_web/components/home_components.ex:290 +#, elixir-autogen, elixir-format +msgid "\"What dividends did I get this month?\"" +msgstr "" + +#: lib/quantic_web/components/home_components.ex:291 +#, elixir-autogen, elixir-format +msgid "\"What's my biggest holding?\"" +msgstr "" + +#: lib/quantic_web/components/home_components.ex:289 +#, elixir-autogen, elixir-format +msgid "\"Which of my stocks are below my target?\"" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:208 +#, elixir-autogen, elixir-format +msgid "%{remaining}/%{limit} left" +msgstr "" + +#: lib/quantic_web/components/home_components.ex:284 +#, elixir-autogen, elixir-format +msgid "An AI assistant on every page. Ask about your portfolio, radar, and dividends in plain language — it reads your own data to answer." +msgstr "" + +#: lib/quantic_web/components/home_components.ex:281 +#: lib/quantic_web/live/ask_live.ex:196 +#: lib/quantic_web/live/ask_live.ex:303 +#, elixir-autogen, elixir-format +msgid "Ask Quantic" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:279 +#, elixir-autogen, elixir-format +msgid "Ask a question…" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:217 +#, elixir-autogen, elixir-format +msgid "Ask me about your portfolio, radar or dividends." +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:379 +#, elixir-autogen, elixir-format +msgid "Dividends this month?" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:288 +#, elixir-autogen, elixir-format +msgid "Send" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:256 +#, elixir-autogen, elixir-format +msgid "Thinking…" +msgstr "" + +#: lib/quantic_web/components/home_components.ex:299 +#, elixir-autogen, elixir-format +msgid "Try it" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:376 +#, elixir-autogen, elixir-format +msgid "What's my biggest holding?" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:378 +#, elixir-autogen, elixir-format +msgid "Which stocks are below my target?" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:201 +#, elixir-autogen, elixir-format +msgid "on %{page}" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:377 +#, elixir-autogen, elixir-format +msgid "What do you think of KO?" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:295 +#, elixir-autogen, elixir-format +msgid "Informational only — not financial advice." +msgstr "" + +#: lib/quantic_web/live/radar_live.ex:504 +#, elixir-autogen, elixir-format +msgid "Dividend score" +msgstr "" + +#: lib/quantic_web/live/radar_live.ex:503 +#, elixir-autogen, elixir-format +msgid "Dividend yield" +msgstr "" + +#: lib/quantic_web/live/radar_live.ex:501 +#, elixir-autogen, elixir-format +msgid "Opportunity" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:362 +#, elixir-autogen, elixir-format +msgid "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index e4688a0..258dcf2 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -17,22 +17,23 @@ msgstr "" msgid "Actions" msgstr "" -#: lib/quantic_web/components/layouts.ex:455 -#: lib/quantic_web/components/layouts.ex:467 +#: lib/quantic_web/components/layouts.ex:466 +#: lib/quantic_web/components/layouts.ex:478 #, elixir-autogen, elixir-format msgid "Attempting to reconnect" msgstr "" -#: lib/quantic_web/components/layouts.ex:65 -#: lib/quantic_web/components/layouts.ex:272 +#: lib/quantic_web/ask_context.ex:39 +#: lib/quantic_web/components/layouts.ex:69 +#: lib/quantic_web/components/layouts.ex:283 #: lib/quantic_web/live/buy_plan_live.ex:26 #: lib/quantic_web/live/buy_plan_live.ex:233 #, elixir-autogen, elixir-format msgid "Buy plan" msgstr "" -#: lib/quantic_web/components/layouts.ex:81 -#: lib/quantic_web/components/layouts.ex:303 +#: lib/quantic_web/components/layouts.ex:85 +#: lib/quantic_web/components/layouts.ex:314 #: lib/quantic_web/live/admin_dashboard_live.ex:211 #: lib/quantic_web/live/community_dashboard_live.ex:27 #: lib/quantic_web/live/community_dashboard_live.ex:65 @@ -40,8 +41,9 @@ msgstr "" msgid "Community" msgstr "" -#: lib/quantic_web/components/layouts.ex:70 -#: lib/quantic_web/components/layouts.ex:282 +#: lib/quantic_web/ask_context.ex:41 +#: lib/quantic_web/components/layouts.ex:74 +#: lib/quantic_web/components/layouts.ex:293 #: lib/quantic_web/components/stock_card_components.ex:589 #: lib/quantic_web/components/stock_card_components.ex:806 #: lib/quantic_web/components/stock_card_components.ex:1267 @@ -52,36 +54,38 @@ msgstr "" msgid "Dividends" msgstr "" -#: lib/quantic_web/components/layouts.ex:75 -#: lib/quantic_web/components/layouts.ex:292 +#: lib/quantic_web/components/layouts.ex:79 +#: lib/quantic_web/components/layouts.ex:303 #, elixir-autogen, elixir-format msgid "Freedom" msgstr "" -#: lib/quantic_web/components/layouts.ex:55 -#: lib/quantic_web/components/layouts.ex:252 +#: lib/quantic_web/ask_context.ex:37 +#: lib/quantic_web/components/layouts.ex:59 +#: lib/quantic_web/components/layouts.ex:263 #: lib/quantic_web/live/path_to_freedom_live.ex:300 #: lib/quantic_web/live/portfolio_live.ex:262 #, elixir-autogen, elixir-format msgid "Portfolio" msgstr "" -#: lib/quantic_web/components/home_components.ex:879 -#: lib/quantic_web/components/layouts.ex:60 -#: lib/quantic_web/components/layouts.ex:262 +#: lib/quantic_web/ask_context.ex:38 +#: lib/quantic_web/components/home_components.ex:915 +#: lib/quantic_web/components/layouts.ex:64 +#: lib/quantic_web/components/layouts.ex:273 #: lib/quantic_web/live/admin_dashboard_live.ex:362 #: lib/quantic_web/live/public_radar_live.ex:105 -#: lib/quantic_web/live/radar_live.ex:254 +#: lib/quantic_web/live/radar_live.ex:269 #, elixir-autogen, elixir-format msgid "Radar" msgstr "" -#: lib/quantic_web/components/layouts.ex:462 +#: lib/quantic_web/components/layouts.ex:473 #, elixir-autogen, elixir-format msgid "Something went wrong!" msgstr "" -#: lib/quantic_web/components/layouts.ex:450 +#: lib/quantic_web/components/layouts.ex:461 #, elixir-autogen, elixir-format msgid "We can't find the internet" msgstr "" @@ -91,7 +95,7 @@ msgstr "" msgid "close" msgstr "" -#: lib/quantic_web/components/home_components.ex:565 +#: lib/quantic_web/components/home_components.ex:601 #: lib/quantic_web/live/public_portfolio_live.ex:123 #, elixir-autogen, elixir-format msgid "%{count} holding" @@ -182,12 +186,12 @@ msgstr "" msgid "Add to portfolio" msgstr "" -#: lib/quantic_web/live/radar_live.ex:294 +#: lib/quantic_web/live/radar_live.ex:289 #, elixir-autogen, elixir-format msgid "Add to radar" msgstr "" -#: lib/quantic_web/live/radar_live.ex:75 +#: lib/quantic_web/live/radar_live.ex:80 #, elixir-autogen, elixir-format msgid "Added %{symbol} to your radar." msgstr "" @@ -313,7 +317,7 @@ msgstr "" msgid "Community sharing" msgstr "" -#: lib/quantic_web/components/home_components.ex:331 +#: lib/quantic_web/components/home_components.ex:367 #: lib/quantic_web/live/community_dashboard_live.ex:101 #, elixir-autogen, elixir-format msgid "Community value" @@ -435,7 +439,7 @@ msgstr "" msgid "Fill price" msgstr "" -#: lib/quantic_web/components/home_components.ex:752 +#: lib/quantic_web/components/home_components.ex:788 #: lib/quantic_web/live/path_to_freedom_live.ex:346 #, elixir-autogen, elixir-format msgid "Freedom in" @@ -446,7 +450,7 @@ msgstr "" msgid "Full history" msgstr "" -#: lib/quantic_web/components/home_components.ex:656 +#: lib/quantic_web/components/home_components.ex:692 #, elixir-autogen, elixir-format msgid "Go to portfolio" msgstr "" @@ -528,13 +532,13 @@ msgstr "" msgid "It expires in 15 minutes." msgstr "" -#: lib/quantic_web/components/layouts.ex:91 +#: lib/quantic_web/components/layouts.ex:95 #: lib/quantic_web/live/settings_live.ex:174 #, elixir-autogen, elixir-format msgid "Language" msgstr "" -#: lib/quantic_web/components/home_components.ex:698 +#: lib/quantic_web/components/home_components.ex:734 #: lib/quantic_web/live/dividends_live.ex:356 #, elixir-autogen, elixir-format msgid "Last 12 months" @@ -542,7 +546,7 @@ msgstr "" #: lib/quantic_web/live/dividends_live.ex:80 #: lib/quantic_web/live/portfolio_live.ex:105 -#: lib/quantic_web/live/radar_live.ex:86 +#: lib/quantic_web/live/radar_live.ex:91 #, elixir-autogen, elixir-format msgid "Market-data provider is unreachable right now. Please try again." msgstr "" @@ -621,8 +625,9 @@ msgstr "" msgid "Other capital (bonds, savings, index funds)" msgstr "" +#: lib/quantic_web/ask_context.ex:40 #: lib/quantic_web/components/home_components.ex:245 -#: lib/quantic_web/components/home_components.ex:745 +#: lib/quantic_web/components/home_components.ex:781 #: lib/quantic_web/live/path_to_freedom_live.ex:24 #: lib/quantic_web/live/path_to_freedom_live.ex:91 #, elixir-autogen, elixir-format @@ -661,7 +666,7 @@ msgstr "" msgid "Portfolio value" msgstr "" -#: lib/quantic_web/components/home_components.ex:337 +#: lib/quantic_web/components/home_components.ex:373 #: lib/quantic_web/live/admin_dashboard_live.ex:151 #: lib/quantic_web/live/community_dashboard_live.ex:74 #: lib/quantic_web/live/community_dashboard_live.ex:81 @@ -784,7 +789,7 @@ msgstr "" msgid "Remove this stock from your radar?" msgstr "" -#: lib/quantic_web/live/radar_live.ex:196 +#: lib/quantic_web/live/radar_live.ex:212 #, elixir-autogen, elixir-format msgid "Removed %{symbol} from your radar." msgstr "" @@ -822,14 +827,15 @@ msgstr "" msgid "Saved!" msgstr "" -#: lib/quantic_web/components/home_components.ex:622 +#: lib/quantic_web/components/home_components.ex:658 #: lib/quantic_web/live/portfolio_live.ex:440 #: lib/quantic_web/live/public_portfolio_live.ex:166 #, elixir-autogen, elixir-format msgid "Sectors" msgstr "" -#: lib/quantic_web/components/layouts.ex:340 +#: lib/quantic_web/ask_context.ex:42 +#: lib/quantic_web/components/layouts.ex:351 #: lib/quantic_web/live/community_dashboard_live.ex:372 #: lib/quantic_web/live/settings_live.ex:157 #, elixir-autogen, elixir-format @@ -922,6 +928,7 @@ msgstr "" #: lib/quantic_web/components/stock_card_components.ex:924 #: lib/quantic_web/live/dividends_live.ex:396 #: lib/quantic_web/live/portfolio_live.ex:565 +#: lib/quantic_web/live/radar_live.ex:502 #, elixir-autogen, elixir-format msgid "Symbol" msgstr "" @@ -996,7 +1003,7 @@ msgid "Underweight position" msgstr "" #: lib/quantic_web/live/portfolio_live.ex:188 -#: lib/quantic_web/live/radar_live.ex:138 +#: lib/quantic_web/live/radar_live.ex:154 #, elixir-autogen, elixir-format msgid "Updated %{symbol}." msgstr "" @@ -1013,7 +1020,7 @@ msgstr "" #: lib/quantic_web/live/dividends_live.ex:73 #: lib/quantic_web/live/portfolio_live.ex:98 -#: lib/quantic_web/live/radar_live.ex:79 +#: lib/quantic_web/live/radar_live.ex:84 #, elixir-autogen, elixir-format msgid "We couldn't find that symbol on the market." msgstr "" @@ -1114,18 +1121,18 @@ msgstr "" msgid "← Back to home" msgstr "" -#: lib/quantic_web/components/layouts.ex:180 +#: lib/quantic_web/components/layouts.ex:184 #, elixir-autogen, elixir-format msgid "Sign up to start your own" msgstr "" -#: lib/quantic_web/components/layouts.ex:176 +#: lib/quantic_web/components/layouts.ex:180 #, elixir-autogen, elixir-format msgid "You're exploring a demo portfolio — changes are yours to play with and expire in 24h." msgstr "" #: lib/quantic_web/live/portfolio_live.ex:369 -#: lib/quantic_web/live/radar_live.ex:270 +#: lib/quantic_web/live/radar_live.ex:303 #, elixir-autogen, elixir-format msgid "AI insights" msgstr "" @@ -1149,42 +1156,22 @@ msgstr "" msgid "Analyzing your stocks…" msgstr "" -#: lib/quantic_web/components/ai_components.ex:179 -#, elixir-autogen, elixir-format -msgid "Avoid" -msgstr "" - -#: lib/quantic_web/components/ai_components.ex:176 -#, elixir-autogen, elixir-format -msgid "Buy" -msgstr "" - #: lib/quantic_web/components/ai_components.ex:86 #, elixir-autogen, elixir-format msgid "Buying opportunities" msgstr "" -#: lib/quantic_web/components/ai_components.ex:178 -#, elixir-autogen, elixir-format -msgid "Caution" -msgstr "" - #: lib/quantic_web/components/ai_components.ex:104 #, elixir-autogen, elixir-format msgid "Dividend coverage" msgstr "" -#: lib/quantic_web/components/ai_components.ex:177 -#, elixir-autogen, elixir-format -msgid "Hold" -msgstr "" - #: lib/quantic_web/live/portfolio_live.ex:393 #, elixir-autogen, elixir-format msgid "Portfolio AI insights" msgstr "" -#: lib/quantic_web/live/radar_live.ex:300 +#: lib/quantic_web/live/radar_live.ex:320 #, elixir-autogen, elixir-format msgid "Radar AI insights" msgstr "" @@ -1199,12 +1186,8 @@ msgstr "" msgid "Strengths" msgstr "" -#: lib/quantic_web/components/ai_components.ex:175 -#, elixir-autogen, elixir-format -msgid "Strong buy" -msgstr "" - -#: lib/quantic_web/components/ai_components.ex:162 +#: lib/quantic_web/components/ai_components.ex:157 +#: lib/quantic_web/live/ask_live.ex:259 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — your quota resets at midnight UTC." msgstr "" @@ -1219,7 +1202,7 @@ msgstr "" msgid "Ask the bot about your portfolio, radar and dividends." msgstr "" -#: lib/quantic_web/components/home_components.ex:408 +#: lib/quantic_web/components/home_components.ex:444 #: lib/quantic_web/live/settings_live.ex:307 #, elixir-autogen, elixir-format msgid "Connect Telegram" @@ -1293,7 +1276,8 @@ msgid "Refresh status" msgstr "" #: lib/quantic/telegram/handler.ex:79 -#: lib/quantic/telegram/handler.ex:201 +#: lib/quantic/telegram/handler.ex:204 +#: lib/quantic_web/live/ask_live.ex:264 #, elixir-autogen, elixir-format msgid "Something went wrong — please try again." msgstr "" @@ -1323,7 +1307,7 @@ msgstr "" msgid "Use /notifications on|off to change." msgstr "" -#: lib/quantic/telegram/handler.ex:195 +#: lib/quantic/telegram/handler.ex:198 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — quota resets at midnight UTC." msgstr "" @@ -1368,38 +1352,38 @@ msgstr "" msgid "📊 Your Quantic daily digest" msgstr "" -#: lib/quantic_web/components/layouts.ex:408 +#: lib/quantic_web/components/layouts.ex:419 #, elixir-autogen, elixir-format msgid "Built with Elixir, Phoenix LiveView, and Tailwind CSS" msgstr "" -#: lib/quantic_web/components/layouts.ex:227 +#: lib/quantic_web/components/layouts.ex:238 #, elixir-autogen, elixir-format msgid "Close menu" msgstr "" -#: lib/quantic_web/components/layouts.ex:313 +#: lib/quantic_web/components/layouts.ex:324 #, elixir-autogen, elixir-format msgid "FAQ" msgstr "" -#: lib/quantic_web/components/layouts.ex:421 +#: lib/quantic_web/components/layouts.ex:432 #, elixir-autogen, elixir-format msgid "Frequently Asked Questions" msgstr "" -#: lib/quantic_web/components/layouts.ex:241 +#: lib/quantic_web/components/layouts.ex:252 #, elixir-autogen, elixir-format msgid "Home" msgstr "" -#: lib/quantic_web/components/layouts.ex:158 -#: lib/quantic_web/components/layouts.ex:223 +#: lib/quantic_web/components/layouts.ex:162 +#: lib/quantic_web/components/layouts.ex:234 #, elixir-autogen, elixir-format msgid "Menu" msgstr "" -#: lib/quantic_web/components/layouts.ex:218 +#: lib/quantic_web/components/layouts.ex:229 #, elixir-autogen, elixir-format msgid "Navigation menu" msgstr "" @@ -1409,42 +1393,42 @@ msgstr "" msgid "New here? Signing in creates your account automatically." msgstr "" -#: lib/quantic_web/components/layouts.ex:149 -#: lib/quantic_web/components/layouts.ex:355 +#: lib/quantic_web/components/layouts.ex:153 +#: lib/quantic_web/components/layouts.ex:366 #, elixir-autogen, elixir-format msgid "Sign in" msgstr "" -#: lib/quantic_web/components/layouts.ex:345 +#: lib/quantic_web/components/layouts.ex:356 #, elixir-autogen, elixir-format msgid "Sign out" msgstr "" -#: lib/quantic_web/components/layouts.ex:398 +#: lib/quantic_web/components/layouts.ex:409 #, elixir-autogen, elixir-format msgid "The information on Quantic is provided for informational and educational purposes only. It is general in nature, does not take into account your personal financial situation, and does not constitute investment, financial, tax, or legal advice — nor a recommendation to buy or sell any security. Investing involves risk, including possible loss of principal; past performance is not a reliable indicator of future results. Market data comes from third-party providers and may be delayed or inaccurate. Before making any investment decision, consider your objectives, time horizon, risk tolerance, and diversification, and consult a qualified financial professional. Quantic is not a registered investment adviser or broker-dealer." msgstr "" -#: lib/quantic_web/components/home_components.ex:397 +#: lib/quantic_web/components/home_components.ex:433 #, elixir-autogen, elixir-format msgid "\"what dividends did I get this month?\" · \"show my radar\" · \"any ex-divs this week?\"" msgstr "" -#: lib/quantic_web/components/home_components.ex:568 +#: lib/quantic_web/components/home_components.ex:604 #, elixir-autogen, elixir-format msgid "%{count} on radar" msgid_plural "%{count} on radar" msgstr[0] "" msgstr[1] "" -#: lib/quantic_web/components/home_components.ex:721 +#: lib/quantic_web/components/home_components.ex:757 #, elixir-autogen, elixir-format msgid "+ %{count} more currency" msgid_plural "+ %{count} more currencies" msgstr[0] "" msgstr[1] "" -#: lib/quantic_web/components/home_components.ex:289 +#: lib/quantic_web/components/home_components.ex:325 #, elixir-autogen, elixir-format msgid "A live community of dividend investors. Browse what others hold, what they target, and how they structure their portfolios." msgstr "" @@ -1459,12 +1443,12 @@ msgstr "" msgid "Add stocks with target prices. We track price, score, and ex-div dates." msgstr "" -#: lib/quantic_web/components/home_components.ex:648 +#: lib/quantic_web/components/home_components.ex:684 #, elixir-autogen, elixir-format msgid "Add your first holding" msgstr "" -#: lib/quantic_web/components/home_components.ex:392 +#: lib/quantic_web/components/home_components.ex:428 #, elixir-autogen, elixir-format msgid "Ask your portfolio anything in natural language — ex-divs, totals, target prices — right from Telegram." msgstr "" @@ -1479,22 +1463,22 @@ msgstr "" msgid "Create your plan" msgstr "" -#: lib/quantic_web/components/home_components.ex:616 +#: lib/quantic_web/components/home_components.ex:652 #, elixir-autogen, elixir-format msgid "Current yield" msgstr "" -#: lib/quantic_web/components/home_components.ex:678 +#: lib/quantic_web/components/home_components.ex:714 #, elixir-autogen, elixir-format msgid "Dividend income" msgstr "" -#: lib/quantic_web/components/home_components.ex:862 +#: lib/quantic_web/components/home_components.ex:898 #, elixir-autogen, elixir-format msgid "Ex-dividend dates in the next %{days} days" msgstr "" -#: lib/quantic_web/components/home_components.ex:954 +#: lib/quantic_web/components/home_components.ex:990 #: lib/quantic_web/components/stock_card_components.ex:143 #: lib/quantic_web/live/buy_plan_live.ex:546 #, elixir-autogen, elixir-format @@ -1506,7 +1490,7 @@ msgstr "" msgid "Free · No broker connection required · Open source" msgstr "" -#: lib/quantic_web/components/home_components.ex:515 +#: lib/quantic_web/components/home_components.ex:551 #, elixir-autogen, elixir-format msgid "Free, no broker connection required. Try a sample portfolio or sign up to build your own." msgstr "" @@ -1521,17 +1505,17 @@ msgstr "" msgid "Get AI insights" msgstr "" -#: lib/quantic_web/components/home_components.ex:557 +#: lib/quantic_web/components/home_components.ex:593 #, elixir-autogen, elixir-format msgid "Good afternoon, %{name}" msgstr "" -#: lib/quantic_web/components/home_components.ex:559 +#: lib/quantic_web/components/home_components.ex:595 #, elixir-autogen, elixir-format msgid "Good evening, %{name}" msgstr "" -#: lib/quantic_web/components/home_components.ex:555 +#: lib/quantic_web/components/home_components.ex:591 #, elixir-autogen, elixir-format msgid "Good morning, %{name}" msgstr "" @@ -1546,32 +1530,32 @@ msgstr "" msgid "Log holdings to get live yield, sector mix, and dividend forecast." msgstr "" -#: lib/quantic_web/live/home_live.ex:120 +#: lib/quantic_web/live/home_live.ex:121 #, elixir-autogen, elixir-format msgid "Most Added to Radar" msgstr "" -#: lib/quantic_web/live/home_live.ex:125 +#: lib/quantic_web/live/home_live.ex:126 #, elixir-autogen, elixir-format msgid "Most Held in Portfolios" msgstr "" -#: lib/quantic_web/components/home_components.ex:572 +#: lib/quantic_web/components/home_components.ex:608 #, elixir-autogen, elixir-format msgid "Next ex-div: %{symbol} in %{days}d" msgstr "" -#: lib/quantic_web/components/home_components.ex:480 +#: lib/quantic_web/components/home_components.ex:516 #, elixir-autogen, elixir-format msgid "No stocks found." msgstr "" -#: lib/quantic_web/components/home_components.ex:577 +#: lib/quantic_web/components/home_components.ex:613 #, elixir-autogen, elixir-format msgid "No upcoming ex-div dates" msgstr "" -#: lib/quantic_web/components/home_components.ex:793 +#: lib/quantic_web/components/home_components.ex:829 #, elixir-autogen, elixir-format msgid "Open my plan" msgstr "" @@ -1581,32 +1565,32 @@ msgstr "" msgid "Plain-language analysis of your portfolio and radar — risks, gaps, opportunities." msgstr "" -#: lib/quantic_web/components/home_components.ex:608 +#: lib/quantic_web/components/home_components.ex:644 #, elixir-autogen, elixir-format msgid "Portfolio stats" msgstr "" -#: lib/quantic_web/components/home_components.ex:388 +#: lib/quantic_web/components/home_components.ex:424 #, elixir-autogen, elixir-format msgid "Quantic in Telegram" msgstr "" -#: lib/quantic_web/live/home_live.ex:130 +#: lib/quantic_web/live/home_live.ex:131 #, elixir-autogen, elixir-format msgid "Recently Updated" msgstr "" -#: lib/quantic_web/components/home_components.ex:298 +#: lib/quantic_web/components/home_components.ex:334 #, elixir-autogen, elixir-format msgid "See the community" msgstr "" -#: lib/quantic_web/components/home_components.ex:285 +#: lib/quantic_web/components/home_components.ex:321 #, elixir-autogen, elixir-format msgid "Share your portfolio with the community" msgstr "" -#: lib/quantic_web/components/home_components.ex:529 +#: lib/quantic_web/components/home_components.ex:565 #, elixir-autogen, elixir-format msgid "Sign up" msgstr "" @@ -1616,39 +1600,39 @@ msgstr "" msgid "Sign up free" msgstr "" -#: lib/quantic_web/components/home_components.ex:410 +#: lib/quantic_web/components/home_components.ex:446 #, elixir-autogen, elixir-format msgid "Sign up to connect" msgstr "" -#: lib/quantic_web/components/home_components.ex:304 +#: lib/quantic_web/components/home_components.ex:340 #, elixir-autogen, elixir-format msgid "Sign up to share yours" msgstr "" -#: lib/quantic_web/components/home_components.ex:512 +#: lib/quantic_web/components/home_components.ex:548 #, elixir-autogen, elixir-format msgid "Start your radar in 30 seconds" msgstr "" -#: lib/quantic_web/components/home_components.ex:953 +#: lib/quantic_web/components/home_components.ex:989 #: lib/quantic_web/components/stock_card_components.ex:142 #: lib/quantic_web/live/buy_plan_live.ex:545 #, elixir-autogen, elixir-format msgid "Strong" msgstr "" -#: lib/quantic_web/components/home_components.ex:690 +#: lib/quantic_web/components/home_components.ex:726 #, elixir-autogen, elixir-format msgid "This month" msgstr "" -#: lib/quantic_web/components/home_components.ex:435 +#: lib/quantic_web/components/home_components.ex:471 #, elixir-autogen, elixir-format msgid "Top Dividend Scores" msgstr "" -#: lib/quantic_web/components/home_components.ex:650 +#: lib/quantic_web/components/home_components.ex:686 #, elixir-autogen, elixir-format msgid "Track real yield, dividend forecast, and sector mix. Takes a minute." msgstr "" @@ -1673,17 +1657,17 @@ msgstr "" msgid "Try a sample portfolio" msgstr "" -#: lib/quantic_web/components/home_components.ex:526 +#: lib/quantic_web/components/home_components.ex:562 #, elixir-autogen, elixir-format msgid "Try the demo" msgstr "" -#: lib/quantic_web/components/home_components.ex:821 +#: lib/quantic_web/components/home_components.ex:857 #, elixir-autogen, elixir-format msgid "View full buy plan" msgstr "" -#: lib/quantic_web/components/home_components.ex:955 +#: lib/quantic_web/components/home_components.ex:991 #: lib/quantic_web/components/stock_card_components.ex:144 #: lib/quantic_web/live/buy_plan_live.ex:547 #, elixir-autogen, elixir-format @@ -1695,12 +1679,12 @@ msgstr "" msgid "What investors are watching" msgstr "" -#: lib/quantic_web/components/home_components.ex:612 +#: lib/quantic_web/components/home_components.ex:648 #, elixir-autogen, elixir-format msgid "Yield on cost" msgstr "" -#: lib/quantic_web/components/home_components.ex:815 +#: lib/quantic_web/components/home_components.ex:851 #, elixir-autogen, elixir-format msgid "Your next picks" msgstr "" @@ -1715,13 +1699,13 @@ msgstr "" msgid "ex-div dates" msgstr "" -#: lib/quantic_web/components/home_components.ex:900 +#: lib/quantic_web/components/home_components.ex:936 #, elixir-autogen, elixir-format msgid "in %{days}d" msgstr "" -#: lib/quantic_web/live/home_live.ex:199 -#: lib/quantic_web/live/home_live.ex:210 +#: lib/quantic_web/live/home_live.ex:200 +#: lib/quantic_web/live/home_live.ex:211 #, elixir-autogen, elixir-format msgid "investor" msgstr "" @@ -1731,12 +1715,12 @@ msgstr "" msgid "radar targets" msgstr "" -#: lib/quantic_web/components/home_components.ex:896 +#: lib/quantic_web/components/home_components.ex:932 #, elixir-autogen, elixir-format msgid "today" msgstr "" -#: lib/quantic_web/components/home_components.ex:898 +#: lib/quantic_web/components/home_components.ex:934 #, elixir-autogen, elixir-format msgid "tomorrow" msgstr "" @@ -1756,17 +1740,17 @@ msgstr "" msgid "%{percentage}% below target" msgstr "" -#: lib/quantic_web/live/radar_live.ex:430 +#: lib/quantic_web/live/radar_live.ex:450 #, elixir-autogen, elixir-format msgid "200-day average" msgstr "" -#: lib/quantic_web/live/radar_live.ex:436 +#: lib/quantic_web/live/radar_live.ex:456 #, elixir-autogen, elixir-format msgid "50-day average" msgstr "" -#: lib/quantic_web/live/radar_live.ex:424 +#: lib/quantic_web/live/radar_live.ex:444 #, elixir-autogen, elixir-format msgid "52-week midpoint" msgstr "" @@ -1798,7 +1782,7 @@ msgstr "" msgid "Click to edit" msgstr "" -#: lib/quantic_web/live/radar_live.ex:418 +#: lib/quantic_web/live/radar_live.ex:438 #, elixir-autogen, elixir-format msgid "Community average" msgstr "" @@ -1808,7 +1792,7 @@ msgstr "" msgid "Compact view" msgstr "" -#: lib/quantic_web/live/radar_live.ex:182 +#: lib/quantic_web/live/radar_live.ex:198 #, elixir-autogen, elixir-format msgid "Could not apply that target price." msgstr "" @@ -1863,12 +1847,12 @@ msgstr "" msgid "Market value" msgstr "" -#: lib/quantic_web/live/radar_live.ex:446 +#: lib/quantic_web/live/radar_live.ex:466 #, elixir-autogen, elixir-format msgid "Needs 3+ community targets (%{count} so far)" msgstr "" -#: lib/quantic_web/live/radar_live.ex:448 +#: lib/quantic_web/live/radar_live.ex:468 #, elixir-autogen, elixir-format msgid "No community targets yet" msgstr "" @@ -1894,13 +1878,13 @@ msgstr "" msgid "No target set" msgstr "" -#: lib/quantic_web/live/radar_live.ex:313 -#: lib/quantic_web/live/radar_live.ex:328 +#: lib/quantic_web/live/radar_live.ex:333 +#: lib/quantic_web/live/radar_live.ex:348 #, elixir-autogen, elixir-format msgid "Nothing on your radar yet. Search above to add your first stock." msgstr "" -#: lib/quantic_web/live/radar_live.ex:285 +#: lib/quantic_web/live/radar_live.ex:280 #, elixir-autogen, elixir-format msgid "On radar" msgstr "" @@ -1916,7 +1900,7 @@ msgid "Position" msgstr "" #: lib/quantic_web/live/portfolio_live.ex:377 -#: lib/quantic_web/live/radar_live.ex:262 +#: lib/quantic_web/live/radar_live.ex:311 #, elixir-autogen, elixir-format msgid "Public page" msgstr "" @@ -1928,7 +1912,7 @@ msgid "Score" msgstr "" #: lib/quantic_web/live/portfolio_live.ex:306 -#: lib/quantic_web/live/radar_live.ex:280 +#: lib/quantic_web/live/radar_live.ex:275 #, elixir-autogen, elixir-format msgid "Search by ticker or company name…" msgstr "" @@ -1956,12 +1940,12 @@ msgstr "" msgid "Suggest a target" msgstr "" -#: lib/quantic_web/live/radar_live.ex:175 +#: lib/quantic_web/live/radar_live.ex:191 #, elixir-autogen, elixir-format msgid "Target for %{symbol} set to %{price}." msgstr "" -#: lib/quantic_web/live/radar_live.ex:90 +#: lib/quantic_web/live/radar_live.ex:95 #, elixir-autogen, elixir-format msgid "That stock is already on your radar." msgstr "" @@ -2078,7 +2062,7 @@ msgstr "" #: lib/quantic_web/live/admin_content_drafts_live.ex:272 #: lib/quantic_web/live/portfolio_live.ex:447 -#: lib/quantic_web/live/radar_live.ex:342 +#: lib/quantic_web/live/radar_live.ex:362 #, elixir-autogen, elixir-format msgid "Dividend calendar" msgstr "" @@ -2334,7 +2318,7 @@ msgstr "" msgid "Monthly dividend goal (today's money)" msgstr "" -#: lib/quantic_web/components/home_components.ex:762 +#: lib/quantic_web/components/home_components.ex:798 #: lib/quantic_web/live/path_to_freedom_live.ex:379 #, elixir-autogen, elixir-format msgid "Not in reach yet" @@ -2440,7 +2424,7 @@ msgstr "" msgid "Your journey to freedom" msgstr "" -#: lib/quantic_web/components/home_components.ex:757 +#: lib/quantic_web/components/home_components.ex:793 #: lib/quantic_web/live/path_to_freedom_live.ex:353 #: lib/quantic_web/live/path_to_freedom_live.ex:856 #: lib/quantic_web/live/path_to_freedom_live.ex:1066 @@ -2494,7 +2478,7 @@ msgstr "" msgid "✓ today" msgstr "" -#: lib/quantic_web/components/home_components.ex:765 +#: lib/quantic_web/components/home_components.ex:801 #, elixir-autogen, elixir-format msgid "Keep going — see what changes it" msgstr "" @@ -2524,7 +2508,7 @@ msgstr "" msgid "The year, and your age, when dividends cover your goal" msgstr "" -#: lib/quantic_web/components/home_components.ex:783 +#: lib/quantic_web/components/home_components.ex:819 #, elixir-autogen, elixir-format msgid "per month" msgstr "" @@ -2741,7 +2725,7 @@ msgstr "" msgid "Activity" msgstr "" -#: lib/quantic_web/components/layouts.ex:330 +#: lib/quantic_web/components/layouts.ex:341 #: lib/quantic_web/live/admin_content_drafts_live.ex:112 #: lib/quantic_web/live/admin_dashboard_live.ex:18 #: lib/quantic_web/live/admin_dashboard_live.ex:64 @@ -3189,3 +3173,115 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Your public link" msgstr "" + +#: lib/quantic_web/components/home_components.ex:292 +#, elixir-autogen, elixir-format +msgid "\"Any ex-dividends this week?\"" +msgstr "" + +#: lib/quantic_web/components/home_components.ex:290 +#, elixir-autogen, elixir-format, fuzzy +msgid "\"What dividends did I get this month?\"" +msgstr "" + +#: lib/quantic_web/components/home_components.ex:291 +#, elixir-autogen, elixir-format +msgid "\"What's my biggest holding?\"" +msgstr "" + +#: lib/quantic_web/components/home_components.ex:289 +#, elixir-autogen, elixir-format +msgid "\"Which of my stocks are below my target?\"" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:208 +#, elixir-autogen, elixir-format +msgid "%{remaining}/%{limit} left" +msgstr "" + +#: lib/quantic_web/components/home_components.ex:284 +#, elixir-autogen, elixir-format +msgid "An AI assistant on every page. Ask about your portfolio, radar, and dividends in plain language — it reads your own data to answer." +msgstr "" + +#: lib/quantic_web/components/home_components.ex:281 +#: lib/quantic_web/live/ask_live.ex:196 +#: lib/quantic_web/live/ask_live.ex:303 +#, elixir-autogen, elixir-format +msgid "Ask Quantic" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:279 +#, elixir-autogen, elixir-format +msgid "Ask a question…" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:217 +#, elixir-autogen, elixir-format, fuzzy +msgid "Ask me about your portfolio, radar or dividends." +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:379 +#, elixir-autogen, elixir-format, fuzzy +msgid "Dividends this month?" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:288 +#, elixir-autogen, elixir-format +msgid "Send" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:256 +#, elixir-autogen, elixir-format +msgid "Thinking…" +msgstr "" + +#: lib/quantic_web/components/home_components.ex:299 +#, elixir-autogen, elixir-format +msgid "Try it" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:376 +#, elixir-autogen, elixir-format +msgid "What's my biggest holding?" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:378 +#, elixir-autogen, elixir-format +msgid "Which stocks are below my target?" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:201 +#, elixir-autogen, elixir-format +msgid "on %{page}" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:377 +#, elixir-autogen, elixir-format +msgid "What do you think of KO?" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:295 +#, elixir-autogen, elixir-format +msgid "Informational only — not financial advice." +msgstr "" + +#: lib/quantic_web/live/radar_live.ex:504 +#, elixir-autogen, elixir-format, fuzzy +msgid "Dividend score" +msgstr "" + +#: lib/quantic_web/live/radar_live.ex:503 +#, elixir-autogen, elixir-format, fuzzy +msgid "Dividend yield" +msgstr "" + +#: lib/quantic_web/live/radar_live.ex:501 +#, elixir-autogen, elixir-format +msgid "Opportunity" +msgstr "" + +#: lib/quantic_web/live/ask_live.ex:362 +#, elixir-autogen, elixir-format +msgid "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" +msgstr "" diff --git a/priv/gettext/es/LC_MESSAGES/default.po b/priv/gettext/es/LC_MESSAGES/default.po index b4347eb..febd340 100644 --- a/priv/gettext/es/LC_MESSAGES/default.po +++ b/priv/gettext/es/LC_MESSAGES/default.po @@ -17,22 +17,23 @@ msgstr "" msgid "Actions" msgstr "Opciones" -#: lib/quantic_web/components/layouts.ex:455 -#: lib/quantic_web/components/layouts.ex:467 +#: lib/quantic_web/components/layouts.ex:466 +#: lib/quantic_web/components/layouts.ex:478 #, elixir-autogen, elixir-format msgid "Attempting to reconnect" msgstr "Intentando reconectar" -#: lib/quantic_web/components/layouts.ex:65 -#: lib/quantic_web/components/layouts.ex:272 +#: lib/quantic_web/ask_context.ex:39 +#: lib/quantic_web/components/layouts.ex:69 +#: lib/quantic_web/components/layouts.ex:283 #: lib/quantic_web/live/buy_plan_live.ex:26 #: lib/quantic_web/live/buy_plan_live.ex:233 #, elixir-autogen, elixir-format msgid "Buy plan" msgstr "Plan de compra" -#: lib/quantic_web/components/layouts.ex:81 -#: lib/quantic_web/components/layouts.ex:303 +#: lib/quantic_web/components/layouts.ex:85 +#: lib/quantic_web/components/layouts.ex:314 #: lib/quantic_web/live/admin_dashboard_live.ex:211 #: lib/quantic_web/live/community_dashboard_live.ex:27 #: lib/quantic_web/live/community_dashboard_live.ex:65 @@ -40,8 +41,9 @@ msgstr "Plan de compra" msgid "Community" msgstr "Comunidad" -#: lib/quantic_web/components/layouts.ex:70 -#: lib/quantic_web/components/layouts.ex:282 +#: lib/quantic_web/ask_context.ex:41 +#: lib/quantic_web/components/layouts.ex:74 +#: lib/quantic_web/components/layouts.ex:293 #: lib/quantic_web/components/stock_card_components.ex:589 #: lib/quantic_web/components/stock_card_components.ex:806 #: lib/quantic_web/components/stock_card_components.ex:1267 @@ -52,36 +54,38 @@ msgstr "Comunidad" msgid "Dividends" msgstr "Dividendos" -#: lib/quantic_web/components/layouts.ex:75 -#: lib/quantic_web/components/layouts.ex:292 +#: lib/quantic_web/components/layouts.ex:79 +#: lib/quantic_web/components/layouts.ex:303 #, elixir-autogen, elixir-format msgid "Freedom" msgstr "Libertad" -#: lib/quantic_web/components/layouts.ex:55 -#: lib/quantic_web/components/layouts.ex:252 +#: lib/quantic_web/ask_context.ex:37 +#: lib/quantic_web/components/layouts.ex:59 +#: lib/quantic_web/components/layouts.ex:263 #: lib/quantic_web/live/path_to_freedom_live.ex:300 #: lib/quantic_web/live/portfolio_live.ex:262 #, elixir-autogen, elixir-format msgid "Portfolio" msgstr "Cartera" -#: lib/quantic_web/components/home_components.ex:879 -#: lib/quantic_web/components/layouts.ex:60 -#: lib/quantic_web/components/layouts.ex:262 +#: lib/quantic_web/ask_context.ex:38 +#: lib/quantic_web/components/home_components.ex:915 +#: lib/quantic_web/components/layouts.ex:64 +#: lib/quantic_web/components/layouts.ex:273 #: lib/quantic_web/live/admin_dashboard_live.ex:362 #: lib/quantic_web/live/public_radar_live.ex:105 -#: lib/quantic_web/live/radar_live.ex:254 +#: lib/quantic_web/live/radar_live.ex:269 #, elixir-autogen, elixir-format msgid "Radar" msgstr "Radar" -#: lib/quantic_web/components/layouts.ex:462 +#: lib/quantic_web/components/layouts.ex:473 #, elixir-autogen, elixir-format msgid "Something went wrong!" msgstr "¡Algo ha ido mal!" -#: lib/quantic_web/components/layouts.ex:450 +#: lib/quantic_web/components/layouts.ex:461 #, elixir-autogen, elixir-format msgid "We can't find the internet" msgstr "No encontramos internet" @@ -91,7 +95,7 @@ msgstr "No encontramos internet" msgid "close" msgstr "cerrar" -#: lib/quantic_web/components/home_components.ex:565 +#: lib/quantic_web/components/home_components.ex:601 #: lib/quantic_web/live/public_portfolio_live.ex:123 #, elixir-autogen, elixir-format msgid "%{count} holding" @@ -182,12 +186,12 @@ msgstr "Añade primero posiciones o acciones al radar — aparecerán aquí, ord msgid "Add to portfolio" msgstr "Añadir a la cartera" -#: lib/quantic_web/live/radar_live.ex:294 +#: lib/quantic_web/live/radar_live.ex:289 #, elixir-autogen, elixir-format msgid "Add to radar" msgstr "Añadir al radar" -#: lib/quantic_web/live/radar_live.ex:75 +#: lib/quantic_web/live/radar_live.ex:80 #, elixir-autogen, elixir-format msgid "Added %{symbol} to your radar." msgstr "Hemos añadido %{symbol} a tu radar." @@ -313,7 +317,7 @@ msgstr "Sectores de la comunidad" msgid "Community sharing" msgstr "Compartir con la comunidad" -#: lib/quantic_web/components/home_components.ex:331 +#: lib/quantic_web/components/home_components.ex:367 #: lib/quantic_web/live/community_dashboard_live.ex:101 #, elixir-autogen, elixir-format msgid "Community value" @@ -435,7 +439,7 @@ msgstr "Error" msgid "Fill price" msgstr "Precio de ejecución" -#: lib/quantic_web/components/home_components.ex:752 +#: lib/quantic_web/components/home_components.ex:788 #: lib/quantic_web/live/path_to_freedom_live.ex:346 #, elixir-autogen, elixir-format msgid "Freedom in" @@ -446,7 +450,7 @@ msgstr "Libertad en" msgid "Full history" msgstr "Histórico completo" -#: lib/quantic_web/components/home_components.ex:656 +#: lib/quantic_web/components/home_components.ex:692 #, elixir-autogen, elixir-format msgid "Go to portfolio" msgstr "Ir a la cartera" @@ -528,13 +532,13 @@ msgstr "Tipo de interés %" msgid "It expires in 15 minutes." msgstr "Caduca en 15 minutos." -#: lib/quantic_web/components/layouts.ex:91 +#: lib/quantic_web/components/layouts.ex:95 #: lib/quantic_web/live/settings_live.ex:174 #, elixir-autogen, elixir-format msgid "Language" msgstr "Idioma" -#: lib/quantic_web/components/home_components.ex:698 +#: lib/quantic_web/components/home_components.ex:734 #: lib/quantic_web/live/dividends_live.ex:356 #, elixir-autogen, elixir-format msgid "Last 12 months" @@ -542,7 +546,7 @@ msgstr "Últimos 12 meses" #: lib/quantic_web/live/dividends_live.ex:80 #: lib/quantic_web/live/portfolio_live.ex:105 -#: lib/quantic_web/live/radar_live.ex:86 +#: lib/quantic_web/live/radar_live.ex:91 #, elixir-autogen, elixir-format msgid "Market-data provider is unreachable right now. Please try again." msgstr "El proveedor de datos de mercado no responde ahora mismo. Inténtalo de nuevo." @@ -621,8 +625,9 @@ msgstr "Objetivo" msgid "Other capital (bonds, savings, index funds)" msgstr "Otro capital (bonos, ahorro, fondos indexados)" +#: lib/quantic_web/ask_context.ex:40 #: lib/quantic_web/components/home_components.ex:245 -#: lib/quantic_web/components/home_components.ex:745 +#: lib/quantic_web/components/home_components.ex:781 #: lib/quantic_web/live/path_to_freedom_live.ex:24 #: lib/quantic_web/live/path_to_freedom_live.ex:91 #, elixir-autogen, elixir-format @@ -661,7 +666,7 @@ msgstr "Cartera no encontrada" msgid "Portfolio value" msgstr "Valor de la cartera" -#: lib/quantic_web/components/home_components.ex:337 +#: lib/quantic_web/components/home_components.ex:373 #: lib/quantic_web/live/admin_dashboard_live.ex:151 #: lib/quantic_web/live/community_dashboard_live.ex:74 #: lib/quantic_web/live/community_dashboard_live.ex:81 @@ -784,7 +789,7 @@ msgstr "¿Eliminar esta posición?" msgid "Remove this stock from your radar?" msgstr "¿Quitar esta acción de tu radar?" -#: lib/quantic_web/live/radar_live.ex:196 +#: lib/quantic_web/live/radar_live.ex:212 #, elixir-autogen, elixir-format msgid "Removed %{symbol} from your radar." msgstr "Hemos quitado %{symbol} de tu radar." @@ -822,14 +827,15 @@ msgstr "Guardar compartición" msgid "Saved!" msgstr "¡Guardado!" -#: lib/quantic_web/components/home_components.ex:622 +#: lib/quantic_web/components/home_components.ex:658 #: lib/quantic_web/live/portfolio_live.ex:440 #: lib/quantic_web/live/public_portfolio_live.ex:166 #, elixir-autogen, elixir-format msgid "Sectors" msgstr "Sectores" -#: lib/quantic_web/components/layouts.ex:340 +#: lib/quantic_web/ask_context.ex:42 +#: lib/quantic_web/components/layouts.ex:351 #: lib/quantic_web/live/community_dashboard_live.ex:372 #: lib/quantic_web/live/settings_live.ex:157 #, elixir-autogen, elixir-format @@ -922,6 +928,7 @@ msgstr "Acciones seguidas" #: lib/quantic_web/components/stock_card_components.ex:924 #: lib/quantic_web/live/dividends_live.ex:396 #: lib/quantic_web/live/portfolio_live.ex:565 +#: lib/quantic_web/live/radar_live.ex:502 #, elixir-autogen, elixir-format msgid "Symbol" msgstr "Símbolo" @@ -996,7 +1003,7 @@ msgid "Underweight position" msgstr "Posición infraponderada" #: lib/quantic_web/live/portfolio_live.ex:188 -#: lib/quantic_web/live/radar_live.ex:138 +#: lib/quantic_web/live/radar_live.ex:154 #, elixir-autogen, elixir-format msgid "Updated %{symbol}." msgstr "Hemos actualizado %{symbol}." @@ -1013,7 +1020,7 @@ msgstr "Ver radar" #: lib/quantic_web/live/dividends_live.ex:73 #: lib/quantic_web/live/portfolio_live.ex:98 -#: lib/quantic_web/live/radar_live.ex:79 +#: lib/quantic_web/live/radar_live.ex:84 #, elixir-autogen, elixir-format msgid "We couldn't find that symbol on the market." msgstr "No hemos encontrado ese símbolo en el mercado." @@ -1114,18 +1121,18 @@ msgstr "lo que la cartera paga hoy, antes de nuevas aportaciones" msgid "← Back to home" msgstr "← Volver al inicio" -#: lib/quantic_web/components/layouts.ex:180 +#: lib/quantic_web/components/layouts.ex:184 #, elixir-autogen, elixir-format msgid "Sign up to start your own" msgstr "Regístrate para crear la tuya" -#: lib/quantic_web/components/layouts.ex:176 +#: lib/quantic_web/components/layouts.ex:180 #, elixir-autogen, elixir-format msgid "You're exploring a demo portfolio — changes are yours to play with and expire in 24h." msgstr "Estás explorando una cartera de demostración — los cambios son tuyos para experimentar y caducan en 24h." #: lib/quantic_web/live/portfolio_live.ex:369 -#: lib/quantic_web/live/radar_live.ex:270 +#: lib/quantic_web/live/radar_live.ex:303 #, elixir-autogen, elixir-format msgid "AI insights" msgstr "Análisis con IA" @@ -1149,42 +1156,22 @@ msgstr "Resumen IA" msgid "Analyzing your stocks…" msgstr "Analizando tus acciones…" -#: lib/quantic_web/components/ai_components.ex:179 -#, elixir-autogen, elixir-format -msgid "Avoid" -msgstr "Evitar" - -#: lib/quantic_web/components/ai_components.ex:176 -#, elixir-autogen, elixir-format -msgid "Buy" -msgstr "Comprar" - #: lib/quantic_web/components/ai_components.ex:86 #, elixir-autogen, elixir-format msgid "Buying opportunities" msgstr "Oportunidades de compra" -#: lib/quantic_web/components/ai_components.ex:178 -#, elixir-autogen, elixir-format -msgid "Caution" -msgstr "Precaución" - #: lib/quantic_web/components/ai_components.ex:104 #, elixir-autogen, elixir-format msgid "Dividend coverage" msgstr "Cobertura de dividendos" -#: lib/quantic_web/components/ai_components.ex:177 -#, elixir-autogen, elixir-format -msgid "Hold" -msgstr "Mantener" - #: lib/quantic_web/live/portfolio_live.ex:393 #, elixir-autogen, elixir-format msgid "Portfolio AI insights" msgstr "Análisis IA de la cartera" -#: lib/quantic_web/live/radar_live.ex:300 +#: lib/quantic_web/live/radar_live.ex:320 #, elixir-autogen, elixir-format msgid "Radar AI insights" msgstr "Análisis IA del radar" @@ -1199,12 +1186,8 @@ msgstr "Señales de riesgo" msgid "Strengths" msgstr "Puntos fuertes" -#: lib/quantic_web/components/ai_components.ex:175 -#, elixir-autogen, elixir-format -msgid "Strong buy" -msgstr "Compra fuerte" - -#: lib/quantic_web/components/ai_components.ex:162 +#: lib/quantic_web/components/ai_components.ex:157 +#: lib/quantic_web/live/ask_live.ex:259 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — your quota resets at midnight UTC." msgstr "Has usado las %{limit} consultas de IA de hoy — tu cupo se restablece a medianoche UTC." @@ -1219,7 +1202,7 @@ msgstr "Pregúntame cosas como:\n• ¿qué hay en mi radar?\n• ¿dividendos e msgid "Ask the bot about your portfolio, radar and dividends." msgstr "Pregunta al bot por tu cartera, radar y dividendos." -#: lib/quantic_web/components/home_components.ex:408 +#: lib/quantic_web/components/home_components.ex:444 #: lib/quantic_web/live/settings_live.ex:307 #, elixir-autogen, elixir-format msgid "Connect Telegram" @@ -1293,7 +1276,8 @@ msgid "Refresh status" msgstr "Actualizar estado" #: lib/quantic/telegram/handler.ex:79 -#: lib/quantic/telegram/handler.ex:201 +#: lib/quantic/telegram/handler.ex:204 +#: lib/quantic_web/live/ask_live.ex:264 #, elixir-autogen, elixir-format msgid "Something went wrong — please try again." msgstr "Algo ha ido mal — inténtalo de nuevo." @@ -1323,7 +1307,7 @@ msgstr "Comando desconocido — prueba /help." msgid "Use /notifications on|off to change." msgstr "Usa /notifications on|off para cambiarlo." -#: lib/quantic/telegram/handler.ex:195 +#: lib/quantic/telegram/handler.ex:198 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — quota resets at midnight UTC." msgstr "Has usado las %{limit} consultas de IA de hoy — el cupo se restablece a medianoche UTC." @@ -1368,38 +1352,38 @@ msgstr "• %{symbol} pagó %{amount} %{currency} netos" msgid "📊 Your Quantic daily digest" msgstr "📊 Tu resumen diario de Quantic" -#: lib/quantic_web/components/layouts.ex:408 +#: lib/quantic_web/components/layouts.ex:419 #, elixir-autogen, elixir-format msgid "Built with Elixir, Phoenix LiveView, and Tailwind CSS" msgstr "Hecho con Elixir, Phoenix LiveView y Tailwind CSS" -#: lib/quantic_web/components/layouts.ex:227 +#: lib/quantic_web/components/layouts.ex:238 #, elixir-autogen, elixir-format msgid "Close menu" msgstr "Cerrar el menú" -#: lib/quantic_web/components/layouts.ex:313 +#: lib/quantic_web/components/layouts.ex:324 #, elixir-autogen, elixir-format msgid "FAQ" msgstr "FAQ" -#: lib/quantic_web/components/layouts.ex:421 +#: lib/quantic_web/components/layouts.ex:432 #, elixir-autogen, elixir-format msgid "Frequently Asked Questions" msgstr "Preguntas frecuentes" -#: lib/quantic_web/components/layouts.ex:241 +#: lib/quantic_web/components/layouts.ex:252 #, elixir-autogen, elixir-format msgid "Home" msgstr "Inicio" -#: lib/quantic_web/components/layouts.ex:158 -#: lib/quantic_web/components/layouts.ex:223 +#: lib/quantic_web/components/layouts.ex:162 +#: lib/quantic_web/components/layouts.ex:234 #, elixir-autogen, elixir-format msgid "Menu" msgstr "Menú" -#: lib/quantic_web/components/layouts.ex:218 +#: lib/quantic_web/components/layouts.ex:229 #, elixir-autogen, elixir-format msgid "Navigation menu" msgstr "Menú de navegación" @@ -1409,42 +1393,42 @@ msgstr "Menú de navegación" msgid "New here? Signing in creates your account automatically." msgstr "¿Nuevo por aquí? Al iniciar sesión, tu cuenta se crea automáticamente." -#: lib/quantic_web/components/layouts.ex:149 -#: lib/quantic_web/components/layouts.ex:355 +#: lib/quantic_web/components/layouts.ex:153 +#: lib/quantic_web/components/layouts.ex:366 #, elixir-autogen, elixir-format msgid "Sign in" msgstr "Iniciar sesión" -#: lib/quantic_web/components/layouts.ex:345 +#: lib/quantic_web/components/layouts.ex:356 #, elixir-autogen, elixir-format msgid "Sign out" msgstr "Cerrar sesión" -#: lib/quantic_web/components/layouts.ex:398 +#: lib/quantic_web/components/layouts.ex:409 #, elixir-autogen, elixir-format msgid "The information on Quantic is provided for informational and educational purposes only. It is general in nature, does not take into account your personal financial situation, and does not constitute investment, financial, tax, or legal advice — nor a recommendation to buy or sell any security. Investing involves risk, including possible loss of principal; past performance is not a reliable indicator of future results. Market data comes from third-party providers and may be delayed or inaccurate. Before making any investment decision, consider your objectives, time horizon, risk tolerance, and diversification, and consult a qualified financial professional. Quantic is not a registered investment adviser or broker-dealer." msgstr "La información en Quantic se proporciona únicamente con fines informativos y educativos. Es de carácter general, no tiene en cuenta tu situación financiera personal y no constituye asesoramiento de inversión, financiero, fiscal o legal — ni una recomendación para comprar o vender ningún valor. Invertir conlleva riesgos, incluida la posible pérdida del capital; los resultados pasados no son un indicador fiable de los resultados futuros. Los datos de mercado provienen de proveedores terceros y pueden estar retrasados o ser inexactos. Antes de tomar cualquier decisión de inversión, considera tus objetivos, horizonte temporal, tolerancia al riesgo y diversificación, y consulta a un profesional financiero cualificado. Quantic no es un asesor financiero registrado ni un intermediario bursátil." -#: lib/quantic_web/components/home_components.ex:397 +#: lib/quantic_web/components/home_components.ex:433 #, elixir-autogen, elixir-format msgid "\"what dividends did I get this month?\" · \"show my radar\" · \"any ex-divs this week?\"" msgstr "\"¿qué dividendos he cobrado este mes?\" · \"muéstrame mi radar\" · \"¿algún ex-div esta semana?\"" -#: lib/quantic_web/components/home_components.ex:568 +#: lib/quantic_web/components/home_components.ex:604 #, elixir-autogen, elixir-format msgid "%{count} on radar" msgid_plural "%{count} on radar" msgstr[0] "%{count} en el radar" msgstr[1] "%{count} en el radar" -#: lib/quantic_web/components/home_components.ex:721 +#: lib/quantic_web/components/home_components.ex:757 #, elixir-autogen, elixir-format msgid "+ %{count} more currency" msgid_plural "+ %{count} more currencies" msgstr[0] "+ %{count} moneda más" msgstr[1] "+ %{count} monedas más" -#: lib/quantic_web/components/home_components.ex:289 +#: lib/quantic_web/components/home_components.ex:325 #, elixir-autogen, elixir-format msgid "A live community of dividend investors. Browse what others hold, what they target, and how they structure their portfolios." msgstr "Una comunidad en vivo de inversores en dividendos. Mira lo que otros tienen, qué precios objetivo se marcan y cómo estructuran sus carteras." @@ -1459,12 +1443,12 @@ msgstr "Inversión en dividendos potenciada con IA. Crea tu lista de seguimiento msgid "Add stocks with target prices. We track price, score, and ex-div dates." msgstr "Añade acciones con precios objetivo. Seguimos el precio, la puntuación y las fechas ex-dividendo." -#: lib/quantic_web/components/home_components.ex:648 +#: lib/quantic_web/components/home_components.ex:684 #, elixir-autogen, elixir-format msgid "Add your first holding" msgstr "Añade tu primera posición" -#: lib/quantic_web/components/home_components.ex:392 +#: lib/quantic_web/components/home_components.ex:428 #, elixir-autogen, elixir-format msgid "Ask your portfolio anything in natural language — ex-divs, totals, target prices — right from Telegram." msgstr "Pregunta lo que quieras a tu cartera en lenguaje natural — ex-dividendos, totales, precios objetivo — directamente desde Telegram." @@ -1479,22 +1463,22 @@ msgstr "Crea tu radar" msgid "Create your plan" msgstr "Crea tu plan" -#: lib/quantic_web/components/home_components.ex:616 +#: lib/quantic_web/components/home_components.ex:652 #, elixir-autogen, elixir-format msgid "Current yield" msgstr "Rentabilidad actual" -#: lib/quantic_web/components/home_components.ex:678 +#: lib/quantic_web/components/home_components.ex:714 #, elixir-autogen, elixir-format msgid "Dividend income" msgstr "Ingresos por dividendos" -#: lib/quantic_web/components/home_components.ex:862 +#: lib/quantic_web/components/home_components.ex:898 #, elixir-autogen, elixir-format msgid "Ex-dividend dates in the next %{days} days" msgstr "Fechas ex-dividendo en los próximos %{days} días" -#: lib/quantic_web/components/home_components.ex:954 +#: lib/quantic_web/components/home_components.ex:990 #: lib/quantic_web/components/stock_card_components.ex:143 #: lib/quantic_web/live/buy_plan_live.ex:546 #, elixir-autogen, elixir-format @@ -1506,7 +1490,7 @@ msgstr "Aceptable" msgid "Free · No broker connection required · Open source" msgstr "Gratis · Sin conectar tu bróker · Código abierto" -#: lib/quantic_web/components/home_components.ex:515 +#: lib/quantic_web/components/home_components.ex:551 #, elixir-autogen, elixir-format msgid "Free, no broker connection required. Try a sample portfolio or sign up to build your own." msgstr "Gratis, sin necesidad de conectar tu bróker. Prueba una cartera de ejemplo o regístrate para crear la tuya." @@ -1521,17 +1505,17 @@ msgstr "De la lista de seguimiento a ingresos por dividendos en 3 pasos" msgid "Get AI insights" msgstr "Obtén análisis con IA" -#: lib/quantic_web/components/home_components.ex:557 +#: lib/quantic_web/components/home_components.ex:593 #, elixir-autogen, elixir-format msgid "Good afternoon, %{name}" msgstr "Buenas tardes, %{name}" -#: lib/quantic_web/components/home_components.ex:559 +#: lib/quantic_web/components/home_components.ex:595 #, elixir-autogen, elixir-format msgid "Good evening, %{name}" msgstr "Buenas noches, %{name}" -#: lib/quantic_web/components/home_components.ex:555 +#: lib/quantic_web/components/home_components.ex:591 #, elixir-autogen, elixir-format msgid "Good morning, %{name}" msgstr "Buenos días, %{name}" @@ -1546,32 +1530,32 @@ msgstr "En directo" msgid "Log holdings to get live yield, sector mix, and dividend forecast." msgstr "Registra tus posiciones para ver rentabilidad en directo, mezcla de sectores y previsión de dividendos." -#: lib/quantic_web/live/home_live.ex:120 +#: lib/quantic_web/live/home_live.ex:121 #, elixir-autogen, elixir-format msgid "Most Added to Radar" msgstr "Más añadidas al radar" -#: lib/quantic_web/live/home_live.ex:125 +#: lib/quantic_web/live/home_live.ex:126 #, elixir-autogen, elixir-format msgid "Most Held in Portfolios" msgstr "Más presentes en carteras" -#: lib/quantic_web/components/home_components.ex:572 +#: lib/quantic_web/components/home_components.ex:608 #, elixir-autogen, elixir-format msgid "Next ex-div: %{symbol} in %{days}d" msgstr "Próximo ex-div: %{symbol} en %{days}d" -#: lib/quantic_web/components/home_components.ex:480 +#: lib/quantic_web/components/home_components.ex:516 #, elixir-autogen, elixir-format msgid "No stocks found." msgstr "No se han encontrado acciones." -#: lib/quantic_web/components/home_components.ex:577 +#: lib/quantic_web/components/home_components.ex:613 #, elixir-autogen, elixir-format msgid "No upcoming ex-div dates" msgstr "Sin fechas ex-div próximas" -#: lib/quantic_web/components/home_components.ex:793 +#: lib/quantic_web/components/home_components.ex:829 #, elixir-autogen, elixir-format msgid "Open my plan" msgstr "Abrir mi plan" @@ -1581,32 +1565,32 @@ msgstr "Abrir mi plan" msgid "Plain-language analysis of your portfolio and radar — risks, gaps, opportunities." msgstr "Análisis en lenguaje claro de tu cartera y tu radar — riesgos, carencias, oportunidades." -#: lib/quantic_web/components/home_components.ex:608 +#: lib/quantic_web/components/home_components.ex:644 #, elixir-autogen, elixir-format msgid "Portfolio stats" msgstr "Estadísticas de la cartera" -#: lib/quantic_web/components/home_components.ex:388 +#: lib/quantic_web/components/home_components.ex:424 #, elixir-autogen, elixir-format msgid "Quantic in Telegram" msgstr "Quantic en Telegram" -#: lib/quantic_web/live/home_live.ex:130 +#: lib/quantic_web/live/home_live.ex:131 #, elixir-autogen, elixir-format msgid "Recently Updated" msgstr "Actualizados recientemente" -#: lib/quantic_web/components/home_components.ex:298 +#: lib/quantic_web/components/home_components.ex:334 #, elixir-autogen, elixir-format msgid "See the community" msgstr "Explora la comunidad" -#: lib/quantic_web/components/home_components.ex:285 +#: lib/quantic_web/components/home_components.ex:321 #, elixir-autogen, elixir-format msgid "Share your portfolio with the community" msgstr "Comparte tu cartera con la comunidad" -#: lib/quantic_web/components/home_components.ex:529 +#: lib/quantic_web/components/home_components.ex:565 #, elixir-autogen, elixir-format msgid "Sign up" msgstr "Regístrate" @@ -1616,39 +1600,39 @@ msgstr "Regístrate" msgid "Sign up free" msgstr "Regístrate gratis" -#: lib/quantic_web/components/home_components.ex:410 +#: lib/quantic_web/components/home_components.ex:446 #, elixir-autogen, elixir-format msgid "Sign up to connect" msgstr "Regístrate para conectarlo" -#: lib/quantic_web/components/home_components.ex:304 +#: lib/quantic_web/components/home_components.ex:340 #, elixir-autogen, elixir-format msgid "Sign up to share yours" msgstr "Regístrate para compartir la tuya" -#: lib/quantic_web/components/home_components.ex:512 +#: lib/quantic_web/components/home_components.ex:548 #, elixir-autogen, elixir-format msgid "Start your radar in 30 seconds" msgstr "Empieza tu radar en 30 segundos" -#: lib/quantic_web/components/home_components.ex:953 +#: lib/quantic_web/components/home_components.ex:989 #: lib/quantic_web/components/stock_card_components.ex:142 #: lib/quantic_web/live/buy_plan_live.ex:545 #, elixir-autogen, elixir-format msgid "Strong" msgstr "Fuerte" -#: lib/quantic_web/components/home_components.ex:690 +#: lib/quantic_web/components/home_components.ex:726 #, elixir-autogen, elixir-format msgid "This month" msgstr "Este mes" -#: lib/quantic_web/components/home_components.ex:435 +#: lib/quantic_web/components/home_components.ex:471 #, elixir-autogen, elixir-format msgid "Top Dividend Scores" msgstr "Mejores puntuaciones de dividendo" -#: lib/quantic_web/components/home_components.ex:650 +#: lib/quantic_web/components/home_components.ex:686 #, elixir-autogen, elixir-format msgid "Track real yield, dividend forecast, and sector mix. Takes a minute." msgstr "Controla la rentabilidad real, la previsión de dividendos y la mezcla de sectores. Lleva un minuto." @@ -1673,17 +1657,17 @@ msgstr "Tendencias en la comunidad" msgid "Try a sample portfolio" msgstr "Prueba una cartera de ejemplo" -#: lib/quantic_web/components/home_components.ex:526 +#: lib/quantic_web/components/home_components.ex:562 #, elixir-autogen, elixir-format msgid "Try the demo" msgstr "Prueba la demo" -#: lib/quantic_web/components/home_components.ex:821 +#: lib/quantic_web/components/home_components.ex:857 #, elixir-autogen, elixir-format msgid "View full buy plan" msgstr "Ver el plan de compra completo" -#: lib/quantic_web/components/home_components.ex:955 +#: lib/quantic_web/components/home_components.ex:991 #: lib/quantic_web/components/stock_card_components.ex:144 #: lib/quantic_web/live/buy_plan_live.ex:547 #, elixir-autogen, elixir-format @@ -1695,12 +1679,12 @@ msgstr "Débil" msgid "What investors are watching" msgstr "Lo que vigilan los inversores" -#: lib/quantic_web/components/home_components.ex:612 +#: lib/quantic_web/components/home_components.ex:648 #, elixir-autogen, elixir-format msgid "Yield on cost" msgstr "Yield on Cost" -#: lib/quantic_web/components/home_components.ex:815 +#: lib/quantic_web/components/home_components.ex:851 #, elixir-autogen, elixir-format msgid "Your next picks" msgstr "Tus próximas compras" @@ -1715,13 +1699,13 @@ msgstr "dividendos" msgid "ex-div dates" msgstr "fechas ex-dividendo" -#: lib/quantic_web/components/home_components.ex:900 +#: lib/quantic_web/components/home_components.ex:936 #, elixir-autogen, elixir-format msgid "in %{days}d" msgstr "en %{days}d" -#: lib/quantic_web/live/home_live.ex:199 -#: lib/quantic_web/live/home_live.ex:210 +#: lib/quantic_web/live/home_live.ex:200 +#: lib/quantic_web/live/home_live.ex:211 #, elixir-autogen, elixir-format msgid "investor" msgstr "inversor" @@ -1731,12 +1715,12 @@ msgstr "inversor" msgid "radar targets" msgstr "objetivos del radar" -#: lib/quantic_web/components/home_components.ex:896 +#: lib/quantic_web/components/home_components.ex:932 #, elixir-autogen, elixir-format msgid "today" msgstr "hoy" -#: lib/quantic_web/components/home_components.ex:898 +#: lib/quantic_web/components/home_components.ex:934 #, elixir-autogen, elixir-format msgid "tomorrow" msgstr "mañana" @@ -1756,17 +1740,17 @@ msgstr "%{percentage}% por encima del objetivo" msgid "%{percentage}% below target" msgstr "%{percentage}% por debajo del objetivo" -#: lib/quantic_web/live/radar_live.ex:430 +#: lib/quantic_web/live/radar_live.ex:450 #, elixir-autogen, elixir-format msgid "200-day average" msgstr "Media de 200 días" -#: lib/quantic_web/live/radar_live.ex:436 +#: lib/quantic_web/live/radar_live.ex:456 #, elixir-autogen, elixir-format msgid "50-day average" msgstr "Media de 50 días" -#: lib/quantic_web/live/radar_live.ex:424 +#: lib/quantic_web/live/radar_live.ex:444 #, elixir-autogen, elixir-format msgid "52-week midpoint" msgstr "Punto medio de 52 semanas" @@ -1798,7 +1782,7 @@ msgstr "Borrar búsqueda" msgid "Click to edit" msgstr "Haz clic para editar" -#: lib/quantic_web/live/radar_live.ex:418 +#: lib/quantic_web/live/radar_live.ex:438 #, elixir-autogen, elixir-format msgid "Community average" msgstr "Media de la comunidad" @@ -1808,7 +1792,7 @@ msgstr "Media de la comunidad" msgid "Compact view" msgstr "Vista compacta" -#: lib/quantic_web/live/radar_live.ex:182 +#: lib/quantic_web/live/radar_live.ex:198 #, elixir-autogen, elixir-format msgid "Could not apply that target price." msgstr "No se pudo aplicar ese precio objetivo." @@ -1863,12 +1847,12 @@ msgstr "En cartera" msgid "Market value" msgstr "Valor de mercado" -#: lib/quantic_web/live/radar_live.ex:446 +#: lib/quantic_web/live/radar_live.ex:466 #, elixir-autogen, elixir-format msgid "Needs 3+ community targets (%{count} so far)" msgstr "Necesita 3+ objetivos de la comunidad (%{count} por ahora)" -#: lib/quantic_web/live/radar_live.ex:448 +#: lib/quantic_web/live/radar_live.ex:468 #, elixir-autogen, elixir-format msgid "No community targets yet" msgstr "Aún no hay objetivos de la comunidad" @@ -1894,13 +1878,13 @@ msgstr "Sin datos de calendario" msgid "No target set" msgstr "Sin objetivo definido" -#: lib/quantic_web/live/radar_live.ex:313 -#: lib/quantic_web/live/radar_live.ex:328 +#: lib/quantic_web/live/radar_live.ex:333 +#: lib/quantic_web/live/radar_live.ex:348 #, elixir-autogen, elixir-format msgid "Nothing on your radar yet. Search above to add your first stock." msgstr "Aún no hay nada en tu radar. Busca arriba para añadir tu primera acción." -#: lib/quantic_web/live/radar_live.ex:285 +#: lib/quantic_web/live/radar_live.ex:280 #, elixir-autogen, elixir-format msgid "On radar" msgstr "En el radar" @@ -1916,7 +1900,7 @@ msgid "Position" msgstr "Posición" #: lib/quantic_web/live/portfolio_live.ex:377 -#: lib/quantic_web/live/radar_live.ex:262 +#: lib/quantic_web/live/radar_live.ex:311 #, elixir-autogen, elixir-format msgid "Public page" msgstr "Página pública" @@ -1928,7 +1912,7 @@ msgid "Score" msgstr "Puntuación" #: lib/quantic_web/live/portfolio_live.ex:306 -#: lib/quantic_web/live/radar_live.ex:280 +#: lib/quantic_web/live/radar_live.ex:275 #, elixir-autogen, elixir-format msgid "Search by ticker or company name…" msgstr "Busca por ticker o nombre de empresa…" @@ -1956,12 +1940,12 @@ msgstr "Estado" msgid "Suggest a target" msgstr "Sugerir un objetivo" -#: lib/quantic_web/live/radar_live.ex:175 +#: lib/quantic_web/live/radar_live.ex:191 #, elixir-autogen, elixir-format msgid "Target for %{symbol} set to %{price}." msgstr "Objetivo de %{symbol} fijado en %{price}." -#: lib/quantic_web/live/radar_live.ex:90 +#: lib/quantic_web/live/radar_live.ex:95 #, elixir-autogen, elixir-format msgid "That stock is already on your radar." msgstr "Esa acción ya está en tu radar." @@ -2078,7 +2062,7 @@ msgstr "Beta" #: lib/quantic_web/live/admin_content_drafts_live.ex:272 #: lib/quantic_web/live/portfolio_live.ex:447 -#: lib/quantic_web/live/radar_live.ex:342 +#: lib/quantic_web/live/radar_live.ex:362 #, elixir-autogen, elixir-format msgid "Dividend calendar" msgstr "Calendario de dividendos" @@ -2334,7 +2318,7 @@ msgstr "Aportación mensual" msgid "Monthly dividend goal (today's money)" msgstr "Objetivo de dividendos mensuales (dinero de hoy)" -#: lib/quantic_web/components/home_components.ex:762 +#: lib/quantic_web/components/home_components.ex:798 #: lib/quantic_web/live/path_to_freedom_live.ex:379 #, elixir-autogen, elixir-format msgid "Not in reach yet" @@ -2440,7 +2424,7 @@ msgstr "Tu objetivo queda fuera de tu alcance dentro del horizonte." msgid "Your journey to freedom" msgstr "Tu camino a la libertad" -#: lib/quantic_web/components/home_components.ex:757 +#: lib/quantic_web/components/home_components.ex:793 #: lib/quantic_web/live/path_to_freedom_live.ex:353 #: lib/quantic_web/live/path_to_freedom_live.ex:856 #: lib/quantic_web/live/path_to_freedom_live.ex:1066 @@ -2494,7 +2478,7 @@ msgstr "¾ de tu objetivo" msgid "✓ today" msgstr "✓ hoy" -#: lib/quantic_web/components/home_components.ex:765 +#: lib/quantic_web/components/home_components.ex:801 #, elixir-autogen, elixir-format msgid "Keep going — see what changes it" msgstr "Sigue adelante — mira qué lo cambia" @@ -2524,7 +2508,7 @@ msgstr "Dinos tu objetivo de dividendos mensuales. Te diremos el año — y tu e msgid "The year, and your age, when dividends cover your goal" msgstr "El año, y tu edad, en que los dividendos cubren tu objetivo" -#: lib/quantic_web/components/home_components.ex:783 +#: lib/quantic_web/components/home_components.ex:819 #, elixir-autogen, elixir-format msgid "per month" msgstr "al mes" @@ -2741,7 +2725,7 @@ msgstr "Usuarios activos — últimas 8 semanas" msgid "Activity" msgstr "Actividad" -#: lib/quantic_web/components/layouts.ex:330 +#: lib/quantic_web/components/layouts.ex:341 #: lib/quantic_web/live/admin_content_drafts_live.ex:112 #: lib/quantic_web/live/admin_dashboard_live.ex:18 #: lib/quantic_web/live/admin_dashboard_live.ex:64 @@ -3189,3 +3173,115 @@ msgstr "Tus enlaces serán:" #, elixir-autogen, elixir-format msgid "Your public link" msgstr "Tu enlace público" + +#: lib/quantic_web/components/home_components.ex:292 +#, elixir-autogen, elixir-format +msgid "\"Any ex-dividends this week?\"" +msgstr "«¿Algún ex-dividendo esta semana?»" + +#: lib/quantic_web/components/home_components.ex:290 +#, elixir-autogen, elixir-format +msgid "\"What dividends did I get this month?\"" +msgstr "«¿Qué dividendos cobré este mes?»" + +#: lib/quantic_web/components/home_components.ex:291 +#, elixir-autogen, elixir-format +msgid "\"What's my biggest holding?\"" +msgstr "«¿Cuál es mi mayor posición?»" + +#: lib/quantic_web/components/home_components.ex:289 +#, elixir-autogen, elixir-format +msgid "\"Which of my stocks are below my target?\"" +msgstr "«¿Cuáles de mis acciones están por debajo de mi precio objetivo?»" + +#: lib/quantic_web/live/ask_live.ex:208 +#, elixir-autogen, elixir-format +msgid "%{remaining}/%{limit} left" +msgstr "%{remaining}/%{limit} restantes" + +#: lib/quantic_web/components/home_components.ex:284 +#, elixir-autogen, elixir-format +msgid "An AI assistant on every page. Ask about your portfolio, radar, and dividends in plain language — it reads your own data to answer." +msgstr "Un asistente de IA en cada página. Pregunta sobre tu cartera, radar y dividendos en lenguaje natural: lee tus propios datos para responder." + +#: lib/quantic_web/components/home_components.ex:281 +#: lib/quantic_web/live/ask_live.ex:196 +#: lib/quantic_web/live/ask_live.ex:303 +#, elixir-autogen, elixir-format +msgid "Ask Quantic" +msgstr "Pregunta a Quantic" + +#: lib/quantic_web/live/ask_live.ex:279 +#, elixir-autogen, elixir-format +msgid "Ask a question…" +msgstr "Escribe una pregunta…" + +#: lib/quantic_web/live/ask_live.ex:217 +#, elixir-autogen, elixir-format +msgid "Ask me about your portfolio, radar or dividends." +msgstr "Pregúntame sobre tu cartera, radar o dividendos." + +#: lib/quantic_web/live/ask_live.ex:379 +#, elixir-autogen, elixir-format +msgid "Dividends this month?" +msgstr "¿Dividendos este mes?" + +#: lib/quantic_web/live/ask_live.ex:288 +#, elixir-autogen, elixir-format +msgid "Send" +msgstr "Enviar" + +#: lib/quantic_web/live/ask_live.ex:256 +#, elixir-autogen, elixir-format +msgid "Thinking…" +msgstr "Pensando…" + +#: lib/quantic_web/components/home_components.ex:299 +#, elixir-autogen, elixir-format +msgid "Try it" +msgstr "Probar" + +#: lib/quantic_web/live/ask_live.ex:376 +#, elixir-autogen, elixir-format +msgid "What's my biggest holding?" +msgstr "¿Cuál es mi mayor posición?" + +#: lib/quantic_web/live/ask_live.ex:378 +#, elixir-autogen, elixir-format +msgid "Which stocks are below my target?" +msgstr "¿Qué acciones están por debajo de mi objetivo?" + +#: lib/quantic_web/live/ask_live.ex:201 +#, elixir-autogen, elixir-format +msgid "on %{page}" +msgstr "en %{page}" + +#: lib/quantic_web/live/ask_live.ex:377 +#, elixir-autogen, elixir-format +msgid "What do you think of KO?" +msgstr "¿Qué opinas de KO?" + +#: lib/quantic_web/live/ask_live.ex:295 +#, elixir-autogen, elixir-format +msgid "Informational only — not financial advice." +msgstr "Solo informativo — no es asesoramiento financiero." + +#: lib/quantic_web/live/radar_live.ex:504 +#, elixir-autogen, elixir-format +msgid "Dividend score" +msgstr "Puntuación de dividendo" + +#: lib/quantic_web/live/radar_live.ex:503 +#, elixir-autogen, elixir-format +msgid "Dividend yield" +msgstr "Rentabilidad por dividendo" + +#: lib/quantic_web/live/radar_live.ex:501 +#, elixir-autogen, elixir-format +msgid "Opportunity" +msgstr "Oportunidad" + +#: lib/quantic_web/live/ask_live.ex:362 +#, elixir-autogen, elixir-format +msgid "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" +msgstr "Estás explorando una demo, así que esta es una respuesta de ejemplo en lugar de una respuesta real (así la demo sigue siendo gratuita). Con tu propia cuenta leo tus posiciones, tu radar y tus dividendos reales para responder preguntas como esta. ¡Regístrate para probarlo de verdad!" diff --git a/priv/gettext/fr/LC_MESSAGES/default.po b/priv/gettext/fr/LC_MESSAGES/default.po index 5a420a8..a535ad2 100644 --- a/priv/gettext/fr/LC_MESSAGES/default.po +++ b/priv/gettext/fr/LC_MESSAGES/default.po @@ -17,22 +17,23 @@ msgstr "" msgid "Actions" msgstr "Opérations" -#: lib/quantic_web/components/layouts.ex:455 -#: lib/quantic_web/components/layouts.ex:467 +#: lib/quantic_web/components/layouts.ex:466 +#: lib/quantic_web/components/layouts.ex:478 #, elixir-autogen, elixir-format msgid "Attempting to reconnect" msgstr "Tentative de reconnexion" -#: lib/quantic_web/components/layouts.ex:65 -#: lib/quantic_web/components/layouts.ex:272 +#: lib/quantic_web/ask_context.ex:39 +#: lib/quantic_web/components/layouts.ex:69 +#: lib/quantic_web/components/layouts.ex:283 #: lib/quantic_web/live/buy_plan_live.ex:26 #: lib/quantic_web/live/buy_plan_live.ex:233 #, elixir-autogen, elixir-format msgid "Buy plan" msgstr "Plan d'achat" -#: lib/quantic_web/components/layouts.ex:81 -#: lib/quantic_web/components/layouts.ex:303 +#: lib/quantic_web/components/layouts.ex:85 +#: lib/quantic_web/components/layouts.ex:314 #: lib/quantic_web/live/admin_dashboard_live.ex:211 #: lib/quantic_web/live/community_dashboard_live.ex:27 #: lib/quantic_web/live/community_dashboard_live.ex:65 @@ -40,8 +41,9 @@ msgstr "Plan d'achat" msgid "Community" msgstr "Communauté" -#: lib/quantic_web/components/layouts.ex:70 -#: lib/quantic_web/components/layouts.ex:282 +#: lib/quantic_web/ask_context.ex:41 +#: lib/quantic_web/components/layouts.ex:74 +#: lib/quantic_web/components/layouts.ex:293 #: lib/quantic_web/components/stock_card_components.ex:589 #: lib/quantic_web/components/stock_card_components.ex:806 #: lib/quantic_web/components/stock_card_components.ex:1267 @@ -52,36 +54,38 @@ msgstr "Communauté" msgid "Dividends" msgstr "Dividendes" -#: lib/quantic_web/components/layouts.ex:75 -#: lib/quantic_web/components/layouts.ex:292 +#: lib/quantic_web/components/layouts.ex:79 +#: lib/quantic_web/components/layouts.ex:303 #, elixir-autogen, elixir-format msgid "Freedom" msgstr "Liberté" -#: lib/quantic_web/components/layouts.ex:55 -#: lib/quantic_web/components/layouts.ex:252 +#: lib/quantic_web/ask_context.ex:37 +#: lib/quantic_web/components/layouts.ex:59 +#: lib/quantic_web/components/layouts.ex:263 #: lib/quantic_web/live/path_to_freedom_live.ex:300 #: lib/quantic_web/live/portfolio_live.ex:262 #, elixir-autogen, elixir-format msgid "Portfolio" msgstr "Portefeuille" -#: lib/quantic_web/components/home_components.ex:879 -#: lib/quantic_web/components/layouts.ex:60 -#: lib/quantic_web/components/layouts.ex:262 +#: lib/quantic_web/ask_context.ex:38 +#: lib/quantic_web/components/home_components.ex:915 +#: lib/quantic_web/components/layouts.ex:64 +#: lib/quantic_web/components/layouts.ex:273 #: lib/quantic_web/live/admin_dashboard_live.ex:362 #: lib/quantic_web/live/public_radar_live.ex:105 -#: lib/quantic_web/live/radar_live.ex:254 +#: lib/quantic_web/live/radar_live.ex:269 #, elixir-autogen, elixir-format msgid "Radar" msgstr "Radar" -#: lib/quantic_web/components/layouts.ex:462 +#: lib/quantic_web/components/layouts.ex:473 #, elixir-autogen, elixir-format msgid "Something went wrong!" msgstr "Une erreur est survenue !" -#: lib/quantic_web/components/layouts.ex:450 +#: lib/quantic_web/components/layouts.ex:461 #, elixir-autogen, elixir-format msgid "We can't find the internet" msgstr "Nous ne trouvons pas Internet" @@ -91,7 +95,7 @@ msgstr "Nous ne trouvons pas Internet" msgid "close" msgstr "fermer" -#: lib/quantic_web/components/home_components.ex:565 +#: lib/quantic_web/components/home_components.ex:601 #: lib/quantic_web/live/public_portfolio_live.ex:123 #, elixir-autogen, elixir-format msgid "%{count} holding" @@ -182,12 +186,12 @@ msgstr "Ajoutez d'abord des positions ou des actions au radar — elles apparaî msgid "Add to portfolio" msgstr "Ajouter au portefeuille" -#: lib/quantic_web/live/radar_live.ex:294 +#: lib/quantic_web/live/radar_live.ex:289 #, elixir-autogen, elixir-format msgid "Add to radar" msgstr "Ajouter au radar" -#: lib/quantic_web/live/radar_live.ex:75 +#: lib/quantic_web/live/radar_live.ex:80 #, elixir-autogen, elixir-format msgid "Added %{symbol} to your radar." msgstr "%{symbol} ajouté à votre radar." @@ -313,7 +317,7 @@ msgstr "Secteurs de la communauté" msgid "Community sharing" msgstr "Partage communautaire" -#: lib/quantic_web/components/home_components.ex:331 +#: lib/quantic_web/components/home_components.ex:367 #: lib/quantic_web/live/community_dashboard_live.ex:101 #, elixir-autogen, elixir-format msgid "Community value" @@ -435,7 +439,7 @@ msgstr "Échec" msgid "Fill price" msgstr "Prix d'exécution" -#: lib/quantic_web/components/home_components.ex:752 +#: lib/quantic_web/components/home_components.ex:788 #: lib/quantic_web/live/path_to_freedom_live.ex:346 #, elixir-autogen, elixir-format msgid "Freedom in" @@ -446,7 +450,7 @@ msgstr "Liberté dans" msgid "Full history" msgstr "Historique complet" -#: lib/quantic_web/components/home_components.ex:656 +#: lib/quantic_web/components/home_components.ex:692 #, elixir-autogen, elixir-format msgid "Go to portfolio" msgstr "Aller au portefeuille" @@ -528,13 +532,13 @@ msgstr "Taux d'intérêt %" msgid "It expires in 15 minutes." msgstr "Il expire dans 15 minutes." -#: lib/quantic_web/components/layouts.ex:91 +#: lib/quantic_web/components/layouts.ex:95 #: lib/quantic_web/live/settings_live.ex:174 #, elixir-autogen, elixir-format msgid "Language" msgstr "Langue" -#: lib/quantic_web/components/home_components.ex:698 +#: lib/quantic_web/components/home_components.ex:734 #: lib/quantic_web/live/dividends_live.ex:356 #, elixir-autogen, elixir-format msgid "Last 12 months" @@ -542,7 +546,7 @@ msgstr "12 derniers mois" #: lib/quantic_web/live/dividends_live.ex:80 #: lib/quantic_web/live/portfolio_live.ex:105 -#: lib/quantic_web/live/radar_live.ex:86 +#: lib/quantic_web/live/radar_live.ex:91 #, elixir-autogen, elixir-format msgid "Market-data provider is unreachable right now. Please try again." msgstr "Le fournisseur de données de marché est injoignable pour le moment. Veuillez réessayer." @@ -621,8 +625,9 @@ msgstr "Objectif" msgid "Other capital (bonds, savings, index funds)" msgstr "Autre capital (obligations, épargne, fonds indiciels)" +#: lib/quantic_web/ask_context.ex:40 #: lib/quantic_web/components/home_components.ex:245 -#: lib/quantic_web/components/home_components.ex:745 +#: lib/quantic_web/components/home_components.ex:781 #: lib/quantic_web/live/path_to_freedom_live.ex:24 #: lib/quantic_web/live/path_to_freedom_live.ex:91 #, elixir-autogen, elixir-format @@ -661,7 +666,7 @@ msgstr "Portefeuille introuvable" msgid "Portfolio value" msgstr "Valeur du portefeuille" -#: lib/quantic_web/components/home_components.ex:337 +#: lib/quantic_web/components/home_components.ex:373 #: lib/quantic_web/live/admin_dashboard_live.ex:151 #: lib/quantic_web/live/community_dashboard_live.ex:74 #: lib/quantic_web/live/community_dashboard_live.ex:81 @@ -784,7 +789,7 @@ msgstr "Supprimer cette position ?" msgid "Remove this stock from your radar?" msgstr "Retirer cette action de votre radar ?" -#: lib/quantic_web/live/radar_live.ex:196 +#: lib/quantic_web/live/radar_live.ex:212 #, elixir-autogen, elixir-format msgid "Removed %{symbol} from your radar." msgstr "%{symbol} retiré de votre radar." @@ -822,14 +827,15 @@ msgstr "Enregistrer le partage" msgid "Saved!" msgstr "Enregistré !" -#: lib/quantic_web/components/home_components.ex:622 +#: lib/quantic_web/components/home_components.ex:658 #: lib/quantic_web/live/portfolio_live.ex:440 #: lib/quantic_web/live/public_portfolio_live.ex:166 #, elixir-autogen, elixir-format msgid "Sectors" msgstr "Secteurs" -#: lib/quantic_web/components/layouts.ex:340 +#: lib/quantic_web/ask_context.ex:42 +#: lib/quantic_web/components/layouts.ex:351 #: lib/quantic_web/live/community_dashboard_live.ex:372 #: lib/quantic_web/live/settings_live.ex:157 #, elixir-autogen, elixir-format @@ -922,6 +928,7 @@ msgstr "Actions suivies" #: lib/quantic_web/components/stock_card_components.ex:924 #: lib/quantic_web/live/dividends_live.ex:396 #: lib/quantic_web/live/portfolio_live.ex:565 +#: lib/quantic_web/live/radar_live.ex:502 #, elixir-autogen, elixir-format msgid "Symbol" msgstr "Symbole" @@ -996,7 +1003,7 @@ msgid "Underweight position" msgstr "Position sous-pondérée" #: lib/quantic_web/live/portfolio_live.ex:188 -#: lib/quantic_web/live/radar_live.ex:138 +#: lib/quantic_web/live/radar_live.ex:154 #, elixir-autogen, elixir-format msgid "Updated %{symbol}." msgstr "%{symbol} mis à jour." @@ -1013,7 +1020,7 @@ msgstr "Voir le radar" #: lib/quantic_web/live/dividends_live.ex:73 #: lib/quantic_web/live/portfolio_live.ex:98 -#: lib/quantic_web/live/radar_live.ex:79 +#: lib/quantic_web/live/radar_live.ex:84 #, elixir-autogen, elixir-format msgid "We couldn't find that symbol on the market." msgstr "Nous n'avons pas trouvé ce symbole sur le marché." @@ -1114,18 +1121,18 @@ msgstr "ce que le portefeuille paie aujourd'hui, avant nouveaux versements" msgid "← Back to home" msgstr "← Retour à l'accueil" -#: lib/quantic_web/components/layouts.ex:180 +#: lib/quantic_web/components/layouts.ex:184 #, elixir-autogen, elixir-format msgid "Sign up to start your own" msgstr "Inscrivez-vous pour créer le vôtre" -#: lib/quantic_web/components/layouts.ex:176 +#: lib/quantic_web/components/layouts.ex:180 #, elixir-autogen, elixir-format msgid "You're exploring a demo portfolio — changes are yours to play with and expire in 24h." msgstr "Vous explorez un portefeuille de démonstration — les modifications sont à vous pour expérimenter et expirent dans 24h." #: lib/quantic_web/live/portfolio_live.ex:369 -#: lib/quantic_web/live/radar_live.ex:270 +#: lib/quantic_web/live/radar_live.ex:303 #, elixir-autogen, elixir-format msgid "AI insights" msgstr "Analyses IA" @@ -1149,42 +1156,22 @@ msgstr "Résumé IA" msgid "Analyzing your stocks…" msgstr "Analyse de vos actions…" -#: lib/quantic_web/components/ai_components.ex:179 -#, elixir-autogen, elixir-format -msgid "Avoid" -msgstr "Éviter" - -#: lib/quantic_web/components/ai_components.ex:176 -#, elixir-autogen, elixir-format -msgid "Buy" -msgstr "Acheter" - #: lib/quantic_web/components/ai_components.ex:86 #, elixir-autogen, elixir-format msgid "Buying opportunities" msgstr "Opportunités d'achat" -#: lib/quantic_web/components/ai_components.ex:178 -#, elixir-autogen, elixir-format -msgid "Caution" -msgstr "Prudence" - #: lib/quantic_web/components/ai_components.ex:104 #, elixir-autogen, elixir-format msgid "Dividend coverage" msgstr "Couverture des dividendes" -#: lib/quantic_web/components/ai_components.ex:177 -#, elixir-autogen, elixir-format -msgid "Hold" -msgstr "Conserver" - #: lib/quantic_web/live/portfolio_live.ex:393 #, elixir-autogen, elixir-format msgid "Portfolio AI insights" msgstr "Analyse IA du portefeuille" -#: lib/quantic_web/live/radar_live.ex:300 +#: lib/quantic_web/live/radar_live.ex:320 #, elixir-autogen, elixir-format msgid "Radar AI insights" msgstr "Analyse IA du radar" @@ -1199,12 +1186,8 @@ msgstr "Signaux de risque" msgid "Strengths" msgstr "Points forts" -#: lib/quantic_web/components/ai_components.ex:175 -#, elixir-autogen, elixir-format -msgid "Strong buy" -msgstr "Achat fort" - -#: lib/quantic_web/components/ai_components.ex:162 +#: lib/quantic_web/components/ai_components.ex:157 +#: lib/quantic_web/live/ask_live.ex:259 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — your quota resets at midnight UTC." msgstr "Vous avez utilisé vos %{limit} requêtes IA du jour — votre quota se réinitialise à minuit UTC." @@ -1219,7 +1202,7 @@ msgstr "Demandez-moi par exemple :\n• qu'y a-t-il sur mon radar ?\n• dividen msgid "Ask the bot about your portfolio, radar and dividends." msgstr "Interrogez le bot sur votre portefeuille, radar et dividendes." -#: lib/quantic_web/components/home_components.ex:408 +#: lib/quantic_web/components/home_components.ex:444 #: lib/quantic_web/live/settings_live.ex:307 #, elixir-autogen, elixir-format msgid "Connect Telegram" @@ -1293,7 +1276,8 @@ msgid "Refresh status" msgstr "Actualiser le statut" #: lib/quantic/telegram/handler.ex:79 -#: lib/quantic/telegram/handler.ex:201 +#: lib/quantic/telegram/handler.ex:204 +#: lib/quantic_web/live/ask_live.ex:264 #, elixir-autogen, elixir-format msgid "Something went wrong — please try again." msgstr "Une erreur est survenue — veuillez réessayer." @@ -1323,7 +1307,7 @@ msgstr "Commande inconnue — essayez /help." msgid "Use /notifications on|off to change." msgstr "Utilisez /notifications on|off pour changer." -#: lib/quantic/telegram/handler.ex:195 +#: lib/quantic/telegram/handler.ex:198 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — quota resets at midnight UTC." msgstr "Vous avez utilisé vos %{limit} requêtes IA du jour — votre quota se réinitialise à minuit UTC." @@ -1368,38 +1352,38 @@ msgstr "• %{symbol} a versé %{amount} %{currency} nets" msgid "📊 Your Quantic daily digest" msgstr "📊 Votre résumé quotidien Quantic" -#: lib/quantic_web/components/layouts.ex:408 +#: lib/quantic_web/components/layouts.ex:419 #, elixir-autogen, elixir-format msgid "Built with Elixir, Phoenix LiveView, and Tailwind CSS" msgstr "Conçu avec Elixir, Phoenix LiveView et Tailwind CSS" -#: lib/quantic_web/components/layouts.ex:227 +#: lib/quantic_web/components/layouts.ex:238 #, elixir-autogen, elixir-format msgid "Close menu" msgstr "Fermer le menu" -#: lib/quantic_web/components/layouts.ex:313 +#: lib/quantic_web/components/layouts.ex:324 #, elixir-autogen, elixir-format msgid "FAQ" msgstr "FAQ" -#: lib/quantic_web/components/layouts.ex:421 +#: lib/quantic_web/components/layouts.ex:432 #, elixir-autogen, elixir-format msgid "Frequently Asked Questions" msgstr "Foire aux questions" -#: lib/quantic_web/components/layouts.ex:241 +#: lib/quantic_web/components/layouts.ex:252 #, elixir-autogen, elixir-format msgid "Home" msgstr "Accueil" -#: lib/quantic_web/components/layouts.ex:158 -#: lib/quantic_web/components/layouts.ex:223 +#: lib/quantic_web/components/layouts.ex:162 +#: lib/quantic_web/components/layouts.ex:234 #, elixir-autogen, elixir-format msgid "Menu" msgstr "Menu" -#: lib/quantic_web/components/layouts.ex:218 +#: lib/quantic_web/components/layouts.ex:229 #, elixir-autogen, elixir-format msgid "Navigation menu" msgstr "Menu de navigation" @@ -1409,42 +1393,42 @@ msgstr "Menu de navigation" msgid "New here? Signing in creates your account automatically." msgstr "Nouveau ici ? La connexion crée automatiquement votre compte." -#: lib/quantic_web/components/layouts.ex:149 -#: lib/quantic_web/components/layouts.ex:355 +#: lib/quantic_web/components/layouts.ex:153 +#: lib/quantic_web/components/layouts.ex:366 #, elixir-autogen, elixir-format msgid "Sign in" msgstr "Se connecter" -#: lib/quantic_web/components/layouts.ex:345 +#: lib/quantic_web/components/layouts.ex:356 #, elixir-autogen, elixir-format msgid "Sign out" msgstr "Se déconnecter" -#: lib/quantic_web/components/layouts.ex:398 +#: lib/quantic_web/components/layouts.ex:409 #, elixir-autogen, elixir-format msgid "The information on Quantic is provided for informational and educational purposes only. It is general in nature, does not take into account your personal financial situation, and does not constitute investment, financial, tax, or legal advice — nor a recommendation to buy or sell any security. Investing involves risk, including possible loss of principal; past performance is not a reliable indicator of future results. Market data comes from third-party providers and may be delayed or inaccurate. Before making any investment decision, consider your objectives, time horizon, risk tolerance, and diversification, and consult a qualified financial professional. Quantic is not a registered investment adviser or broker-dealer." msgstr "Les informations sur Quantic sont fournies à titre purement informatif et éducatif. Elles sont de nature générale, ne tiennent pas compte de votre situation financière personnelle et ne constituent pas un conseil en investissement, financier, fiscal ou juridique — ni une recommandation d'achat ou de vente d'un quelconque titre. Investir comporte des risques, y compris la perte possible du capital ; les performances passées ne sont pas un indicateur fiable des résultats futurs. Les données de marché proviennent de fournisseurs tiers et peuvent être retardées ou inexactes. Avant toute décision d'investissement, prenez en compte vos objectifs, votre horizon de placement, votre tolérance au risque et votre diversification, et consultez un professionnel financier qualifié. Quantic n'est ni un conseiller en investissement enregistré ni un courtier." -#: lib/quantic_web/components/home_components.ex:397 +#: lib/quantic_web/components/home_components.ex:433 #, elixir-autogen, elixir-format msgid "\"what dividends did I get this month?\" · \"show my radar\" · \"any ex-divs this week?\"" msgstr "\"quels dividendes ai-je reçus ce mois-ci ?\" · \"montre mon radar\" · \"des ex-div cette semaine ?\"" -#: lib/quantic_web/components/home_components.ex:568 +#: lib/quantic_web/components/home_components.ex:604 #, elixir-autogen, elixir-format msgid "%{count} on radar" msgid_plural "%{count} on radar" msgstr[0] "%{count} sur le radar" msgstr[1] "%{count} sur le radar" -#: lib/quantic_web/components/home_components.ex:721 +#: lib/quantic_web/components/home_components.ex:757 #, elixir-autogen, elixir-format msgid "+ %{count} more currency" msgid_plural "+ %{count} more currencies" msgstr[0] "+ %{count} autre devise" msgstr[1] "+ %{count} autres devises" -#: lib/quantic_web/components/home_components.ex:289 +#: lib/quantic_web/components/home_components.ex:325 #, elixir-autogen, elixir-format msgid "A live community of dividend investors. Browse what others hold, what they target, and how they structure their portfolios." msgstr "Une communauté vivante d'investisseurs en dividendes. Parcourez ce que les autres détiennent, ce qu'ils visent et comment ils structurent leurs portefeuilles." @@ -1459,12 +1443,12 @@ msgstr "L'investissement en dividendes augmenté par l'IA. Construisez votre lis msgid "Add stocks with target prices. We track price, score, and ex-div dates." msgstr "Ajoutez des actions avec des prix cibles. Nous suivons le cours, le score et les dates ex-dividende." -#: lib/quantic_web/components/home_components.ex:648 +#: lib/quantic_web/components/home_components.ex:684 #, elixir-autogen, elixir-format msgid "Add your first holding" msgstr "Ajouter votre première position" -#: lib/quantic_web/components/home_components.ex:392 +#: lib/quantic_web/components/home_components.ex:428 #, elixir-autogen, elixir-format msgid "Ask your portfolio anything in natural language — ex-divs, totals, target prices — right from Telegram." msgstr "Posez n'importe quelle question à votre portefeuille en langage naturel — ex-div, totaux, prix cibles — directement depuis Telegram." @@ -1479,22 +1463,22 @@ msgstr "Construisez votre radar" msgid "Create your plan" msgstr "Créez votre plan" -#: lib/quantic_web/components/home_components.ex:616 +#: lib/quantic_web/components/home_components.ex:652 #, elixir-autogen, elixir-format msgid "Current yield" msgstr "Rendement actuel" -#: lib/quantic_web/components/home_components.ex:678 +#: lib/quantic_web/components/home_components.ex:714 #, elixir-autogen, elixir-format msgid "Dividend income" msgstr "Revenu de dividendes" -#: lib/quantic_web/components/home_components.ex:862 +#: lib/quantic_web/components/home_components.ex:898 #, elixir-autogen, elixir-format msgid "Ex-dividend dates in the next %{days} days" msgstr "Dates ex-dividende dans les %{days} prochains jours" -#: lib/quantic_web/components/home_components.ex:954 +#: lib/quantic_web/components/home_components.ex:990 #: lib/quantic_web/components/stock_card_components.ex:143 #: lib/quantic_web/live/buy_plan_live.ex:546 #, elixir-autogen, elixir-format @@ -1506,7 +1490,7 @@ msgstr "Correct" msgid "Free · No broker connection required · Open source" msgstr "Gratuit · Aucune connexion au courtier requise · Open source" -#: lib/quantic_web/components/home_components.ex:515 +#: lib/quantic_web/components/home_components.ex:551 #, elixir-autogen, elixir-format msgid "Free, no broker connection required. Try a sample portfolio or sign up to build your own." msgstr "Gratuit, sans connexion au courtier. Essayez un portefeuille d'exemple ou inscrivez-vous pour créer le vôtre." @@ -1521,17 +1505,17 @@ msgstr "De la liste de suivi au revenu de dividendes en 3 étapes" msgid "Get AI insights" msgstr "Obtenez des analyses IA" -#: lib/quantic_web/components/home_components.ex:557 +#: lib/quantic_web/components/home_components.ex:593 #, elixir-autogen, elixir-format msgid "Good afternoon, %{name}" msgstr "Bon après-midi, %{name}" -#: lib/quantic_web/components/home_components.ex:559 +#: lib/quantic_web/components/home_components.ex:595 #, elixir-autogen, elixir-format msgid "Good evening, %{name}" msgstr "Bonsoir, %{name}" -#: lib/quantic_web/components/home_components.ex:555 +#: lib/quantic_web/components/home_components.ex:591 #, elixir-autogen, elixir-format msgid "Good morning, %{name}" msgstr "Bonjour, %{name}" @@ -1546,32 +1530,32 @@ msgstr "En direct" msgid "Log holdings to get live yield, sector mix, and dividend forecast." msgstr "Enregistrez vos positions pour obtenir le rendement en direct, la répartition sectorielle et les prévisions de dividendes." -#: lib/quantic_web/live/home_live.ex:120 +#: lib/quantic_web/live/home_live.ex:121 #, elixir-autogen, elixir-format msgid "Most Added to Radar" msgstr "Les plus ajoutées au radar" -#: lib/quantic_web/live/home_live.ex:125 +#: lib/quantic_web/live/home_live.ex:126 #, elixir-autogen, elixir-format msgid "Most Held in Portfolios" msgstr "Les plus détenues en portefeuille" -#: lib/quantic_web/components/home_components.ex:572 +#: lib/quantic_web/components/home_components.ex:608 #, elixir-autogen, elixir-format msgid "Next ex-div: %{symbol} in %{days}d" msgstr "Prochain ex-div : %{symbol} dans %{days} j" -#: lib/quantic_web/components/home_components.ex:480 +#: lib/quantic_web/components/home_components.ex:516 #, elixir-autogen, elixir-format msgid "No stocks found." msgstr "Aucune action trouvée." -#: lib/quantic_web/components/home_components.ex:577 +#: lib/quantic_web/components/home_components.ex:613 #, elixir-autogen, elixir-format msgid "No upcoming ex-div dates" msgstr "Aucune date ex-dividende à venir" -#: lib/quantic_web/components/home_components.ex:793 +#: lib/quantic_web/components/home_components.ex:829 #, elixir-autogen, elixir-format msgid "Open my plan" msgstr "Ouvrir mon plan" @@ -1581,32 +1565,32 @@ msgstr "Ouvrir mon plan" msgid "Plain-language analysis of your portfolio and radar — risks, gaps, opportunities." msgstr "Analyse en langage clair de votre portefeuille et de votre radar — risques, lacunes, opportunités." -#: lib/quantic_web/components/home_components.ex:608 +#: lib/quantic_web/components/home_components.ex:644 #, elixir-autogen, elixir-format msgid "Portfolio stats" msgstr "Statistiques du portefeuille" -#: lib/quantic_web/components/home_components.ex:388 +#: lib/quantic_web/components/home_components.ex:424 #, elixir-autogen, elixir-format msgid "Quantic in Telegram" msgstr "Quantic dans Telegram" -#: lib/quantic_web/live/home_live.ex:130 +#: lib/quantic_web/live/home_live.ex:131 #, elixir-autogen, elixir-format msgid "Recently Updated" msgstr "Mis à jour récemment" -#: lib/quantic_web/components/home_components.ex:298 +#: lib/quantic_web/components/home_components.ex:334 #, elixir-autogen, elixir-format msgid "See the community" msgstr "Voir la communauté" -#: lib/quantic_web/components/home_components.ex:285 +#: lib/quantic_web/components/home_components.ex:321 #, elixir-autogen, elixir-format msgid "Share your portfolio with the community" msgstr "Partagez votre portefeuille avec la communauté" -#: lib/quantic_web/components/home_components.ex:529 +#: lib/quantic_web/components/home_components.ex:565 #, elixir-autogen, elixir-format msgid "Sign up" msgstr "S'inscrire" @@ -1616,39 +1600,39 @@ msgstr "S'inscrire" msgid "Sign up free" msgstr "S'inscrire gratuitement" -#: lib/quantic_web/components/home_components.ex:410 +#: lib/quantic_web/components/home_components.ex:446 #, elixir-autogen, elixir-format msgid "Sign up to connect" msgstr "Inscrivez-vous pour connecter Telegram" -#: lib/quantic_web/components/home_components.ex:304 +#: lib/quantic_web/components/home_components.ex:340 #, elixir-autogen, elixir-format msgid "Sign up to share yours" msgstr "Inscrivez-vous pour partager le vôtre" -#: lib/quantic_web/components/home_components.ex:512 +#: lib/quantic_web/components/home_components.ex:548 #, elixir-autogen, elixir-format msgid "Start your radar in 30 seconds" msgstr "Lancez votre radar en 30 secondes" -#: lib/quantic_web/components/home_components.ex:953 +#: lib/quantic_web/components/home_components.ex:989 #: lib/quantic_web/components/stock_card_components.ex:142 #: lib/quantic_web/live/buy_plan_live.ex:545 #, elixir-autogen, elixir-format msgid "Strong" msgstr "Solide" -#: lib/quantic_web/components/home_components.ex:690 +#: lib/quantic_web/components/home_components.ex:726 #, elixir-autogen, elixir-format msgid "This month" msgstr "Ce mois-ci" -#: lib/quantic_web/components/home_components.ex:435 +#: lib/quantic_web/components/home_components.ex:471 #, elixir-autogen, elixir-format msgid "Top Dividend Scores" msgstr "Meilleurs scores de dividende" -#: lib/quantic_web/components/home_components.ex:650 +#: lib/quantic_web/components/home_components.ex:686 #, elixir-autogen, elixir-format msgid "Track real yield, dividend forecast, and sector mix. Takes a minute." msgstr "Suivez le rendement réel, les prévisions de dividendes et la répartition sectorielle. En une minute." @@ -1673,17 +1657,17 @@ msgstr "Tendances dans la communauté" msgid "Try a sample portfolio" msgstr "Essayer un portefeuille d'exemple" -#: lib/quantic_web/components/home_components.ex:526 +#: lib/quantic_web/components/home_components.ex:562 #, elixir-autogen, elixir-format msgid "Try the demo" msgstr "Essayer la démo" -#: lib/quantic_web/components/home_components.ex:821 +#: lib/quantic_web/components/home_components.ex:857 #, elixir-autogen, elixir-format msgid "View full buy plan" msgstr "Voir le plan d'achat complet" -#: lib/quantic_web/components/home_components.ex:955 +#: lib/quantic_web/components/home_components.ex:991 #: lib/quantic_web/components/stock_card_components.ex:144 #: lib/quantic_web/live/buy_plan_live.ex:547 #, elixir-autogen, elixir-format @@ -1695,12 +1679,12 @@ msgstr "Faible" msgid "What investors are watching" msgstr "Ce que les investisseurs surveillent" -#: lib/quantic_web/components/home_components.ex:612 +#: lib/quantic_web/components/home_components.ex:648 #, elixir-autogen, elixir-format msgid "Yield on cost" msgstr "Yield on Cost" -#: lib/quantic_web/components/home_components.ex:815 +#: lib/quantic_web/components/home_components.ex:851 #, elixir-autogen, elixir-format msgid "Your next picks" msgstr "Vos prochains choix" @@ -1715,13 +1699,13 @@ msgstr "dividendes" msgid "ex-div dates" msgstr "dates ex-dividende" -#: lib/quantic_web/components/home_components.ex:900 +#: lib/quantic_web/components/home_components.ex:936 #, elixir-autogen, elixir-format msgid "in %{days}d" msgstr "dans %{days} j" -#: lib/quantic_web/live/home_live.ex:199 -#: lib/quantic_web/live/home_live.ex:210 +#: lib/quantic_web/live/home_live.ex:200 +#: lib/quantic_web/live/home_live.ex:211 #, elixir-autogen, elixir-format msgid "investor" msgstr "investisseur" @@ -1731,12 +1715,12 @@ msgstr "investisseur" msgid "radar targets" msgstr "objectifs radar" -#: lib/quantic_web/components/home_components.ex:896 +#: lib/quantic_web/components/home_components.ex:932 #, elixir-autogen, elixir-format msgid "today" msgstr "aujourd'hui" -#: lib/quantic_web/components/home_components.ex:898 +#: lib/quantic_web/components/home_components.ex:934 #, elixir-autogen, elixir-format msgid "tomorrow" msgstr "demain" @@ -1756,17 +1740,17 @@ msgstr "%{percentage}% au-dessus de la cible" msgid "%{percentage}% below target" msgstr "%{percentage}% sous la cible" -#: lib/quantic_web/live/radar_live.ex:430 +#: lib/quantic_web/live/radar_live.ex:450 #, elixir-autogen, elixir-format msgid "200-day average" msgstr "Moyenne 200 jours" -#: lib/quantic_web/live/radar_live.ex:436 +#: lib/quantic_web/live/radar_live.ex:456 #, elixir-autogen, elixir-format msgid "50-day average" msgstr "Moyenne 50 jours" -#: lib/quantic_web/live/radar_live.ex:424 +#: lib/quantic_web/live/radar_live.ex:444 #, elixir-autogen, elixir-format msgid "52-week midpoint" msgstr "Point médian 52 semaines" @@ -1798,7 +1782,7 @@ msgstr "Effacer la recherche" msgid "Click to edit" msgstr "Cliquez pour modifier" -#: lib/quantic_web/live/radar_live.ex:418 +#: lib/quantic_web/live/radar_live.ex:438 #, elixir-autogen, elixir-format msgid "Community average" msgstr "Moyenne de la communauté" @@ -1808,7 +1792,7 @@ msgstr "Moyenne de la communauté" msgid "Compact view" msgstr "Vue compacte" -#: lib/quantic_web/live/radar_live.ex:182 +#: lib/quantic_web/live/radar_live.ex:198 #, elixir-autogen, elixir-format msgid "Could not apply that target price." msgstr "Impossible d'appliquer ce prix cible." @@ -1863,12 +1847,12 @@ msgstr "En portefeuille" msgid "Market value" msgstr "Valeur de marché" -#: lib/quantic_web/live/radar_live.ex:446 +#: lib/quantic_web/live/radar_live.ex:466 #, elixir-autogen, elixir-format msgid "Needs 3+ community targets (%{count} so far)" msgstr "Nécessite 3+ cibles de la communauté (%{count} pour l'instant)" -#: lib/quantic_web/live/radar_live.ex:448 +#: lib/quantic_web/live/radar_live.ex:468 #, elixir-autogen, elixir-format msgid "No community targets yet" msgstr "Pas encore de cibles de la communauté" @@ -1894,13 +1878,13 @@ msgstr "Pas de données de calendrier" msgid "No target set" msgstr "Aucune cible définie" -#: lib/quantic_web/live/radar_live.ex:313 -#: lib/quantic_web/live/radar_live.ex:328 +#: lib/quantic_web/live/radar_live.ex:333 +#: lib/quantic_web/live/radar_live.ex:348 #, elixir-autogen, elixir-format msgid "Nothing on your radar yet. Search above to add your first stock." msgstr "Rien sur votre radar pour l'instant. Recherchez ci-dessus pour ajouter votre première action." -#: lib/quantic_web/live/radar_live.ex:285 +#: lib/quantic_web/live/radar_live.ex:280 #, elixir-autogen, elixir-format msgid "On radar" msgstr "Sur le radar" @@ -1916,7 +1900,7 @@ msgid "Position" msgstr "Position" #: lib/quantic_web/live/portfolio_live.ex:377 -#: lib/quantic_web/live/radar_live.ex:262 +#: lib/quantic_web/live/radar_live.ex:311 #, elixir-autogen, elixir-format msgid "Public page" msgstr "Page publique" @@ -1928,7 +1912,7 @@ msgid "Score" msgstr "Score" #: lib/quantic_web/live/portfolio_live.ex:306 -#: lib/quantic_web/live/radar_live.ex:280 +#: lib/quantic_web/live/radar_live.ex:275 #, elixir-autogen, elixir-format msgid "Search by ticker or company name…" msgstr "Recherchez par ticker ou nom d'entreprise…" @@ -1956,12 +1940,12 @@ msgstr "Statut" msgid "Suggest a target" msgstr "Suggérer une cible" -#: lib/quantic_web/live/radar_live.ex:175 +#: lib/quantic_web/live/radar_live.ex:191 #, elixir-autogen, elixir-format msgid "Target for %{symbol} set to %{price}." msgstr "Cible de %{symbol} fixée à %{price}." -#: lib/quantic_web/live/radar_live.ex:90 +#: lib/quantic_web/live/radar_live.ex:95 #, elixir-autogen, elixir-format msgid "That stock is already on your radar." msgstr "Cette action est déjà sur votre radar." @@ -2078,7 +2062,7 @@ msgstr "Beta" #: lib/quantic_web/live/admin_content_drafts_live.ex:272 #: lib/quantic_web/live/portfolio_live.ex:447 -#: lib/quantic_web/live/radar_live.ex:342 +#: lib/quantic_web/live/radar_live.ex:362 #, elixir-autogen, elixir-format msgid "Dividend calendar" msgstr "Calendrier des dividendes" @@ -2334,7 +2318,7 @@ msgstr "Versement mensuel" msgid "Monthly dividend goal (today's money)" msgstr "Objectif de dividende mensuel (argent d'aujourd'hui)" -#: lib/quantic_web/components/home_components.ex:762 +#: lib/quantic_web/components/home_components.ex:798 #: lib/quantic_web/live/path_to_freedom_live.ex:379 #, elixir-autogen, elixir-format msgid "Not in reach yet" @@ -2440,7 +2424,7 @@ msgstr "Votre objectif reste hors de portée dans l'horizon." msgid "Your journey to freedom" msgstr "Votre chemin vers la liberté" -#: lib/quantic_web/components/home_components.ex:757 +#: lib/quantic_web/components/home_components.ex:793 #: lib/quantic_web/live/path_to_freedom_live.ex:353 #: lib/quantic_web/live/path_to_freedom_live.ex:856 #: lib/quantic_web/live/path_to_freedom_live.ex:1066 @@ -2494,7 +2478,7 @@ msgstr "¾ de votre objectif" msgid "✓ today" msgstr "✓ aujourd'hui" -#: lib/quantic_web/components/home_components.ex:765 +#: lib/quantic_web/components/home_components.ex:801 #, elixir-autogen, elixir-format msgid "Keep going — see what changes it" msgstr "Continuez — voyez ce qui change la donne" @@ -2524,7 +2508,7 @@ msgstr "Indiquez votre objectif de dividendes mensuels. Nous vous dirons l'anné msgid "The year, and your age, when dividends cover your goal" msgstr "L'année, et votre âge, où les dividendes couvrent votre objectif" -#: lib/quantic_web/components/home_components.ex:783 +#: lib/quantic_web/components/home_components.ex:819 #, elixir-autogen, elixir-format msgid "per month" msgstr "par mois" @@ -2741,7 +2725,7 @@ msgstr "Utilisateurs actifs — 8 dernières semaines" msgid "Activity" msgstr "Activité" -#: lib/quantic_web/components/layouts.ex:330 +#: lib/quantic_web/components/layouts.ex:341 #: lib/quantic_web/live/admin_content_drafts_live.ex:112 #: lib/quantic_web/live/admin_dashboard_live.ex:18 #: lib/quantic_web/live/admin_dashboard_live.ex:64 @@ -3189,3 +3173,115 @@ msgstr "Vos liens seront :" #, elixir-autogen, elixir-format msgid "Your public link" msgstr "Votre lien public" + +#: lib/quantic_web/components/home_components.ex:292 +#, elixir-autogen, elixir-format +msgid "\"Any ex-dividends this week?\"" +msgstr "« Des ex-dividendes cette semaine ? »" + +#: lib/quantic_web/components/home_components.ex:290 +#, elixir-autogen, elixir-format +msgid "\"What dividends did I get this month?\"" +msgstr "« Quels dividendes ai-je reçus ce mois-ci ? »" + +#: lib/quantic_web/components/home_components.ex:291 +#, elixir-autogen, elixir-format +msgid "\"What's my biggest holding?\"" +msgstr "« Quelle est ma plus grande position ? »" + +#: lib/quantic_web/components/home_components.ex:289 +#, elixir-autogen, elixir-format +msgid "\"Which of my stocks are below my target?\"" +msgstr "« Lesquelles de mes actions sont sous mon objectif ? »" + +#: lib/quantic_web/live/ask_live.ex:208 +#, elixir-autogen, elixir-format +msgid "%{remaining}/%{limit} left" +msgstr "%{remaining}/%{limit} restantes" + +#: lib/quantic_web/components/home_components.ex:284 +#, elixir-autogen, elixir-format +msgid "An AI assistant on every page. Ask about your portfolio, radar, and dividends in plain language — it reads your own data to answer." +msgstr "Un assistant IA sur chaque page. Posez vos questions sur votre portefeuille, votre radar et vos dividendes en langage naturel : il lit vos propres données pour répondre." + +#: lib/quantic_web/components/home_components.ex:281 +#: lib/quantic_web/live/ask_live.ex:196 +#: lib/quantic_web/live/ask_live.ex:303 +#, elixir-autogen, elixir-format +msgid "Ask Quantic" +msgstr "Demander à Quantic" + +#: lib/quantic_web/live/ask_live.ex:279 +#, elixir-autogen, elixir-format +msgid "Ask a question…" +msgstr "Posez une question…" + +#: lib/quantic_web/live/ask_live.ex:217 +#, elixir-autogen, elixir-format +msgid "Ask me about your portfolio, radar or dividends." +msgstr "Posez-moi des questions sur votre portefeuille, votre radar ou vos dividendes." + +#: lib/quantic_web/live/ask_live.ex:379 +#, elixir-autogen, elixir-format +msgid "Dividends this month?" +msgstr "Dividendes ce mois-ci ?" + +#: lib/quantic_web/live/ask_live.ex:288 +#, elixir-autogen, elixir-format +msgid "Send" +msgstr "Envoyer" + +#: lib/quantic_web/live/ask_live.ex:256 +#, elixir-autogen, elixir-format +msgid "Thinking…" +msgstr "Réflexion…" + +#: lib/quantic_web/components/home_components.ex:299 +#, elixir-autogen, elixir-format +msgid "Try it" +msgstr "Essayer" + +#: lib/quantic_web/live/ask_live.ex:376 +#, elixir-autogen, elixir-format +msgid "What's my biggest holding?" +msgstr "Quelle est ma plus grande position ?" + +#: lib/quantic_web/live/ask_live.ex:378 +#, elixir-autogen, elixir-format +msgid "Which stocks are below my target?" +msgstr "Quelles actions sont sous mon objectif ?" + +#: lib/quantic_web/live/ask_live.ex:201 +#, elixir-autogen, elixir-format +msgid "on %{page}" +msgstr "sur %{page}" + +#: lib/quantic_web/live/ask_live.ex:377 +#, elixir-autogen, elixir-format +msgid "What do you think of KO?" +msgstr "Que pensez-vous de KO ?" + +#: lib/quantic_web/live/ask_live.ex:295 +#, elixir-autogen, elixir-format +msgid "Informational only — not financial advice." +msgstr "À titre informatif uniquement — pas un conseil financier." + +#: lib/quantic_web/live/radar_live.ex:504 +#, elixir-autogen, elixir-format +msgid "Dividend score" +msgstr "Score de dividende" + +#: lib/quantic_web/live/radar_live.ex:503 +#, elixir-autogen, elixir-format +msgid "Dividend yield" +msgstr "Rendement du dividende" + +#: lib/quantic_web/live/radar_live.ex:501 +#, elixir-autogen, elixir-format +msgid "Opportunity" +msgstr "Opportunité" + +#: lib/quantic_web/live/ask_live.ex:362 +#, elixir-autogen, elixir-format +msgid "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" +msgstr "Vous explorez une démo, ceci est donc une réponse d'exemple plutôt qu'une vraie réponse (cela garde la démo gratuite). Avec votre propre compte, je lis vos positions, votre radar et vos dividendes réels pour répondre à ce genre de questions. Inscrivez-vous pour l'essayer pour de vrai !" diff --git a/priv/gettext/it/LC_MESSAGES/default.po b/priv/gettext/it/LC_MESSAGES/default.po index b0cec0d..f8a825d 100644 --- a/priv/gettext/it/LC_MESSAGES/default.po +++ b/priv/gettext/it/LC_MESSAGES/default.po @@ -17,22 +17,23 @@ msgstr "" msgid "Actions" msgstr "Operazioni" -#: lib/quantic_web/components/layouts.ex:455 -#: lib/quantic_web/components/layouts.ex:467 +#: lib/quantic_web/components/layouts.ex:466 +#: lib/quantic_web/components/layouts.ex:478 #, elixir-autogen, elixir-format msgid "Attempting to reconnect" msgstr "Tentativo di riconnessione" -#: lib/quantic_web/components/layouts.ex:65 -#: lib/quantic_web/components/layouts.ex:272 +#: lib/quantic_web/ask_context.ex:39 +#: lib/quantic_web/components/layouts.ex:69 +#: lib/quantic_web/components/layouts.ex:283 #: lib/quantic_web/live/buy_plan_live.ex:26 #: lib/quantic_web/live/buy_plan_live.ex:233 #, elixir-autogen, elixir-format msgid "Buy plan" msgstr "Piano di acquisto" -#: lib/quantic_web/components/layouts.ex:81 -#: lib/quantic_web/components/layouts.ex:303 +#: lib/quantic_web/components/layouts.ex:85 +#: lib/quantic_web/components/layouts.ex:314 #: lib/quantic_web/live/admin_dashboard_live.ex:211 #: lib/quantic_web/live/community_dashboard_live.ex:27 #: lib/quantic_web/live/community_dashboard_live.ex:65 @@ -40,8 +41,9 @@ msgstr "Piano di acquisto" msgid "Community" msgstr "Community" -#: lib/quantic_web/components/layouts.ex:70 -#: lib/quantic_web/components/layouts.ex:282 +#: lib/quantic_web/ask_context.ex:41 +#: lib/quantic_web/components/layouts.ex:74 +#: lib/quantic_web/components/layouts.ex:293 #: lib/quantic_web/components/stock_card_components.ex:589 #: lib/quantic_web/components/stock_card_components.ex:806 #: lib/quantic_web/components/stock_card_components.ex:1267 @@ -52,36 +54,38 @@ msgstr "Community" msgid "Dividends" msgstr "Dividendi" -#: lib/quantic_web/components/layouts.ex:75 -#: lib/quantic_web/components/layouts.ex:292 +#: lib/quantic_web/components/layouts.ex:79 +#: lib/quantic_web/components/layouts.ex:303 #, elixir-autogen, elixir-format msgid "Freedom" msgstr "Libertà" -#: lib/quantic_web/components/layouts.ex:55 -#: lib/quantic_web/components/layouts.ex:252 +#: lib/quantic_web/ask_context.ex:37 +#: lib/quantic_web/components/layouts.ex:59 +#: lib/quantic_web/components/layouts.ex:263 #: lib/quantic_web/live/path_to_freedom_live.ex:300 #: lib/quantic_web/live/portfolio_live.ex:262 #, elixir-autogen, elixir-format msgid "Portfolio" msgstr "Portafoglio" -#: lib/quantic_web/components/home_components.ex:879 -#: lib/quantic_web/components/layouts.ex:60 -#: lib/quantic_web/components/layouts.ex:262 +#: lib/quantic_web/ask_context.ex:38 +#: lib/quantic_web/components/home_components.ex:915 +#: lib/quantic_web/components/layouts.ex:64 +#: lib/quantic_web/components/layouts.ex:273 #: lib/quantic_web/live/admin_dashboard_live.ex:362 #: lib/quantic_web/live/public_radar_live.ex:105 -#: lib/quantic_web/live/radar_live.ex:254 +#: lib/quantic_web/live/radar_live.ex:269 #, elixir-autogen, elixir-format msgid "Radar" msgstr "Radar" -#: lib/quantic_web/components/layouts.ex:462 +#: lib/quantic_web/components/layouts.ex:473 #, elixir-autogen, elixir-format msgid "Something went wrong!" msgstr "Qualcosa è andato storto!" -#: lib/quantic_web/components/layouts.ex:450 +#: lib/quantic_web/components/layouts.ex:461 #, elixir-autogen, elixir-format msgid "We can't find the internet" msgstr "Non troviamo Internet" @@ -91,7 +95,7 @@ msgstr "Non troviamo Internet" msgid "close" msgstr "chiudi" -#: lib/quantic_web/components/home_components.ex:565 +#: lib/quantic_web/components/home_components.ex:601 #: lib/quantic_web/live/public_portfolio_live.ex:123 #, elixir-autogen, elixir-format msgid "%{count} holding" @@ -182,12 +186,12 @@ msgstr "Aggiungi prima posizioni o titoli al radar — appariranno qui, in class msgid "Add to portfolio" msgstr "Aggiungi al portafoglio" -#: lib/quantic_web/live/radar_live.ex:294 +#: lib/quantic_web/live/radar_live.ex:289 #, elixir-autogen, elixir-format msgid "Add to radar" msgstr "Aggiungi al radar" -#: lib/quantic_web/live/radar_live.ex:75 +#: lib/quantic_web/live/radar_live.ex:80 #, elixir-autogen, elixir-format msgid "Added %{symbol} to your radar." msgstr "%{symbol} aggiunto al tuo radar." @@ -313,7 +317,7 @@ msgstr "Settori della community" msgid "Community sharing" msgstr "Condivisione con la community" -#: lib/quantic_web/components/home_components.ex:331 +#: lib/quantic_web/components/home_components.ex:367 #: lib/quantic_web/live/community_dashboard_live.ex:101 #, elixir-autogen, elixir-format msgid "Community value" @@ -435,7 +439,7 @@ msgstr "Non riuscito" msgid "Fill price" msgstr "Prezzo di esecuzione" -#: lib/quantic_web/components/home_components.ex:752 +#: lib/quantic_web/components/home_components.ex:788 #: lib/quantic_web/live/path_to_freedom_live.ex:346 #, elixir-autogen, elixir-format msgid "Freedom in" @@ -446,7 +450,7 @@ msgstr "Libertà tra" msgid "Full history" msgstr "Storico completo" -#: lib/quantic_web/components/home_components.ex:656 +#: lib/quantic_web/components/home_components.ex:692 #, elixir-autogen, elixir-format msgid "Go to portfolio" msgstr "Vai al portafoglio" @@ -528,13 +532,13 @@ msgstr "Tasso di interesse %" msgid "It expires in 15 minutes." msgstr "Scade tra 15 minuti." -#: lib/quantic_web/components/layouts.ex:91 +#: lib/quantic_web/components/layouts.ex:95 #: lib/quantic_web/live/settings_live.ex:174 #, elixir-autogen, elixir-format msgid "Language" msgstr "Lingua" -#: lib/quantic_web/components/home_components.ex:698 +#: lib/quantic_web/components/home_components.ex:734 #: lib/quantic_web/live/dividends_live.ex:356 #, elixir-autogen, elixir-format msgid "Last 12 months" @@ -542,7 +546,7 @@ msgstr "Ultimi 12 mesi" #: lib/quantic_web/live/dividends_live.ex:80 #: lib/quantic_web/live/portfolio_live.ex:105 -#: lib/quantic_web/live/radar_live.ex:86 +#: lib/quantic_web/live/radar_live.ex:91 #, elixir-autogen, elixir-format msgid "Market-data provider is unreachable right now. Please try again." msgstr "Il fornitore di dati di mercato non è raggiungibile al momento. Riprova." @@ -621,8 +625,9 @@ msgstr "Obiettivo" msgid "Other capital (bonds, savings, index funds)" msgstr "Altro capitale (obbligazioni, risparmi, fondi indicizzati)" +#: lib/quantic_web/ask_context.ex:40 #: lib/quantic_web/components/home_components.ex:245 -#: lib/quantic_web/components/home_components.ex:745 +#: lib/quantic_web/components/home_components.ex:781 #: lib/quantic_web/live/path_to_freedom_live.ex:24 #: lib/quantic_web/live/path_to_freedom_live.ex:91 #, elixir-autogen, elixir-format @@ -661,7 +666,7 @@ msgstr "Portafoglio non trovato" msgid "Portfolio value" msgstr "Valore del portafoglio" -#: lib/quantic_web/components/home_components.ex:337 +#: lib/quantic_web/components/home_components.ex:373 #: lib/quantic_web/live/admin_dashboard_live.ex:151 #: lib/quantic_web/live/community_dashboard_live.ex:74 #: lib/quantic_web/live/community_dashboard_live.ex:81 @@ -784,7 +789,7 @@ msgstr "Rimuovere questa posizione?" msgid "Remove this stock from your radar?" msgstr "Rimuovere questo titolo dal tuo radar?" -#: lib/quantic_web/live/radar_live.ex:196 +#: lib/quantic_web/live/radar_live.ex:212 #, elixir-autogen, elixir-format msgid "Removed %{symbol} from your radar." msgstr "%{symbol} rimosso dal tuo radar." @@ -822,14 +827,15 @@ msgstr "Salva condivisione" msgid "Saved!" msgstr "Salvato!" -#: lib/quantic_web/components/home_components.ex:622 +#: lib/quantic_web/components/home_components.ex:658 #: lib/quantic_web/live/portfolio_live.ex:440 #: lib/quantic_web/live/public_portfolio_live.ex:166 #, elixir-autogen, elixir-format msgid "Sectors" msgstr "Settori" -#: lib/quantic_web/components/layouts.ex:340 +#: lib/quantic_web/ask_context.ex:42 +#: lib/quantic_web/components/layouts.ex:351 #: lib/quantic_web/live/community_dashboard_live.ex:372 #: lib/quantic_web/live/settings_live.ex:157 #, elixir-autogen, elixir-format @@ -922,6 +928,7 @@ msgstr "Titoli seguiti" #: lib/quantic_web/components/stock_card_components.ex:924 #: lib/quantic_web/live/dividends_live.ex:396 #: lib/quantic_web/live/portfolio_live.ex:565 +#: lib/quantic_web/live/radar_live.ex:502 #, elixir-autogen, elixir-format msgid "Symbol" msgstr "Simbolo" @@ -996,7 +1003,7 @@ msgid "Underweight position" msgstr "Posizione sottopesata" #: lib/quantic_web/live/portfolio_live.ex:188 -#: lib/quantic_web/live/radar_live.ex:138 +#: lib/quantic_web/live/radar_live.ex:154 #, elixir-autogen, elixir-format msgid "Updated %{symbol}." msgstr "%{symbol} aggiornato." @@ -1013,7 +1020,7 @@ msgstr "Vedi radar" #: lib/quantic_web/live/dividends_live.ex:73 #: lib/quantic_web/live/portfolio_live.ex:98 -#: lib/quantic_web/live/radar_live.ex:79 +#: lib/quantic_web/live/radar_live.ex:84 #, elixir-autogen, elixir-format msgid "We couldn't find that symbol on the market." msgstr "Non abbiamo trovato quel simbolo sul mercato." @@ -1114,18 +1121,18 @@ msgstr "quello che il portafoglio paga oggi, prima di nuovi versamenti" msgid "← Back to home" msgstr "← Torna alla home" -#: lib/quantic_web/components/layouts.ex:180 +#: lib/quantic_web/components/layouts.ex:184 #, elixir-autogen, elixir-format msgid "Sign up to start your own" msgstr "Registrati per creare il tuo" -#: lib/quantic_web/components/layouts.ex:176 +#: lib/quantic_web/components/layouts.ex:180 #, elixir-autogen, elixir-format msgid "You're exploring a demo portfolio — changes are yours to play with and expire in 24h." msgstr "Stai esplorando un portafoglio dimostrativo — le modifiche sono tue per sperimentare e scadono in 24h." #: lib/quantic_web/live/portfolio_live.ex:369 -#: lib/quantic_web/live/radar_live.ex:270 +#: lib/quantic_web/live/radar_live.ex:303 #, elixir-autogen, elixir-format msgid "AI insights" msgstr "Analisi IA" @@ -1149,42 +1156,22 @@ msgstr "Riepilogo IA" msgid "Analyzing your stocks…" msgstr "Analisi delle tue azioni…" -#: lib/quantic_web/components/ai_components.ex:179 -#, elixir-autogen, elixir-format -msgid "Avoid" -msgstr "Evita" - -#: lib/quantic_web/components/ai_components.ex:176 -#, elixir-autogen, elixir-format -msgid "Buy" -msgstr "Acquista" - #: lib/quantic_web/components/ai_components.ex:86 #, elixir-autogen, elixir-format msgid "Buying opportunities" msgstr "Opportunità di acquisto" -#: lib/quantic_web/components/ai_components.ex:178 -#, elixir-autogen, elixir-format -msgid "Caution" -msgstr "Cautela" - #: lib/quantic_web/components/ai_components.ex:104 #, elixir-autogen, elixir-format msgid "Dividend coverage" msgstr "Copertura dei dividendi" -#: lib/quantic_web/components/ai_components.ex:177 -#, elixir-autogen, elixir-format -msgid "Hold" -msgstr "Mantieni" - #: lib/quantic_web/live/portfolio_live.ex:393 #, elixir-autogen, elixir-format msgid "Portfolio AI insights" msgstr "Analisi IA del portafoglio" -#: lib/quantic_web/live/radar_live.ex:300 +#: lib/quantic_web/live/radar_live.ex:320 #, elixir-autogen, elixir-format msgid "Radar AI insights" msgstr "Analisi IA del radar" @@ -1199,12 +1186,8 @@ msgstr "Segnali di rischio" msgid "Strengths" msgstr "Punti di forza" -#: lib/quantic_web/components/ai_components.ex:175 -#, elixir-autogen, elixir-format -msgid "Strong buy" -msgstr "Acquisto forte" - -#: lib/quantic_web/components/ai_components.ex:162 +#: lib/quantic_web/components/ai_components.ex:157 +#: lib/quantic_web/live/ask_live.ex:259 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — your quota resets at midnight UTC." msgstr "Hai usato le %{limit} richieste IA di oggi — la tua quota si azzera a mezzanotte UTC." @@ -1219,7 +1202,7 @@ msgstr "Chiedimi ad esempio:\n• cosa c'è nel mio radar?\n• dividendi questo msgid "Ask the bot about your portfolio, radar and dividends." msgstr "Chiedi al bot del tuo portafoglio, radar e dividendi." -#: lib/quantic_web/components/home_components.ex:408 +#: lib/quantic_web/components/home_components.ex:444 #: lib/quantic_web/live/settings_live.ex:307 #, elixir-autogen, elixir-format msgid "Connect Telegram" @@ -1293,7 +1276,8 @@ msgid "Refresh status" msgstr "Aggiorna stato" #: lib/quantic/telegram/handler.ex:79 -#: lib/quantic/telegram/handler.ex:201 +#: lib/quantic/telegram/handler.ex:204 +#: lib/quantic_web/live/ask_live.ex:264 #, elixir-autogen, elixir-format msgid "Something went wrong — please try again." msgstr "Qualcosa è andato storto — riprova." @@ -1323,7 +1307,7 @@ msgstr "Comando sconosciuto — prova /help." msgid "Use /notifications on|off to change." msgstr "Usa /notifications on|off per cambiare." -#: lib/quantic/telegram/handler.ex:195 +#: lib/quantic/telegram/handler.ex:198 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — quota resets at midnight UTC." msgstr "Hai usato le %{limit} richieste IA di oggi — la quota si azzera a mezzanotte UTC." @@ -1368,38 +1352,38 @@ msgstr "• %{symbol} ha pagato %{amount} %{currency} netti" msgid "📊 Your Quantic daily digest" msgstr "📊 Il tuo riepilogo giornaliero Quantic" -#: lib/quantic_web/components/layouts.ex:408 +#: lib/quantic_web/components/layouts.ex:419 #, elixir-autogen, elixir-format msgid "Built with Elixir, Phoenix LiveView, and Tailwind CSS" msgstr "Realizzato con Elixir, Phoenix LiveView e Tailwind CSS" -#: lib/quantic_web/components/layouts.ex:227 +#: lib/quantic_web/components/layouts.ex:238 #, elixir-autogen, elixir-format msgid "Close menu" msgstr "Chiudi il menu" -#: lib/quantic_web/components/layouts.ex:313 +#: lib/quantic_web/components/layouts.ex:324 #, elixir-autogen, elixir-format msgid "FAQ" msgstr "FAQ" -#: lib/quantic_web/components/layouts.ex:421 +#: lib/quantic_web/components/layouts.ex:432 #, elixir-autogen, elixir-format msgid "Frequently Asked Questions" msgstr "Domande frequenti" -#: lib/quantic_web/components/layouts.ex:241 +#: lib/quantic_web/components/layouts.ex:252 #, elixir-autogen, elixir-format msgid "Home" msgstr "Home" -#: lib/quantic_web/components/layouts.ex:158 -#: lib/quantic_web/components/layouts.ex:223 +#: lib/quantic_web/components/layouts.ex:162 +#: lib/quantic_web/components/layouts.ex:234 #, elixir-autogen, elixir-format msgid "Menu" msgstr "Menu" -#: lib/quantic_web/components/layouts.ex:218 +#: lib/quantic_web/components/layouts.ex:229 #, elixir-autogen, elixir-format msgid "Navigation menu" msgstr "Menu di navigazione" @@ -1409,42 +1393,42 @@ msgstr "Menu di navigazione" msgid "New here? Signing in creates your account automatically." msgstr "Nuovo qui? Accedendo, il tuo account viene creato automaticamente." -#: lib/quantic_web/components/layouts.ex:149 -#: lib/quantic_web/components/layouts.ex:355 +#: lib/quantic_web/components/layouts.ex:153 +#: lib/quantic_web/components/layouts.ex:366 #, elixir-autogen, elixir-format msgid "Sign in" msgstr "Accedi" -#: lib/quantic_web/components/layouts.ex:345 +#: lib/quantic_web/components/layouts.ex:356 #, elixir-autogen, elixir-format msgid "Sign out" msgstr "Esci" -#: lib/quantic_web/components/layouts.ex:398 +#: lib/quantic_web/components/layouts.ex:409 #, elixir-autogen, elixir-format msgid "The information on Quantic is provided for informational and educational purposes only. It is general in nature, does not take into account your personal financial situation, and does not constitute investment, financial, tax, or legal advice — nor a recommendation to buy or sell any security. Investing involves risk, including possible loss of principal; past performance is not a reliable indicator of future results. Market data comes from third-party providers and may be delayed or inaccurate. Before making any investment decision, consider your objectives, time horizon, risk tolerance, and diversification, and consult a qualified financial professional. Quantic is not a registered investment adviser or broker-dealer." msgstr "Le informazioni su Quantic sono fornite esclusivamente a scopo informativo ed educativo. Hanno carattere generale, non tengono conto della tua situazione finanziaria personale e non costituiscono consulenza in materia di investimenti, finanziaria, fiscale o legale — né una raccomandazione ad acquistare o vendere alcun titolo. Investire comporta rischi, inclusa la possibile perdita del capitale; i rendimenti passati non sono un indicatore affidabile dei risultati futuri. I dati di mercato provengono da fornitori terzi e possono essere ritardati o imprecisi. Prima di prendere qualsiasi decisione di investimento, considera i tuoi obiettivi, l'orizzonte temporale, la tolleranza al rischio e la diversificazione, e consulta un professionista finanziario qualificato. Quantic non è un consulente finanziario registrato né un intermediario." -#: lib/quantic_web/components/home_components.ex:397 +#: lib/quantic_web/components/home_components.ex:433 #, elixir-autogen, elixir-format msgid "\"what dividends did I get this month?\" · \"show my radar\" · \"any ex-divs this week?\"" msgstr "\"quali dividendi ho ricevuto questo mese?\" · \"mostra il mio radar\" · \"ex-div questa settimana?\"" -#: lib/quantic_web/components/home_components.ex:568 +#: lib/quantic_web/components/home_components.ex:604 #, elixir-autogen, elixir-format msgid "%{count} on radar" msgid_plural "%{count} on radar" msgstr[0] "%{count} sul radar" msgstr[1] "%{count} sul radar" -#: lib/quantic_web/components/home_components.ex:721 +#: lib/quantic_web/components/home_components.ex:757 #, elixir-autogen, elixir-format msgid "+ %{count} more currency" msgid_plural "+ %{count} more currencies" msgstr[0] "+ %{count} altra valuta" msgstr[1] "+ %{count} altre valute" -#: lib/quantic_web/components/home_components.ex:289 +#: lib/quantic_web/components/home_components.ex:325 #, elixir-autogen, elixir-format msgid "A live community of dividend investors. Browse what others hold, what they target, and how they structure their portfolios." msgstr "Una community di investitori in dividendi, in tempo reale. Sfoglia cosa possiedono gli altri, quali obiettivi si pongono e come strutturano i loro portafogli." @@ -1459,12 +1443,12 @@ msgstr "Investimento in dividendi potenziato dall'IA. Costruisci la tua watchlis msgid "Add stocks with target prices. We track price, score, and ex-div dates." msgstr "Aggiungi titoli con prezzi obiettivo. Seguiamo prezzo, punteggio e date ex-dividendo." -#: lib/quantic_web/components/home_components.ex:648 +#: lib/quantic_web/components/home_components.ex:684 #, elixir-autogen, elixir-format msgid "Add your first holding" msgstr "Aggiungi la tua prima posizione" -#: lib/quantic_web/components/home_components.ex:392 +#: lib/quantic_web/components/home_components.ex:428 #, elixir-autogen, elixir-format msgid "Ask your portfolio anything in natural language — ex-divs, totals, target prices — right from Telegram." msgstr "Chiedi qualsiasi cosa al tuo portafoglio in linguaggio naturale — ex-div, totali, prezzi obiettivo — direttamente da Telegram." @@ -1479,22 +1463,22 @@ msgstr "Costruisci il tuo radar" msgid "Create your plan" msgstr "Crea il tuo piano" -#: lib/quantic_web/components/home_components.ex:616 +#: lib/quantic_web/components/home_components.ex:652 #, elixir-autogen, elixir-format msgid "Current yield" msgstr "Rendimento attuale" -#: lib/quantic_web/components/home_components.ex:678 +#: lib/quantic_web/components/home_components.ex:714 #, elixir-autogen, elixir-format msgid "Dividend income" msgstr "Reddito da dividendi" -#: lib/quantic_web/components/home_components.ex:862 +#: lib/quantic_web/components/home_components.ex:898 #, elixir-autogen, elixir-format msgid "Ex-dividend dates in the next %{days} days" msgstr "Date ex-dividendo nei prossimi %{days} giorni" -#: lib/quantic_web/components/home_components.ex:954 +#: lib/quantic_web/components/home_components.ex:990 #: lib/quantic_web/components/stock_card_components.ex:143 #: lib/quantic_web/live/buy_plan_live.ex:546 #, elixir-autogen, elixir-format @@ -1506,7 +1490,7 @@ msgstr "Discreto" msgid "Free · No broker connection required · Open source" msgstr "Gratuito · Nessun collegamento al broker richiesto · Open source" -#: lib/quantic_web/components/home_components.ex:515 +#: lib/quantic_web/components/home_components.ex:551 #, elixir-autogen, elixir-format msgid "Free, no broker connection required. Try a sample portfolio or sign up to build your own." msgstr "Gratuito, senza collegamento al broker. Prova un portafoglio di esempio o registrati per costruire il tuo." @@ -1521,17 +1505,17 @@ msgstr "Dalla watchlist al reddito da dividendi in 3 passi" msgid "Get AI insights" msgstr "Ottieni analisi IA" -#: lib/quantic_web/components/home_components.ex:557 +#: lib/quantic_web/components/home_components.ex:593 #, elixir-autogen, elixir-format msgid "Good afternoon, %{name}" msgstr "Buon pomeriggio, %{name}" -#: lib/quantic_web/components/home_components.ex:559 +#: lib/quantic_web/components/home_components.ex:595 #, elixir-autogen, elixir-format msgid "Good evening, %{name}" msgstr "Buonasera, %{name}" -#: lib/quantic_web/components/home_components.ex:555 +#: lib/quantic_web/components/home_components.ex:591 #, elixir-autogen, elixir-format msgid "Good morning, %{name}" msgstr "Buongiorno, %{name}" @@ -1546,32 +1530,32 @@ msgstr "Live" msgid "Log holdings to get live yield, sector mix, and dividend forecast." msgstr "Registra le posizioni per avere rendimento in tempo reale, mix di settori e previsione dei dividendi." -#: lib/quantic_web/live/home_live.ex:120 +#: lib/quantic_web/live/home_live.ex:121 #, elixir-autogen, elixir-format msgid "Most Added to Radar" msgstr "I più aggiunti al radar" -#: lib/quantic_web/live/home_live.ex:125 +#: lib/quantic_web/live/home_live.ex:126 #, elixir-autogen, elixir-format msgid "Most Held in Portfolios" msgstr "I più presenti nei portafogli" -#: lib/quantic_web/components/home_components.ex:572 +#: lib/quantic_web/components/home_components.ex:608 #, elixir-autogen, elixir-format msgid "Next ex-div: %{symbol} in %{days}d" msgstr "Prossimo ex-div: %{symbol} tra %{days}g" -#: lib/quantic_web/components/home_components.ex:480 +#: lib/quantic_web/components/home_components.ex:516 #, elixir-autogen, elixir-format msgid "No stocks found." msgstr "Nessun titolo trovato." -#: lib/quantic_web/components/home_components.ex:577 +#: lib/quantic_web/components/home_components.ex:613 #, elixir-autogen, elixir-format msgid "No upcoming ex-div dates" msgstr "Nessuna data ex-dividendo in arrivo" -#: lib/quantic_web/components/home_components.ex:793 +#: lib/quantic_web/components/home_components.ex:829 #, elixir-autogen, elixir-format msgid "Open my plan" msgstr "Apri il mio piano" @@ -1581,32 +1565,32 @@ msgstr "Apri il mio piano" msgid "Plain-language analysis of your portfolio and radar — risks, gaps, opportunities." msgstr "Analisi in linguaggio semplice del tuo portafoglio e del tuo radar — rischi, lacune, opportunità." -#: lib/quantic_web/components/home_components.ex:608 +#: lib/quantic_web/components/home_components.ex:644 #, elixir-autogen, elixir-format msgid "Portfolio stats" msgstr "Statistiche del portafoglio" -#: lib/quantic_web/components/home_components.ex:388 +#: lib/quantic_web/components/home_components.ex:424 #, elixir-autogen, elixir-format msgid "Quantic in Telegram" msgstr "Quantic su Telegram" -#: lib/quantic_web/live/home_live.ex:130 +#: lib/quantic_web/live/home_live.ex:131 #, elixir-autogen, elixir-format msgid "Recently Updated" msgstr "Aggiornati di recente" -#: lib/quantic_web/components/home_components.ex:298 +#: lib/quantic_web/components/home_components.ex:334 #, elixir-autogen, elixir-format msgid "See the community" msgstr "Esplora la community" -#: lib/quantic_web/components/home_components.ex:285 +#: lib/quantic_web/components/home_components.ex:321 #, elixir-autogen, elixir-format msgid "Share your portfolio with the community" msgstr "Condividi il tuo portafoglio con la community" -#: lib/quantic_web/components/home_components.ex:529 +#: lib/quantic_web/components/home_components.ex:565 #, elixir-autogen, elixir-format msgid "Sign up" msgstr "Registrati" @@ -1616,39 +1600,39 @@ msgstr "Registrati" msgid "Sign up free" msgstr "Registrati gratis" -#: lib/quantic_web/components/home_components.ex:410 +#: lib/quantic_web/components/home_components.ex:446 #, elixir-autogen, elixir-format msgid "Sign up to connect" msgstr "Registrati per collegarti" -#: lib/quantic_web/components/home_components.ex:304 +#: lib/quantic_web/components/home_components.ex:340 #, elixir-autogen, elixir-format msgid "Sign up to share yours" msgstr "Registrati per condividere il tuo" -#: lib/quantic_web/components/home_components.ex:512 +#: lib/quantic_web/components/home_components.ex:548 #, elixir-autogen, elixir-format msgid "Start your radar in 30 seconds" msgstr "Avvia il tuo radar in 30 secondi" -#: lib/quantic_web/components/home_components.ex:953 +#: lib/quantic_web/components/home_components.ex:989 #: lib/quantic_web/components/stock_card_components.ex:142 #: lib/quantic_web/live/buy_plan_live.ex:545 #, elixir-autogen, elixir-format msgid "Strong" msgstr "Forte" -#: lib/quantic_web/components/home_components.ex:690 +#: lib/quantic_web/components/home_components.ex:726 #, elixir-autogen, elixir-format msgid "This month" msgstr "Questo mese" -#: lib/quantic_web/components/home_components.ex:435 +#: lib/quantic_web/components/home_components.ex:471 #, elixir-autogen, elixir-format msgid "Top Dividend Scores" msgstr "I migliori punteggi dividendo" -#: lib/quantic_web/components/home_components.ex:650 +#: lib/quantic_web/components/home_components.ex:686 #, elixir-autogen, elixir-format msgid "Track real yield, dividend forecast, and sector mix. Takes a minute." msgstr "Segui rendimento reale, previsione dei dividendi e mix di settori. Ci vuole un minuto." @@ -1673,17 +1657,17 @@ msgstr "Di tendenza nella community" msgid "Try a sample portfolio" msgstr "Prova un portafoglio di esempio" -#: lib/quantic_web/components/home_components.ex:526 +#: lib/quantic_web/components/home_components.ex:562 #, elixir-autogen, elixir-format msgid "Try the demo" msgstr "Prova la demo" -#: lib/quantic_web/components/home_components.ex:821 +#: lib/quantic_web/components/home_components.ex:857 #, elixir-autogen, elixir-format msgid "View full buy plan" msgstr "Vedi il piano di acquisto completo" -#: lib/quantic_web/components/home_components.ex:955 +#: lib/quantic_web/components/home_components.ex:991 #: lib/quantic_web/components/stock_card_components.ex:144 #: lib/quantic_web/live/buy_plan_live.ex:547 #, elixir-autogen, elixir-format @@ -1695,12 +1679,12 @@ msgstr "Debole" msgid "What investors are watching" msgstr "Cosa osservano gli investitori" -#: lib/quantic_web/components/home_components.ex:612 +#: lib/quantic_web/components/home_components.ex:648 #, elixir-autogen, elixir-format msgid "Yield on cost" msgstr "Yield on Cost" -#: lib/quantic_web/components/home_components.ex:815 +#: lib/quantic_web/components/home_components.ex:851 #, elixir-autogen, elixir-format msgid "Your next picks" msgstr "Le tue prossime scelte" @@ -1715,13 +1699,13 @@ msgstr "i tuoi dividendi" msgid "ex-div dates" msgstr "le tue date ex-dividendo" -#: lib/quantic_web/components/home_components.ex:900 +#: lib/quantic_web/components/home_components.ex:936 #, elixir-autogen, elixir-format msgid "in %{days}d" msgstr "tra %{days}g" -#: lib/quantic_web/live/home_live.ex:199 -#: lib/quantic_web/live/home_live.ex:210 +#: lib/quantic_web/live/home_live.ex:200 +#: lib/quantic_web/live/home_live.ex:211 #, elixir-autogen, elixir-format msgid "investor" msgstr "investitore" @@ -1731,12 +1715,12 @@ msgstr "investitore" msgid "radar targets" msgstr "i tuoi obiettivi del radar" -#: lib/quantic_web/components/home_components.ex:896 +#: lib/quantic_web/components/home_components.ex:932 #, elixir-autogen, elixir-format msgid "today" msgstr "oggi" -#: lib/quantic_web/components/home_components.ex:898 +#: lib/quantic_web/components/home_components.ex:934 #, elixir-autogen, elixir-format msgid "tomorrow" msgstr "domani" @@ -1756,17 +1740,17 @@ msgstr "%{percentage}% sopra l'obiettivo" msgid "%{percentage}% below target" msgstr "%{percentage}% sotto l'obiettivo" -#: lib/quantic_web/live/radar_live.ex:430 +#: lib/quantic_web/live/radar_live.ex:450 #, elixir-autogen, elixir-format msgid "200-day average" msgstr "Media a 200 giorni" -#: lib/quantic_web/live/radar_live.ex:436 +#: lib/quantic_web/live/radar_live.ex:456 #, elixir-autogen, elixir-format msgid "50-day average" msgstr "Media a 50 giorni" -#: lib/quantic_web/live/radar_live.ex:424 +#: lib/quantic_web/live/radar_live.ex:444 #, elixir-autogen, elixir-format msgid "52-week midpoint" msgstr "Punto medio a 52 settimane" @@ -1798,7 +1782,7 @@ msgstr "Cancella ricerca" msgid "Click to edit" msgstr "Clicca per modificare" -#: lib/quantic_web/live/radar_live.ex:418 +#: lib/quantic_web/live/radar_live.ex:438 #, elixir-autogen, elixir-format msgid "Community average" msgstr "Media della community" @@ -1808,7 +1792,7 @@ msgstr "Media della community" msgid "Compact view" msgstr "Vista compatta" -#: lib/quantic_web/live/radar_live.ex:182 +#: lib/quantic_web/live/radar_live.ex:198 #, elixir-autogen, elixir-format msgid "Could not apply that target price." msgstr "Impossibile applicare questo prezzo obiettivo." @@ -1863,12 +1847,12 @@ msgstr "In portafoglio" msgid "Market value" msgstr "Valore di mercato" -#: lib/quantic_web/live/radar_live.ex:446 +#: lib/quantic_web/live/radar_live.ex:466 #, elixir-autogen, elixir-format msgid "Needs 3+ community targets (%{count} so far)" msgstr "Servono 3+ obiettivi della community (%{count} finora)" -#: lib/quantic_web/live/radar_live.ex:448 +#: lib/quantic_web/live/radar_live.ex:468 #, elixir-autogen, elixir-format msgid "No community targets yet" msgstr "Ancora nessun obiettivo della community" @@ -1894,13 +1878,13 @@ msgstr "Nessun dato di calendario" msgid "No target set" msgstr "Nessun obiettivo impostato" -#: lib/quantic_web/live/radar_live.ex:313 -#: lib/quantic_web/live/radar_live.ex:328 +#: lib/quantic_web/live/radar_live.ex:333 +#: lib/quantic_web/live/radar_live.ex:348 #, elixir-autogen, elixir-format msgid "Nothing on your radar yet. Search above to add your first stock." msgstr "Niente nel tuo radar per ora. Cerca sopra per aggiungere il tuo primo titolo." -#: lib/quantic_web/live/radar_live.ex:285 +#: lib/quantic_web/live/radar_live.ex:280 #, elixir-autogen, elixir-format msgid "On radar" msgstr "Nel radar" @@ -1916,7 +1900,7 @@ msgid "Position" msgstr "Posizione" #: lib/quantic_web/live/portfolio_live.ex:377 -#: lib/quantic_web/live/radar_live.ex:262 +#: lib/quantic_web/live/radar_live.ex:311 #, elixir-autogen, elixir-format msgid "Public page" msgstr "Pagina pubblica" @@ -1928,7 +1912,7 @@ msgid "Score" msgstr "Punteggio" #: lib/quantic_web/live/portfolio_live.ex:306 -#: lib/quantic_web/live/radar_live.ex:280 +#: lib/quantic_web/live/radar_live.ex:275 #, elixir-autogen, elixir-format msgid "Search by ticker or company name…" msgstr "Cerca per ticker o nome dell'azienda…" @@ -1956,12 +1940,12 @@ msgstr "Stato" msgid "Suggest a target" msgstr "Suggerisci un obiettivo" -#: lib/quantic_web/live/radar_live.ex:175 +#: lib/quantic_web/live/radar_live.ex:191 #, elixir-autogen, elixir-format msgid "Target for %{symbol} set to %{price}." msgstr "Obiettivo di %{symbol} impostato a %{price}." -#: lib/quantic_web/live/radar_live.ex:90 +#: lib/quantic_web/live/radar_live.ex:95 #, elixir-autogen, elixir-format msgid "That stock is already on your radar." msgstr "Questo titolo è già nel tuo radar." @@ -2078,7 +2062,7 @@ msgstr "Beta" #: lib/quantic_web/live/admin_content_drafts_live.ex:272 #: lib/quantic_web/live/portfolio_live.ex:447 -#: lib/quantic_web/live/radar_live.ex:342 +#: lib/quantic_web/live/radar_live.ex:362 #, elixir-autogen, elixir-format msgid "Dividend calendar" msgstr "Calendario dividendi" @@ -2334,7 +2318,7 @@ msgstr "Contributo mensile" msgid "Monthly dividend goal (today's money)" msgstr "Obiettivo di dividendo mensile (in moneta di oggi)" -#: lib/quantic_web/components/home_components.ex:762 +#: lib/quantic_web/components/home_components.ex:798 #: lib/quantic_web/live/path_to_freedom_live.ex:379 #, elixir-autogen, elixir-format msgid "Not in reach yet" @@ -2440,7 +2424,7 @@ msgstr "Il tuo obiettivo resta fuori portata entro l'orizzonte." msgid "Your journey to freedom" msgstr "Il tuo percorso verso la libertà" -#: lib/quantic_web/components/home_components.ex:757 +#: lib/quantic_web/components/home_components.ex:793 #: lib/quantic_web/live/path_to_freedom_live.ex:353 #: lib/quantic_web/live/path_to_freedom_live.ex:856 #: lib/quantic_web/live/path_to_freedom_live.ex:1066 @@ -2494,7 +2478,7 @@ msgstr "¾ del tuo obiettivo" msgid "✓ today" msgstr "✓ oggi" -#: lib/quantic_web/components/home_components.ex:765 +#: lib/quantic_web/components/home_components.ex:801 #, elixir-autogen, elixir-format msgid "Keep going — see what changes it" msgstr "Continua — scopri cosa lo cambia" @@ -2524,7 +2508,7 @@ msgstr "Dicci il tuo obiettivo di dividendi mensili. Ti diremo l'anno — e la t msgid "The year, and your age, when dividends cover your goal" msgstr "L'anno, e la tua età, in cui i dividendi coprono il tuo obiettivo" -#: lib/quantic_web/components/home_components.ex:783 +#: lib/quantic_web/components/home_components.ex:819 #, elixir-autogen, elixir-format msgid "per month" msgstr "al mese" @@ -2741,7 +2725,7 @@ msgstr "Utenti attivi — ultime 8 settimane" msgid "Activity" msgstr "Attività" -#: lib/quantic_web/components/layouts.ex:330 +#: lib/quantic_web/components/layouts.ex:341 #: lib/quantic_web/live/admin_content_drafts_live.ex:112 #: lib/quantic_web/live/admin_dashboard_live.ex:18 #: lib/quantic_web/live/admin_dashboard_live.ex:64 @@ -3189,3 +3173,115 @@ msgstr "I tuoi link saranno:" #, elixir-autogen, elixir-format msgid "Your public link" msgstr "Il tuo link pubblico" + +#: lib/quantic_web/components/home_components.ex:292 +#, elixir-autogen, elixir-format +msgid "\"Any ex-dividends this week?\"" +msgstr "«Qualche ex-dividendo questa settimana?»" + +#: lib/quantic_web/components/home_components.ex:290 +#, elixir-autogen, elixir-format +msgid "\"What dividends did I get this month?\"" +msgstr "«Quali dividendi ho ricevuto questo mese?»" + +#: lib/quantic_web/components/home_components.ex:291 +#, elixir-autogen, elixir-format +msgid "\"What's my biggest holding?\"" +msgstr "«Qual è la mia posizione più grande?»" + +#: lib/quantic_web/components/home_components.ex:289 +#, elixir-autogen, elixir-format +msgid "\"Which of my stocks are below my target?\"" +msgstr "«Quali delle mie azioni sono sotto il mio obiettivo?»" + +#: lib/quantic_web/live/ask_live.ex:208 +#, elixir-autogen, elixir-format +msgid "%{remaining}/%{limit} left" +msgstr "%{remaining}/%{limit} rimasti" + +#: lib/quantic_web/components/home_components.ex:284 +#, elixir-autogen, elixir-format +msgid "An AI assistant on every page. Ask about your portfolio, radar, and dividends in plain language — it reads your own data to answer." +msgstr "Un assistente IA su ogni pagina. Chiedi del tuo portafoglio, radar e dividendi in linguaggio naturale: legge i tuoi dati per rispondere." + +#: lib/quantic_web/components/home_components.ex:281 +#: lib/quantic_web/live/ask_live.ex:196 +#: lib/quantic_web/live/ask_live.ex:303 +#, elixir-autogen, elixir-format +msgid "Ask Quantic" +msgstr "Chiedi a Quantic" + +#: lib/quantic_web/live/ask_live.ex:279 +#, elixir-autogen, elixir-format +msgid "Ask a question…" +msgstr "Scrivi una domanda…" + +#: lib/quantic_web/live/ask_live.ex:217 +#, elixir-autogen, elixir-format +msgid "Ask me about your portfolio, radar or dividends." +msgstr "Chiedimi del tuo portafoglio, radar o dividendi." + +#: lib/quantic_web/live/ask_live.ex:379 +#, elixir-autogen, elixir-format +msgid "Dividends this month?" +msgstr "Dividendi questo mese?" + +#: lib/quantic_web/live/ask_live.ex:288 +#, elixir-autogen, elixir-format +msgid "Send" +msgstr "Invia" + +#: lib/quantic_web/live/ask_live.ex:256 +#, elixir-autogen, elixir-format +msgid "Thinking…" +msgstr "Sto pensando…" + +#: lib/quantic_web/components/home_components.ex:299 +#, elixir-autogen, elixir-format +msgid "Try it" +msgstr "Provalo" + +#: lib/quantic_web/live/ask_live.ex:376 +#, elixir-autogen, elixir-format +msgid "What's my biggest holding?" +msgstr "Qual è la mia posizione più grande?" + +#: lib/quantic_web/live/ask_live.ex:378 +#, elixir-autogen, elixir-format +msgid "Which stocks are below my target?" +msgstr "Quali azioni sono sotto il mio obiettivo?" + +#: lib/quantic_web/live/ask_live.ex:201 +#, elixir-autogen, elixir-format +msgid "on %{page}" +msgstr "su %{page}" + +#: lib/quantic_web/live/ask_live.ex:377 +#, elixir-autogen, elixir-format +msgid "What do you think of KO?" +msgstr "Cosa ne pensi di KO?" + +#: lib/quantic_web/live/ask_live.ex:295 +#, elixir-autogen, elixir-format +msgid "Informational only — not financial advice." +msgstr "Solo a scopo informativo — non è una consulenza finanziaria." + +#: lib/quantic_web/live/radar_live.ex:504 +#, elixir-autogen, elixir-format +msgid "Dividend score" +msgstr "Punteggio dividendo" + +#: lib/quantic_web/live/radar_live.ex:503 +#, elixir-autogen, elixir-format +msgid "Dividend yield" +msgstr "Rendimento da dividendo" + +#: lib/quantic_web/live/radar_live.ex:501 +#, elixir-autogen, elixir-format +msgid "Opportunity" +msgstr "Opportunità" + +#: lib/quantic_web/live/ask_live.ex:362 +#, elixir-autogen, elixir-format +msgid "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" +msgstr "Stai esplorando una demo, quindi questa è una risposta di esempio anziché una risposta reale (così la demo resta gratuita). Con il tuo account leggo le tue posizioni, il tuo radar e i tuoi dividendi reali per rispondere a domande come questa. Registrati per provarlo davvero!" diff --git a/priv/gettext/pt/LC_MESSAGES/default.po b/priv/gettext/pt/LC_MESSAGES/default.po index 944a189..5925be1 100644 --- a/priv/gettext/pt/LC_MESSAGES/default.po +++ b/priv/gettext/pt/LC_MESSAGES/default.po @@ -17,22 +17,23 @@ msgstr "" msgid "Actions" msgstr "Opções" -#: lib/quantic_web/components/layouts.ex:455 -#: lib/quantic_web/components/layouts.ex:467 +#: lib/quantic_web/components/layouts.ex:466 +#: lib/quantic_web/components/layouts.ex:478 #, elixir-autogen, elixir-format msgid "Attempting to reconnect" msgstr "Tentando reconectar" -#: lib/quantic_web/components/layouts.ex:65 -#: lib/quantic_web/components/layouts.ex:272 +#: lib/quantic_web/ask_context.ex:39 +#: lib/quantic_web/components/layouts.ex:69 +#: lib/quantic_web/components/layouts.ex:283 #: lib/quantic_web/live/buy_plan_live.ex:26 #: lib/quantic_web/live/buy_plan_live.ex:233 #, elixir-autogen, elixir-format msgid "Buy plan" msgstr "Plano de compra" -#: lib/quantic_web/components/layouts.ex:81 -#: lib/quantic_web/components/layouts.ex:303 +#: lib/quantic_web/components/layouts.ex:85 +#: lib/quantic_web/components/layouts.ex:314 #: lib/quantic_web/live/admin_dashboard_live.ex:211 #: lib/quantic_web/live/community_dashboard_live.ex:27 #: lib/quantic_web/live/community_dashboard_live.ex:65 @@ -40,8 +41,9 @@ msgstr "Plano de compra" msgid "Community" msgstr "Comunidade" -#: lib/quantic_web/components/layouts.ex:70 -#: lib/quantic_web/components/layouts.ex:282 +#: lib/quantic_web/ask_context.ex:41 +#: lib/quantic_web/components/layouts.ex:74 +#: lib/quantic_web/components/layouts.ex:293 #: lib/quantic_web/components/stock_card_components.ex:589 #: lib/quantic_web/components/stock_card_components.ex:806 #: lib/quantic_web/components/stock_card_components.ex:1267 @@ -52,36 +54,38 @@ msgstr "Comunidade" msgid "Dividends" msgstr "Dividendos" -#: lib/quantic_web/components/layouts.ex:75 -#: lib/quantic_web/components/layouts.ex:292 +#: lib/quantic_web/components/layouts.ex:79 +#: lib/quantic_web/components/layouts.ex:303 #, elixir-autogen, elixir-format msgid "Freedom" msgstr "Liberdade" -#: lib/quantic_web/components/layouts.ex:55 -#: lib/quantic_web/components/layouts.ex:252 +#: lib/quantic_web/ask_context.ex:37 +#: lib/quantic_web/components/layouts.ex:59 +#: lib/quantic_web/components/layouts.ex:263 #: lib/quantic_web/live/path_to_freedom_live.ex:300 #: lib/quantic_web/live/portfolio_live.ex:262 #, elixir-autogen, elixir-format msgid "Portfolio" msgstr "Carteira" -#: lib/quantic_web/components/home_components.ex:879 -#: lib/quantic_web/components/layouts.ex:60 -#: lib/quantic_web/components/layouts.ex:262 +#: lib/quantic_web/ask_context.ex:38 +#: lib/quantic_web/components/home_components.ex:915 +#: lib/quantic_web/components/layouts.ex:64 +#: lib/quantic_web/components/layouts.ex:273 #: lib/quantic_web/live/admin_dashboard_live.ex:362 #: lib/quantic_web/live/public_radar_live.ex:105 -#: lib/quantic_web/live/radar_live.ex:254 +#: lib/quantic_web/live/radar_live.ex:269 #, elixir-autogen, elixir-format msgid "Radar" msgstr "Radar" -#: lib/quantic_web/components/layouts.ex:462 +#: lib/quantic_web/components/layouts.ex:473 #, elixir-autogen, elixir-format msgid "Something went wrong!" msgstr "Algo deu errado!" -#: lib/quantic_web/components/layouts.ex:450 +#: lib/quantic_web/components/layouts.ex:461 #, elixir-autogen, elixir-format msgid "We can't find the internet" msgstr "Não encontramos a internet" @@ -91,7 +95,7 @@ msgstr "Não encontramos a internet" msgid "close" msgstr "fechar" -#: lib/quantic_web/components/home_components.ex:565 +#: lib/quantic_web/components/home_components.ex:601 #: lib/quantic_web/live/public_portfolio_live.ex:123 #, elixir-autogen, elixir-format msgid "%{count} holding" @@ -182,12 +186,12 @@ msgstr "Adicione primeiro posições ou ações ao radar — elas aparecerão aq msgid "Add to portfolio" msgstr "Adicionar à carteira" -#: lib/quantic_web/live/radar_live.ex:294 +#: lib/quantic_web/live/radar_live.ex:289 #, elixir-autogen, elixir-format msgid "Add to radar" msgstr "Adicionar ao radar" -#: lib/quantic_web/live/radar_live.ex:75 +#: lib/quantic_web/live/radar_live.ex:80 #, elixir-autogen, elixir-format msgid "Added %{symbol} to your radar." msgstr "Adicionamos %{symbol} ao seu radar." @@ -313,7 +317,7 @@ msgstr "Setores da comunidade" msgid "Community sharing" msgstr "Compartilhamento com a comunidade" -#: lib/quantic_web/components/home_components.ex:331 +#: lib/quantic_web/components/home_components.ex:367 #: lib/quantic_web/live/community_dashboard_live.ex:101 #, elixir-autogen, elixir-format msgid "Community value" @@ -435,7 +439,7 @@ msgstr "Falhou" msgid "Fill price" msgstr "Preço de execução" -#: lib/quantic_web/components/home_components.ex:752 +#: lib/quantic_web/components/home_components.ex:788 #: lib/quantic_web/live/path_to_freedom_live.ex:346 #, elixir-autogen, elixir-format msgid "Freedom in" @@ -446,7 +450,7 @@ msgstr "Liberdade em" msgid "Full history" msgstr "Histórico completo" -#: lib/quantic_web/components/home_components.ex:656 +#: lib/quantic_web/components/home_components.ex:692 #, elixir-autogen, elixir-format msgid "Go to portfolio" msgstr "Ir para a carteira" @@ -528,13 +532,13 @@ msgstr "Taxa de juros %" msgid "It expires in 15 minutes." msgstr "Ele expira em 15 minutos." -#: lib/quantic_web/components/layouts.ex:91 +#: lib/quantic_web/components/layouts.ex:95 #: lib/quantic_web/live/settings_live.ex:174 #, elixir-autogen, elixir-format msgid "Language" msgstr "Idioma" -#: lib/quantic_web/components/home_components.ex:698 +#: lib/quantic_web/components/home_components.ex:734 #: lib/quantic_web/live/dividends_live.ex:356 #, elixir-autogen, elixir-format msgid "Last 12 months" @@ -542,7 +546,7 @@ msgstr "Últimos 12 meses" #: lib/quantic_web/live/dividends_live.ex:80 #: lib/quantic_web/live/portfolio_live.ex:105 -#: lib/quantic_web/live/radar_live.ex:86 +#: lib/quantic_web/live/radar_live.ex:91 #, elixir-autogen, elixir-format msgid "Market-data provider is unreachable right now. Please try again." msgstr "O provedor de dados de mercado está inacessível agora. Tente novamente." @@ -621,8 +625,9 @@ msgstr "Objetivo" msgid "Other capital (bonds, savings, index funds)" msgstr "Outro capital (títulos, poupança, fundos de índice)" +#: lib/quantic_web/ask_context.ex:40 #: lib/quantic_web/components/home_components.ex:245 -#: lib/quantic_web/components/home_components.ex:745 +#: lib/quantic_web/components/home_components.ex:781 #: lib/quantic_web/live/path_to_freedom_live.ex:24 #: lib/quantic_web/live/path_to_freedom_live.ex:91 #, elixir-autogen, elixir-format @@ -661,7 +666,7 @@ msgstr "Carteira não encontrada" msgid "Portfolio value" msgstr "Valor da carteira" -#: lib/quantic_web/components/home_components.ex:337 +#: lib/quantic_web/components/home_components.ex:373 #: lib/quantic_web/live/admin_dashboard_live.ex:151 #: lib/quantic_web/live/community_dashboard_live.ex:74 #: lib/quantic_web/live/community_dashboard_live.ex:81 @@ -784,7 +789,7 @@ msgstr "Remover esta posição?" msgid "Remove this stock from your radar?" msgstr "Remover esta ação do seu radar?" -#: lib/quantic_web/live/radar_live.ex:196 +#: lib/quantic_web/live/radar_live.ex:212 #, elixir-autogen, elixir-format msgid "Removed %{symbol} from your radar." msgstr "Removemos %{symbol} do seu radar." @@ -822,14 +827,15 @@ msgstr "Salvar compartilhamento" msgid "Saved!" msgstr "Salvo!" -#: lib/quantic_web/components/home_components.ex:622 +#: lib/quantic_web/components/home_components.ex:658 #: lib/quantic_web/live/portfolio_live.ex:440 #: lib/quantic_web/live/public_portfolio_live.ex:166 #, elixir-autogen, elixir-format msgid "Sectors" msgstr "Setores" -#: lib/quantic_web/components/layouts.ex:340 +#: lib/quantic_web/ask_context.ex:42 +#: lib/quantic_web/components/layouts.ex:351 #: lib/quantic_web/live/community_dashboard_live.ex:372 #: lib/quantic_web/live/settings_live.ex:157 #, elixir-autogen, elixir-format @@ -922,6 +928,7 @@ msgstr "Ações acompanhadas" #: lib/quantic_web/components/stock_card_components.ex:924 #: lib/quantic_web/live/dividends_live.ex:396 #: lib/quantic_web/live/portfolio_live.ex:565 +#: lib/quantic_web/live/radar_live.ex:502 #, elixir-autogen, elixir-format msgid "Symbol" msgstr "Símbolo" @@ -996,7 +1003,7 @@ msgid "Underweight position" msgstr "Posição subponderada" #: lib/quantic_web/live/portfolio_live.ex:188 -#: lib/quantic_web/live/radar_live.ex:138 +#: lib/quantic_web/live/radar_live.ex:154 #, elixir-autogen, elixir-format msgid "Updated %{symbol}." msgstr "Atualizamos %{symbol}." @@ -1013,7 +1020,7 @@ msgstr "Ver radar" #: lib/quantic_web/live/dividends_live.ex:73 #: lib/quantic_web/live/portfolio_live.ex:98 -#: lib/quantic_web/live/radar_live.ex:79 +#: lib/quantic_web/live/radar_live.ex:84 #, elixir-autogen, elixir-format msgid "We couldn't find that symbol on the market." msgstr "Não encontramos esse símbolo no mercado." @@ -1114,18 +1121,18 @@ msgstr "o que a carteira paga hoje, antes de novos aportes" msgid "← Back to home" msgstr "← Voltar ao início" -#: lib/quantic_web/components/layouts.ex:180 +#: lib/quantic_web/components/layouts.ex:184 #, elixir-autogen, elixir-format msgid "Sign up to start your own" msgstr "Cadastre-se para criar a sua" -#: lib/quantic_web/components/layouts.ex:176 +#: lib/quantic_web/components/layouts.ex:180 #, elixir-autogen, elixir-format msgid "You're exploring a demo portfolio — changes are yours to play with and expire in 24h." msgstr "Você está explorando uma carteira de demonstração — as mudanças são suas para experimentar e expiram em 24h." #: lib/quantic_web/live/portfolio_live.ex:369 -#: lib/quantic_web/live/radar_live.ex:270 +#: lib/quantic_web/live/radar_live.ex:303 #, elixir-autogen, elixir-format msgid "AI insights" msgstr "Análises com IA" @@ -1149,42 +1156,22 @@ msgstr "Resumo IA" msgid "Analyzing your stocks…" msgstr "Analisando suas ações…" -#: lib/quantic_web/components/ai_components.ex:179 -#, elixir-autogen, elixir-format -msgid "Avoid" -msgstr "Evitar" - -#: lib/quantic_web/components/ai_components.ex:176 -#, elixir-autogen, elixir-format -msgid "Buy" -msgstr "Comprar" - #: lib/quantic_web/components/ai_components.ex:86 #, elixir-autogen, elixir-format msgid "Buying opportunities" msgstr "Oportunidades de compra" -#: lib/quantic_web/components/ai_components.ex:178 -#, elixir-autogen, elixir-format -msgid "Caution" -msgstr "Cautela" - #: lib/quantic_web/components/ai_components.ex:104 #, elixir-autogen, elixir-format msgid "Dividend coverage" msgstr "Cobertura de dividendos" -#: lib/quantic_web/components/ai_components.ex:177 -#, elixir-autogen, elixir-format -msgid "Hold" -msgstr "Manter" - #: lib/quantic_web/live/portfolio_live.ex:393 #, elixir-autogen, elixir-format msgid "Portfolio AI insights" msgstr "Análise IA da carteira" -#: lib/quantic_web/live/radar_live.ex:300 +#: lib/quantic_web/live/radar_live.ex:320 #, elixir-autogen, elixir-format msgid "Radar AI insights" msgstr "Análise IA do radar" @@ -1199,12 +1186,8 @@ msgstr "Sinais de risco" msgid "Strengths" msgstr "Pontos fortes" -#: lib/quantic_web/components/ai_components.ex:175 -#, elixir-autogen, elixir-format -msgid "Strong buy" -msgstr "Compra forte" - -#: lib/quantic_web/components/ai_components.ex:162 +#: lib/quantic_web/components/ai_components.ex:157 +#: lib/quantic_web/live/ask_live.ex:259 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — your quota resets at midnight UTC." msgstr "Você usou as %{limit} consultas de IA de hoje — sua cota volta à meia-noite UTC." @@ -1219,7 +1202,7 @@ msgstr "Pergunte coisas como:\n• o que há no meu radar?\n• dividendos este msgid "Ask the bot about your portfolio, radar and dividends." msgstr "Pergunte ao bot sobre sua carteira, radar e dividendos." -#: lib/quantic_web/components/home_components.ex:408 +#: lib/quantic_web/components/home_components.ex:444 #: lib/quantic_web/live/settings_live.ex:307 #, elixir-autogen, elixir-format msgid "Connect Telegram" @@ -1293,7 +1276,8 @@ msgid "Refresh status" msgstr "Atualizar status" #: lib/quantic/telegram/handler.ex:79 -#: lib/quantic/telegram/handler.ex:201 +#: lib/quantic/telegram/handler.ex:204 +#: lib/quantic_web/live/ask_live.ex:264 #, elixir-autogen, elixir-format msgid "Something went wrong — please try again." msgstr "Algo deu errado — tente novamente." @@ -1323,7 +1307,7 @@ msgstr "Comando desconhecido — tente /help." msgid "Use /notifications on|off to change." msgstr "Use /notifications on|off para mudar." -#: lib/quantic/telegram/handler.ex:195 +#: lib/quantic/telegram/handler.ex:198 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — quota resets at midnight UTC." msgstr "Você usou as %{limit} consultas de IA de hoje — a cota volta à meia-noite UTC." @@ -1368,38 +1352,38 @@ msgstr "• %{symbol} pagou %{amount} %{currency} líquidos" msgid "📊 Your Quantic daily digest" msgstr "📊 Seu resumo diário do Quantic" -#: lib/quantic_web/components/layouts.ex:408 +#: lib/quantic_web/components/layouts.ex:419 #, elixir-autogen, elixir-format msgid "Built with Elixir, Phoenix LiveView, and Tailwind CSS" msgstr "Feito com Elixir, Phoenix LiveView e Tailwind CSS" -#: lib/quantic_web/components/layouts.ex:227 +#: lib/quantic_web/components/layouts.ex:238 #, elixir-autogen, elixir-format msgid "Close menu" msgstr "Fechar menu" -#: lib/quantic_web/components/layouts.ex:313 +#: lib/quantic_web/components/layouts.ex:324 #, elixir-autogen, elixir-format msgid "FAQ" msgstr "FAQ" -#: lib/quantic_web/components/layouts.ex:421 +#: lib/quantic_web/components/layouts.ex:432 #, elixir-autogen, elixir-format msgid "Frequently Asked Questions" msgstr "Perguntas frequentes" -#: lib/quantic_web/components/layouts.ex:241 +#: lib/quantic_web/components/layouts.ex:252 #, elixir-autogen, elixir-format msgid "Home" msgstr "Início" -#: lib/quantic_web/components/layouts.ex:158 -#: lib/quantic_web/components/layouts.ex:223 +#: lib/quantic_web/components/layouts.ex:162 +#: lib/quantic_web/components/layouts.ex:234 #, elixir-autogen, elixir-format msgid "Menu" msgstr "Menu" -#: lib/quantic_web/components/layouts.ex:218 +#: lib/quantic_web/components/layouts.ex:229 #, elixir-autogen, elixir-format msgid "Navigation menu" msgstr "Menu de navegação" @@ -1409,42 +1393,42 @@ msgstr "Menu de navegação" msgid "New here? Signing in creates your account automatically." msgstr "Novo por aqui? Ao entrar, sua conta é criada automaticamente." -#: lib/quantic_web/components/layouts.ex:149 -#: lib/quantic_web/components/layouts.ex:355 +#: lib/quantic_web/components/layouts.ex:153 +#: lib/quantic_web/components/layouts.ex:366 #, elixir-autogen, elixir-format msgid "Sign in" msgstr "Entrar" -#: lib/quantic_web/components/layouts.ex:345 +#: lib/quantic_web/components/layouts.ex:356 #, elixir-autogen, elixir-format msgid "Sign out" msgstr "Sair" -#: lib/quantic_web/components/layouts.ex:398 +#: lib/quantic_web/components/layouts.ex:409 #, elixir-autogen, elixir-format msgid "The information on Quantic is provided for informational and educational purposes only. It is general in nature, does not take into account your personal financial situation, and does not constitute investment, financial, tax, or legal advice — nor a recommendation to buy or sell any security. Investing involves risk, including possible loss of principal; past performance is not a reliable indicator of future results. Market data comes from third-party providers and may be delayed or inaccurate. Before making any investment decision, consider your objectives, time horizon, risk tolerance, and diversification, and consult a qualified financial professional. Quantic is not a registered investment adviser or broker-dealer." msgstr "As informações no Quantic são fornecidas apenas para fins informativos e educacionais. Têm caráter geral, não levam em conta sua situação financeira pessoal e não constituem aconselhamento de investimento, financeiro, fiscal ou jurídico — nem uma recomendação de compra ou venda de qualquer ativo. Investir envolve riscos, incluindo a possível perda do capital; resultados passados não são um indicador confiável de resultados futuros. Os dados de mercado vêm de fornecedores terceiros e podem estar atrasados ou imprecisos. Antes de tomar qualquer decisão de investimento, considere seus objetivos, horizonte de tempo, tolerância ao risco e diversificação, e consulte um profissional financeiro qualificado. O Quantic não é um consultor de investimentos registrado nem uma corretora." -#: lib/quantic_web/components/home_components.ex:397 +#: lib/quantic_web/components/home_components.ex:433 #, elixir-autogen, elixir-format msgid "\"what dividends did I get this month?\" · \"show my radar\" · \"any ex-divs this week?\"" msgstr "\"que dividendos recebi este mês?\" · \"mostre meu radar\" · \"algum ex-div esta semana?\"" -#: lib/quantic_web/components/home_components.ex:568 +#: lib/quantic_web/components/home_components.ex:604 #, elixir-autogen, elixir-format msgid "%{count} on radar" msgid_plural "%{count} on radar" msgstr[0] "%{count} no radar" msgstr[1] "%{count} no radar" -#: lib/quantic_web/components/home_components.ex:721 +#: lib/quantic_web/components/home_components.ex:757 #, elixir-autogen, elixir-format msgid "+ %{count} more currency" msgid_plural "+ %{count} more currencies" msgstr[0] "+ %{count} outra moeda" msgstr[1] "+ %{count} outras moedas" -#: lib/quantic_web/components/home_components.ex:289 +#: lib/quantic_web/components/home_components.ex:325 #, elixir-autogen, elixir-format msgid "A live community of dividend investors. Browse what others hold, what they target, and how they structure their portfolios." msgstr "Uma comunidade ao vivo de investidores em dividendos. Veja o que os outros possuem, quais alvos definem e como estruturam suas carteiras." @@ -1459,12 +1443,12 @@ msgstr "Investimento em dividendos potencializado por IA. Monte sua lista de aco msgid "Add stocks with target prices. We track price, score, and ex-div dates." msgstr "Adicione ações com preços-alvo. Acompanhamos preço, pontuação e datas ex-dividendo." -#: lib/quantic_web/components/home_components.ex:648 +#: lib/quantic_web/components/home_components.ex:684 #, elixir-autogen, elixir-format msgid "Add your first holding" msgstr "Adicione sua primeira posição" -#: lib/quantic_web/components/home_components.ex:392 +#: lib/quantic_web/components/home_components.ex:428 #, elixir-autogen, elixir-format msgid "Ask your portfolio anything in natural language — ex-divs, totals, target prices — right from Telegram." msgstr "Pergunte qualquer coisa à sua carteira em linguagem natural — ex-divs, totais, preços-alvo — direto do Telegram." @@ -1479,22 +1463,22 @@ msgstr "Monte seu radar" msgid "Create your plan" msgstr "Crie seu plano" -#: lib/quantic_web/components/home_components.ex:616 +#: lib/quantic_web/components/home_components.ex:652 #, elixir-autogen, elixir-format msgid "Current yield" msgstr "Yield atual" -#: lib/quantic_web/components/home_components.ex:678 +#: lib/quantic_web/components/home_components.ex:714 #, elixir-autogen, elixir-format msgid "Dividend income" msgstr "Renda de dividendos" -#: lib/quantic_web/components/home_components.ex:862 +#: lib/quantic_web/components/home_components.ex:898 #, elixir-autogen, elixir-format msgid "Ex-dividend dates in the next %{days} days" msgstr "Datas ex-dividendo nos próximos %{days} dias" -#: lib/quantic_web/components/home_components.ex:954 +#: lib/quantic_web/components/home_components.ex:990 #: lib/quantic_web/components/stock_card_components.ex:143 #: lib/quantic_web/live/buy_plan_live.ex:546 #, elixir-autogen, elixir-format @@ -1506,7 +1490,7 @@ msgstr "Razoável" msgid "Free · No broker connection required · Open source" msgstr "Gratuito · Sem conexão com corretora · Código aberto" -#: lib/quantic_web/components/home_components.ex:515 +#: lib/quantic_web/components/home_components.ex:551 #, elixir-autogen, elixir-format msgid "Free, no broker connection required. Try a sample portfolio or sign up to build your own." msgstr "Gratuito, sem conexão com corretora. Experimente uma carteira de exemplo ou cadastre-se para montar a sua." @@ -1521,17 +1505,17 @@ msgstr "Da lista de acompanhamento à renda de dividendos em 3 passos" msgid "Get AI insights" msgstr "Receba análises com IA" -#: lib/quantic_web/components/home_components.ex:557 +#: lib/quantic_web/components/home_components.ex:593 #, elixir-autogen, elixir-format msgid "Good afternoon, %{name}" msgstr "Boa tarde, %{name}" -#: lib/quantic_web/components/home_components.ex:559 +#: lib/quantic_web/components/home_components.ex:595 #, elixir-autogen, elixir-format msgid "Good evening, %{name}" msgstr "Boa noite, %{name}" -#: lib/quantic_web/components/home_components.ex:555 +#: lib/quantic_web/components/home_components.ex:591 #, elixir-autogen, elixir-format msgid "Good morning, %{name}" msgstr "Bom dia, %{name}" @@ -1546,32 +1530,32 @@ msgstr "Ao vivo" msgid "Log holdings to get live yield, sector mix, and dividend forecast." msgstr "Registre suas posições para ver yield ao vivo, mix de setores e previsão de dividendos." -#: lib/quantic_web/live/home_live.ex:120 +#: lib/quantic_web/live/home_live.ex:121 #, elixir-autogen, elixir-format msgid "Most Added to Radar" msgstr "Mais adicionadas ao Radar" -#: lib/quantic_web/live/home_live.ex:125 +#: lib/quantic_web/live/home_live.ex:126 #, elixir-autogen, elixir-format msgid "Most Held in Portfolios" msgstr "Mais presentes nas carteiras" -#: lib/quantic_web/components/home_components.ex:572 +#: lib/quantic_web/components/home_components.ex:608 #, elixir-autogen, elixir-format msgid "Next ex-div: %{symbol} in %{days}d" msgstr "Próximo ex-div: %{symbol} em %{days}d" -#: lib/quantic_web/components/home_components.ex:480 +#: lib/quantic_web/components/home_components.ex:516 #, elixir-autogen, elixir-format msgid "No stocks found." msgstr "Nenhuma ação encontrada." -#: lib/quantic_web/components/home_components.ex:577 +#: lib/quantic_web/components/home_components.ex:613 #, elixir-autogen, elixir-format msgid "No upcoming ex-div dates" msgstr "Nenhuma data ex-dividendo próxima" -#: lib/quantic_web/components/home_components.ex:793 +#: lib/quantic_web/components/home_components.ex:829 #, elixir-autogen, elixir-format msgid "Open my plan" msgstr "Abrir meu plano" @@ -1581,32 +1565,32 @@ msgstr "Abrir meu plano" msgid "Plain-language analysis of your portfolio and radar — risks, gaps, opportunities." msgstr "Análise em linguagem simples da sua carteira e do seu radar — riscos, lacunas, oportunidades." -#: lib/quantic_web/components/home_components.ex:608 +#: lib/quantic_web/components/home_components.ex:644 #, elixir-autogen, elixir-format msgid "Portfolio stats" msgstr "Estatísticas da carteira" -#: lib/quantic_web/components/home_components.ex:388 +#: lib/quantic_web/components/home_components.ex:424 #, elixir-autogen, elixir-format msgid "Quantic in Telegram" msgstr "Quantic no Telegram" -#: lib/quantic_web/live/home_live.ex:130 +#: lib/quantic_web/live/home_live.ex:131 #, elixir-autogen, elixir-format msgid "Recently Updated" msgstr "Atualizados recentemente" -#: lib/quantic_web/components/home_components.ex:298 +#: lib/quantic_web/components/home_components.ex:334 #, elixir-autogen, elixir-format msgid "See the community" msgstr "Conheça a comunidade" -#: lib/quantic_web/components/home_components.ex:285 +#: lib/quantic_web/components/home_components.ex:321 #, elixir-autogen, elixir-format msgid "Share your portfolio with the community" msgstr "Compartilhe sua carteira com a comunidade" -#: lib/quantic_web/components/home_components.ex:529 +#: lib/quantic_web/components/home_components.ex:565 #, elixir-autogen, elixir-format msgid "Sign up" msgstr "Cadastre-se" @@ -1616,39 +1600,39 @@ msgstr "Cadastre-se" msgid "Sign up free" msgstr "Cadastre-se grátis" -#: lib/quantic_web/components/home_components.ex:410 +#: lib/quantic_web/components/home_components.ex:446 #, elixir-autogen, elixir-format msgid "Sign up to connect" msgstr "Cadastre-se para conectar" -#: lib/quantic_web/components/home_components.ex:304 +#: lib/quantic_web/components/home_components.ex:340 #, elixir-autogen, elixir-format msgid "Sign up to share yours" msgstr "Cadastre-se para compartilhar a sua" -#: lib/quantic_web/components/home_components.ex:512 +#: lib/quantic_web/components/home_components.ex:548 #, elixir-autogen, elixir-format msgid "Start your radar in 30 seconds" msgstr "Comece seu radar em 30 segundos" -#: lib/quantic_web/components/home_components.ex:953 +#: lib/quantic_web/components/home_components.ex:989 #: lib/quantic_web/components/stock_card_components.ex:142 #: lib/quantic_web/live/buy_plan_live.ex:545 #, elixir-autogen, elixir-format msgid "Strong" msgstr "Forte" -#: lib/quantic_web/components/home_components.ex:690 +#: lib/quantic_web/components/home_components.ex:726 #, elixir-autogen, elixir-format msgid "This month" msgstr "Este mês" -#: lib/quantic_web/components/home_components.ex:435 +#: lib/quantic_web/components/home_components.ex:471 #, elixir-autogen, elixir-format msgid "Top Dividend Scores" msgstr "Melhores pontuações de dividendos" -#: lib/quantic_web/components/home_components.ex:650 +#: lib/quantic_web/components/home_components.ex:686 #, elixir-autogen, elixir-format msgid "Track real yield, dividend forecast, and sector mix. Takes a minute." msgstr "Acompanhe o yield real, a previsão de dividendos e o mix de setores. Leva um minuto." @@ -1673,17 +1657,17 @@ msgstr "Em alta na comunidade" msgid "Try a sample portfolio" msgstr "Experimente uma carteira de exemplo" -#: lib/quantic_web/components/home_components.ex:526 +#: lib/quantic_web/components/home_components.ex:562 #, elixir-autogen, elixir-format msgid "Try the demo" msgstr "Experimente a demo" -#: lib/quantic_web/components/home_components.ex:821 +#: lib/quantic_web/components/home_components.ex:857 #, elixir-autogen, elixir-format msgid "View full buy plan" msgstr "Ver o plano de compra completo" -#: lib/quantic_web/components/home_components.ex:955 +#: lib/quantic_web/components/home_components.ex:991 #: lib/quantic_web/components/stock_card_components.ex:144 #: lib/quantic_web/live/buy_plan_live.ex:547 #, elixir-autogen, elixir-format @@ -1695,12 +1679,12 @@ msgstr "Fraco" msgid "What investors are watching" msgstr "O que os investidores estão acompanhando" -#: lib/quantic_web/components/home_components.ex:612 +#: lib/quantic_web/components/home_components.ex:648 #, elixir-autogen, elixir-format msgid "Yield on cost" msgstr "Yield on Cost" -#: lib/quantic_web/components/home_components.ex:815 +#: lib/quantic_web/components/home_components.ex:851 #, elixir-autogen, elixir-format msgid "Your next picks" msgstr "Suas próximas escolhas" @@ -1715,13 +1699,13 @@ msgstr "dividendos" msgid "ex-div dates" msgstr "ex-dividendos" -#: lib/quantic_web/components/home_components.ex:900 +#: lib/quantic_web/components/home_components.ex:936 #, elixir-autogen, elixir-format msgid "in %{days}d" msgstr "em %{days}d" -#: lib/quantic_web/live/home_live.ex:199 -#: lib/quantic_web/live/home_live.ex:210 +#: lib/quantic_web/live/home_live.ex:200 +#: lib/quantic_web/live/home_live.ex:211 #, elixir-autogen, elixir-format msgid "investor" msgstr "investidor" @@ -1731,12 +1715,12 @@ msgstr "investidor" msgid "radar targets" msgstr "alvos do radar" -#: lib/quantic_web/components/home_components.ex:896 +#: lib/quantic_web/components/home_components.ex:932 #, elixir-autogen, elixir-format msgid "today" msgstr "hoje" -#: lib/quantic_web/components/home_components.ex:898 +#: lib/quantic_web/components/home_components.ex:934 #, elixir-autogen, elixir-format msgid "tomorrow" msgstr "amanhã" @@ -1756,17 +1740,17 @@ msgstr "%{percentage}% acima do alvo" msgid "%{percentage}% below target" msgstr "%{percentage}% abaixo do alvo" -#: lib/quantic_web/live/radar_live.ex:430 +#: lib/quantic_web/live/radar_live.ex:450 #, elixir-autogen, elixir-format msgid "200-day average" msgstr "Média de 200 dias" -#: lib/quantic_web/live/radar_live.ex:436 +#: lib/quantic_web/live/radar_live.ex:456 #, elixir-autogen, elixir-format msgid "50-day average" msgstr "Média de 50 dias" -#: lib/quantic_web/live/radar_live.ex:424 +#: lib/quantic_web/live/radar_live.ex:444 #, elixir-autogen, elixir-format msgid "52-week midpoint" msgstr "Ponto médio de 52 semanas" @@ -1798,7 +1782,7 @@ msgstr "Limpar busca" msgid "Click to edit" msgstr "Clique para editar" -#: lib/quantic_web/live/radar_live.ex:418 +#: lib/quantic_web/live/radar_live.ex:438 #, elixir-autogen, elixir-format msgid "Community average" msgstr "Média da comunidade" @@ -1808,7 +1792,7 @@ msgstr "Média da comunidade" msgid "Compact view" msgstr "Visão compacta" -#: lib/quantic_web/live/radar_live.ex:182 +#: lib/quantic_web/live/radar_live.ex:198 #, elixir-autogen, elixir-format msgid "Could not apply that target price." msgstr "Não foi possível aplicar esse preço-alvo." @@ -1863,12 +1847,12 @@ msgstr "Na carteira" msgid "Market value" msgstr "Valor de mercado" -#: lib/quantic_web/live/radar_live.ex:446 +#: lib/quantic_web/live/radar_live.ex:466 #, elixir-autogen, elixir-format msgid "Needs 3+ community targets (%{count} so far)" msgstr "Precisa de 3+ alvos da comunidade (%{count} até agora)" -#: lib/quantic_web/live/radar_live.ex:448 +#: lib/quantic_web/live/radar_live.ex:468 #, elixir-autogen, elixir-format msgid "No community targets yet" msgstr "Ainda não há alvos da comunidade" @@ -1894,13 +1878,13 @@ msgstr "Sem dados de calendário" msgid "No target set" msgstr "Nenhum alvo definido" -#: lib/quantic_web/live/radar_live.ex:313 -#: lib/quantic_web/live/radar_live.ex:328 +#: lib/quantic_web/live/radar_live.ex:333 +#: lib/quantic_web/live/radar_live.ex:348 #, elixir-autogen, elixir-format msgid "Nothing on your radar yet. Search above to add your first stock." msgstr "Ainda não há nada no seu radar. Busque acima para adicionar sua primeira ação." -#: lib/quantic_web/live/radar_live.ex:285 +#: lib/quantic_web/live/radar_live.ex:280 #, elixir-autogen, elixir-format msgid "On radar" msgstr "No radar" @@ -1916,7 +1900,7 @@ msgid "Position" msgstr "Posição" #: lib/quantic_web/live/portfolio_live.ex:377 -#: lib/quantic_web/live/radar_live.ex:262 +#: lib/quantic_web/live/radar_live.ex:311 #, elixir-autogen, elixir-format msgid "Public page" msgstr "Página pública" @@ -1928,7 +1912,7 @@ msgid "Score" msgstr "Pontuação" #: lib/quantic_web/live/portfolio_live.ex:306 -#: lib/quantic_web/live/radar_live.ex:280 +#: lib/quantic_web/live/radar_live.ex:275 #, elixir-autogen, elixir-format msgid "Search by ticker or company name…" msgstr "Busque por ticker ou nome da empresa…" @@ -1956,12 +1940,12 @@ msgstr "Status" msgid "Suggest a target" msgstr "Sugerir um alvo" -#: lib/quantic_web/live/radar_live.ex:175 +#: lib/quantic_web/live/radar_live.ex:191 #, elixir-autogen, elixir-format msgid "Target for %{symbol} set to %{price}." msgstr "Alvo de %{symbol} definido em %{price}." -#: lib/quantic_web/live/radar_live.ex:90 +#: lib/quantic_web/live/radar_live.ex:95 #, elixir-autogen, elixir-format msgid "That stock is already on your radar." msgstr "Essa ação já está no seu radar." @@ -2078,7 +2062,7 @@ msgstr "Beta" #: lib/quantic_web/live/admin_content_drafts_live.ex:272 #: lib/quantic_web/live/portfolio_live.ex:447 -#: lib/quantic_web/live/radar_live.ex:342 +#: lib/quantic_web/live/radar_live.ex:362 #, elixir-autogen, elixir-format msgid "Dividend calendar" msgstr "Calendário de dividendos" @@ -2334,7 +2318,7 @@ msgstr "Contribuição mensal" msgid "Monthly dividend goal (today's money)" msgstr "Objetivo mensal de dividendos (dinheiro de hoje)" -#: lib/quantic_web/components/home_components.ex:762 +#: lib/quantic_web/components/home_components.ex:798 #: lib/quantic_web/live/path_to_freedom_live.ex:379 #, elixir-autogen, elixir-format msgid "Not in reach yet" @@ -2440,7 +2424,7 @@ msgstr "O teu objetivo permanece fora de alcance dentro do horizonte." msgid "Your journey to freedom" msgstr "A tua jornada para a liberdade" -#: lib/quantic_web/components/home_components.ex:757 +#: lib/quantic_web/components/home_components.ex:793 #: lib/quantic_web/live/path_to_freedom_live.ex:353 #: lib/quantic_web/live/path_to_freedom_live.ex:856 #: lib/quantic_web/live/path_to_freedom_live.ex:1066 @@ -2494,7 +2478,7 @@ msgstr "¾ do teu objetivo" msgid "✓ today" msgstr "✓ hoje" -#: lib/quantic_web/components/home_components.ex:765 +#: lib/quantic_web/components/home_components.ex:801 #, elixir-autogen, elixir-format msgid "Keep going — see what changes it" msgstr "Continua — vê o que o muda" @@ -2524,7 +2508,7 @@ msgstr "Diz-nos o teu objetivo de dividendos mensais. Dizemos-te o ano — e a t msgid "The year, and your age, when dividends cover your goal" msgstr "O ano, e a tua idade, em que os dividendos cobrem o teu objetivo" -#: lib/quantic_web/components/home_components.ex:783 +#: lib/quantic_web/components/home_components.ex:819 #, elixir-autogen, elixir-format msgid "per month" msgstr "por mês" @@ -2741,7 +2725,7 @@ msgstr "Utilizadores ativos — últimas 8 semanas" msgid "Activity" msgstr "Atividade" -#: lib/quantic_web/components/layouts.ex:330 +#: lib/quantic_web/components/layouts.ex:341 #: lib/quantic_web/live/admin_content_drafts_live.ex:112 #: lib/quantic_web/live/admin_dashboard_live.ex:18 #: lib/quantic_web/live/admin_dashboard_live.ex:64 @@ -3189,3 +3173,115 @@ msgstr "Seus links serão:" #, elixir-autogen, elixir-format msgid "Your public link" msgstr "Seu link público" + +#: lib/quantic_web/components/home_components.ex:292 +#, elixir-autogen, elixir-format +msgid "\"Any ex-dividends this week?\"" +msgstr "«Algum ex-dividendo esta semana?»" + +#: lib/quantic_web/components/home_components.ex:290 +#, elixir-autogen, elixir-format +msgid "\"What dividends did I get this month?\"" +msgstr "«Que dividendos recebi este mês?»" + +#: lib/quantic_web/components/home_components.ex:291 +#, elixir-autogen, elixir-format +msgid "\"What's my biggest holding?\"" +msgstr "«Qual é a minha maior posição?»" + +#: lib/quantic_web/components/home_components.ex:289 +#, elixir-autogen, elixir-format +msgid "\"Which of my stocks are below my target?\"" +msgstr "«Quais das minhas ações estão abaixo do meu preço-alvo?»" + +#: lib/quantic_web/live/ask_live.ex:208 +#, elixir-autogen, elixir-format +msgid "%{remaining}/%{limit} left" +msgstr "%{remaining}/%{limit} restantes" + +#: lib/quantic_web/components/home_components.ex:284 +#, elixir-autogen, elixir-format +msgid "An AI assistant on every page. Ask about your portfolio, radar, and dividends in plain language — it reads your own data to answer." +msgstr "Um assistente de IA em todas as páginas. Pergunta sobre a tua carteira, radar e dividendos em linguagem natural: lê os teus próprios dados para responder." + +#: lib/quantic_web/components/home_components.ex:281 +#: lib/quantic_web/live/ask_live.ex:196 +#: lib/quantic_web/live/ask_live.ex:303 +#, elixir-autogen, elixir-format +msgid "Ask Quantic" +msgstr "Pergunta ao Quantic" + +#: lib/quantic_web/live/ask_live.ex:279 +#, elixir-autogen, elixir-format +msgid "Ask a question…" +msgstr "Escreve uma pergunta…" + +#: lib/quantic_web/live/ask_live.ex:217 +#, elixir-autogen, elixir-format +msgid "Ask me about your portfolio, radar or dividends." +msgstr "Pergunta-me sobre a tua carteira, radar ou dividendos." + +#: lib/quantic_web/live/ask_live.ex:379 +#, elixir-autogen, elixir-format +msgid "Dividends this month?" +msgstr "Dividendos este mês?" + +#: lib/quantic_web/live/ask_live.ex:288 +#, elixir-autogen, elixir-format +msgid "Send" +msgstr "Enviar" + +#: lib/quantic_web/live/ask_live.ex:256 +#, elixir-autogen, elixir-format +msgid "Thinking…" +msgstr "A pensar…" + +#: lib/quantic_web/components/home_components.ex:299 +#, elixir-autogen, elixir-format +msgid "Try it" +msgstr "Experimentar" + +#: lib/quantic_web/live/ask_live.ex:376 +#, elixir-autogen, elixir-format +msgid "What's my biggest holding?" +msgstr "Qual é a minha maior posição?" + +#: lib/quantic_web/live/ask_live.ex:378 +#, elixir-autogen, elixir-format +msgid "Which stocks are below my target?" +msgstr "Que ações estão abaixo do meu alvo?" + +#: lib/quantic_web/live/ask_live.ex:201 +#, elixir-autogen, elixir-format +msgid "on %{page}" +msgstr "em %{page}" + +#: lib/quantic_web/live/ask_live.ex:377 +#, elixir-autogen, elixir-format +msgid "What do you think of KO?" +msgstr "O que achas da KO?" + +#: lib/quantic_web/live/ask_live.ex:295 +#, elixir-autogen, elixir-format +msgid "Informational only — not financial advice." +msgstr "Apenas informativo — não é aconselhamento financeiro." + +#: lib/quantic_web/live/radar_live.ex:504 +#, elixir-autogen, elixir-format +msgid "Dividend score" +msgstr "Pontuação de dividendo" + +#: lib/quantic_web/live/radar_live.ex:503 +#, elixir-autogen, elixir-format +msgid "Dividend yield" +msgstr "Rendibilidade do dividendo" + +#: lib/quantic_web/live/radar_live.ex:501 +#, elixir-autogen, elixir-format +msgid "Opportunity" +msgstr "Oportunidade" + +#: lib/quantic_web/live/ask_live.ex:362 +#, elixir-autogen, elixir-format +msgid "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" +msgstr "Estás a explorar uma demo, por isso esta é uma resposta de exemplo em vez de uma resposta real (assim a demo continua gratuita). Com a tua própria conta leio as tuas posições, o teu radar e os teus dividendos reais para responder a perguntas como esta. Regista-te para experimentar a sério!" diff --git a/test/quantic_web/live/ask_live_test.exs b/test/quantic_web/live/ask_live_test.exs new file mode 100644 index 0000000..aaa448c --- /dev/null +++ b/test/quantic_web/live/ask_live_test.exs @@ -0,0 +1,185 @@ +defmodule QuanticWeb.AskLiveTest do + use QuanticWeb.ConnCase, async: false + + import Phoenix.LiveViewTest + import Quantic.AccountsFixtures + + alias Quantic.AI.ChatResult + alias Quantic.Accounts + + setup do + Quantic.AI.Cache.clear() + Mox.stub(Quantic.AI.ProviderMock, :name, fn -> "mock" end) + Mox.set_mox_global() + :ok + end + + test "the widget mounts on every authenticated page", %{conn: conn} do + conn = sign_in(conn, email_user_fixture()) + + {:ok, lv, _html} = live(conn, ~p"/settings") + widget = find_live_child(lv, "ask-widget") + + assert has_element?(widget, "#ask-toggle") + # Panel (and form) only appear once opened. + refute has_element?(widget, "#ask-form") + render_click(element(widget, "#ask-toggle")) + assert has_element?(widget, "#ask-form") + assert has_element?(widget, "#ask-messages-empty") + end + + test "the widget is absent for anonymous visitors", %{conn: conn} do + {:ok, lv, _html} = live(conn, ~p"/") + assert find_live_child(lv, "ask-widget") == nil + end + + test "the widget follows a signed-in user onto the home and community pages", + %{conn: conn} do + conn = sign_in(conn, email_user_fixture()) + + {:ok, home, _html} = live(conn, ~p"/") + assert has_element?(find_live_child(home, "ask-widget"), "#ask-toggle") + + {:ok, community, _html} = live(conn, ~p"/community") + assert has_element?(find_live_child(community, "ask-widget"), "#ask-toggle") + end + + test "happy path: question → thinking → tool-grounded reply", %{conn: conn} do + conn = sign_in(conn, email_user_fixture()) + + Mox.stub(Quantic.AI.ProviderMock, :chat, fn _messages, _opts -> + {:ok, %ChatResult{text: "You hold 10 shares of AAPL."}} + end) + + {:ok, lv, _html} = live(conn, ~p"/settings") + widget = find_live_child(lv, "ask-widget") + render_click(element(widget, "#ask-toggle")) + + html = + widget + |> form("#ask-form", chat: %{text: "what do I hold?"}) + |> render_submit() + + assert html =~ "Thinking" + # The user's own turn renders immediately. + assert html =~ "what do I hold?" + + html = render_async(widget) + assert html =~ "You hold 10 shares of AAPL." + assert has_element?(widget, "#ask-messages [id^='msg-']") + end + + test "rate-limited reply shows the quota notice and disables input", %{conn: conn} do + conn = sign_in(conn, email_user_fixture()) + + quota = %{allowed: false, remaining: 0, limit: 3, resets_at: nil} + + Mox.stub(Quantic.AI.ProviderMock, :chat, fn _messages, _opts -> + {:error, {:rate_limited, quota}} + end) + + {:ok, lv, _html} = live(conn, ~p"/settings") + widget = find_live_child(lv, "ask-widget") + render_click(element(widget, "#ask-toggle")) + + widget |> form("#ask-form", chat: %{text: "anything?"}) |> render_submit() + html = render_async(widget) + + assert html =~ "quota resets at midnight UTC" + assert has_element?(widget, "#ask-input[disabled]") + end + + test "provider failure shows the generic error and adds no assistant bubble", %{conn: conn} do + conn = sign_in(conn, email_user_fixture()) + + Mox.stub(Quantic.AI.ProviderMock, :chat, fn _messages, _opts -> {:error, :boom} end) + + {:ok, lv, _html} = live(conn, ~p"/settings") + widget = find_live_child(lv, "ask-widget") + render_click(element(widget, "#ask-toggle")) + + widget |> form("#ask-form", chat: %{text: "hello"}) |> render_submit() + html = render_async(widget) + + assert html =~ "Something went wrong" + # The user's own turn is still shown; no assistant reply was added. + assert html =~ "hello" + refute has_element?(widget, "#ask-thinking") + end + + test "multi-turn: the conversation history accumulates across turns", %{conn: conn} do + conn = sign_in(conn, email_user_fixture()) + + # Echo the number of messages the provider received, so we can prove + # earlier turns are replayed on the next call. + Mox.stub(Quantic.AI.ProviderMock, :chat, fn messages, _opts -> + {:ok, %ChatResult{text: "history length #{length(messages)}"}} + end) + + {:ok, lv, _html} = live(conn, ~p"/settings") + widget = find_live_child(lv, "ask-widget") + render_click(element(widget, "#ask-toggle")) + + widget |> form("#ask-form", chat: %{text: "first"}) |> render_submit() + html = render_async(widget) + assert html =~ "history length 1" + + widget |> form("#ask-form", chat: %{text: "second"}) |> render_submit() + html = render_async(widget) + # user1, assistant1, user2 = 3 messages handed to the provider. + assert html =~ "history length 3" + end + + test "a persisted conversation and open state are restored on mount", %{conn: conn} do + conn = sign_in(conn, email_user_fixture()) + + {:ok, lv, _html} = live(conn, ~p"/settings") + widget = find_live_child(lv, "ask-widget") + + payload = %{ + "open" => true, + "history" => [ + %{"role" => "user", "text" => "what do I hold?"}, + %{"role" => "assistant", "text" => "10 shares of AAPL"} + ] + } + + html = render_hook(element(widget, "#ask-widget-root"), "restore", payload) + + assert html =~ "what do I hold?" + assert html =~ "10 shares of AAPL" + # open: true was restored, so the panel (and its form) is shown. + assert has_element?(widget, "#ask-form") + end + + test "demo accounts get a canned reply — no provider call, no quota spent", %{conn: conn} do + demo = + email_user_fixture() + |> Ecto.Changeset.change(demo: true) + |> Quantic.Repo.update!() + + conn = sign_in(conn, demo) + scope = Quantic.Accounts.Scope.for_user(demo) + + # Note: no ProviderMock.chat stub — if the code reached the provider, + # Mox would raise, failing this test. That's the no-cost guarantee. + {:ok, lv, _html} = live(conn, ~p"/settings") + widget = find_live_child(lv, "ask-widget") + render_click(element(widget, "#ask-toggle")) + + widget |> form("#ask-form", chat: %{text: "what do I hold?"}) |> render_submit() + html = render_async(widget) + + assert html =~ "sample reply" + # Nothing charged: the demo path never records an AI request. + assert Quantic.AI.quota(scope).remaining == Quantic.AI.daily_limit() + end + + defp sign_in(conn, user) do + token = Accounts.generate_user_session_token(user) + + conn + |> Plug.Test.init_test_session(%{}) + |> Plug.Conn.put_session(:user_token, token) + end +end From 7b85a16f4cbe6a61d24967e1d27985a19024c640 Mon Sep 17 00:00:00 2001 From: Francesc Leveque Date: Fri, 19 Jun 2026 21:00:57 +0200 Subject: [PATCH 3/8] refactor(ai): make the per-stock AI summary informational MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop the strong_buy→avoid verdict from stock_summary (schema, prompt, system message, and the badge component + its now-dead helpers). Aligns the feature with the app's own footer disclaimer ('not a recommendation to buy or sell any security') and with the chat widget's informational framing — present the data and trade-offs, let the user decide. Co-Authored-By: Claude Opus 4.8 (1M context) --- lib/quantic/ai/insights.ex | 14 +++++--------- lib/quantic_web/components/ai_components.ex | 19 +------------------ test/quantic/ai/insights_test.exs | 17 +++++++---------- 3 files changed, 13 insertions(+), 37 deletions(-) diff --git a/lib/quantic/ai/insights.ex b/lib/quantic/ai/insights.ex index 63306a4..0779f84 100644 --- a/lib/quantic/ai/insights.ex +++ b/lib/quantic/ai/insights.ex @@ -68,13 +68,9 @@ defmodule Quantic.AI.Insights do "type" => "object", "properties" => %{ "summary" => %{"type" => "string"}, - "verdict" => %{ - "type" => "string", - "enum" => ["strong_buy", "buy", "hold", "caution", "avoid"] - }, "keyPoints" => %{"type" => "array", "items" => %{"type" => "string"}} }, - "required" => ["summary", "verdict", "keyPoints"] + "required" => ["summary", "keyPoints"] } @doc "AI insights over the scope's holdings. `{:ok, map} | {:error, _} | :empty`." @@ -133,17 +129,17 @@ defmodule Quantic.AI.Insights do data -> prompt = """ - Assess this stock for dividend investing: + Describe how this stock looks on dividend-investing criteria: #{Jason.encode!(data)} - Provide a 2-3 sentence summary, a verdict (strong_buy, buy, hold, caution, or avoid), and 2-3 key bullet points. + Provide a 2-3 sentence factual summary and 2-3 key bullet points covering its strengths and risks. Describe the data; do NOT give a verdict or a buy/sell/hold recommendation. """ cached_generate(scope, "stock_summary", data, prompt, @summary_schema, """ - You are a dividend investment analyst assistant. Provide a concise assessment of an individual stock for dividend investing. + You are a dividend-investing information assistant. Describe how an individual stock looks on dividend criteria — as information, never as advice. Consider yield, payout ratio, PE ratio, price vs target, 52-week position, and MA200 trend. - Be specific and actionable. Prices are denominated in this stock's quoted currency, see the `currency` field. + Be specific and factual. Do NOT recommend buying, selling, or holding, and do NOT rate the stock — present the data, strengths, and risks and let the user decide. Prices are denominated in this stock's quoted currency, see the `currency` field. IMPORTANT: The "targetPrice" field is NOT an analyst target — it is the price at which the user personally wants to act (buy or sell). Treat it as the user's desired action price. """) end diff --git a/lib/quantic_web/components/ai_components.ex b/lib/quantic_web/components/ai_components.ex index e51bd48..b89c087 100644 --- a/lib/quantic_web/components/ai_components.ex +++ b/lib/quantic_web/components/ai_components.ex @@ -141,12 +141,7 @@ defmodule QuanticWeb.AIComponents do
<% {:ok, summary} = @state %> -

- - {verdict_label(summary["verdict"])} - - {summary["summary"]} -

+

{summary["summary"]}

  • {point}
@@ -165,16 +160,4 @@ defmodule QuanticWeb.AIComponents do

""" end - - defp verdict_class("strong_buy"), do: "badge-success" - defp verdict_class("buy"), do: "badge-success badge-outline" - defp verdict_class("hold"), do: "badge-ghost" - defp verdict_class("caution"), do: "badge-warning" - defp verdict_class(_avoid), do: "badge-error" - - defp verdict_label("strong_buy"), do: gettext("Strong buy") - defp verdict_label("buy"), do: gettext("Buy") - defp verdict_label("hold"), do: gettext("Hold") - defp verdict_label("caution"), do: gettext("Caution") - defp verdict_label(_avoid), do: gettext("Avoid") end diff --git a/test/quantic/ai/insights_test.exs b/test/quantic/ai/insights_test.exs index 1a90311..0705b42 100644 --- a/test/quantic/ai/insights_test.exs +++ b/test/quantic/ai/insights_test.exs @@ -93,18 +93,15 @@ defmodule Quantic.AI.InsightsTest do expect(Quantic.AI.ProviderMock, :generate_json, fn prompt, schema, _opts -> assert prompt =~ "AAPL" - assert schema["properties"]["verdict"]["enum"] == [ - "strong_buy", - "buy", - "hold", - "caution", - "avoid" - ] - - {:ok, %{"summary" => "Fine.", "verdict" => "hold", "keyPoints" => []}} + # Informational summary only — no buy/sell/hold verdict (keeps the + # feature consistent with the app's "not a recommendation" stance). + assert schema["required"] == ["summary", "keyPoints"] + refute Map.has_key?(schema["properties"], "verdict") + + {:ok, %{"summary" => "Fine.", "keyPoints" => ["solid yield"]}} end) - assert {:ok, %{"verdict" => "hold"}} = Insights.stock_summary(scope, "AAPL") + assert {:ok, %{"summary" => "Fine."}} = Insights.stock_summary(scope, "AAPL") assert Insights.stock_summary(scope, "GHOST") == :empty end end From 6366ade1bb6ebee5b44a1041442b0f6cbb1b6c99 Mon Sep 17 00:00:00 2001 From: Francesc Leveque Date: Fri, 19 Jun 2026 21:01:05 +0200 Subject: [PATCH 4/8] feat(ai): don't charge quota for no-cost failures; raise daily limit to 5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A failure that never reached the provider (e.g. a missing API key) spent no money, so it no longer counts against the user's daily quota; real provider calls — success or provider-side error — still count. Also bump the default daily limit 3 → 5 (the test env is pinned to 3 so the rate-limit tests stay deterministic, independent of the prod default). Co-Authored-By: Claude Opus 4.8 (1M context) --- config/test.exs | 4 +++- lib/quantic/ai.ex | 23 +++++++++++++++-------- test/quantic/ai_test.exs | 12 ++++++++++++ 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/config/test.exs b/config/test.exs index 984b75f..a8b85e1 100644 --- a/config/test.exs +++ b/config/test.exs @@ -26,7 +26,9 @@ config :quantic, Quantic.Mailer, adapter: Swoosh.Adapters.Test # Swap the live market-data provider for a Mox-generated mock; tests set # expectations per-test via Mox.expect/3. config :quantic, Quantic.MarketData, provider: Quantic.MarketData.ProviderMock -config :quantic, Quantic.AI, provider: Quantic.AI.ProviderMock +# Pin the daily AI quota for deterministic rate-limit tests, independent +# of the production default. +config :quantic, Quantic.AI, provider: Quantic.AI.ProviderMock, daily_limit: 3 # Oban in manual testing mode: no queues poll, no plugins run; jobs are # executed explicitly via Oban.Testing helpers (perform_job/3). diff --git a/lib/quantic/ai.ex b/lib/quantic/ai.ex index 9fd109f..df532ff 100644 --- a/lib/quantic/ai.ex +++ b/lib/quantic/ai.ex @@ -8,7 +8,7 @@ defmodule Quantic.AI do `chat_as/3` / `generate_json_as/4`, which enforce the daily limit and record the request before delegating to the configured provider. AI inference costs real money — the limit keeps the service free for - everyone (#{3}/day per user; config-overridable). **Admins bypass the + everyone (#{5}/day per user; config-overridable). **Admins bypass the limit entirely** (legacy `AiRateLimiter` parity — the founder's own tooling, e.g. content drafts, must never be throttled); their calls are still recorded so usage/cost stats stay accurate. @@ -23,7 +23,7 @@ defmodule Quantic.AI do alias Quantic.AI.Request alias Quantic.Repo - @default_daily_limit 3 + @default_daily_limit 5 @typedoc "The rate-limit verdict, shaped for UI display." @type quota :: %{ @@ -97,8 +97,7 @@ defmodule Quantic.AI do defp with_quota(%Scope{user: %{admin: true} = user}, feature, fun) do # Legacy parity: admins bypass the daily limit. Still recorded so # usage/cost stats (and the admin dashboard) stay accurate. - record_request(user, feature) - fun.() + fun.() |> record_unless_free(user, feature) end defp with_quota(%Scope{user: user} = scope, feature, fun) do @@ -107,13 +106,21 @@ defmodule Quantic.AI do {:error, {:rate_limited, quota}} _allowed -> - # Record BEFORE the call (legacy did too): a slow/failed LLM - # call still spent real money and counts against the quota. - record_request(user, feature) - fun.() + fun.() |> record_unless_free(user, feature) end end + # A real LLM call — success OR a provider-side error — spent money, so + # it counts against the quota (legacy parity). But a failure that never + # reached the provider (e.g. a missing API key) cost nothing and must + # not burn the user's daily attempts. + defp record_unless_free({:error, :missing_api_key} = result, _user, _feature), do: result + + defp record_unless_free(result, user, feature) do + record_request(user, feature) + result + end + defp record_request(%{id: user_id}, feature) do Repo.insert!(%Request{user_id: user_id, feature: feature, provider: provider().name()}) end diff --git a/test/quantic/ai_test.exs b/test/quantic/ai_test.exs index e2ca298..478e92b 100644 --- a/test/quantic/ai_test.exs +++ b/test/quantic/ai_test.exs @@ -43,6 +43,18 @@ defmodule Quantic.AITest do assert AI.quota(scope_b).remaining == 3 end + test "a pre-flight failure (no provider call, no cost) does not spend quota" do + scope = Scope.for_user(email_user_fixture()) + + expect(Quantic.AI.ProviderMock, :generate_json, fn _, _, _ -> {:error, :missing_api_key} end) + + assert {:error, :missing_api_key} = + AI.generate_json_as(scope, "p", %{}, feature: "insights") + + # Nothing was charged — the provider was never reached. + assert AI.quota(scope).remaining == 3 + end + test "admins bypass the daily limit (legacy parity) but calls are recorded" do {:ok, admin} = Quantic.Accounts.set_admin(email_user_fixture().email, true) scope = Scope.for_user(admin) From 334c11d22dd14140d85c0060406db17cd88e6d71 Mon Sep 17 00:00:00 2001 From: Francesc Leveque Date: Fri, 19 Jun 2026 21:01:17 +0200 Subject: [PATCH 5/8] feat(radar): match the portfolio toolbar + add a sort select MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the radar controls (AI insights, public page, view toggle) out of the title row into a controls row below the search, matching the portfolio page, and add a persisted sort select — Opportunity (default), Symbol, Dividend yield, Dividend score — reusing the shared sort_select component. Also wires the Ask Quantic widget onto the radar page. Co-Authored-By: Claude Opus 4.8 (1M context) --- lib/quantic_web/live/radar_live.ex | 96 ++++++++++++++++++++++-------- 1 file changed, 71 insertions(+), 25 deletions(-) diff --git a/lib/quantic_web/live/radar_live.ex b/lib/quantic_web/live/radar_live.ex index 3a9685e..113a65a 100644 --- a/lib/quantic_web/live/radar_live.ex +++ b/lib/quantic_web/live/radar_live.ex @@ -15,6 +15,10 @@ defmodule QuanticWeb.RadarLive do alias Quantic.Portfolio alias Quantic.Radar + # Opportunity-first by default (← legacy grid order); the user can pick + # another order from the sort select, persisted per browser. + @sort_default :opportunity + @impl true def mount(_params, _session, socket) do if connected?(socket), do: MarketData.subscribe_quotes() @@ -25,6 +29,7 @@ defmodule QuanticWeb.RadarLive do socket |> stream_configure(:entries, dom_id: &"entries-#{&1.item.id}") |> assign(:view, :card) + |> assign(:sort, @sort_default) |> assign(:show_metrics, false) |> assign(:on_radar, MapSet.new(items, & &1.stock.symbol)) |> assign(:query, "") @@ -91,7 +96,7 @@ defmodule QuanticWeb.RadarLive do end end - ## View toggle + ## View toggle + sort def handle_event("set-view", %{"view" => view} = params, socket) do view = if view == "compact", do: :compact, else: :card @@ -105,6 +110,17 @@ defmodule QuanticWeb.RadarLive do end end + def handle_event("set-sort", %{"sort" => sort} = params, socket) do + sort = parse_sort(sort) + socket = socket |> assign(:sort, sort) |> restream() + + if params["restore"] do + {:noreply, socket} + else + {:noreply, push_event(socket, "store-sort-pref", %{key: "quantic:radar-sort", sort: sort})} + end + end + ## Edit / delete (kept from the table era, now inside cards too) def handle_event("edit", %{"id" => id}, socket) do @@ -248,30 +264,9 @@ defmodule QuanticWeb.RadarLive do @impl true def render(assigns) do ~H""" - +
-
-

{gettext("Radar")}

-
- <.link - :if={public_radar_slug(@current_scope)} - navigate={~p"/r/#{public_radar_slug(@current_scope)}"} - class="btn btn-ghost btn-sm" - > - <.icon name="hero-arrow-top-right-on-square" class="size-4" /> - {gettext("Public page")} - - - <.view_toggle view={@view} storage_key="quantic:radar-view" /> -
-
+

{gettext("Radar")}

<.stock_search id="radar-search" @@ -297,6 +292,31 @@ defmodule QuanticWeb.RadarLive do +
+
+ + <.link + :if={public_radar_slug(@current_scope)} + navigate={~p"/r/#{public_radar_slug(@current_scope)}"} + class="btn btn-ghost btn-sm" + > + <.icon name="hero-arrow-top-right-on-square" class="size-4" /> + {gettext("Public page")} + +
+
+ <.sort_select sort={@sort} storage_key="quantic:radar-sort" options={sort_options()} /> + <.view_toggle view={@view} storage_key="quantic:radar-view" /> +
+
+ <.insights_panel id="radar-insights" state={@insights} title={gettext("Radar AI insights")} /> <.stock_summary_panel id="radar-ai-summary" symbol={@ai_summary_symbol} state={@ai_summary} /> @@ -361,7 +381,7 @@ defmodule QuanticWeb.RadarLive do entries = items |> Enum.map(&build_entry(&1, quotes, community)) - |> Enum.sort_by(&opportunity_order/1) + |> sort_entries(socket.assigns[:sort] || @sort_default) calendar = entries @@ -459,6 +479,32 @@ defmodule QuanticWeb.RadarLive do defp opportunity_order(%{status: :above_target, delta_pct: d}), do: {2, d} defp opportunity_order(_no_target), do: {3, 0.0} + ## Sorting (mirrors the portfolio page's persisted sort) + + defp sort_entries(entries, :symbol), do: Enum.sort_by(entries, & &1.stock.symbol) + + defp sort_entries(entries, :yield), + do: Enum.sort_by(entries, &((&1.quote && &1.quote.dividend_yield) || -1.0), :desc) + + defp sort_entries(entries, :score), + do: Enum.sort_by(entries, &((&1.rating && &1.rating.score) || -1), :desc) + + defp sort_entries(entries, _opportunity), do: Enum.sort_by(entries, &opportunity_order/1) + + defp parse_sort("symbol"), do: :symbol + defp parse_sort("yield"), do: :yield + defp parse_sort("score"), do: :score + defp parse_sort(_opportunity), do: :opportunity + + defp sort_options do + [ + {:opportunity, gettext("Opportunity")}, + {:symbol, gettext("Symbol")}, + {:yield, gettext("Dividend yield")}, + {:score, gettext("Dividend score")} + ] + end + defp range_position(%{ price: price, fifty_two_week_low: low, From 74f8c43ba8e225ae7cb57fe33ff808e21ff0ea5e Mon Sep 17 00:00:00 2001 From: Francesc Leveque Date: Fri, 19 Jun 2026 21:07:28 +0200 Subject: [PATCH 6/8] feat(ai): show logo chips for stocks an answer references MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Under each chat answer, render <.stock_logo> chips for the stocks it mentions. The symbol set comes from the model's actual tool calls (ChatResult.tool_calls) — what the tools really returned — then narrowed to tickers present in the reply text. Reliable by construction: no regex-guessing tickers out of prose (which misfires on AI/EU/USD). Co-Authored-By: Claude Opus 4.8 (1M context) --- lib/quantic_web/live/ask_live.ex | 66 ++++++++++++++++++++++--- test/quantic_web/live/ask_live_test.exs | 26 ++++++++++ 2 files changed, 86 insertions(+), 6 deletions(-) diff --git a/lib/quantic_web/live/ask_live.ex b/lib/quantic_web/live/ask_live.ex index 3eadcf5..3d59ae9 100644 --- a/lib/quantic_web/live/ask_live.ex +++ b/lib/quantic_web/live/ask_live.ex @@ -18,6 +18,7 @@ defmodule QuanticWeb.AskLive do use QuanticWeb, :live_view import QuanticWeb.AIComponents, only: [ai_mark: 1] + import QuanticWeb.StockComponents, only: [stock_logo: 1] alias Quantic.AI alias Quantic.AI.ChatResult @@ -73,7 +74,12 @@ defmodule QuanticWeb.AskLive do socket = Enum.reduce(restored, socket, fn msg, acc -> - stream_insert(acc, :messages, %{id: next_id(), role: msg.role, text: msg.text}) + stream_insert(acc, :messages, %{ + id: next_id(), + role: msg.role, + text: msg.text, + symbols: [] + }) end) {:noreply, @@ -122,19 +128,22 @@ defmodule QuanticWeb.AskLive do open: true ) |> assign(:form, to_form(%{"text" => ""}, as: :chat)) - |> stream_insert(:messages, %{id: next_id(), role: :user, text: text}) + |> stream_insert(:messages, %{id: next_id(), role: :user, text: text, symbols: []}) |> persist() |> start_async(:chat, chat_task(scope, history, page))} end end @impl true - def handle_async(:chat, {:ok, {:ok, %ChatResult{text: text}}}, socket) when text != "" do + def handle_async(:chat, {:ok, {:ok, %ChatResult{text: text} = result}}, socket) + when text != "" do + symbols = referenced_symbols(result, text) + {:noreply, socket |> assign(:history, socket.assigns.history ++ [%{role: :assistant, text: text}]) |> assign(thinking: false, quota: quota_for(socket.assigns[:current_scope])) - |> stream_insert(:messages, %{id: next_id(), role: :assistant, text: text}) + |> stream_insert(:messages, %{id: next_id(), role: :assistant, text: text, symbols: symbols}) |> persist()} end @@ -232,8 +241,8 @@ defmodule QuanticWeb.AskLive do :for={{dom_id, msg} <- @streams.messages} id={dom_id} class={[ - "flex", - msg.role == :user && "justify-end" + "flex flex-col gap-1", + if(msg.role == :user, do: "items-end", else: "items-start") ]} >
{msg.text}
+ <%!-- Logos for the stocks this answer referenced (from the + tool calls the model actually made — not a regex on prose). --%> +
+ + <.stock_logo symbol={sym} size={18} /> + {sym} + +
@@ -366,6 +386,40 @@ defmodule QuanticWeb.AskLive do defp next_id, do: System.unique_integer([:positive]) |> Integer.to_string() + # Stocks to show as logo chips under an answer: the symbols the model's + # tools actually returned (reliable — not a regex guess on prose), + # narrowed to those the reply text mentions by ticker, so we don't dump + # every holding under a "show my portfolio" answer. + defp referenced_symbols(%ChatResult{tool_calls: calls}, text) do + calls + |> collect_symbols([]) + |> Enum.uniq() + |> Enum.filter(&mentioned?(&1, text)) + |> Enum.take(8) + end + + defp collect_symbols(map, acc) when is_map(map) and not is_struct(map) do + Enum.reduce(map, acc, fn + {k, v}, acc when k in [:symbol, "symbol"] and is_binary(v) -> [v | acc] + {_k, v}, acc -> collect_symbols(v, acc) + end) + end + + defp collect_symbols(list, acc) when is_list(list), + do: Enum.reduce(list, acc, &collect_symbols/2) + + defp collect_symbols(_other, acc), do: acc + + # Whole-token, case-sensitive: tickers are uppercase, so this avoids + # matching short symbols inside ordinary words ("IT", "ON", "A"). + # Boundaries are alphanumeric only (not "."), so a ticker ending a + # sentence ("…than PEP.") still matches; a dotted ticker like "DGE.L" + # still matches as a unit because the whole symbol (dot included) is + # what we search for. + defp mentioned?(symbol, text) do + Regex.match?(~r/(? + {:ok, + %ChatResult{ + text: "KO has a steadier payout than PEP.", + tool_calls: [ + %{name: "get_stock", args: %{"symbol" => "KO"}, result: %{found: true, symbol: "KO"}}, + %{name: "get_stock", args: %{"symbol" => "PEP"}, result: %{found: true, symbol: "PEP"}} + ] + }} + end) + + {:ok, lv, _html} = live(conn, ~p"/settings") + widget = find_live_child(lv, "ask-widget") + render_click(element(widget, "#ask-toggle")) + + widget |> form("#ask-form", chat: %{text: "compare KO and PEP"}) |> render_submit() + html = render_async(widget) + + # The <.stock_logo> img carries alt={symbol}; both referenced tickers chip. + assert html =~ ~s(alt="KO") + assert html =~ ~s(alt="PEP") + end + test "a persisted conversation and open state are restored on mount", %{conn: conn} do conn = sign_in(conn, email_user_fixture()) From cdad3151d40450ff9f267bb22f3f3197ac53c96f Mon Sep 17 00:00:00 2001 From: Francesc Leveque Date: Fri, 19 Jun 2026 21:15:26 +0200 Subject: [PATCH 7/8] refactor(ai): reframe insights 'Buying opportunities' as neutral observations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The portfolio/radar AI insights presented a directive 'Buying opportunities' section, which reads as a buy recommendation — the same issue the per-stock verdict removal addressed, and a contradiction of the app's 'not a recommendation to buy or sell' disclaimer. Rename the schema field buyingOpportunities -> observations (reason -> note), reword the prompts to describe what's notable without recommending a buy, drop the 'actionable' framing from the analyst system prompt, and relabel the UI section 'Worth noting' (neutral colour). Seven locales. Co-Authored-By: Claude Opus 4.8 (1M context) --- lib/quantic/ai/insights.ex | 18 ++++---- lib/quantic_web/components/ai_components.ex | 8 ++-- priv/gettext/ca/LC_MESSAGES/default.po | 42 +++++++++---------- priv/gettext/de/LC_MESSAGES/default.po | 42 +++++++++---------- priv/gettext/default.pot | 42 +++++++++---------- priv/gettext/en/LC_MESSAGES/default.po | 42 +++++++++---------- priv/gettext/es/LC_MESSAGES/default.po | 42 +++++++++---------- priv/gettext/fr/LC_MESSAGES/default.po | 42 +++++++++---------- priv/gettext/it/LC_MESSAGES/default.po | 42 +++++++++---------- priv/gettext/pt/LC_MESSAGES/default.po | 42 +++++++++---------- test/quantic/ai/insights_test.exs | 2 +- .../live/ai_insights_live_test.exs | 2 +- 12 files changed, 183 insertions(+), 183 deletions(-) diff --git a/lib/quantic/ai/insights.ex b/lib/quantic/ai/insights.ex index 0779f84..fad4c03 100644 --- a/lib/quantic/ai/insights.ex +++ b/lib/quantic/ai/insights.ex @@ -25,9 +25,9 @@ defmodule Quantic.AI.Insights do alias Quantic.Radar @analyst_system """ - You are a dividend investment analyst assistant. Analyze the user's stocks and provide actionable insights. - Focus on dividend investing strategy: yield quality, payout sustainability, portfolio diversification by payment months, and value opportunities. - Be concise and specific. Reference stocks by their symbol. + You are a dividend-investing information assistant. Describe what is notable about the user's stocks as information, not advice. + Focus on dividend-investing criteria: yield quality, payout sustainability, portfolio diversification by payment months, and valuation. + Be concise and specific. Reference stocks by their symbol. Do NOT recommend buying, selling, or holding, and do NOT call anything a "good" or "bad" buy — present observations, strengths, and risks and let the user decide. Prices are denominated in each stock's quoted currency, see the `currency` field on every row; do not assume a single currency across the portfolio. IMPORTANT: The "targetPrice" field is NOT an analyst target — it is the price at which the user personally wants to act (buy or sell). Treat it as the user's desired action price. """ @@ -36,15 +36,15 @@ defmodule Quantic.AI.Insights do "type" => "object", "properties" => %{ "summary" => %{"type" => "string"}, - "buyingOpportunities" => %{ + "observations" => %{ "type" => "array", "items" => %{ "type" => "object", "properties" => %{ "symbol" => %{"type" => "string"}, - "reason" => %{"type" => "string"} + "note" => %{"type" => "string"} }, - "required" => ["symbol", "reason"] + "required" => ["symbol", "note"] } }, "coverageGaps" => %{"type" => "string"}, @@ -61,7 +61,7 @@ defmodule Quantic.AI.Insights do }, "strengths" => %{"type" => "array", "items" => %{"type" => "string"}} }, - "required" => ["summary", "buyingOpportunities", "coverageGaps", "riskFlags", "strengths"] + "required" => ["summary", "observations", "coverageGaps", "riskFlags", "strengths"] } @summary_schema %{ @@ -87,7 +87,7 @@ defmodule Quantic.AI.Insights do Provide: 1. A brief portfolio summary (2-3 sentences) - 2. Buying opportunities (stocks that could strengthen the portfolio, or existing positions worth adding to) + 2. Notable observations (e.g. holdings trading below the user's target price, or near a 52-week low) — describe what's notable; do NOT recommend buying 3. Dividend coverage gaps (months with no dividend income) 4. Risk flags (high payout ratios, low scores, concentration risk, stocks trading well above MA200) 5. Portfolio strengths (good diversification, strong yields, consistent payers) @@ -109,7 +109,7 @@ defmodule Quantic.AI.Insights do Provide: 1. A brief portfolio summary (2-3 sentences) - 2. Buying opportunities (stocks trading below target or near 52-week lows with good fundamentals) + 2. Notable observations (stocks trading below the user's target, or near a 52-week low) — describe what's notable; do NOT recommend buying 3. Dividend coverage gaps (months with no dividend income) 4. Risk flags (high payout ratios, low scores, stocks trading well above MA200) 5. Portfolio strengths (good diversification, strong yields, consistent payers) diff --git a/lib/quantic_web/components/ai_components.ex b/lib/quantic_web/components/ai_components.ex index b89c087..bbf03ca 100644 --- a/lib/quantic_web/components/ai_components.ex +++ b/lib/quantic_web/components/ai_components.ex @@ -82,11 +82,11 @@ defmodule QuanticWeb.AIComponents do <% {:ok, insights} = @state %>

{insights["summary"]}

-
-

{gettext("Buying opportunities")}

+
+

{gettext("Worth noting")}

    -
  • - {opp["symbol"]} — {opp["reason"]} +
  • + {obs["symbol"]} — {obs["note"]}
diff --git a/priv/gettext/ca/LC_MESSAGES/default.po b/priv/gettext/ca/LC_MESSAGES/default.po index 29c40a0..7dfd2ab 100644 --- a/priv/gettext/ca/LC_MESSAGES/default.po +++ b/priv/gettext/ca/LC_MESSAGES/default.po @@ -1156,11 +1156,6 @@ msgstr "Resum IA" msgid "Analyzing your stocks…" msgstr "Analitzant les teves accions…" -#: lib/quantic_web/components/ai_components.ex:86 -#, elixir-autogen, elixir-format -msgid "Buying opportunities" -msgstr "Oportunitats de compra" - #: lib/quantic_web/components/ai_components.ex:104 #, elixir-autogen, elixir-format msgid "Dividend coverage" @@ -1187,7 +1182,7 @@ msgid "Strengths" msgstr "Punts forts" #: lib/quantic_web/components/ai_components.ex:157 -#: lib/quantic_web/live/ask_live.ex:259 +#: lib/quantic_web/live/ask_live.ex:279 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — your quota resets at midnight UTC." msgstr "Has fet servir les %{limit} consultes d'IA d'avui — el teu límit es restableix a mitjanit UTC." @@ -1277,7 +1272,7 @@ msgstr "Actualitzar estat" #: lib/quantic/telegram/handler.ex:79 #: lib/quantic/telegram/handler.ex:204 -#: lib/quantic_web/live/ask_live.ex:264 +#: lib/quantic_web/live/ask_live.ex:284 #, elixir-autogen, elixir-format msgid "Something went wrong — please try again." msgstr "Alguna cosa ha anat malament — torna-ho a provar." @@ -3194,7 +3189,7 @@ msgstr "«Quina és la meva posició més gran?»" msgid "\"Which of my stocks are below my target?\"" msgstr "«Quines de les meves accions estan per sota del meu preu objectiu?»" -#: lib/quantic_web/live/ask_live.ex:208 +#: lib/quantic_web/live/ask_live.ex:217 #, elixir-autogen, elixir-format msgid "%{remaining}/%{limit} left" msgstr "%{remaining}/%{limit} restants" @@ -3205,33 +3200,33 @@ msgid "An AI assistant on every page. Ask about your portfolio, radar, and divid msgstr "Un assistent d'IA a cada pàgina. Pregunta sobre la teva cartera, radar i dividends en llenguatge natural: llegeix les teves pròpies dades per respondre." #: lib/quantic_web/components/home_components.ex:281 -#: lib/quantic_web/live/ask_live.ex:196 -#: lib/quantic_web/live/ask_live.ex:303 +#: lib/quantic_web/live/ask_live.ex:205 +#: lib/quantic_web/live/ask_live.ex:323 #, elixir-autogen, elixir-format msgid "Ask Quantic" msgstr "Pregunta a Quantic" -#: lib/quantic_web/live/ask_live.ex:279 +#: lib/quantic_web/live/ask_live.ex:299 #, elixir-autogen, elixir-format msgid "Ask a question…" msgstr "Escriu una pregunta…" -#: lib/quantic_web/live/ask_live.ex:217 +#: lib/quantic_web/live/ask_live.ex:226 #, elixir-autogen, elixir-format msgid "Ask me about your portfolio, radar or dividends." msgstr "Pregunta'm sobre la teva cartera, radar o dividends." -#: lib/quantic_web/live/ask_live.ex:379 +#: lib/quantic_web/live/ask_live.ex:433 #, elixir-autogen, elixir-format msgid "Dividends this month?" msgstr "Dividends aquest mes?" -#: lib/quantic_web/live/ask_live.ex:288 +#: lib/quantic_web/live/ask_live.ex:308 #, elixir-autogen, elixir-format msgid "Send" msgstr "Envia" -#: lib/quantic_web/live/ask_live.ex:256 +#: lib/quantic_web/live/ask_live.ex:276 #, elixir-autogen, elixir-format msgid "Thinking…" msgstr "Pensant…" @@ -3241,27 +3236,27 @@ msgstr "Pensant…" msgid "Try it" msgstr "Prova-ho" -#: lib/quantic_web/live/ask_live.ex:376 +#: lib/quantic_web/live/ask_live.ex:430 #, elixir-autogen, elixir-format msgid "What's my biggest holding?" msgstr "Quina és la meva posició més gran?" -#: lib/quantic_web/live/ask_live.ex:378 +#: lib/quantic_web/live/ask_live.ex:432 #, elixir-autogen, elixir-format msgid "Which stocks are below my target?" msgstr "Quines accions estan per sota del meu objectiu?" -#: lib/quantic_web/live/ask_live.ex:201 +#: lib/quantic_web/live/ask_live.ex:210 #, elixir-autogen, elixir-format msgid "on %{page}" msgstr "a %{page}" -#: lib/quantic_web/live/ask_live.ex:377 +#: lib/quantic_web/live/ask_live.ex:431 #, elixir-autogen, elixir-format msgid "What do you think of KO?" msgstr "Què en penses de KO?" -#: lib/quantic_web/live/ask_live.ex:295 +#: lib/quantic_web/live/ask_live.ex:315 #, elixir-autogen, elixir-format msgid "Informational only — not financial advice." msgstr "Només informatiu — no és assessorament financer." @@ -3281,7 +3276,12 @@ msgstr "Rendibilitat per dividend" msgid "Opportunity" msgstr "Oportunitat" -#: lib/quantic_web/live/ask_live.ex:362 +#: lib/quantic_web/live/ask_live.ex:382 #, elixir-autogen, elixir-format msgid "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" msgstr "Estàs explorant una demo, així que aquesta és una resposta d'exemple en lloc d'una resposta real (així la demo continua sent gratuïta). Amb el teu propi compte llegeixo les teves posicions, el teu radar i els teus dividends reals per respondre preguntes com aquesta. Registra't per provar-ho de debò!" + +#: lib/quantic_web/components/ai_components.ex:86 +#, elixir-autogen, elixir-format +msgid "Worth noting" +msgstr "A tenir en compte" diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index 35b3a0c..326a242 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -1156,11 +1156,6 @@ msgstr "KI-Zusammenfassung" msgid "Analyzing your stocks…" msgstr "Deine Aktien werden analysiert…" -#: lib/quantic_web/components/ai_components.ex:86 -#, elixir-autogen, elixir-format -msgid "Buying opportunities" -msgstr "Kaufgelegenheiten" - #: lib/quantic_web/components/ai_components.ex:104 #, elixir-autogen, elixir-format msgid "Dividend coverage" @@ -1187,7 +1182,7 @@ msgid "Strengths" msgstr "Stärken" #: lib/quantic_web/components/ai_components.ex:157 -#: lib/quantic_web/live/ask_live.ex:259 +#: lib/quantic_web/live/ask_live.ex:279 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — your quota resets at midnight UTC." msgstr "Du hast die %{limit} KI-Anfragen für heute verbraucht — dein Kontingent wird um Mitternacht UTC zurückgesetzt." @@ -1277,7 +1272,7 @@ msgstr "Status aktualisieren" #: lib/quantic/telegram/handler.ex:79 #: lib/quantic/telegram/handler.ex:204 -#: lib/quantic_web/live/ask_live.ex:264 +#: lib/quantic_web/live/ask_live.ex:284 #, elixir-autogen, elixir-format msgid "Something went wrong — please try again." msgstr "Etwas ist schiefgelaufen — bitte versuche es erneut." @@ -3194,7 +3189,7 @@ msgstr "„Was ist meine größte Position?“" msgid "\"Which of my stocks are below my target?\"" msgstr "„Welche meiner Aktien liegen unter meinem Zielkurs?“" -#: lib/quantic_web/live/ask_live.ex:208 +#: lib/quantic_web/live/ask_live.ex:217 #, elixir-autogen, elixir-format msgid "%{remaining}/%{limit} left" msgstr "%{remaining}/%{limit} übrig" @@ -3205,33 +3200,33 @@ msgid "An AI assistant on every page. Ask about your portfolio, radar, and divid msgstr "Ein KI-Assistent auf jeder Seite. Frag in natürlicher Sprache nach deinem Portfolio, Radar und deinen Dividenden – er liest deine eigenen Daten, um zu antworten." #: lib/quantic_web/components/home_components.ex:281 -#: lib/quantic_web/live/ask_live.ex:196 -#: lib/quantic_web/live/ask_live.ex:303 +#: lib/quantic_web/live/ask_live.ex:205 +#: lib/quantic_web/live/ask_live.ex:323 #, elixir-autogen, elixir-format msgid "Ask Quantic" msgstr "Quantic fragen" -#: lib/quantic_web/live/ask_live.ex:279 +#: lib/quantic_web/live/ask_live.ex:299 #, elixir-autogen, elixir-format msgid "Ask a question…" msgstr "Stell eine Frage…" -#: lib/quantic_web/live/ask_live.ex:217 +#: lib/quantic_web/live/ask_live.ex:226 #, elixir-autogen, elixir-format msgid "Ask me about your portfolio, radar or dividends." msgstr "Frag mich zu deinem Portfolio, Radar oder deinen Dividenden." -#: lib/quantic_web/live/ask_live.ex:379 +#: lib/quantic_web/live/ask_live.ex:433 #, elixir-autogen, elixir-format msgid "Dividends this month?" msgstr "Dividenden diesen Monat?" -#: lib/quantic_web/live/ask_live.ex:288 +#: lib/quantic_web/live/ask_live.ex:308 #, elixir-autogen, elixir-format msgid "Send" msgstr "Senden" -#: lib/quantic_web/live/ask_live.ex:256 +#: lib/quantic_web/live/ask_live.ex:276 #, elixir-autogen, elixir-format msgid "Thinking…" msgstr "Denkt nach…" @@ -3241,27 +3236,27 @@ msgstr "Denkt nach…" msgid "Try it" msgstr "Ausprobieren" -#: lib/quantic_web/live/ask_live.ex:376 +#: lib/quantic_web/live/ask_live.ex:430 #, elixir-autogen, elixir-format msgid "What's my biggest holding?" msgstr "Was ist meine größte Position?" -#: lib/quantic_web/live/ask_live.ex:378 +#: lib/quantic_web/live/ask_live.ex:432 #, elixir-autogen, elixir-format msgid "Which stocks are below my target?" msgstr "Welche Aktien liegen unter meinem Ziel?" -#: lib/quantic_web/live/ask_live.ex:201 +#: lib/quantic_web/live/ask_live.ex:210 #, elixir-autogen, elixir-format msgid "on %{page}" msgstr "auf %{page}" -#: lib/quantic_web/live/ask_live.ex:377 +#: lib/quantic_web/live/ask_live.ex:431 #, elixir-autogen, elixir-format msgid "What do you think of KO?" msgstr "Was hältst du von KO?" -#: lib/quantic_web/live/ask_live.ex:295 +#: lib/quantic_web/live/ask_live.ex:315 #, elixir-autogen, elixir-format msgid "Informational only — not financial advice." msgstr "Nur zur Information – keine Finanzberatung." @@ -3281,7 +3276,12 @@ msgstr "Dividendenrendite" msgid "Opportunity" msgstr "Chance" -#: lib/quantic_web/live/ask_live.ex:362 +#: lib/quantic_web/live/ask_live.ex:382 #, elixir-autogen, elixir-format msgid "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" msgstr "Du testest eine Demo, daher ist dies eine Beispielantwort statt einer echten Antwort (so bleibt die Demo kostenlos). Mit deinem eigenen Konto lese ich deine echten Positionen, deinen Radar und deine Dividenden, um solche Fragen zu beantworten. Registriere dich, um es wirklich auszuprobieren!" + +#: lib/quantic_web/components/ai_components.ex:86 +#, elixir-autogen, elixir-format +msgid "Worth noting" +msgstr "Beachtenswert" diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index c536475..1ae7dbf 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -1156,11 +1156,6 @@ msgstr "" msgid "Analyzing your stocks…" msgstr "" -#: lib/quantic_web/components/ai_components.ex:86 -#, elixir-autogen, elixir-format -msgid "Buying opportunities" -msgstr "" - #: lib/quantic_web/components/ai_components.ex:104 #, elixir-autogen, elixir-format msgid "Dividend coverage" @@ -1187,7 +1182,7 @@ msgid "Strengths" msgstr "" #: lib/quantic_web/components/ai_components.ex:157 -#: lib/quantic_web/live/ask_live.ex:259 +#: lib/quantic_web/live/ask_live.ex:279 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — your quota resets at midnight UTC." msgstr "" @@ -1277,7 +1272,7 @@ msgstr "" #: lib/quantic/telegram/handler.ex:79 #: lib/quantic/telegram/handler.ex:204 -#: lib/quantic_web/live/ask_live.ex:264 +#: lib/quantic_web/live/ask_live.ex:284 #, elixir-autogen, elixir-format msgid "Something went wrong — please try again." msgstr "" @@ -3194,7 +3189,7 @@ msgstr "" msgid "\"Which of my stocks are below my target?\"" msgstr "" -#: lib/quantic_web/live/ask_live.ex:208 +#: lib/quantic_web/live/ask_live.ex:217 #, elixir-autogen, elixir-format msgid "%{remaining}/%{limit} left" msgstr "" @@ -3205,33 +3200,33 @@ msgid "An AI assistant on every page. Ask about your portfolio, radar, and divid msgstr "" #: lib/quantic_web/components/home_components.ex:281 -#: lib/quantic_web/live/ask_live.ex:196 -#: lib/quantic_web/live/ask_live.ex:303 +#: lib/quantic_web/live/ask_live.ex:205 +#: lib/quantic_web/live/ask_live.ex:323 #, elixir-autogen, elixir-format msgid "Ask Quantic" msgstr "" -#: lib/quantic_web/live/ask_live.ex:279 +#: lib/quantic_web/live/ask_live.ex:299 #, elixir-autogen, elixir-format msgid "Ask a question…" msgstr "" -#: lib/quantic_web/live/ask_live.ex:217 +#: lib/quantic_web/live/ask_live.ex:226 #, elixir-autogen, elixir-format msgid "Ask me about your portfolio, radar or dividends." msgstr "" -#: lib/quantic_web/live/ask_live.ex:379 +#: lib/quantic_web/live/ask_live.ex:433 #, elixir-autogen, elixir-format msgid "Dividends this month?" msgstr "" -#: lib/quantic_web/live/ask_live.ex:288 +#: lib/quantic_web/live/ask_live.ex:308 #, elixir-autogen, elixir-format msgid "Send" msgstr "" -#: lib/quantic_web/live/ask_live.ex:256 +#: lib/quantic_web/live/ask_live.ex:276 #, elixir-autogen, elixir-format msgid "Thinking…" msgstr "" @@ -3241,27 +3236,27 @@ msgstr "" msgid "Try it" msgstr "" -#: lib/quantic_web/live/ask_live.ex:376 +#: lib/quantic_web/live/ask_live.ex:430 #, elixir-autogen, elixir-format msgid "What's my biggest holding?" msgstr "" -#: lib/quantic_web/live/ask_live.ex:378 +#: lib/quantic_web/live/ask_live.ex:432 #, elixir-autogen, elixir-format msgid "Which stocks are below my target?" msgstr "" -#: lib/quantic_web/live/ask_live.ex:201 +#: lib/quantic_web/live/ask_live.ex:210 #, elixir-autogen, elixir-format msgid "on %{page}" msgstr "" -#: lib/quantic_web/live/ask_live.ex:377 +#: lib/quantic_web/live/ask_live.ex:431 #, elixir-autogen, elixir-format msgid "What do you think of KO?" msgstr "" -#: lib/quantic_web/live/ask_live.ex:295 +#: lib/quantic_web/live/ask_live.ex:315 #, elixir-autogen, elixir-format msgid "Informational only — not financial advice." msgstr "" @@ -3281,7 +3276,12 @@ msgstr "" msgid "Opportunity" msgstr "" -#: lib/quantic_web/live/ask_live.ex:362 +#: lib/quantic_web/live/ask_live.ex:382 #, elixir-autogen, elixir-format msgid "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" msgstr "" + +#: lib/quantic_web/components/ai_components.ex:86 +#, elixir-autogen, elixir-format +msgid "Worth noting" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index 258dcf2..d82b859 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -1156,11 +1156,6 @@ msgstr "" msgid "Analyzing your stocks…" msgstr "" -#: lib/quantic_web/components/ai_components.ex:86 -#, elixir-autogen, elixir-format -msgid "Buying opportunities" -msgstr "" - #: lib/quantic_web/components/ai_components.ex:104 #, elixir-autogen, elixir-format msgid "Dividend coverage" @@ -1187,7 +1182,7 @@ msgid "Strengths" msgstr "" #: lib/quantic_web/components/ai_components.ex:157 -#: lib/quantic_web/live/ask_live.ex:259 +#: lib/quantic_web/live/ask_live.ex:279 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — your quota resets at midnight UTC." msgstr "" @@ -1277,7 +1272,7 @@ msgstr "" #: lib/quantic/telegram/handler.ex:79 #: lib/quantic/telegram/handler.ex:204 -#: lib/quantic_web/live/ask_live.ex:264 +#: lib/quantic_web/live/ask_live.ex:284 #, elixir-autogen, elixir-format msgid "Something went wrong — please try again." msgstr "" @@ -3194,7 +3189,7 @@ msgstr "" msgid "\"Which of my stocks are below my target?\"" msgstr "" -#: lib/quantic_web/live/ask_live.ex:208 +#: lib/quantic_web/live/ask_live.ex:217 #, elixir-autogen, elixir-format msgid "%{remaining}/%{limit} left" msgstr "" @@ -3205,33 +3200,33 @@ msgid "An AI assistant on every page. Ask about your portfolio, radar, and divid msgstr "" #: lib/quantic_web/components/home_components.ex:281 -#: lib/quantic_web/live/ask_live.ex:196 -#: lib/quantic_web/live/ask_live.ex:303 +#: lib/quantic_web/live/ask_live.ex:205 +#: lib/quantic_web/live/ask_live.ex:323 #, elixir-autogen, elixir-format msgid "Ask Quantic" msgstr "" -#: lib/quantic_web/live/ask_live.ex:279 +#: lib/quantic_web/live/ask_live.ex:299 #, elixir-autogen, elixir-format msgid "Ask a question…" msgstr "" -#: lib/quantic_web/live/ask_live.ex:217 +#: lib/quantic_web/live/ask_live.ex:226 #, elixir-autogen, elixir-format, fuzzy msgid "Ask me about your portfolio, radar or dividends." msgstr "" -#: lib/quantic_web/live/ask_live.ex:379 +#: lib/quantic_web/live/ask_live.ex:433 #, elixir-autogen, elixir-format, fuzzy msgid "Dividends this month?" msgstr "" -#: lib/quantic_web/live/ask_live.ex:288 +#: lib/quantic_web/live/ask_live.ex:308 #, elixir-autogen, elixir-format msgid "Send" msgstr "" -#: lib/quantic_web/live/ask_live.ex:256 +#: lib/quantic_web/live/ask_live.ex:276 #, elixir-autogen, elixir-format msgid "Thinking…" msgstr "" @@ -3241,27 +3236,27 @@ msgstr "" msgid "Try it" msgstr "" -#: lib/quantic_web/live/ask_live.ex:376 +#: lib/quantic_web/live/ask_live.ex:430 #, elixir-autogen, elixir-format msgid "What's my biggest holding?" msgstr "" -#: lib/quantic_web/live/ask_live.ex:378 +#: lib/quantic_web/live/ask_live.ex:432 #, elixir-autogen, elixir-format msgid "Which stocks are below my target?" msgstr "" -#: lib/quantic_web/live/ask_live.ex:201 +#: lib/quantic_web/live/ask_live.ex:210 #, elixir-autogen, elixir-format msgid "on %{page}" msgstr "" -#: lib/quantic_web/live/ask_live.ex:377 +#: lib/quantic_web/live/ask_live.ex:431 #, elixir-autogen, elixir-format msgid "What do you think of KO?" msgstr "" -#: lib/quantic_web/live/ask_live.ex:295 +#: lib/quantic_web/live/ask_live.ex:315 #, elixir-autogen, elixir-format msgid "Informational only — not financial advice." msgstr "" @@ -3281,7 +3276,12 @@ msgstr "" msgid "Opportunity" msgstr "" -#: lib/quantic_web/live/ask_live.ex:362 +#: lib/quantic_web/live/ask_live.ex:382 #, elixir-autogen, elixir-format msgid "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" msgstr "" + +#: lib/quantic_web/components/ai_components.ex:86 +#, elixir-autogen, elixir-format +msgid "Worth noting" +msgstr "" diff --git a/priv/gettext/es/LC_MESSAGES/default.po b/priv/gettext/es/LC_MESSAGES/default.po index febd340..ff40393 100644 --- a/priv/gettext/es/LC_MESSAGES/default.po +++ b/priv/gettext/es/LC_MESSAGES/default.po @@ -1156,11 +1156,6 @@ msgstr "Resumen IA" msgid "Analyzing your stocks…" msgstr "Analizando tus acciones…" -#: lib/quantic_web/components/ai_components.ex:86 -#, elixir-autogen, elixir-format -msgid "Buying opportunities" -msgstr "Oportunidades de compra" - #: lib/quantic_web/components/ai_components.ex:104 #, elixir-autogen, elixir-format msgid "Dividend coverage" @@ -1187,7 +1182,7 @@ msgid "Strengths" msgstr "Puntos fuertes" #: lib/quantic_web/components/ai_components.ex:157 -#: lib/quantic_web/live/ask_live.ex:259 +#: lib/quantic_web/live/ask_live.ex:279 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — your quota resets at midnight UTC." msgstr "Has usado las %{limit} consultas de IA de hoy — tu cupo se restablece a medianoche UTC." @@ -1277,7 +1272,7 @@ msgstr "Actualizar estado" #: lib/quantic/telegram/handler.ex:79 #: lib/quantic/telegram/handler.ex:204 -#: lib/quantic_web/live/ask_live.ex:264 +#: lib/quantic_web/live/ask_live.ex:284 #, elixir-autogen, elixir-format msgid "Something went wrong — please try again." msgstr "Algo ha ido mal — inténtalo de nuevo." @@ -3194,7 +3189,7 @@ msgstr "«¿Cuál es mi mayor posición?»" msgid "\"Which of my stocks are below my target?\"" msgstr "«¿Cuáles de mis acciones están por debajo de mi precio objetivo?»" -#: lib/quantic_web/live/ask_live.ex:208 +#: lib/quantic_web/live/ask_live.ex:217 #, elixir-autogen, elixir-format msgid "%{remaining}/%{limit} left" msgstr "%{remaining}/%{limit} restantes" @@ -3205,33 +3200,33 @@ msgid "An AI assistant on every page. Ask about your portfolio, radar, and divid msgstr "Un asistente de IA en cada página. Pregunta sobre tu cartera, radar y dividendos en lenguaje natural: lee tus propios datos para responder." #: lib/quantic_web/components/home_components.ex:281 -#: lib/quantic_web/live/ask_live.ex:196 -#: lib/quantic_web/live/ask_live.ex:303 +#: lib/quantic_web/live/ask_live.ex:205 +#: lib/quantic_web/live/ask_live.ex:323 #, elixir-autogen, elixir-format msgid "Ask Quantic" msgstr "Pregunta a Quantic" -#: lib/quantic_web/live/ask_live.ex:279 +#: lib/quantic_web/live/ask_live.ex:299 #, elixir-autogen, elixir-format msgid "Ask a question…" msgstr "Escribe una pregunta…" -#: lib/quantic_web/live/ask_live.ex:217 +#: lib/quantic_web/live/ask_live.ex:226 #, elixir-autogen, elixir-format msgid "Ask me about your portfolio, radar or dividends." msgstr "Pregúntame sobre tu cartera, radar o dividendos." -#: lib/quantic_web/live/ask_live.ex:379 +#: lib/quantic_web/live/ask_live.ex:433 #, elixir-autogen, elixir-format msgid "Dividends this month?" msgstr "¿Dividendos este mes?" -#: lib/quantic_web/live/ask_live.ex:288 +#: lib/quantic_web/live/ask_live.ex:308 #, elixir-autogen, elixir-format msgid "Send" msgstr "Enviar" -#: lib/quantic_web/live/ask_live.ex:256 +#: lib/quantic_web/live/ask_live.ex:276 #, elixir-autogen, elixir-format msgid "Thinking…" msgstr "Pensando…" @@ -3241,27 +3236,27 @@ msgstr "Pensando…" msgid "Try it" msgstr "Probar" -#: lib/quantic_web/live/ask_live.ex:376 +#: lib/quantic_web/live/ask_live.ex:430 #, elixir-autogen, elixir-format msgid "What's my biggest holding?" msgstr "¿Cuál es mi mayor posición?" -#: lib/quantic_web/live/ask_live.ex:378 +#: lib/quantic_web/live/ask_live.ex:432 #, elixir-autogen, elixir-format msgid "Which stocks are below my target?" msgstr "¿Qué acciones están por debajo de mi objetivo?" -#: lib/quantic_web/live/ask_live.ex:201 +#: lib/quantic_web/live/ask_live.ex:210 #, elixir-autogen, elixir-format msgid "on %{page}" msgstr "en %{page}" -#: lib/quantic_web/live/ask_live.ex:377 +#: lib/quantic_web/live/ask_live.ex:431 #, elixir-autogen, elixir-format msgid "What do you think of KO?" msgstr "¿Qué opinas de KO?" -#: lib/quantic_web/live/ask_live.ex:295 +#: lib/quantic_web/live/ask_live.ex:315 #, elixir-autogen, elixir-format msgid "Informational only — not financial advice." msgstr "Solo informativo — no es asesoramiento financiero." @@ -3281,7 +3276,12 @@ msgstr "Rentabilidad por dividendo" msgid "Opportunity" msgstr "Oportunidad" -#: lib/quantic_web/live/ask_live.ex:362 +#: lib/quantic_web/live/ask_live.ex:382 #, elixir-autogen, elixir-format msgid "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" msgstr "Estás explorando una demo, así que esta es una respuesta de ejemplo en lugar de una respuesta real (así la demo sigue siendo gratuita). Con tu propia cuenta leo tus posiciones, tu radar y tus dividendos reales para responder preguntas como esta. ¡Regístrate para probarlo de verdad!" + +#: lib/quantic_web/components/ai_components.ex:86 +#, elixir-autogen, elixir-format +msgid "Worth noting" +msgstr "A tener en cuenta" diff --git a/priv/gettext/fr/LC_MESSAGES/default.po b/priv/gettext/fr/LC_MESSAGES/default.po index a535ad2..eb513cf 100644 --- a/priv/gettext/fr/LC_MESSAGES/default.po +++ b/priv/gettext/fr/LC_MESSAGES/default.po @@ -1156,11 +1156,6 @@ msgstr "Résumé IA" msgid "Analyzing your stocks…" msgstr "Analyse de vos actions…" -#: lib/quantic_web/components/ai_components.ex:86 -#, elixir-autogen, elixir-format -msgid "Buying opportunities" -msgstr "Opportunités d'achat" - #: lib/quantic_web/components/ai_components.ex:104 #, elixir-autogen, elixir-format msgid "Dividend coverage" @@ -1187,7 +1182,7 @@ msgid "Strengths" msgstr "Points forts" #: lib/quantic_web/components/ai_components.ex:157 -#: lib/quantic_web/live/ask_live.ex:259 +#: lib/quantic_web/live/ask_live.ex:279 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — your quota resets at midnight UTC." msgstr "Vous avez utilisé vos %{limit} requêtes IA du jour — votre quota se réinitialise à minuit UTC." @@ -1277,7 +1272,7 @@ msgstr "Actualiser le statut" #: lib/quantic/telegram/handler.ex:79 #: lib/quantic/telegram/handler.ex:204 -#: lib/quantic_web/live/ask_live.ex:264 +#: lib/quantic_web/live/ask_live.ex:284 #, elixir-autogen, elixir-format msgid "Something went wrong — please try again." msgstr "Une erreur est survenue — veuillez réessayer." @@ -3194,7 +3189,7 @@ msgstr "« Quelle est ma plus grande position ? »" msgid "\"Which of my stocks are below my target?\"" msgstr "« Lesquelles de mes actions sont sous mon objectif ? »" -#: lib/quantic_web/live/ask_live.ex:208 +#: lib/quantic_web/live/ask_live.ex:217 #, elixir-autogen, elixir-format msgid "%{remaining}/%{limit} left" msgstr "%{remaining}/%{limit} restantes" @@ -3205,33 +3200,33 @@ msgid "An AI assistant on every page. Ask about your portfolio, radar, and divid msgstr "Un assistant IA sur chaque page. Posez vos questions sur votre portefeuille, votre radar et vos dividendes en langage naturel : il lit vos propres données pour répondre." #: lib/quantic_web/components/home_components.ex:281 -#: lib/quantic_web/live/ask_live.ex:196 -#: lib/quantic_web/live/ask_live.ex:303 +#: lib/quantic_web/live/ask_live.ex:205 +#: lib/quantic_web/live/ask_live.ex:323 #, elixir-autogen, elixir-format msgid "Ask Quantic" msgstr "Demander à Quantic" -#: lib/quantic_web/live/ask_live.ex:279 +#: lib/quantic_web/live/ask_live.ex:299 #, elixir-autogen, elixir-format msgid "Ask a question…" msgstr "Posez une question…" -#: lib/quantic_web/live/ask_live.ex:217 +#: lib/quantic_web/live/ask_live.ex:226 #, elixir-autogen, elixir-format msgid "Ask me about your portfolio, radar or dividends." msgstr "Posez-moi des questions sur votre portefeuille, votre radar ou vos dividendes." -#: lib/quantic_web/live/ask_live.ex:379 +#: lib/quantic_web/live/ask_live.ex:433 #, elixir-autogen, elixir-format msgid "Dividends this month?" msgstr "Dividendes ce mois-ci ?" -#: lib/quantic_web/live/ask_live.ex:288 +#: lib/quantic_web/live/ask_live.ex:308 #, elixir-autogen, elixir-format msgid "Send" msgstr "Envoyer" -#: lib/quantic_web/live/ask_live.ex:256 +#: lib/quantic_web/live/ask_live.ex:276 #, elixir-autogen, elixir-format msgid "Thinking…" msgstr "Réflexion…" @@ -3241,27 +3236,27 @@ msgstr "Réflexion…" msgid "Try it" msgstr "Essayer" -#: lib/quantic_web/live/ask_live.ex:376 +#: lib/quantic_web/live/ask_live.ex:430 #, elixir-autogen, elixir-format msgid "What's my biggest holding?" msgstr "Quelle est ma plus grande position ?" -#: lib/quantic_web/live/ask_live.ex:378 +#: lib/quantic_web/live/ask_live.ex:432 #, elixir-autogen, elixir-format msgid "Which stocks are below my target?" msgstr "Quelles actions sont sous mon objectif ?" -#: lib/quantic_web/live/ask_live.ex:201 +#: lib/quantic_web/live/ask_live.ex:210 #, elixir-autogen, elixir-format msgid "on %{page}" msgstr "sur %{page}" -#: lib/quantic_web/live/ask_live.ex:377 +#: lib/quantic_web/live/ask_live.ex:431 #, elixir-autogen, elixir-format msgid "What do you think of KO?" msgstr "Que pensez-vous de KO ?" -#: lib/quantic_web/live/ask_live.ex:295 +#: lib/quantic_web/live/ask_live.ex:315 #, elixir-autogen, elixir-format msgid "Informational only — not financial advice." msgstr "À titre informatif uniquement — pas un conseil financier." @@ -3281,7 +3276,12 @@ msgstr "Rendement du dividende" msgid "Opportunity" msgstr "Opportunité" -#: lib/quantic_web/live/ask_live.ex:362 +#: lib/quantic_web/live/ask_live.ex:382 #, elixir-autogen, elixir-format msgid "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" msgstr "Vous explorez une démo, ceci est donc une réponse d'exemple plutôt qu'une vraie réponse (cela garde la démo gratuite). Avec votre propre compte, je lis vos positions, votre radar et vos dividendes réels pour répondre à ce genre de questions. Inscrivez-vous pour l'essayer pour de vrai !" + +#: lib/quantic_web/components/ai_components.ex:86 +#, elixir-autogen, elixir-format +msgid "Worth noting" +msgstr "À noter" diff --git a/priv/gettext/it/LC_MESSAGES/default.po b/priv/gettext/it/LC_MESSAGES/default.po index f8a825d..147626a 100644 --- a/priv/gettext/it/LC_MESSAGES/default.po +++ b/priv/gettext/it/LC_MESSAGES/default.po @@ -1156,11 +1156,6 @@ msgstr "Riepilogo IA" msgid "Analyzing your stocks…" msgstr "Analisi delle tue azioni…" -#: lib/quantic_web/components/ai_components.ex:86 -#, elixir-autogen, elixir-format -msgid "Buying opportunities" -msgstr "Opportunità di acquisto" - #: lib/quantic_web/components/ai_components.ex:104 #, elixir-autogen, elixir-format msgid "Dividend coverage" @@ -1187,7 +1182,7 @@ msgid "Strengths" msgstr "Punti di forza" #: lib/quantic_web/components/ai_components.ex:157 -#: lib/quantic_web/live/ask_live.ex:259 +#: lib/quantic_web/live/ask_live.ex:279 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — your quota resets at midnight UTC." msgstr "Hai usato le %{limit} richieste IA di oggi — la tua quota si azzera a mezzanotte UTC." @@ -1277,7 +1272,7 @@ msgstr "Aggiorna stato" #: lib/quantic/telegram/handler.ex:79 #: lib/quantic/telegram/handler.ex:204 -#: lib/quantic_web/live/ask_live.ex:264 +#: lib/quantic_web/live/ask_live.ex:284 #, elixir-autogen, elixir-format msgid "Something went wrong — please try again." msgstr "Qualcosa è andato storto — riprova." @@ -3194,7 +3189,7 @@ msgstr "«Qual è la mia posizione più grande?»" msgid "\"Which of my stocks are below my target?\"" msgstr "«Quali delle mie azioni sono sotto il mio obiettivo?»" -#: lib/quantic_web/live/ask_live.ex:208 +#: lib/quantic_web/live/ask_live.ex:217 #, elixir-autogen, elixir-format msgid "%{remaining}/%{limit} left" msgstr "%{remaining}/%{limit} rimasti" @@ -3205,33 +3200,33 @@ msgid "An AI assistant on every page. Ask about your portfolio, radar, and divid msgstr "Un assistente IA su ogni pagina. Chiedi del tuo portafoglio, radar e dividendi in linguaggio naturale: legge i tuoi dati per rispondere." #: lib/quantic_web/components/home_components.ex:281 -#: lib/quantic_web/live/ask_live.ex:196 -#: lib/quantic_web/live/ask_live.ex:303 +#: lib/quantic_web/live/ask_live.ex:205 +#: lib/quantic_web/live/ask_live.ex:323 #, elixir-autogen, elixir-format msgid "Ask Quantic" msgstr "Chiedi a Quantic" -#: lib/quantic_web/live/ask_live.ex:279 +#: lib/quantic_web/live/ask_live.ex:299 #, elixir-autogen, elixir-format msgid "Ask a question…" msgstr "Scrivi una domanda…" -#: lib/quantic_web/live/ask_live.ex:217 +#: lib/quantic_web/live/ask_live.ex:226 #, elixir-autogen, elixir-format msgid "Ask me about your portfolio, radar or dividends." msgstr "Chiedimi del tuo portafoglio, radar o dividendi." -#: lib/quantic_web/live/ask_live.ex:379 +#: lib/quantic_web/live/ask_live.ex:433 #, elixir-autogen, elixir-format msgid "Dividends this month?" msgstr "Dividendi questo mese?" -#: lib/quantic_web/live/ask_live.ex:288 +#: lib/quantic_web/live/ask_live.ex:308 #, elixir-autogen, elixir-format msgid "Send" msgstr "Invia" -#: lib/quantic_web/live/ask_live.ex:256 +#: lib/quantic_web/live/ask_live.ex:276 #, elixir-autogen, elixir-format msgid "Thinking…" msgstr "Sto pensando…" @@ -3241,27 +3236,27 @@ msgstr "Sto pensando…" msgid "Try it" msgstr "Provalo" -#: lib/quantic_web/live/ask_live.ex:376 +#: lib/quantic_web/live/ask_live.ex:430 #, elixir-autogen, elixir-format msgid "What's my biggest holding?" msgstr "Qual è la mia posizione più grande?" -#: lib/quantic_web/live/ask_live.ex:378 +#: lib/quantic_web/live/ask_live.ex:432 #, elixir-autogen, elixir-format msgid "Which stocks are below my target?" msgstr "Quali azioni sono sotto il mio obiettivo?" -#: lib/quantic_web/live/ask_live.ex:201 +#: lib/quantic_web/live/ask_live.ex:210 #, elixir-autogen, elixir-format msgid "on %{page}" msgstr "su %{page}" -#: lib/quantic_web/live/ask_live.ex:377 +#: lib/quantic_web/live/ask_live.ex:431 #, elixir-autogen, elixir-format msgid "What do you think of KO?" msgstr "Cosa ne pensi di KO?" -#: lib/quantic_web/live/ask_live.ex:295 +#: lib/quantic_web/live/ask_live.ex:315 #, elixir-autogen, elixir-format msgid "Informational only — not financial advice." msgstr "Solo a scopo informativo — non è una consulenza finanziaria." @@ -3281,7 +3276,12 @@ msgstr "Rendimento da dividendo" msgid "Opportunity" msgstr "Opportunità" -#: lib/quantic_web/live/ask_live.ex:362 +#: lib/quantic_web/live/ask_live.ex:382 #, elixir-autogen, elixir-format msgid "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" msgstr "Stai esplorando una demo, quindi questa è una risposta di esempio anziché una risposta reale (così la demo resta gratuita). Con il tuo account leggo le tue posizioni, il tuo radar e i tuoi dividendi reali per rispondere a domande come questa. Registrati per provarlo davvero!" + +#: lib/quantic_web/components/ai_components.ex:86 +#, elixir-autogen, elixir-format +msgid "Worth noting" +msgstr "Da notare" diff --git a/priv/gettext/pt/LC_MESSAGES/default.po b/priv/gettext/pt/LC_MESSAGES/default.po index 5925be1..631309c 100644 --- a/priv/gettext/pt/LC_MESSAGES/default.po +++ b/priv/gettext/pt/LC_MESSAGES/default.po @@ -1156,11 +1156,6 @@ msgstr "Resumo IA" msgid "Analyzing your stocks…" msgstr "Analisando suas ações…" -#: lib/quantic_web/components/ai_components.ex:86 -#, elixir-autogen, elixir-format -msgid "Buying opportunities" -msgstr "Oportunidades de compra" - #: lib/quantic_web/components/ai_components.ex:104 #, elixir-autogen, elixir-format msgid "Dividend coverage" @@ -1187,7 +1182,7 @@ msgid "Strengths" msgstr "Pontos fortes" #: lib/quantic_web/components/ai_components.ex:157 -#: lib/quantic_web/live/ask_live.ex:259 +#: lib/quantic_web/live/ask_live.ex:279 #, elixir-autogen, elixir-format msgid "You've used today's %{limit} AI requests — your quota resets at midnight UTC." msgstr "Você usou as %{limit} consultas de IA de hoje — sua cota volta à meia-noite UTC." @@ -1277,7 +1272,7 @@ msgstr "Atualizar status" #: lib/quantic/telegram/handler.ex:79 #: lib/quantic/telegram/handler.ex:204 -#: lib/quantic_web/live/ask_live.ex:264 +#: lib/quantic_web/live/ask_live.ex:284 #, elixir-autogen, elixir-format msgid "Something went wrong — please try again." msgstr "Algo deu errado — tente novamente." @@ -3194,7 +3189,7 @@ msgstr "«Qual é a minha maior posição?»" msgid "\"Which of my stocks are below my target?\"" msgstr "«Quais das minhas ações estão abaixo do meu preço-alvo?»" -#: lib/quantic_web/live/ask_live.ex:208 +#: lib/quantic_web/live/ask_live.ex:217 #, elixir-autogen, elixir-format msgid "%{remaining}/%{limit} left" msgstr "%{remaining}/%{limit} restantes" @@ -3205,33 +3200,33 @@ msgid "An AI assistant on every page. Ask about your portfolio, radar, and divid msgstr "Um assistente de IA em todas as páginas. Pergunta sobre a tua carteira, radar e dividendos em linguagem natural: lê os teus próprios dados para responder." #: lib/quantic_web/components/home_components.ex:281 -#: lib/quantic_web/live/ask_live.ex:196 -#: lib/quantic_web/live/ask_live.ex:303 +#: lib/quantic_web/live/ask_live.ex:205 +#: lib/quantic_web/live/ask_live.ex:323 #, elixir-autogen, elixir-format msgid "Ask Quantic" msgstr "Pergunta ao Quantic" -#: lib/quantic_web/live/ask_live.ex:279 +#: lib/quantic_web/live/ask_live.ex:299 #, elixir-autogen, elixir-format msgid "Ask a question…" msgstr "Escreve uma pergunta…" -#: lib/quantic_web/live/ask_live.ex:217 +#: lib/quantic_web/live/ask_live.ex:226 #, elixir-autogen, elixir-format msgid "Ask me about your portfolio, radar or dividends." msgstr "Pergunta-me sobre a tua carteira, radar ou dividendos." -#: lib/quantic_web/live/ask_live.ex:379 +#: lib/quantic_web/live/ask_live.ex:433 #, elixir-autogen, elixir-format msgid "Dividends this month?" msgstr "Dividendos este mês?" -#: lib/quantic_web/live/ask_live.ex:288 +#: lib/quantic_web/live/ask_live.ex:308 #, elixir-autogen, elixir-format msgid "Send" msgstr "Enviar" -#: lib/quantic_web/live/ask_live.ex:256 +#: lib/quantic_web/live/ask_live.ex:276 #, elixir-autogen, elixir-format msgid "Thinking…" msgstr "A pensar…" @@ -3241,27 +3236,27 @@ msgstr "A pensar…" msgid "Try it" msgstr "Experimentar" -#: lib/quantic_web/live/ask_live.ex:376 +#: lib/quantic_web/live/ask_live.ex:430 #, elixir-autogen, elixir-format msgid "What's my biggest holding?" msgstr "Qual é a minha maior posição?" -#: lib/quantic_web/live/ask_live.ex:378 +#: lib/quantic_web/live/ask_live.ex:432 #, elixir-autogen, elixir-format msgid "Which stocks are below my target?" msgstr "Que ações estão abaixo do meu alvo?" -#: lib/quantic_web/live/ask_live.ex:201 +#: lib/quantic_web/live/ask_live.ex:210 #, elixir-autogen, elixir-format msgid "on %{page}" msgstr "em %{page}" -#: lib/quantic_web/live/ask_live.ex:377 +#: lib/quantic_web/live/ask_live.ex:431 #, elixir-autogen, elixir-format msgid "What do you think of KO?" msgstr "O que achas da KO?" -#: lib/quantic_web/live/ask_live.ex:295 +#: lib/quantic_web/live/ask_live.ex:315 #, elixir-autogen, elixir-format msgid "Informational only — not financial advice." msgstr "Apenas informativo — não é aconselhamento financeiro." @@ -3281,7 +3276,12 @@ msgstr "Rendibilidade do dividendo" msgid "Opportunity" msgstr "Oportunidade" -#: lib/quantic_web/live/ask_live.ex:362 +#: lib/quantic_web/live/ask_live.ex:382 #, elixir-autogen, elixir-format msgid "You're exploring a demo, so this is a sample reply rather than a live answer (it keeps the demo free to run). With your own account I read your real holdings, radar and dividends to answer questions like this. Sign up to try it for real!" msgstr "Estás a explorar uma demo, por isso esta é uma resposta de exemplo em vez de uma resposta real (assim a demo continua gratuita). Com a tua própria conta leio as tuas posições, o teu radar e os teus dividendos reais para responder a perguntas como esta. Regista-te para experimentar a sério!" + +#: lib/quantic_web/components/ai_components.ex:86 +#, elixir-autogen, elixir-format +msgid "Worth noting" +msgstr "A ter em conta" diff --git a/test/quantic/ai/insights_test.exs b/test/quantic/ai/insights_test.exs index 0705b42..3be78b8 100644 --- a/test/quantic/ai/insights_test.exs +++ b/test/quantic/ai/insights_test.exs @@ -60,7 +60,7 @@ defmodule Quantic.AI.InsightsTest do insights = %{ "summary" => "Solid.", - "buyingOpportunities" => [], + "observations" => [], "coverageGaps" => "", "riskFlags" => [], "strengths" => [] diff --git a/test/quantic_web/live/ai_insights_live_test.exs b/test/quantic_web/live/ai_insights_live_test.exs index aadb237..94d8503 100644 --- a/test/quantic_web/live/ai_insights_live_test.exs +++ b/test/quantic_web/live/ai_insights_live_test.exs @@ -45,7 +45,7 @@ defmodule QuanticWeb.AIInsightsLiveTest do {:ok, %{ "summary" => "A focused single-stock portfolio.", - "buyingOpportunities" => [%{"symbol" => "AAPL", "reason" => "below your target"}], + "observations" => [%{"symbol" => "AAPL", "note" => "below your target"}], "coverageGaps" => "No income in March.", "riskFlags" => [], "strengths" => ["Quality holding"] From 746d6d562aeba2e44c68e08e77ee84295cd99ec2 Mon Sep 17 00:00:00 2001 From: Francesc Leveque Date: Fri, 19 Jun 2026 21:15:26 +0200 Subject: [PATCH 8/8] docs: document the Ask Quantic chat widget + informational AI framing Promote Ask Quantic to its own README feature; correct the architecture AI section (5/day quota, record-on-real-call, demo no-provider, the not-financial-advice-by-construction stance, localStorage persistence, and tool-call-derived logo chips). Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 3 ++- docs/architecture.md | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ad511ce..6fc52a0 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,8 @@ Built on Elixir + Phoenix LiveView. Consolidates a previous multi-stack ecosyste - **Dividends** — a cash ledger with IBKR / MyInvestor statement import, per-currency charts (12-month + full-history), a payment calendar, and upcoming ex-dividend tracking. - **Path to Freedom** — a FIRE projection (three capital pools, inflation, adaptive drawdown) with live sensitivity levers. - **Community** — opt-in public portfolio (`/p/:slug`) and radar (`/r/:slug`) pages with share images, plus a `/community` dashboard and trending. -- **AI** — portfolio/radar insights and per-stock summaries, plus **Ask Quantic**, an always-present chat widget that answers natural-language questions about your portfolio, radar, and dividends (it calls the same scoped tools as the Telegram bot). Gemini, provider-agnostic, with a per-user daily quota. +- **Ask Quantic (AI chat)** — an always-present assistant on every page. Ask in plain language about your portfolio, radar, dividends, or any stock; answers show the referenced stocks' logos, and the conversation follows you as you navigate. Informational only — not financial advice. +- **AI insights** — portfolio/radar insights and per-stock dividend summaries (yield, payout sustainability, valuation, 52-week position) — observations, strengths, and risks, never buy/sell calls. Gemini, provider-agnostic, with a per-user daily quota. - **Telegram** — an account-linked bot (queries + a daily digest of ex-divs, dividends, and target hits). - **Seven languages** — en, es, ca, pt, de, fr, it. - **Demo mode** — "Try a sample portfolio" seeds a real, ephemeral account so every feature is visible without signing up. diff --git a/docs/architecture.md b/docs/architecture.md index 6ecb427..9711a38 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -125,11 +125,13 @@ Stock **enrichment** (sector/industry + inferred dividend payment schedule) runs `Quantic.AI` is a provider-agnostic seam over LLM calls. The `Quantic.AI.Provider` behaviour has just two generic callbacks — `chat/2` (with an internally-walked tool loop) and `generate_json/3` — so adding a provider is two functions, not a per-feature re-port. The Gemini adapter (Req, `Req.Test`-stubbed) is the live implementation. -Every scoped call (`chat_as/3`, `generate_json_as/4`) enforces a **per-user daily quota** (`ai_requests` table, 3/day UTC, config-overridable) recorded *before* the call (a failed LLM call still costs money), with one ordering invariant pinned by test: the **cache probe runs before the quota check**, so a rate-limited user still sees cached results. **Admins bypass the quota** (legacy `AiRateLimiter` parity). System-initiated calls (`generate_json/3`, logo LLM resolver, content drafts) bypass the quota entirely. +Every scoped call (`chat_as/3`, `generate_json_as/4`) enforces a **per-user daily quota** (`ai_requests` table, 5/day UTC, config-overridable). A call is recorded only when it **actually reaches the provider** — a real provider failure still counts (it spent money), but a pre-flight failure that never called out (e.g. a missing API key) does not burn the quota. One ordering invariant is pinned by test: the **cache probe runs before the quota check**, so a rate-limited user still sees cached results. **Admins bypass the quota** (legacy `AiRateLimiter` parity); **demo accounts never reach a provider at all** (the chat returns a canned reply). System-initiated calls (`generate_json/3`, logo LLM resolver, content drafts) bypass the quota entirely. Features: portfolio/radar **insights** and per-stock **summaries** (`AI.Insights`, 6h input-digest cache), the **Ask Quantic chat widget** (`QuanticWeb.AskLive`), the **Telegram bot's brain**, and **content drafts** (below). All need `GEMINI_API_KEY` to light up; without it each AI feature degrades independently. -The chat tools live in `Quantic.AI.PortfolioTools` (`all_for/1`) — seven user-scoped tools over the contexts' public APIs, closing over the caller's `Scope` so the LLM can only ever read that user's own data. They have **two front doors**: the Telegram bot and `AskLive`. The web widget is a **sticky nested LiveView** mounted once in `Layouts.app`, so its conversation survives `live_navigate` across the authenticated pages; a `handle_params` `on_mount` hook (`QuanticWeb.AskContext`) broadcasts the current page over the internal `ask_context:` PubSub topic the widget subscribes to, giving each answer page context. No new AI infrastructure — it reuses `chat_as/3` (quota, tool loop) wholesale. +**Not financial advice — by construction.** The insights, summaries, and chat are *informational*: they describe a stock on dividend criteria (yield, payout ratio, P/E, MA200, 52-week position) and surface observations, strengths, and risks, but never emit a buy/sell/hold verdict or a "good/bad buy" rating. This is enforced in the prompts and schemas (the per-stock summary has no `verdict`; insights expose neutral `observations`, not `buyingOpportunities`) and matches the app's footer disclaimer ("not a recommendation to buy or sell any security"). The chat also carries an in-widget "not financial advice" note. + +The chat tools live in `Quantic.AI.PortfolioTools` (`all_for/1`) — seven user-scoped tools over the contexts' public APIs, closing over the caller's `Scope` so the LLM can only ever read that user's own data. They have **two front doors**: the Telegram bot and `AskLive`. The web widget is a **sticky nested LiveView** mounted once in `Layouts.app`, so its conversation survives `live_navigate` across the authenticated pages; a `handle_params` `on_mount` hook (`QuanticWeb.AskContext`) broadcasts the current page over the internal `ask_context:` PubSub topic the widget subscribes to, giving each answer page context. Open state + conversation are mirrored to `localStorage` (a colocated JS hook), so they survive a refresh or cross-`live_session` navigation. Each answer renders `<.stock_logo>` chips for the stocks it referenced, derived from the model's actual `tool_calls` (not a regex on prose). No new AI infrastructure — it reuses `chat_as/3` (quota, tool loop) wholesale. ## Telegram