Skip to content

feat: invitations manager UI#231

Open
ValwareIRC wants to merge 5 commits into
mainfrom
feature/invitations-manager
Open

feat: invitations manager UI#231
ValwareIRC wants to merge 5 commits into
mainfrom
feature/invitations-manager

Conversation

@ValwareIRC
Copy link
Copy Markdown
Contributor

@ValwareIRC ValwareIRC commented May 18, 2026

Summary

Client UI for the obbyircd INVITELINK protocol (server-side already shipped). Adds an "Invitations" category to User Settings where a logged-in user on an `obby.world/invitation`-capable server can mint, list, copy, and delete invite share-ids.

Cap-gated: the panel renders a "this server doesn't support invite links" message on non-obby servers; otherwise shows the create form + list.

Wire plumbing

  • New `INVITELINK` dispatch handler parses both shapes (`CREATE` single-row reply + `LIST` `ENTRY` rows) and emits `INVITELINK_CREATED` / `INVITELINK_ENTRY` events.
  • `LIST_END` / `DELETED` / `FAIL` come through the existing NOTE / FAIL standard-replies pipeline; the store handler filters on `command === "INVITELINK"`.
  • New `InviteLink` type, `inviteLinks` store slice, three store actions.

Test plan

  • On obby.t3ks.com (cap `obby.world/invitation`): Invitations category visible; create / list / copy / delete all work.
  • On a non-obby server: panel shows the explanatory message.
  • Delete is two-click (confirm-state on the trash icon).

🤖 Generated with Claude Code

Summary by CodeRabbit

Release Notes

  • New Features
    • Added Invitations panel in settings to create and manage server invite links with optional channel selection and descriptions
    • Copy invite URLs to clipboard and view redemption counts
    • Delete invites with two-step confirmation
    • Multi-language support for invitations feature across 14+ languages

Review Change Stack

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 18, 2026

Warning

Rate limit exceeded

@ValwareIRC has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 44 minutes and 47 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 012dc0ea-ecc0-4bb1-8d86-cfb8900a763a

📥 Commits

Reviewing files that changed from the base of the PR and between befdd5e and 144c0a5.

📒 Files selected for processing (2)
  • src/components/ui/UserSettings.tsx
  • src/lib/irc/IRCClient.ts
📝 Walkthrough

Walkthrough

This PR introduces a complete invite links management feature for servers supporting the obby.world/invitation capability. It extends IRC event handling, adds a new settings panel for creating and managing invite links, integrates it into the user settings UI, and provides multilingual support across 14 languages. Users can create invites with optional channel targeting, copy invite URLs with feedback, and delete invites using two-step confirmation.

Changes

Invite Links Management Feature

Layer / File(s) Summary
IRC Protocol: INVITELINK Events and Handler
src/lib/irc/IRCClient.ts, src/lib/irc/handlers/invitelink.ts, src/lib/irc/handlers/index.ts
Adds INVITELINK_CREATED and INVITELINK_ENTRY event types, implements handleInvitelink to parse IRC responses, and registers the handler in the dispatch table. Handles both CREATE and ENTRY response forms with proper field extraction, channel normalization, and timestamp/redeem count parsing.
Settings Type and UserSettings Integration
src/lib/settings/types.ts, src/components/ui/UserSettings.tsx
Extends SettingCategory union with "invitations", imports FaShareSquare icon and InvitationsPanel component, adds category metadata to the settings list, and updates mobile content rendering to show the invitations panel when active.
InvitationsPanel Component
src/components/ui/InvitationsPanel.tsx
Implements full invite management UI with relative time formatting, server and capability gating, invite creation form with channel/description fields, clipboard copy with transient feedback, two-step delete confirmation (4s timeout), invite list rendering with redeem counts, and empty/error states.
Internationalization
src/locales/*/messages.mjs, src/locales/*/messages.po
Updates compiled locale data and translation source files for Czech, German, English, Spanish, Finnish, French, Italian, Japanese, Korean, Dutch, Polish, Portuguese, Romanian, and Russian with new message keys for invite panel UI, time-ago labels, form fields, confirmations, and status messages. Most non-English translations are pending.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested reviewers

  • matheusfillipe

Poem

🐰 Behold! Invite links bloom in the IRC garden,
With panels of sharing and channels of grace,
Confirm twice, then vanish—a deletion by pardon,
Now 14 tongues sing this feature's embrace! 🎉

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title "feat: invitations manager UI" accurately describes the main change—a new invitations management UI panel added to the settings. It is concise, specific, and directly reflects the primary feature being implemented.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/invitations-manager

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown

Pages Preview
Preview URL: https://feature-invitations-manager.obsidianirc.pages.dev

Automated deployment preview for the PR in the Cloudflare Pages.

The settings panel was 100% empty when opened from a context where
no server is the active one (home/discover routes) because the outer
gate dropped the render entirely. Make the panel responsible for its
own no-server placeholder so the tab always shows something useful.
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 18

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/components/ui/UserSettings.tsx (1)

1786-1791: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Desktop Invitations category never renders the invitations panel.

Line 1786 routes "invitations" through the generic SettingRenderer path on desktop, but there is no desktop branch equivalent to the mobile render at Lines 1591-1593. This leaves the Invitations tab blank/non-functional on desktop.

Proposed fix
           <div className="flex-1 overflow-y-auto p-6">
             {/* Profile category - custom rendering */}
             {activeCategory === "profile" && renderProfileFields()}

             {/* Account category - custom rendering */}
             {activeCategory === "account" && renderAccountFields()}

             {/* Media category - custom slider rendering */}
             {activeCategory === "media" && renderMediaFields()}

             {/* Privacy category - custom rendering */}
             {activeCategory === "privacy" && renderPrivacyFields()}
+
+            {/* Invitations category */}
+            {activeCategory === "invitations" && (
+              <InvitationsPanel serverId={currentServer?.id} />
+            )}

             {/* Other categories - use SettingRenderer */}
             {activeCategory !== "profile" &&
               activeCategory !== "account" &&
               activeCategory !== "media" &&
-              activeCategory !== "privacy" && (
+              activeCategory !== "privacy" &&
+              activeCategory !== "invitations" && (
                 <div className="space-y-4">
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/ui/UserSettings.tsx` around lines 1786 - 1791, The Invitations
tab is being funneled into the generic SettingRenderer on desktop because there
is no desktop-specific branch for activeCategory === "invitations"; update
UserSettings.tsx to add a desktop branch that checks activeCategory ===
"invitations" (before the generic SettingRenderer branch) and render the same
Invitations panel component used on mobile (mirror the mobile rendering logic
around the mobile invitations branch), ensuring the InvitationsPanel (or
whatever Invitations component is used) is rendered instead of falling through
to SettingRenderer.
🟡 Minor comments (4)
src/locales/cs/messages.mjs-1-1 (1)

1-1: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

New invitations strings are still untranslated in Czech locale.

Line 1 includes multiple invite-related entries in English (for example: Create, Copy, Copy link, Refresh, Create a new invite link, Your invite links). This causes mixed-language UI in cs.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/locales/cs/messages.mjs` at line 1, The Czech locale bundle (exported
const messages in src/locales/cs/messages.mjs) still contains untranslated
invite-related English strings—specifically keys with values "Create" (hYgDIe),
"Copy" (he3ygx), "Copy link" (y1eoq1), "Refresh" (lCF0wC), "Create a new invite
link" (RIfHS5) and "Your invite links" (ukyW4o); update those values to proper
Czech translations consistent with surrounding entries and locale style, then
rebuild/serialize the messages JSON so the messages variable contains the
translated strings.
src/components/ui/InvitationsPanel.tsx-117-123 (1)

117-123: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Copy success is shown even when Clipboard API is unavailable.

Line 119 uses optional chaining on navigator.clipboard, so on unsupported environments it resolves undefined and still runs the success UI state.

Proposed fix
   const handleCopy = async (url: string, shareId: string) => {
     try {
-      await navigator.clipboard?.writeText(url);
+      if (!navigator.clipboard) return;
+      await navigator.clipboard.writeText(url);
       setCopiedId(shareId);
       setTimeout(() => {
         setCopiedId((current) => (current === shareId ? null : current));
       }, 1500);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/ui/InvitationsPanel.tsx` around lines 117 - 123, The success
UI is triggered even when the Clipboard API is unavailable because optional
chaining lets await navigator.clipboard?.writeText(url) resolve to undefined;
modify handleCopy to explicitly check for navigator.clipboard and
navigator.clipboard.writeText before attempting to write, return or show an
error/fallback if missing, and only call setCopiedId/timeout after a successful
writeText inside the try block; reference the handleCopy function and
setCopiedId state so the success state is gated on a confirmed clipboard write.
src/locales/en/messages.po-2451-2453 (1)

2451-2453: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix missing spaces around the inline capability tag.

The string will render with merged words (theobby.world/invitationcapability). Add spaces around the <0>...</0> segment.

Suggested fix
-msgid "This server doesn't support invite links (the<0>obby.world/invitation</0>capability isn't advertised). You can still chat normally; this panel is for obbyircd-powered networks."
-msgstr "This server doesn't support invite links (the<0>obby.world/invitation</0>capability isn't advertised). You can still chat normally; this panel is for obbyircd-powered networks."
+msgid "This server doesn't support invite links (the <0>obby.world/invitation</0> capability isn't advertised). You can still chat normally; this panel is for obbyircd-powered networks."
+msgstr "This server doesn't support invite links (the <0>obby.world/invitation</0> capability isn't advertised). You can still chat normally; this panel is for obbyircd-powered networks."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/locales/en/messages.po` around lines 2451 - 2453, The translated message
for InvitationsPanel (msgid/msgstr) lacks spaces around the inline capability
tag causing merged words; update both msgid and msgstr in the locale entry for
src/components/ui/InvitationsPanel.tsx to add a space before the <0> tag and a
space after the </0> tag so the rendered string reads "the
<0>obby.world/invitation</0> capability" instead of
"theobby.world/invitationcapability".
src/locales/ru/messages.mjs-1-1 (1)

1-1: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Russian invite-link strings are partially untranslated.

The RU catalog still contains several English invite-management strings, which will surface mixed-language UI in this feature.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/locales/ru/messages.mjs` at line 1, The RU locale contains several
invite-link UI strings still in English; update the untranslated entries by
providing Russian translations for the invite-related message keys (e.g.
"WYxRzo" ("Create and manage your invite links"), "UETAwW" ("You haven't created
any invite links yet. Use the form above to mint your first one."), "xbi8D6"
(obbyircd-specific invite panel text) and any other invite/invitation-related
keys) so the invite-management UI is fully localized; locate these keys inside
messages in src/locales/ru/messages.mjs and replace their English text with
appropriate Russian strings while preserving existing interpolation placeholders
and array structure.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/components/ui/InvitationsPanel.tsx`:
- Around line 66-69: The Biome suppression comment above the useEffect in
InvitationsPanel.tsx is using the wrong text; replace the current comment with
the repository-required suppression for store action refs: change the line
before useEffect to "// biome-ignore lint/correctness/useExhaustiveDependencies:
store actions have unstable refs" so the dependency list ([serverId, cap]) may
omit the unstable store action loadInvitations without failing the linter.

In `@src/locales/cs/messages.po`:
- Around line 69-83: The Czech locale file src/locales/cs/messages.po contains
untranslated invite-related entries (e.g. msgid "{0}d ago", "{0}h ago", "{0}m
ago" referenced from src/components/ui/InvitationsPanel.tsx and many other
ranges) which must be filled before merge; open src/locales/cs/messages.po,
provide appropriate Czech translations for each empty msgstr "" corresponding to
the listed msgid values (and the other ranges called out in the review), then
run the project extraction/localization step (npm run i18n:extract) to verify no
non-English .po file has empty msgstr entries and commit the updated .po
file(s).

In `@src/locales/de/messages.po`:
- Around line 69-83: The German .po file has empty translations for the
invitation time strings (msgid "{0}d ago", "{0}h ago", "{0}m ago") referenced in
src/components/ui/InvitationsPanel.tsx and several other entries flagged in the
comment; open src/locales/de/messages.po, provide appropriate German msgstr
values (e.g. use "{0}d vor", "{0}h vor", "{0}m vor" or other correct localized
phrasing) for each empty msgid, and then run npm run i18n:extract to confirm no
other non-English .po files contain empty msgstr entries before committing.

In `@src/locales/es/messages.mjs`:
- Line 1: The Spanish messages JSON still contains invite-link UI strings in
English; locate the entries by their unique keys (e.g. "/AkXyp" -> "Confirm?",
"GdhD7H" -> "Click again to confirm", "hYgDIe" -> "Create", "lCF0wC" ->
"Refresh", "y1eoq1" -> "Copy link", "BPm98R" -> "No server is selected. Pick a
server from the sidebar first; invite links are managed per-server.", etc.) and
replace the English text with proper Spanish translations, preserving any
placeholders/array structures and escaping so the outer JSON.parse string
remains valid; after updating these keys (and any other invite-link related keys
left in English) re-validate the JSON string and run the localization/lint
tests.

In `@src/locales/es/messages.po`:
- Around line 69-82: Several Spanish translations are missing for new Invitation
UI strings (e.g. msgid "{0}d ago", "{0}h ago", "{0}m ago" used in
InvitationsPanel.tsx); populate the empty msgstr "" entries with accurate
Spanish equivalents (preserving placeholders like {0}) for these msgids and all
other reported ranges (e.g., lines listed in the comment). Run npm run
i18n:extract to list missing translations, update every non-English .po file's
empty msgstr entries accordingly, ensure placeholder order/format remains
unchanged, and save the updated .po files before merging.

In `@src/locales/fi/messages.po`:
- Around line 69-82: The Finnish .po entries for the InvitationsPanel time-ago
strings (msgid "{0}d ago", "{0}h ago", "{0}m ago" referenced from
InvitationsPanel.tsx) are empty; fill each corresponding msgstr with the proper
Finnish translations (preserving the {0} placeholder formatting), and then run
npm run i18n:extract and update all other non-English .po files to remove empty
msgstr entries (including the other ranges called out) before committing.

In `@src/locales/fr/messages.po`:
- Around line 69-82: Several new invitation-time strings ("{0}d ago", "{0}h
ago", "{0}m ago" and other msgid entries) were left untranslated (msgstr ""), so
update each corresponding msgstr with the correct French translations before
merging; search for the listed msgid values and fill their msgstr (e.g., "{0}d
ago" -> "{0} j", "{0}h ago" -> "{0} h", "{0}m ago" -> "{0} min" or your
preferred localized forms), run the i18n extractor (npm run i18n:extract) to
rediscover any other missing msgstr entries across all non-English .po files,
and ensure every empty msgstr noted in the reviewer comment is populated so the
Invitations UI is fully localized in French.

In `@src/locales/it/messages.mjs`:
- Line 1: The Italian messages bundle (exported as messages in
src/locales/it/messages.mjs) still contains untranslated invite-link UI strings
(examples: keys "/AkXyp" => "Confirm?", "ObsidianIRC - Bringing IRC to the
future" and keys like "WYxRzo" => "Create and manage your invite links",
"y1eoq1" => "Copy link", "ukyW4o" => "Your invite links", "RIfHS5" => "Create a
new invite link", etc.); update the JSON payload so every English value for
invite-related keys is translated to Italian, preserving the existing key
names/array structure and any interpolation placeholders (e.g. [\"0\"],
[\"searchQuery\"]) to avoid breaking runtime lookups. Ensure translations
maintain formatting/escaping (backslashes, quotes) and run the i18n tests or
build to verify no JSON parse or runtime substitution errors.

In `@src/locales/it/messages.po`:
- Around line 69-83: Fill the missing Italian translations for the newly added
invitation strings in src/locales/it/messages.po: replace the empty msgstr ""
for msgid "{0}d ago", "{0}h ago", "{0}m ago" (and the other ranges listed:
116-118, 564-567, etc.) with appropriate Italian equivalents (e.g., "{0}g fa",
"{0}h fa", "{0}min fa" or your preferred localized phrasing) so the
InvitationsPanel component strings from InvitationsPanel.tsx are fully
localized; after updating, run npm run i18n:extract (and/or your normal i18n
validation) to ensure no other non-English .po files contain empty msgstr
entries before committing.

In `@src/locales/ja/messages.po`:
- Around line 69-83: The Japanese locale file src/locales/ja/messages.po
contains empty msgstr entries for many invite-related msgid strings (e.g., "{0}d
ago", "{0}h ago", "{0}m ago" referenced from
src/components/ui/InvitationsPanel.tsx and other invite strings listed in the
comment); run npm run i18n:extract to refresh missing keys, then provide
accurate Japanese translations for each empty msgstr corresponding to those
msgid values (search for the msgid texts in messages.po and fill their msgstr),
ensuring every non-English .po file has no remaining empty msgstr entries before
committing.

In `@src/locales/ko/messages.po`:
- Around line 69-82: The PO entries for the Invitations UI are missing Korean
translations (empty msgstr for msgid "{0}d ago", "{0}h ago", "{0}m ago" used in
InvitationsPanel.tsx), causing fallback/untranslated text; run the i18n
extraction (npm run i18n:extract), then fill the corresponding msgstr values
with proper Korean translations for these msgids in src/locales/ko/messages.po
and for the other empty msgstr occurrences noted in the comment (all non-English
.po entries referenced) so every user-visible string added by InvitationsPanel
(and the other listed msgid ranges) has a Korean translation before merging.

In `@src/locales/nl/messages.po`:
- Around line 69-82: Fill in the missing Dutch translations for the invitation
time strings in src/locales/nl/messages.po (the msgid entries "{0}d ago", "{0}h
ago", "{0}m ago" referenced from src/components/ui/InvitationsPanel.tsx) by
populating their corresponding msgstr values with proper Dutch equivalents
(e.g., "{0}d geleden", "{0}u geleden", "{0}m geleden"), then run npm run
i18n:extract and scan the listed ranges/other .po files to replace any remaining
empty msgstr "" entries so all non-English locales have translations before
committing.

In `@src/locales/pl/messages.mjs`:
- Line 1: The messages JSON exported as messages contains several invite-related
strings still in English (e.g. values for keys like "ObsidianIRC - Bringing IRC
to the future", "Create a new invite link", "Your invite links", "This many
people registered through this link", "Copy link" and any other
invite/invitation-related entries); update those values in the messages payload
to Polish translations, editing the exported messages JSON in
src/locales/pl/messages.mjs (the messages constant) so all invite/invitation UI
strings are fully translated and consistent with the rest of the pl locale.

In `@src/locales/pl/messages.po`:
- Around line 69-82: Add Polish translations for the new invite-link time
strings that were left empty: set msgstr for "{0}d ago", "{0}h ago", and "{0}m
ago" (the msgid strings used by src/components/ui/InvitationsPanel.tsx) in
src/locales/pl/messages.po; run the i18n extraction command (npm run
i18n:extract) to locate any other empty msgstr entries listed in the review and
fill them all consistently, preserving the placeholder {0} in each translation.

In `@src/locales/pt/messages.mjs`:
- Line 1: The runtime Portuguese bundle exports a messages JSON that still
contains untranslated English invite-related entries (the exported const
messages in the file contains keys like RIfHS5, WYxRzo, UETAwW, etc. that map to
English invite strings); open the exported messages payload (the JSON string
assigned to messages), translate the English invite UI strings to Portuguese for
those keys (and any other invite-related keys left in English), update the JSON
string (or regenerate the locale bundle via the i18n build step) and rebuild the
bundle so src/locales/pt/messages.mjs ships complete Portuguese translations.

In `@src/locales/pt/messages.po`:
- Around line 69-82: The pt translation file has empty msgstr entries for the
InvitationsPanel time-ago strings (msgid "{0}d ago", "{0}h ago", "{0}m ago"
referenced from src/components/ui/InvitationsPanel.tsx); fill those msgstr
values with Portuguese translations (for example "há {0}d", "há {0}h", "há {0}m"
or prefer full words like "há {0} dias", "há {0} horas", "há {0} minutos" as
appropriate), then run npm run i18n:extract and ensure you populate all other
empty msgstr "" entries across non-English .po files mentioned in the review
before committing.

In `@src/locales/ro/messages.po`:
- Around line 69-83: Several Romanian translations for invite-related strings
are blank; open src/locales/ro/messages.po and fill the empty msgstr entries for
the entries referenced (e.g., the "{0}d ago", "{0}h ago", "{0}m ago" entries
tied to src/components/ui/InvitationsPanel.tsx and the other ranges called out)
with proper Romanian equivalents using the same placeholder {0} (for example
"acum {0}z", "acum {0}h", "acum {0}m" or correct localized forms), then run npm
run i18n:extract to verify no other non-English .po files have empty msgstr
entries before committing. Ensure you preserve placeholders exactly as {0} and
update any other listed ranges (116-118, 564-567, etc.) in the same file set.

In `@src/locales/ru/messages.po`:
- Around line 69-83: The new Russian translations in src/locales/ru/messages.po
are left empty (msgstr ""), causing untranslated UI strings; open the file and
fill every newly added msgstr for the Invitation-related msgid entries (e.g.,
"{0}d ago", "{0}h ago", "{0}m ago" and all other empty msgstr occurrences called
out in the review) with proper Russian text preserving placeholders like {0};
run npm run i18n:extract to locate any other missing translations across
non-English .po files, update all empty msgstr entries accordingly, and commit
the updated .po files before merging.

---

Outside diff comments:
In `@src/components/ui/UserSettings.tsx`:
- Around line 1786-1791: The Invitations tab is being funneled into the generic
SettingRenderer on desktop because there is no desktop-specific branch for
activeCategory === "invitations"; update UserSettings.tsx to add a desktop
branch that checks activeCategory === "invitations" (before the generic
SettingRenderer branch) and render the same Invitations panel component used on
mobile (mirror the mobile rendering logic around the mobile invitations branch),
ensuring the InvitationsPanel (or whatever Invitations component is used) is
rendered instead of falling through to SettingRenderer.

---

Minor comments:
In `@src/components/ui/InvitationsPanel.tsx`:
- Around line 117-123: The success UI is triggered even when the Clipboard API
is unavailable because optional chaining lets await
navigator.clipboard?.writeText(url) resolve to undefined; modify handleCopy to
explicitly check for navigator.clipboard and navigator.clipboard.writeText
before attempting to write, return or show an error/fallback if missing, and
only call setCopiedId/timeout after a successful writeText inside the try block;
reference the handleCopy function and setCopiedId state so the success state is
gated on a confirmed clipboard write.

In `@src/locales/cs/messages.mjs`:
- Line 1: The Czech locale bundle (exported const messages in
src/locales/cs/messages.mjs) still contains untranslated invite-related English
strings—specifically keys with values "Create" (hYgDIe), "Copy" (he3ygx), "Copy
link" (y1eoq1), "Refresh" (lCF0wC), "Create a new invite link" (RIfHS5) and
"Your invite links" (ukyW4o); update those values to proper Czech translations
consistent with surrounding entries and locale style, then rebuild/serialize the
messages JSON so the messages variable contains the translated strings.

In `@src/locales/en/messages.po`:
- Around line 2451-2453: The translated message for InvitationsPanel
(msgid/msgstr) lacks spaces around the inline capability tag causing merged
words; update both msgid and msgstr in the locale entry for
src/components/ui/InvitationsPanel.tsx to add a space before the <0> tag and a
space after the </0> tag so the rendered string reads "the
<0>obby.world/invitation</0> capability" instead of
"theobby.world/invitationcapability".

In `@src/locales/ru/messages.mjs`:
- Line 1: The RU locale contains several invite-link UI strings still in
English; update the untranslated entries by providing Russian translations for
the invite-related message keys (e.g. "WYxRzo" ("Create and manage your invite
links"), "UETAwW" ("You haven't created any invite links yet. Use the form above
to mint your first one."), "xbi8D6" (obbyircd-specific invite panel text) and
any other invite/invitation-related keys) so the invite-management UI is fully
localized; locate these keys inside messages in src/locales/ru/messages.mjs and
replace their English text with appropriate Russian strings while preserving
existing interpolation placeholders and array structure.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: faa6f31f-813d-4f1c-9b2a-dbe0f846a51f

📥 Commits

Reviewing files that changed from the base of the PR and between 2b362bd and befdd5e.

📒 Files selected for processing (48)
  • src/components/ui/InvitationsPanel.tsx
  • src/components/ui/UserSettings.tsx
  • src/lib/irc/IRCClient.ts
  • src/lib/irc/handlers/index.ts
  • src/lib/irc/handlers/invitelink.ts
  • src/lib/settings/types.ts
  • src/locales/cs/messages.mjs
  • src/locales/cs/messages.po
  • src/locales/de/messages.mjs
  • src/locales/de/messages.po
  • src/locales/en/messages.mjs
  • src/locales/en/messages.po
  • src/locales/es/messages.mjs
  • src/locales/es/messages.po
  • src/locales/fi/messages.mjs
  • src/locales/fi/messages.po
  • src/locales/fr/messages.mjs
  • src/locales/fr/messages.po
  • src/locales/it/messages.mjs
  • src/locales/it/messages.po
  • src/locales/ja/messages.mjs
  • src/locales/ja/messages.po
  • src/locales/ko/messages.mjs
  • src/locales/ko/messages.po
  • src/locales/nl/messages.mjs
  • src/locales/nl/messages.po
  • src/locales/pl/messages.mjs
  • src/locales/pl/messages.po
  • src/locales/pt/messages.mjs
  • src/locales/pt/messages.po
  • src/locales/ro/messages.mjs
  • src/locales/ro/messages.po
  • src/locales/ru/messages.mjs
  • src/locales/ru/messages.po
  • src/locales/sv/messages.mjs
  • src/locales/sv/messages.po
  • src/locales/tr/messages.mjs
  • src/locales/tr/messages.po
  • src/locales/uk/messages.mjs
  • src/locales/uk/messages.po
  • src/locales/zh-TW/messages.mjs
  • src/locales/zh-TW/messages.po
  • src/locales/zh/messages.mjs
  • src/locales/zh/messages.po
  • src/store/handlers/index.ts
  • src/store/handlers/invitelink.ts
  • src/store/index.ts
  • src/types/index.ts

Comment on lines +66 to +69
// biome-ignore lint/correctness/useExhaustiveDependencies: cap toggles trigger reload by design
useEffect(() => {
if (serverId && cap) loadInvitations(serverId);
}, [serverId, cap]);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win

Use the required Biome suppression comment text for omitted store-action deps.

Line 66 suppression text does not match the repository-required form for store action refs in useEffect.

Proposed fix
-  // biome-ignore lint/correctness/useExhaustiveDependencies: cap toggles trigger reload by design
+  // biome-ignore lint/correctness/useExhaustiveDependencies: store actions have unstable refs
   useEffect(() => {
     if (serverId && cap) loadInvitations(serverId);
   }, [serverId, cap]);

As per coding guidelines, "Suppress Biome linter on store action refs used in useEffect dependencies with // biome-ignore lint/correctness/useExhaustiveDependencies: store actions have unstable refs — store action functions change reference on every state update and cause infinite loops".

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// biome-ignore lint/correctness/useExhaustiveDependencies: cap toggles trigger reload by design
useEffect(() => {
if (serverId && cap) loadInvitations(serverId);
}, [serverId, cap]);
// biome-ignore lint/correctness/useExhaustiveDependencies: store actions have unstable refs
useEffect(() => {
if (serverId && cap) loadInvitations(serverId);
}, [serverId, cap]);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/ui/InvitationsPanel.tsx` around lines 66 - 69, The Biome
suppression comment above the useEffect in InvitationsPanel.tsx is using the
wrong text; replace the current comment with the repository-required suppression
for store action refs: change the line before useEffect to "// biome-ignore
lint/correctness/useExhaustiveDependencies: store actions have unstable refs" so
the dependency list ([serverId, cap]) may omit the unstable store action
loadInvitations without failing the linter.

Comment on lines +69 to +83
#. placeholder {0}: Math.floor(secs / 86400)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}d ago"
msgstr ""

#. placeholder {0}: Math.floor(secs / 3600)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}h ago"
msgstr ""

#. placeholder {0}: Math.floor(secs / 60)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}m ago"
msgstr ""

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fill the new Czech invite strings before merge.

Many newly added invite-related entries are still msgstr "", so the Czech locale will ship with untranslated UI text.

As per coding guidelines, src/locales/**/*.po: "When adding new user-visible strings, translate them before committing — run npm run i18n:extract to identify missing strings, then fill in all empty msgstr "" entries across every non-English .po file before committing".

Also applies to: 116-118, 564-567, 665-668, 710-745, 815-826, 1276-1317, 1667-1670, 2017-2021, 2444-2455, 2602-2605, 2795-2818

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/locales/cs/messages.po` around lines 69 - 83, The Czech locale file
src/locales/cs/messages.po contains untranslated invite-related entries (e.g.
msgid "{0}d ago", "{0}h ago", "{0}m ago" referenced from
src/components/ui/InvitationsPanel.tsx and many other ranges) which must be
filled before merge; open src/locales/cs/messages.po, provide appropriate Czech
translations for each empty msgstr "" corresponding to the listed msgid values
(and the other ranges called out in the review), then run the project
extraction/localization step (npm run i18n:extract) to verify no non-English .po
file has empty msgstr entries and commit the updated .po file(s).

Comment on lines +69 to +83
#. placeholder {0}: Math.floor(secs / 86400)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}d ago"
msgstr ""

#. placeholder {0}: Math.floor(secs / 3600)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}h ago"
msgstr ""

#. placeholder {0}: Math.floor(secs / 60)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}m ago"
msgstr ""

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Complete the German translations for the new invitation strings.

The new invite-related entries still contain empty msgstr, which leaves untranslated text in the German UI.

As per coding guidelines, src/locales/**/*.po: "When adding new user-visible strings, translate them before committing — run npm run i18n:extract to identify missing strings, then fill in all empty msgstr "" entries across every non-English .po file before committing".

Also applies to: 116-118, 564-567, 665-668, 710-745, 815-826, 1276-1317, 1667-1670, 2017-2021, 2444-2455, 2602-2605, 2795-2818

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/locales/de/messages.po` around lines 69 - 83, The German .po file has
empty translations for the invitation time strings (msgid "{0}d ago", "{0}h
ago", "{0}m ago") referenced in src/components/ui/InvitationsPanel.tsx and
several other entries flagged in the comment; open src/locales/de/messages.po,
provide appropriate German msgstr values (e.g. use "{0}d vor", "{0}h vor", "{0}m
vor" or other correct localized phrasing) for each empty msgid, and then run npm
run i18n:extract to confirm no other non-English .po files contain empty msgstr
entries before committing.

@@ -1 +1 @@
/*eslint-disable*/export const messages=JSON.parse("{\"+5VMrz\":[\"Formato de patrón inválido. Usa el formato nick!user@host (se permiten comodines *)\"],\"+6NQQA\":[\"Canal de soporte general\"],\"+6NyRG\":[\"Cliente\"],\"+K0AvT\":[\"Desconectar\"],\"+cyFdH\":[\"Mensaje predeterminado al marcarse como ausente\"],\"+mVPqU\":[\"Renderizar formato Markdown en mensajes\"],\"+vqCJH\":[\"Tu nombre de usuario de cuenta para autenticación\"],\"+yPBXI\":[\"Elegir archivo\"],\"+zy2Nq\":[\"Tipo\"],\"/09cao\":[\"Baja seguridad de enlace (Nivel \",[\"securityLevel\"],\")\"],\"/3BQ4J\":[\"Los usuarios fuera del canal no pueden enviar mensajes a él\"],\"/6BzZF\":[\"Alternar lista de miembros\"],\"/TNOPk\":[\"El usuario está ausente\"],\"/XQgft\":[\"Explorar\"],\"/cF7Rs\":[\"Volumen\"],\"/dqduX\":[\"Página siguiente\"],\"/fc3q4\":[\"Todo el contenido\"],\"/kISDh\":[\"Activar sonidos de notificación\"],\"/n04sB\":[\"Kill\"],\"/rTz0M\":[\"Audio\"],\"/rfkZe\":[\"Reproducir sonidos para menciones y mensajes\"],\"0/0ZGA\":[\"Máscara de nombre de canal\"],\"0D6j7U\":[\"Más información sobre reglas personalizadas →\"],\"0XsHcR\":[\"Expulsar usuario\"],\"0ZpE//\":[\"Ordenar por usuarios\"],\"0bEPwz\":[\"Marcar como ausente\"],\"0dGkPt\":[\"Expandir lista de canales\"],\"0gS7M5\":[\"Nombre a mostrar\"],\"0kS+M8\":[\"EjemploRED\"],\"0rgoY7\":[\"Solo te conectas a los servidores que eliges\"],\"0wdd7X\":[\"Unirse\"],\"0wkVYx\":[\"Mensajes privados\"],\"111uHX\":[\"Vista previa del enlace\"],\"196EG4\":[\"Eliminar chat privado\"],\"1DSr1i\":[\"Registrar una cuenta\"],\"1O/24y\":[\"Alternar lista de canales\"],\"1VPJJ2\":[\"Advertencia de enlace externo\"],\"1ZC/dv\":[\"Sin menciones ni mensajes sin leer\"],\"1pO1zi\":[\"El nombre del servidor es obligatorio\"],\"1uwfzQ\":[\"Ver tema del canal\"],\"268g7c\":[\"Ingresa el nombre a mostrar\"],\"2FOFq1\":[\"Los operadores del servidor en la red podrían leer tus mensajes\"],\"2FYpfJ\":[\"Más\"],\"2HF1Y2\":[[\"inviter\"],\" ha invitado a \",[\"target\"],\" a unirse a \",[\"channel\"]],\"2I70QL\":[\"Ver información del perfil de usuario\"],\"2QYdmE\":[\"Usuarios:\"],\"2QpEjG\":[\"salió\"],\"2YE223\":[\"Mensaje en #\",[\"0\"],\" (Intro para nueva línea, Mayús+Intro para enviar)\"],\"2bimFY\":[\"Usar contraseña del servidor\"],\"2iTmdZ\":[\"Almacenamiento local:\"],\"2odkwe\":[\"Estricto – Protección más agresiva\"],\"2uDhbA\":[\"Ingresa el nombre de usuario a invitar\"],\"2ygf/L\":[\"← Atrás\"],\"2zEgxj\":[\"Buscar GIFs...\"],\"3RdPhl\":[\"Renombrar canal\"],\"3THokf\":[\"Usuario con voz\"],\"3TSz9S\":[\"Minimizar\"],\"3jBDvM\":[\"Nombre a mostrar del canal\"],\"3ryuFU\":[\"Informes de errores opcionales para mejorar la app\"],\"3uBF/8\":[\"Cerrar visor\"],\"3uwW8F\":[\"https://example.com/avatar/\",[\"size\"],\"/channel.jpg\"],\"3xf8Kz\":[\"Ingresa nombre de cuenta...\"],\"4/Rr0R\":[\"Invitar a un usuario al canal actual\"],\"4EZrJN\":[\"Reglas\"],\"4JJtW9\":[\"#overflow\"],\"4NqeT4\":[\"Perfil de flood (+F)\"],\"4RZQRK\":[\"¿Qué estás haciendo?\"],\"4hfTrB\":[\"Apodo\"],\"4n99LO\":[\"Ya en \",[\"0\"]],\"4t6vMV\":[\"Cambiar automáticamente a línea única para mensajes cortos\"],\"4vsHmf\":[\"Tiempo (min)\"],\"5+INAX\":[\"Resaltar mensajes que te mencionan\"],\"5R5Pv/\":[\"Nombre de oper\"],\"678PKt\":[\"Nombre de red\"],\"6Aih4U\":[\"Desconectado\"],\"6CO3WE\":[\"Contraseña requerida para unirse al canal. Deja vacío para eliminar la clave.\"],\"6HhMs3\":[\"Mensaje de salida\"],\"6V3Ea3\":[\"Copiado\"],\"6lGV3K\":[\"Mostrar menos\"],\"6yFOEi\":[\"Ingresa contraseña de oper...\"],\"7+IHTZ\":[\"Ningún archivo elegido\"],\"73hrRi\":[\"nick!user@host (ej., spam*!*@*, *!*@badhost.com)\"],\"7QkKyN\":[\"Enviar mensaje privado\"],\"7U1W7c\":[\"Muy relajado\"],\"7Y1YQj\":[\"Nombre real:\"],\"7YHArF\":[\"— abrir en visor\"],\"7fjnVl\":[\"Buscar usuarios...\"],\"7jL88x\":[\"¿Eliminar este mensaje? Esta acción no se puede deshacer.\"],\"7nGhhM\":[\"¿Qué piensas?\"],\"7sEpu1\":[\"Miembros — \",[\"0\"]],\"7sNhEz\":[\"Nombre de usuario\"],\"8H0Q+x\":[\"Más información sobre perfiles →\"],\"8Phu0A\":[\"Mostrar cuando los usuarios cambian su apodo\"],\"8XTG9e\":[\"Ingresa la contraseña de oper\"],\"8XsV2J\":[\"Reintentar envío\"],\"8ZsakT\":[\"Contraseña\"],\"8kR84m\":[\"Estás a punto de abrir un enlace externo:\"],\"8lCgih\":[\"Eliminar regla\"],\"8p/xVT\":[[\"0\",\"plural\",{\"one\":[[\"1\"]],\"other\":[[\"2\"]]}]],\"8wRzac\":[[\"joinCount\",\"plural\",{\"one\":[\"se unió\"],\"other\":[\"se unió \",[\"joinCount\"],\" veces\"]}]],\"9BMLnJ\":[\"Reconectar al servidor\"],\"9OEgyT\":[\"Agregar reacción\"],\"9PQ8m2\":[\"G-Line (ban global)\"],\"9Qs99X\":[\"Correo electrónico:\"],\"9QupBP\":[\"Eliminar patrón\"],\"9bG48P\":[\"Enviando\"],\"9f5f0u\":[\"¿Preguntas sobre privacidad? Contáctanos:\"],\"9unqs3\":[\"Ausente:\"],\"9v3hwv\":[\"No se encontraron servidores.\"],\"9zb2WA\":[\"Conectando\"],\"A1taO8\":[\"Buscar\"],\"A2adVi\":[\"Enviar notificaciones de escritura\"],\"A9Rhec\":[\"Nombre del canal\"],\"AWOSPo\":[\"Acercar\"],\"AXSpEQ\":[\"Oper al conectar\"],\"AeXO77\":[\"Cuenta\"],\"AhNP40\":[\"Buscar posición\"],\"Ai2U7L\":[\"Host\"],\"AjBQnf\":[\"Apodo cambiado\"],\"AmXVh6\":[\"https://example.com/avatar.png\"],\"AnRu/j\":[\"Cancelar respuesta\"],\"ApSx0O\":[\"Se encontraron \",[\"0\"],\" mensajes que coinciden con \\\"\",[\"searchQuery\"],\"\\\"\"],\"AxPAXW\":[\"No se encontraron resultados\"],\"AyNqAB\":[\"Mostrar todos los eventos del servidor en el chat\"],\"B/QqGw\":[\"Alejado del teclado\"],\"B8AaMI\":[\"Este campo es obligatorio\"],\"BA2c49\":[\"El servidor no admite filtrado avanzado de LIST\"],\"BDKt3I\":[[\"0\"],\", \",[\"1\"],\", \",[\"2\"],\" y \",[\"3\"],\" más están escribiendo...\"],\"BGul2A\":[\"Tienes cambios sin guardar. ¿Seguro que deseas cerrar sin guardar?\"],\"BIf9fi\":[\"Tu mensaje de estado\"],\"BZz3md\":[\"Tu sitio web personal\"],\"Bgm/H7\":[\"Permitir ingresar múltiples líneas de texto\"],\"BiQIl1\":[\"Fijar esta conversación de mensaje privado\"],\"BlNZZ2\":[\"Haz clic para ir al mensaje\"],\"Bowq3c\":[\"Solo los operadores pueden cambiar el tema del canal\"],\"Btozzp\":[\"Esta imagen ha expirado\"],\"Bycfjm\":[\"Total: \",[\"0\"]],\"C6IBQc\":[\"Copiar JSON completo\"],\"C9L9wL\":[\"Recopilación de datos\"],\"CDq4wC\":[\"Moderar usuario\"],\"CHVRxG\":[\"Mensaje a @\",[\"0\"],\" (Mayús+Intro para nueva línea)\"],\"CN9zdR\":[\"El nombre y la contraseña de oper son obligatorios\"],\"CW3sYa\":[\"Agregar reacción \",[\"emoji\"]],\"CaAkqd\":[\"Mostrar desconexiones\"],\"CbvaYj\":[\"Banear por apodo\"],\"CcK+Ft\":[\"PDF\"],\"Ce8q3L\":[\"Selecciona un canal\"],\"CsekCi\":[\"Normal\"],\"D+NlUC\":[\"Sistema\"],\"D28t6+\":[\"se unió y salió\"],\"DB8zMK\":[\"Aplicar\"],\"DBcWHr\":[\"Archivo de sonido de notificación personalizado\"],\"DTy9Xw\":[\"Vistas previas de medios\"],\"Dj4pSr\":[\"Elige una contraseña segura\"],\"Du+zn+\":[\"Buscando...\"],\"Du2T2f\":[\"Ajuste no encontrado\"],\"DwsSVQ\":[\"Aplicar filtros y actualizar\"],\"E3W/zd\":[\"Apodo predeterminado\"],\"E6nRW7\":[\"Copiar URL\"],\"E703RG\":[\"Modos:\"],\"EAeu1Z\":[\"Enviar invitación\"],\"EFKJQT\":[\"Ajuste\"],\"EGPQBv\":[\"Reglas de flood personalizadas (+f)\"],\"ELik0r\":[\"Ver política de privacidad completa\"],\"EPbeC2\":[\"Ver o editar el tema del canal\"],\"EQCDNT\":[\"Ingresa nombre de usuario oper...\"],\"EUvulZ\":[\"Se encontró 1 mensaje que coincide con \\\"\",[\"searchQuery\"],\"\\\"\"],\"EatZYJ\":[\"Imagen siguiente\"],\"EdQY6l\":[\"Ninguno\"],\"EnqLYU\":[\"Buscar servidores...\"],\"F0OKMc\":[\"Editar servidor\"],\"F6Int2\":[\"Activar resaltados\"],\"FDoLyE\":[\"Máximo de usuarios\"],\"FUU/hZ\":[\"Controla cuántos medios externos se cargan en el chat.\"],\"Fdp03t\":[\"activado\"],\"FfPWR0\":[\"Modal\"],\"FjkaiT\":[\"Alejar\"],\"FlqOE9\":[\"Qué significa esto:\"],\"FolHNl\":[\"Administra tu cuenta y autenticación\"],\"Fp2Dif\":[\"Salió del servidor\"],\"G5KmCc\":[\"GZ-Line (Z-Line global)\"],\"GDs0lz\":[\"<0>Riesgo:</0> La información sensible (mensajes, conversaciones privadas, datos de autenticación) podría quedar expuesta a administradores de red o atacantes situados entre los servidores IRC.\"],\"GR+2I3\":[\"Agregar máscara de invitación (p. ej., nick!*@*, *!*@host.com)\"],\"GRLyMU\":[\"Cerrar avisos del servidor desplegados\"],\"GlHnXw\":[\"Cambio de apodo fallido: \",[\"error\"],\" \",[\"0\"]],\"GswZF3\":[\"Vista previa:\"],\"GtmO8/\":[\"de\"],\"GtuHUQ\":[\"Renombrar este canal en el servidor. Todos los usuarios verán el nuevo nombre.\"],\"GuGfFX\":[\"Alternar búsqueda\"],\"GxkJXS\":[\"Subiendo...\"],\"GzbwnK\":[\"Se unió al canal\"],\"GzsUDB\":[\"Perfil extendido\"],\"H/PnT8\":[\"Insertar emoji\"],\"H6Izzl\":[\"Tu código de color preferido\"],\"H9jIv+\":[\"Mostrar entradas/salidas\"],\"HAKBY9\":[\"Subir archivos\"],\"HdE1If\":[\"Canal\"],\"Hk4AW9\":[\"Tu nombre de visualización preferido\"],\"HmHDk7\":[\"Seleccionar miembro\"],\"HrQzPU\":[\"Canales en \",[\"networkName\"]],\"I2tXQ5\":[\"Mensaje a @\",[\"0\"],\" (Intro para nueva línea, Mayús+Intro para enviar)\"],\"I6bw/h\":[\"Banear usuario\"],\"I92Z+b\":[\"Activar notificaciones\"],\"I9D72S\":[\"¿Estás seguro de que deseas eliminar este mensaje? Esta acción no se puede deshacer.\"],\"IA+1wo\":[\"Mostrar cuando los usuarios son expulsados de los canales\"],\"IDwkJx\":[\"IRC Operator\"],\"ILlU+s\":[\"Info:\"],\"IUwGEM\":[\"Guardar cambios\"],\"IVeGK6\":[[\"0\"],\", \",[\"1\"],\" y \",[\"2\"],\" están escribiendo...\"],\"IgrLD/\":[\"Pausar\"],\"Im6JED\":[\"WHISPER\"],\"ImOQa9\":[\"Responder\"],\"IoHMnl\":[\"El valor máximo es \",[\"0\"]],\"IvMj+0\":[\"Op\"],\"J28zul\":[\"Conectando...\"],\"J5T9NW\":[\"Información del usuario\"],\"J8Y5+z\":[\"¡Vaya! ¡División de red! ⚠️\"],\"JBHkBA\":[\"Abandonó el canal\"],\"JCwL0Q\":[\"Ingresa un motivo (opcional)\"],\"JFciKP\":[\"Alternar\"],\"JXGkhG\":[\"Cambiar el nombre del canal (solo operadores)\"],\"JcD7qf\":[\"Más acciones\"],\"JdkA+c\":[\"Secreto (+s)\"],\"Jmu12l\":[\"Canales del servidor\"],\"JvQ++s\":[\"Activar Markdown\"],\"K2jwh/\":[\"No hay datos WHOIS disponibles\"],\"KAXSwC\":[\"Voz\"],\"KDfTdX\":[\"Eliminar mensaje\"],\"KKBlUU\":[\"Insertar\"],\"KM0pLb\":[\"¡Bienvenido al canal!\"],\"KR6W2h\":[\"Dejar de ignorar usuario\"],\"KV+Bi1\":[\"Solo por invitación (+i)\"],\"KdCtwE\":[\"Cuántos segundos monitorear la actividad de flood antes de restablecer los contadores\"],\"Kkezga\":[\"Contraseña del servidor\"],\"KsiQ/8\":[\"Los usuarios deben ser invitados para unirse al canal\"],\"L+gB/D\":[\"Información del canal\"],\"LC1a7n\":[\"El servidor IRC ha informado que sus enlaces entre servidores tienen un nivel de seguridad bajo. Esto significa que cuando tus mensajes se retransmiten entre servidores IRC en la red, es posible que no estén correctamente cifrados o que los certificados SSL/TLS no se validen correctamente.\"],\"LNfLR5\":[\"Mostrar expulsiones\"],\"LQb0W/\":[\"Mostrar todos los eventos\"],\"LU7/yA\":[\"Nombre alternativo para mostrar en la interfaz. Puede contener espacios, emoji y caracteres especiales. El nombre real del canal (\",[\"channelName\"],\") seguirá usándose para los comandos IRC.\"],\"LUb9O7\":[\"Se requiere un puerto de servidor válido\"],\"Lb+BUl\":[\"https://example.com/avatar.jpg\"],\"LcET2C\":[\"Política de privacidad\"],\"LcuSDR\":[\"Administra la información y metadatos de tu perfil\"],\"LqLS9B\":[\"Mostrar cambios de apodo\"],\"LsDQt2\":[\"Configuración del canal\"],\"LtI9AS\":[\"Propietario\"],\"LuNhhL\":[\"reaccionó a este mensaje\"],\"M/AZNG\":[\"URL de tu imagen de avatar\"],\"M/WIer\":[\"Enviar mensaje\"],\"M8er/5\":[\"Nombre:\"],\"MHk+7g\":[\"Imagen anterior\"],\"MRorGe\":[\"MP al usuario\"],\"MVbSGP\":[\"Ventana de tiempo (segundos)\"],\"MkpcsT\":[\"Tus mensajes y ajustes se almacenan localmente en tu dispositivo\"],\"N/hDSy\":[\"Marcar como bot, normalmente 'on' o vacío\"],\"N7TQbE\":[\"Invitar usuario a \",[\"channelName\"]],\"NCca/o\":[\"Ingresa apodo predeterminado...\"],\"Nqs6B9\":[\"Muestra todos los medios externos. Cualquier URL puede generar una solicitud a un servidor desconocido.\"],\"Nt+9O7\":[\"Usar WebSocket en lugar de TCP sin procesar\"],\"NxIHzc\":[\"Expulsar usuario\"],\"O+v/cL\":[\"Ver todos los canales del servidor\"],\"ODwSCk\":[\"Enviar un GIF\"],\"OGQ5kK\":[\"Configurar sonidos de notificación y resaltados\"],\"OIPt1Z\":[\"Mostrar u ocultar la barra lateral de miembros\"],\"OKSNq/\":[\"Muy estricto\"],\"ONWvwQ\":[\"Subir\"],\"OVKoQO\":[\"Tu contraseña de cuenta para autenticación\"],\"ObsidianIRC - Bringing IRC to the future\":[\"ObsidianIRC - Llevando IRC al futuro\"],\"OhCpra\":[\"Establece un tema…\"],\"OkltoQ\":[\"Banear a \",[\"username\"],\" por apodo (impide que vuelva a unirse con el mismo nick)\"],\"P+t/Te\":[\"Sin datos adicionales\"],\"P42Wcc\":[\"Seguro\"],\"PD38l0\":[\"Vista previa del avatar del canal\"],\"PD9mEt\":[\"Escribe un mensaje...\"],\"PPqfdA\":[\"Abrir configuración del canal\"],\"PSCjfZ\":[\"El tema que se mostrará para este canal. Todos los usuarios pueden ver el tema.\"],\"PZCecv\":[\"Vista previa de PDF\"],\"PeLgsC\":[[\"c\",\"plural\",{\"one\":[\"1 vez\"],\"other\":[[\"c\"],\" veces\"]}]],\"PguS2C\":[\"Agregar máscara de excepción (p. ej., nick!*@*, *!*@host.com)\"],\"Pil5Ty\":[\"Mostrando \",[\"displayedChannelsCount\"],\" de \",[\"0\"],\" canales\"],\"PqhVlJ\":[\"Banear usuario (por hostmask)\"],\"Q+chwU\":[\"Nombre de usuario:\"],\"Q6hhn8\":[\"Preferencias\"],\"QF4a34\":[\"Por favor, introduce un nombre de usuario\"],\"QGqSZ2\":[\"Color y formato\"],\"QJQd1J\":[\"Editar perfil\"],\"QSzGDE\":[\"Inactivo\"],\"QUlny5\":[\"¡Bienvenido a \",[\"0\"],\"!\"],\"Qoq+GP\":[\"Leer más\"],\"QuSkCF\":[\"Filtrar canales...\"],\"QwUrDZ\":[\"cambió el tema a: \",[\"topic\"]],\"R0UH07\":[\"Imagen \",[\"0\"],\" de \",[\"1\"]],\"R7SsBE\":[\"Silenciar\"],\"R8rf1X\":[\"Haz clic para establecer el tema\"],\"RArB3D\":[\"fue expulsado de \",[\"channelName\"],\" por \",[\"username\"]],\"RI3cWd\":[\"Descubre el mundo de IRC con ObsidianIRC\"],\"RMMaN5\":[\"Moderado (+m)\"],\"RWw9Lg\":[\"Cerrar ventana\"],\"RZ2BuZ\":[\"Se requiere verificación para el registro de la cuenta \",[\"account\"],\": \",[\"message\"]],\"RySp6q\":[\"Ocultar comentarios\"],\"SPKQTd\":[\"El apodo es obligatorio\"],\"SPVjfj\":[\"Por defecto será 'sin motivo' si se deja vacío\"],\"SQKPvQ\":[\"Invitar usuario\"],\"SkZcl+\":[\"Elige un perfil de protección contra flood predefinido. Estos perfiles ofrecen configuraciones de protección equilibradas para diferentes casos de uso.\"],\"Slr+3C\":[\"Mínimo de usuarios\"],\"Spnlre\":[\"Has invitado a \",[\"target\"],\" a unirse a \",[\"channel\"]],\"T/ckN5\":[\"Abrir en el visor\"],\"T91vKp\":[\"Reproducir\"],\"TV2Wdu\":[\"Conoce cómo gestionamos tus datos y protegemos tu privacidad.\"],\"TgFpwD\":[\"Aplicando...\"],\"TkzSFB\":[\"Sin cambios\"],\"TtserG\":[\"Ingresa el nombre real\"],\"Ttz9J1\":[\"Ingresa contraseña...\"],\"Tz0i8g\":[\"Ajustes\"],\"U3pytU\":[\"Admin\"],\"UDb2YD\":[\"Reaccionar\"],\"UE4KO5\":[\"*channel*\"],\"UGT5vp\":[\"Guardar configuración\"],\"UV5hLB\":[\"No se encontraron bans\"],\"Uaj3Nd\":[\"Mensajes de estado\"],\"Ue3uny\":[\"Predeterminado (sin perfil)\"],\"UkARhe\":[\"Normal – Protección estándar\"],\"Umn7Cj\":[\"Aún no hay comentarios. ¡Sé el primero!\"],\"UtUIRh\":[[\"0\"],\" mensajes anteriores\"],\"UwzP+U\":[\"Conexión segura\"],\"V0/A4O\":[\"Propietario del canal\"],\"V4qgxE\":[\"Creado hace menos de (min)\"],\"V8yTm6\":[\"Limpiar búsqueda\"],\"VJMMyz\":[\"ObsidianIRC - Llevando IRC al futuro\"],\"VJScHU\":[\"Motivo\"],\"VLsmVV\":[\"Silenciar notificaciones\"],\"VbyRUy\":[\"Comentarios\"],\"Vmx0mQ\":[\"Establecido por:\"],\"VqnIZz\":[\"Ver nuestra política de privacidad y prácticas de datos\"],\"VrMygG\":[\"La longitud mínima es \",[\"0\"]],\"VrnTui\":[\"Tus pronombres, mostrados en tu perfil\"],\"W8E3qn\":[\"Cuenta autenticada\"],\"WAakm9\":[\"Eliminar canal\"],\"WFxTHC\":[\"Agregar máscara de ban (p. ej., nick!*@*, *!*@host.com)\"],\"WN1g9F\":[\"El host del servidor es obligatorio\"],\"WRYdXW\":[\"Posición del audio\"],\"WUOH5B\":[\"Ignorar usuario\"],\"WWEXnZ\":[[\"0\",\"plural\",{\"one\":[\"Mostrar 1 elemento más\"],\"other\":[\"Mostrar \",[\"1\"],\" elementos más\"]}]],\"Weq9zb\":[\"General\"],\"Wfj7Sk\":[\"Silenciar o activar los sonidos de notificación\"],\"Wm7gbG\":[\"GitHub:\"],\"WyeHWY\":[\"*spam*\"],\"WzMCru\":[\"Perfil de usuario\"],\"X6S3lt\":[\"Buscar ajustes, canales, servidores...\"],\"XEHan5\":[\"Continuar de todos modos\"],\"XI1+wb\":[\"Formato no válido\"],\"XIXeuC\":[\"Mensaje a @\",[\"0\"]],\"XMS+k4\":[\"Iniciar mensaje privado\"],\"XWgxXq\":[\"Álbum\"],\"Xd7+IT\":[\"Desfijar chat privado\"],\"Xm/s+u\":[\"Pantalla\"],\"Xp2n93\":[\"Muestra medios desde el host de archivos de confianza de tu servidor. No se realizan solicitudes a servicios externos.\"],\"XvjC4F\":[\"Guardando...\"],\"Y/qryO\":[\"No se encontraron usuarios que coincidan con tu búsqueda\"],\"YAqRpI\":[\"Registro de cuenta exitoso para \",[\"account\"],\": \",[\"message\"]],\"YEfzvP\":[\"Tema protegido (+t)\"],\"YQOn6a\":[\"Contraer lista de miembros\"],\"YRCoE9\":[\"Operador del canal\"],\"YURQaF\":[\"Ver perfil\"],\"YdBSvr\":[\"Controlar la visualización de medios y contenido externo\"],\"Yj6U3V\":[\"Sin servidor central:\"],\"YjvpGx\":[\"Pronombres\"],\"YqH4l4\":[\"Sin clave\"],\"YyUPpV\":[\"Cuenta:\"],\"ZJSWfw\":[\"Mensaje al desconectarse del servidor\"],\"ZR1dJ4\":[\"Invitaciones\"],\"ZdWg0V\":[\"Abrir en el navegador\"],\"ZhRBbl\":[\"Buscar mensajes…\"],\"Zmcu3y\":[\"Filtros avanzados\"],\"a2/8e5\":[\"Tema establecido hace más de (min)\"],\"aHKcKc\":[\"Página anterior\"],\"aJTbXX\":[\"Contraseña de oper\"],\"aQryQv\":[\"El patrón ya existe\"],\"aW9pLN\":[\"Número máximo de usuarios permitidos en el canal. Deja vacío para no establecer límite.\"],\"ah4fmZ\":[\"También muestra vistas previas de YouTube, Vimeo, SoundCloud y servicios conocidos similares.\"],\"aifXak\":[\"No hay medios en este canal\"],\"ap2zBz\":[\"Relajado\"],\"az8lvo\":[\"Desactivado\"],\"azXSNo\":[\"Expandir lista de miembros\"],\"azdliB\":[\"Iniciar sesión en una cuenta\"],\"b26wlF\":[\"ella/la\"],\"bD/+Ei\":[\"Estricto\"],\"bQ6BJn\":[\"Configura reglas detalladas de protección contra flood. Cada regla especifica qué tipo de actividad monitorear y qué acción tomar cuando se superan los umbrales.\"],\"beV7+y\":[\"El usuario recibirá una invitación para unirse a \",[\"channelName\"],\".\"],\"bk84cH\":[\"Mensaje de ausencia\"],\"bkHdLj\":[\"Agregar servidor IRC\"],\"bmQLn5\":[\"Añadir regla\"],\"bwRvnp\":[\"Acción\"],\"c8+EVZ\":[\"Cuenta verificada\"],\"cGYUlD\":[\"No se carga ninguna vista previa de medios.\"],\"cLF98o\":[\"Mostrar comentarios (\",[\"commentCount\"],\")\"],\"cLKIDO\":[\"No hay usuarios disponibles\"],\"cSgpoS\":[\"Fijar chat privado\"],\"cde3ce\":[\"Mensaje a <0>\",[\"0\"],\"</0>\"],\"chQsxg\":[\"Copiar salida formateada\"],\"cl/A5J\":[\"¡Bienvenido a \",[\"__DEFAULT_IRC_SERVER_NAME__\"],\"!\"],\"cnGeoo\":[\"Eliminar\"],\"coPLXT\":[\"No almacenamos tus comunicaciones IRC en nuestros servidores\"],\"crYH/6\":[\"Reproductor de SoundCloud\"],\"d3sis4\":[\"Agregar servidor\"],\"d9aN5k\":[\"Eliminar a \",[\"username\"],\" del canal\"],\"dEgA5A\":[\"Cancelar\"],\"dGi1We\":[\"Desfijar esta conversación de mensaje privado\"],\"dJVuyC\":[\"salió de \",[\"channelName\"],\" (\",[\"reason\"],\")\"],\"dMtLDE\":[\"a\"],\"dXqxlh\":[\"<0>⚠️ ¡Riesgo de seguridad!</0> Esta conexión puede ser vulnerable a intercepciones o ataques de intermediario.\"],\"da9Q/R\":[\"Modos del canal cambiados\"],\"dhJN3N\":[\"Mostrar comentarios\"],\"dj2xTE\":[\"Descartar notificación\"],\"dpCzmC\":[\"Configuración de protección contra flood\"],\"e9dQpT\":[\"¿Deseas abrir este enlace en una nueva pestaña?\"],\"ePK91l\":[\"Editar\"],\"eYBDuB\":[\"Sube una imagen o proporciona una URL con sustitución opcional de \",[\"size\"],\" para tamaño dinámico\"],\"edBbee\":[\"Banear a \",[\"username\"],\" por hostmask (impide que vuelva a unirse desde la misma IP/host)\"],\"ekfzWq\":[\"Configuración de usuario\"],\"elPDWs\":[\"Personaliza tu experiencia con el cliente IRC\"],\"eu2osY\":[\"<0>💡 Recomendación:</0> Continúa solo si confías en este servidor y entiendes los riesgos. Evita compartir información sensible o contraseñas a través de esta conexión.\"],\"euEhbr\":[\"Haz clic para unirte a \",[\"channel\"]],\"ez3vLd\":[\"Activar entrada multilínea\"],\"f0J5Ki\":[\"La comunicación entre servidores puede usar conexiones sin cifrar\"],\"f9BHJk\":[\"Advertir al usuario\"],\"fDOLLd\":[\"No se encontraron canales.\"],\"ffzDkB\":[\"Analíticas anónimas:\"],\"fq1GF9\":[\"Mostrar cuando los usuarios se desconectan del servidor\"],\"gEF57C\":[\"Este servidor solo admite un tipo de conexión\"],\"gJuLUI\":[\"Lista de ignorados\"],\"gNzMrk\":[\"Avatar actual\"],\"gjPWyO\":[\"Ingresa tu apodo...\"],\"gz6UQ3\":[\"Maximizar\"],\"h6razj\":[\"Excluir máscara de nombre de canal\"],\"hG6jnw\":[\"Sin tema establecido\"],\"hG89Ed\":[\"Imagen\"],\"hZ6znB\":[\"Puerto\"],\"ha+Bz5\":[\"ej., 100:1440\"],\"hehnjM\":[\"Cantidad\"],\"hzdLuQ\":[\"Solo los usuarios con Voice o superior pueden hablar\"],\"i0qMbr\":[\"Inicio\"],\"iDNBZe\":[\"Notificaciones\"],\"iH8pgl\":[\"Atrás\"],\"iL9SZg\":[\"Banear usuario (por apodo)\"],\"iNt+3c\":[\"Volver a la imagen\"],\"iQvi+a\":[\"No advertirme sobre la baja seguridad de enlaces para este servidor\"],\"iSLIjg\":[\"Conectar\"],\"iWXkHH\":[\"Halfop\"],\"iZeTtp\":[\"Host del servidor\"],\"idD8Ev\":[\"Guardado\"],\"iivqkW\":[\"Conectado desde\"],\"ij+Elv\":[\"Vista previa de imagen\"],\"ilIWp7\":[\"Alternar notificaciones\"],\"iuaqvB\":[\"Usa * como comodín. Ejemplos: baduser!*@*, *!*@spammer.com, troll*!*@*\"],\"ixkTse\":[\"Bot\"],\"j2DGR0\":[\"Banear por hostmask\"],\"jA4uoI\":[\"Tema:\"],\"jLXxGK\":[\"https://example.com\"],\"jPSk57\":[\"Motivo (opcional)\"],\"jUV7CU\":[\"Subir avatar\"],\"jW5Uwh\":[\"Controla cuántos medios externos se cargan. Desactivado / Seguro / Fuentes confiables / Todo el contenido.\"],\"jXzms5\":[\"Opciones de adjunto\"],\"jZlrte\":[\"Color\"],\"jfC/xh\":[\"Contacto\"],\"jywMpv\":[\"#new-channel-name\"],\"k112DD\":[\"Cargar mensajes anteriores\"],\"k3ID0F\":[\"Filtrar miembros…\"],\"k65gsE\":[\"Ver en detalle\"],\"k7Zgob\":[\"Cancelar conexión\"],\"kAVx5h\":[\"No se encontraron invitaciones\"],\"kCLEPU\":[\"Conectado a\"],\"kF5LKb\":[\"Patrones ignorados:\"],\"kGeOx/\":[\"Unirse a \",[\"0\"]],\"kITKr8\":[\"Cargando modos del canal...\"],\"kPpPsw\":[\"Eres un IRC Operator\"],\"kWJmRL\":[\"Tú\"],\"kfcRb0\":[\"Avatar\"],\"kjMqSj\":[\"Copiar JSON\"],\"krViRy\":[\"Clic para copiar como JSON\"],\"ks71ra\":[\"Excepciones\"],\"kw4lRv\":[\"Medio operador del canal\"],\"kxgIRq\":[\"Selecciona o agrega un canal para comenzar.\"],\"ky6dWe\":[\"Vista previa del avatar\"],\"l+GxCv\":[\"Cargando canales...\"],\"l+IUVW\":[\"Verificación de cuenta exitosa para \",[\"account\"],\": \",[\"message\"]],\"l/siQz\":[[\"reconnectCount\",\"plural\",{\"one\":[\"se reconectó\"],\"other\":[\"se reconectó \",[\"reconnectCount\"],\" veces\"]}]],\"l5jmzx\":[[\"0\"],\" y \",[\"1\"],\" están escribiendo...\"],\"lHy8N5\":[\"Cargando más canales...\"],\"lbpf14\":[\"Unirse a \",[\"value\"]],\"lfFsZ4\":[\"Canales\"],\"lkNdiH\":[\"Nombre de cuenta\"],\"ln500L\":[\"ObsidianIRC\"],\"lnCMdg\":[\"Subir imagen\"],\"loQxaJ\":[\"He vuelto\"],\"lvfaxv\":[\"INICIO\"],\"m16xKo\":[\"Agregar\"],\"m8flAk\":[\"Vista previa (aún no subido)\"],\"mEPxTp\":[\"<0>⚠️ ¡Ten cuidado!</0> Solo abre enlaces de fuentes de confianza. Los enlaces maliciosos pueden comprometer tu seguridad o privacidad.\"],\"mHGdhG\":[\"Información del servidor\"],\"mHS8lb\":[\"Mensaje en #\",[\"0\"]],\"mMYBD9\":[\"Amplio – Ámbito de protección más amplio\"],\"mTGsPd\":[\"Tema del canal\"],\"mU8j6O\":[\"Sin mensajes externos (+n)\"],\"mZp8FL\":[\"Retorno automático a línea única\"],\"mdQu8G\":[\"TuApodo\"],\"miSSBQ\":[\"Comentarios (\",[\"commentCount\"],\")\"],\"mvyLSy\":[\"El usuario está autenticado\"],\"mwtcGl\":[\"Cerrar comentarios\"],\"mzI/c+\":[\"Descargar\"],\"n3fGRk\":[\"establecido por \",[\"0\"]],\"nE9jsU\":[\"Relajado – Protección menos agresiva\"],\"nNflMD\":[\"Salir del canal\"],\"nPXkBi\":[\"Cargando datos WHOIS...\"],\"nQnxxF\":[\"Mensaje en #\",[\"0\"],\" (Mayús+Intro para nueva línea)\"],\"nWMRxa\":[\"Desfijar\"],\"nkC032\":[\"Sin perfil de flood\"],\"o69z4d\":[\"Enviar un mensaje de advertencia a \",[\"username\"]],\"o9ylQi\":[\"Busca GIFs para empezar\"],\"oFGkER\":[\"Avisos del servidor\"],\"oOi11l\":[\"Ir al final\"],\"oQEzQR\":[\"Nuevo mensaje directo\"],\"oXOSPE\":[\"En línea\"],\"oal760\":[\"Son posibles ataques de intermediario en los enlaces del servidor\"],\"oeqmmJ\":[\"Fuentes de confianza\"],\"ovBPCi\":[\"Predeterminado\"],\"p0Z69r\":[\"El patrón no puede estar vacío\"],\"p1KgtK\":[\"Error al cargar el audio\"],\"p59pEv\":[\"Detalles adicionales\"],\"p7sRI6\":[\"Avisar a otros cuando estás escribiendo\"],\"pBm1od\":[\"Canal secreto\"],\"pNmiXx\":[\"Tu apodo predeterminado para todos los servidores\"],\"pUUo9G\":[\"Hostname:\"],\"pVGPmz\":[\"Contraseña de la cuenta\"],\"peNE68\":[\"Permanente\"],\"plhHQt\":[\"Sin datos\"],\"pm6+q5\":[\"Advertencia de seguridad\"],\"pn5qSs\":[\"Información adicional\"],\"q0cR4S\":[\"ahora se llama **\",[\"newNick\"],\"**\"],\"qFcunY\":[\"El canal no aparecerá en los comandos LIST ni NAMES\"],\"qLpTm/\":[\"Eliminar reacción \",[\"emoji\"]],\"qVkGWK\":[\"Fijar\"],\"qY8wNa\":[\"Página de inicio\"],\"qb0xJ7\":[\"Usa comodines: * coincide con cualquier secuencia, ? coincide con cualquier carácter individual. Ejemplos: nick!*@*, *!*@host.com, *!*user@*\"],\"qhzpRq\":[\"Clave del canal (+k)\"],\"qtoOYG\":[\"Sin límite\"],\"r1W2AS\":[\"Imagen del servidor de archivos\"],\"rIPR2O\":[\"Tema establecido hace menos de (min)\"],\"rMMSYo\":[\"La longitud máxima es \",[\"0\"]],\"rWtzQe\":[\"La red se dividió y se reconectó. ✅\"],\"rYG2u6\":[\"Por favor espera...\"],\"rdUucN\":[\"Vista previa\"],\"rjGI/Q\":[\"Privacidad\"],\"rk8iDX\":[\"Cargando GIFs...\"],\"rn6SBY\":[\"Activar sonido\"],\"s/UKqq\":[\"Fue expulsado del canal\"],\"s8cATI\":[\"se unió a \",[\"channelName\"]],\"sCO9ue\":[\"La conexión a <0>\",[\"serverName\"],\"</0> presenta los siguientes problemas de seguridad:\"],\"sGH11W\":[\"Servidor\"],\"sHI1H+\":[\"ahora se llama **\",[\"newNick\"],\"**\"],\"sJyV04\":[[\"inviter\"],\" te ha invitado a unirte a \",[\"channel\"]],\"sby+1/\":[\"Haz clic para copiar\"],\"sfN25C\":[\"Tu nombre real o completo\"],\"sliuzR\":[\"Abrir enlace\"],\"sqrO9R\":[\"Menciones personalizadas\"],\"sr6RdJ\":[\"Multilínea con Shift+Enter\"],\"swrCpB\":[\"El canal ha sido renombrado de \",[\"oldName\"],\" a \",[\"newName\"],\" por \",[\"user\"],[\"0\"]],\"sxkWRg\":[\"Avanzado\"],\"t/YqKh\":[\"Eliminar\"],\"t47eHD\":[\"Tu identificador único en este servidor\"],\"tAkAh0\":[\"URL con sustitución opcional de \",[\"size\"],\" para tamaño dinámico. Ejemplo: https://example.com/avatar/\",[\"size\"],\"/channel.jpg\"],\"tXLJS3\":[\"Mostrar u ocultar la barra lateral de canales\"],\"tfDRzk\":[\"Guardar\"],\"tiBsJk\":[\"salió de \",[\"channelName\"]],\"tt4/UD\":[\"salió (\",[\"reason\"],\")\"],\"u0TcnO\":[\"El apodo {nick} ya está en uso, reintentando con {newNick}\"],\"u0a8B4\":[\"Autenticarse como operador IRC para acceso administrativo\"],\"u0rWFU\":[\"Creado hace más de (min)\"],\"u72w3t\":[\"Usuarios y patrones a ignorar\"],\"u7jc2L\":[\"salió\"],\"uAQUqI\":[\"Estado\"],\"uB85T3\":[\"Error al guardar: \",[\"msg\"]],\"uV3DOL\":[\"G-Line\"],\"uW3lLI\":[\"Servidores IRC:\"],\"usSSr/\":[\"Nivel de zoom\"],\"v7uvcf\":[\"Software:\"],\"vE8kb+\":[\"Shift+Enter para nuevas líneas (Enter envía)\"],\"vERlcd\":[\"Perfil\"],\"vK0RL8\":[\"Sin tema\"],\"vSJd18\":[\"Video\"],\"vXIe7J\":[\"Idioma\"],\"vaHYxN\":[\"Nombre real\"],\"vhjbKr\":[\"Ausente\"],\"w4NYox\":[\"cliente \",[\"title\"]],\"w8xQRx\":[\"Valor no válido\"],\"wFjjxZ\":[\"fue expulsado de \",[\"channelName\"],\" por \",[\"username\"],\" (\",[\"reason\"],\")\"],\"wGjaGl\":[\"No se encontraron excepciones de ban\"],\"wPrGnM\":[\"Administrador del canal\"],\"wRkP2d\":[\"GIF\"],\"wbm86v\":[\"Mostrar cuando los usuarios entran o salen de canales\"],\"whqZ9r\":[\"Palabras o frases adicionales para resaltar\"],\"wm7RV4\":[\"Sonido de notificación\"],\"wz/Yoq\":[\"Tus mensajes podrían ser interceptados al retransmitirse entre servidores\"],\"xCJdfg\":[\"Limpiar\"],\"xUHRTR\":[\"Autenticarse automáticamente como operador al conectar\"],\"xWHwwQ\":[\"Bans\"],\"xYilR2\":[\"Medios\"],\"xceQrO\":[\"Solo se admiten websockets seguros\"],\"xdtXa+\":[\"nombre-del-canal\"],\"xfXC7q\":[\"Canales de texto\"],\"xlCYOE\":[\"Cargando más mensajes...\"],\"xlhswE\":[\"El valor mínimo es \",[\"0\"]],\"xq97Ci\":[\"Agregar una palabra o frase...\"],\"xuRqRq\":[\"Límite de usuarios (+l)\"],\"xwF+7J\":[[\"0\"],\" está escribiendo...\"],\"yNeucF\":[\"Este servidor no admite metadatos de perfil extendido (extensión IRCv3 METADATA). Los campos adicionales como avatar, nombre a mostrar y estado no están disponibles.\"],\"yPlrca\":[\"Avatar del canal\"],\"yQE2r9\":[\"Cargando\"],\"ySU+JY\":[\"tu@correo.com\"],\"yTX1Rt\":[\"Nombre de usuario Oper\"],\"yYOzWD\":[\"registros\"],\"yfx9Re\":[\"Contraseña de operador IRC\"],\"ygCKqB\":[\"Detener\"],\"ymDxJx\":[\"Nombre de usuario de operador IRC\"],\"yrpRsQ\":[\"Ordenar por nombre\"],\"yz7wBu\":[\"Cerrar\"],\"zJw+jA\":[\"establece modo: \",[\"0\"]],\"zebeLu\":[\"Ingresa el nombre de usuario de oper\"],\"zpr0Bw\":[\"GZ-Line\"]}"); No newline at end of file
/*eslint-disable*/export const messages=JSON.parse("{\"+5VMrz\":[\"Formato de patrón inválido. Usa el formato nick!user@host (se permiten comodines *)\"],\"+6NQQA\":[\"Canal de soporte general\"],\"+6NyRG\":[\"Cliente\"],\"+K0AvT\":[\"Desconectar\"],\"+cyFdH\":[\"Mensaje predeterminado al marcarse como ausente\"],\"+mVPqU\":[\"Renderizar formato Markdown en mensajes\"],\"+vqCJH\":[\"Tu nombre de usuario de cuenta para autenticación\"],\"+yPBXI\":[\"Elegir archivo\"],\"+zy2Nq\":[\"Tipo\"],\"/09cao\":[\"Baja seguridad de enlace (Nivel \",[\"securityLevel\"],\")\"],\"/3BQ4J\":[\"Los usuarios fuera del canal no pueden enviar mensajes a él\"],\"/6BzZF\":[\"Alternar lista de miembros\"],\"/AkXyp\":[\"Confirm?\"],\"/TNOPk\":[\"El usuario está ausente\"],\"/XQgft\":[\"Explorar\"],\"/cF7Rs\":[\"Volumen\"],\"/dqduX\":[\"Página siguiente\"],\"/fc3q4\":[\"Todo el contenido\"],\"/kISDh\":[\"Activar sonidos de notificación\"],\"/n04sB\":[\"Kill\"],\"/rTz0M\":[\"Audio\"],\"/rfkZe\":[\"Reproducir sonidos para menciones y mensajes\"],\"0/0ZGA\":[\"Máscara de nombre de canal\"],\"0D6j7U\":[\"Más información sobre reglas personalizadas →\"],\"0XsHcR\":[\"Expulsar usuario\"],\"0ZpE//\":[\"Ordenar por usuarios\"],\"0bEPwz\":[\"Marcar como ausente\"],\"0dGkPt\":[\"Expandir lista de canales\"],\"0gS7M5\":[\"Nombre a mostrar\"],\"0kS+M8\":[\"EjemploRED\"],\"0rgoY7\":[\"Solo te conectas a los servidores que eliges\"],\"0wdd7X\":[\"Unirse\"],\"0wkVYx\":[\"Mensajes privados\"],\"111uHX\":[\"Vista previa del enlace\"],\"196EG4\":[\"Eliminar chat privado\"],\"1DSr1i\":[\"Registrar una cuenta\"],\"1O/24y\":[\"Alternar lista de canales\"],\"1VPJJ2\":[\"Advertencia de enlace externo\"],\"1ZC/dv\":[\"Sin menciones ni mensajes sin leer\"],\"1pO1zi\":[\"El nombre del servidor es obligatorio\"],\"1uwfzQ\":[\"Ver tema del canal\"],\"268g7c\":[\"Ingresa el nombre a mostrar\"],\"2FOFq1\":[\"Los operadores del servidor en la red podrían leer tus mensajes\"],\"2FYpfJ\":[\"Más\"],\"2HF1Y2\":[[\"inviter\"],\" ha invitado a \",[\"target\"],\" a unirse a \",[\"channel\"]],\"2I70QL\":[\"Ver información del perfil de usuario\"],\"2QYdmE\":[\"Usuarios:\"],\"2QpEjG\":[\"salió\"],\"2YE223\":[\"Mensaje en #\",[\"0\"],\" (Intro para nueva línea, Mayús+Intro para enviar)\"],\"2bimFY\":[\"Usar contraseña del servidor\"],\"2iTmdZ\":[\"Almacenamiento local:\"],\"2odkwe\":[\"Estricto – Protección más agresiva\"],\"2uDhbA\":[\"Ingresa el nombre de usuario a invitar\"],\"2ygf/L\":[\"← Atrás\"],\"2zEgxj\":[\"Buscar GIFs...\"],\"3RdPhl\":[\"Renombrar canal\"],\"3THokf\":[\"Usuario con voz\"],\"3TSz9S\":[\"Minimizar\"],\"3jBDvM\":[\"Nombre a mostrar del canal\"],\"3ryuFU\":[\"Informes de errores opcionales para mejorar la app\"],\"3uBF/8\":[\"Cerrar visor\"],\"3uwW8F\":[\"https://example.com/avatar/\",[\"size\"],\"/channel.jpg\"],\"3xf8Kz\":[\"Ingresa nombre de cuenta...\"],\"4/Rr0R\":[\"Invitar a un usuario al canal actual\"],\"4EZrJN\":[\"Reglas\"],\"4JJtW9\":[\"#overflow\"],\"4NqeT4\":[\"Perfil de flood (+F)\"],\"4RZQRK\":[\"¿Qué estás haciendo?\"],\"4hfTrB\":[\"Apodo\"],\"4n99LO\":[\"Ya en \",[\"0\"]],\"4t6vMV\":[\"Cambiar automáticamente a línea única para mensajes cortos\"],\"4vsHmf\":[\"Tiempo (min)\"],\"5+INAX\":[\"Resaltar mensajes que te mencionan\"],\"5R5Pv/\":[\"Nombre de oper\"],\"678PKt\":[\"Nombre de red\"],\"6Aih4U\":[\"Desconectado\"],\"6CO3WE\":[\"Contraseña requerida para unirse al canal. Deja vacío para eliminar la clave.\"],\"6HhMs3\":[\"Mensaje de salida\"],\"6V3Ea3\":[\"Copiado\"],\"6lGV3K\":[\"Mostrar menos\"],\"6yFOEi\":[\"Ingresa contraseña de oper...\"],\"7+IHTZ\":[\"Ningún archivo elegido\"],\"73hrRi\":[\"nick!user@host (ej., spam*!*@*, *!*@badhost.com)\"],\"7QkKyN\":[\"Enviar mensaje privado\"],\"7U1W7c\":[\"Muy relajado\"],\"7Y1YQj\":[\"Nombre real:\"],\"7YHArF\":[\"— abrir en visor\"],\"7fjnVl\":[\"Buscar usuarios...\"],\"7jL88x\":[\"¿Eliminar este mensaje? Esta acción no se puede deshacer.\"],\"7nGhhM\":[\"¿Qué piensas?\"],\"7sEpu1\":[\"Miembros — \",[\"0\"]],\"7sNhEz\":[\"Nombre de usuario\"],\"8H0Q+x\":[\"Más información sobre perfiles →\"],\"8Phu0A\":[\"Mostrar cuando los usuarios cambian su apodo\"],\"8XTG9e\":[\"Ingresa la contraseña de oper\"],\"8XsV2J\":[\"Reintentar envío\"],\"8ZsakT\":[\"Contraseña\"],\"8kR84m\":[\"Estás a punto de abrir un enlace externo:\"],\"8lCgih\":[\"Eliminar regla\"],\"8p/xVT\":[[\"0\",\"plural\",{\"one\":[[\"1\"]],\"other\":[[\"2\"]]}]],\"8wRzac\":[[\"joinCount\",\"plural\",{\"one\":[\"se unió\"],\"other\":[\"se unió \",[\"joinCount\"],\" veces\"]}]],\"9BMLnJ\":[\"Reconectar al servidor\"],\"9OEgyT\":[\"Agregar reacción\"],\"9PQ8m2\":[\"G-Line (ban global)\"],\"9Qs99X\":[\"Correo electrónico:\"],\"9QupBP\":[\"Eliminar patrón\"],\"9bG48P\":[\"Enviando\"],\"9f5f0u\":[\"¿Preguntas sobre privacidad? Contáctanos:\"],\"9unqs3\":[\"Ausente:\"],\"9v3hwv\":[\"No se encontraron servidores.\"],\"9zb2WA\":[\"Conectando\"],\"A1taO8\":[\"Buscar\"],\"A2adVi\":[\"Enviar notificaciones de escritura\"],\"A9Rhec\":[\"Nombre del canal\"],\"AWOSPo\":[\"Acercar\"],\"AXSpEQ\":[\"Oper al conectar\"],\"AeXO77\":[\"Cuenta\"],\"AhNP40\":[\"Buscar posición\"],\"Ai2U7L\":[\"Host\"],\"AjBQnf\":[\"Apodo cambiado\"],\"AmXVh6\":[\"https://example.com/avatar.png\"],\"AnRu/j\":[\"Cancelar respuesta\"],\"ApSx0O\":[\"Se encontraron \",[\"0\"],\" mensajes que coinciden con \\\"\",[\"searchQuery\"],\"\\\"\"],\"AxPAXW\":[\"No se encontraron resultados\"],\"AyNqAB\":[\"Mostrar todos los eventos del servidor en el chat\"],\"B/QqGw\":[\"Alejado del teclado\"],\"B8AaMI\":[\"Este campo es obligatorio\"],\"BA2c49\":[\"El servidor no admite filtrado avanzado de LIST\"],\"BDKt3I\":[[\"0\"],\", \",[\"1\"],\", \",[\"2\"],\" y \",[\"3\"],\" más están escribiendo...\"],\"BGul2A\":[\"Tienes cambios sin guardar. ¿Seguro que deseas cerrar sin guardar?\"],\"BIf9fi\":[\"Tu mensaje de estado\"],\"BPm98R\":[\"No server is selected. Pick a server from the sidebar first; invite links are managed per-server.\"],\"BZz3md\":[\"Tu sitio web personal\"],\"Bgm/H7\":[\"Permitir ingresar múltiples líneas de texto\"],\"BiQIl1\":[\"Fijar esta conversación de mensaje privado\"],\"BlNZZ2\":[\"Haz clic para ir al mensaje\"],\"Bowq3c\":[\"Solo los operadores pueden cambiar el tema del canal\"],\"Btozzp\":[\"Esta imagen ha expirado\"],\"Bycfjm\":[\"Total: \",[\"0\"]],\"C6IBQc\":[\"Copiar JSON completo\"],\"C9L9wL\":[\"Recopilación de datos\"],\"CDq4wC\":[\"Moderar usuario\"],\"CHVRxG\":[\"Mensaje a @\",[\"0\"],\" (Mayús+Intro para nueva línea)\"],\"CN9zdR\":[\"El nombre y la contraseña de oper son obligatorios\"],\"CW3sYa\":[\"Agregar reacción \",[\"emoji\"]],\"CaAkqd\":[\"Mostrar desconexiones\"],\"CbvaYj\":[\"Banear por apodo\"],\"CcK+Ft\":[\"PDF\"],\"Ce8q3L\":[\"Selecciona un canal\"],\"CsekCi\":[\"Normal\"],\"D+NlUC\":[\"Sistema\"],\"D28t6+\":[\"se unió y salió\"],\"DB8zMK\":[\"Aplicar\"],\"DBcWHr\":[\"Archivo de sonido de notificación personalizado\"],\"DTy9Xw\":[\"Vistas previas de medios\"],\"Dj4pSr\":[\"Elige una contraseña segura\"],\"Du+zn+\":[\"Buscando...\"],\"Du2T2f\":[\"Ajuste no encontrado\"],\"DwsSVQ\":[\"Aplicar filtros y actualizar\"],\"E3W/zd\":[\"Apodo predeterminado\"],\"E6nRW7\":[\"Copiar URL\"],\"E703RG\":[\"Modos:\"],\"EAeu1Z\":[\"Enviar invitación\"],\"EFKJQT\":[\"Ajuste\"],\"EGPQBv\":[\"Reglas de flood personalizadas (+f)\"],\"ELik0r\":[\"Ver política de privacidad completa\"],\"EPbeC2\":[\"Ver o editar el tema del canal\"],\"EQCDNT\":[\"Ingresa nombre de usuario oper...\"],\"EUvulZ\":[\"Se encontró 1 mensaje que coincide con \\\"\",[\"searchQuery\"],\"\\\"\"],\"EatZYJ\":[\"Imagen siguiente\"],\"EdQY6l\":[\"Ninguno\"],\"EnqLYU\":[\"Buscar servidores...\"],\"F0OKMc\":[\"Editar servidor\"],\"F6Int2\":[\"Activar resaltados\"],\"FDoLyE\":[\"Máximo de usuarios\"],\"FUU/hZ\":[\"Controla cuántos medios externos se cargan en el chat.\"],\"Fdp03t\":[\"activado\"],\"FfPWR0\":[\"Modal\"],\"FjkaiT\":[\"Alejar\"],\"FlqOE9\":[\"Qué significa esto:\"],\"FolHNl\":[\"Administra tu cuenta y autenticación\"],\"Fp2Dif\":[\"Salió del servidor\"],\"G5KmCc\":[\"GZ-Line (Z-Line global)\"],\"GDs0lz\":[\"<0>Riesgo:</0> La información sensible (mensajes, conversaciones privadas, datos de autenticación) podría quedar expuesta a administradores de red o atacantes situados entre los servidores IRC.\"],\"GR+2I3\":[\"Agregar máscara de invitación (p. ej., nick!*@*, *!*@host.com)\"],\"GRLyMU\":[\"Cerrar avisos del servidor desplegados\"],\"GdhD7H\":[\"Click again to confirm\"],\"GlHnXw\":[\"Cambio de apodo fallido: \",[\"error\"],\" \",[\"0\"]],\"GswZF3\":[\"Vista previa:\"],\"GtmO8/\":[\"de\"],\"GtuHUQ\":[\"Renombrar este canal en el servidor. Todos los usuarios verán el nuevo nombre.\"],\"GuGfFX\":[\"Alternar búsqueda\"],\"GxkJXS\":[\"Subiendo...\"],\"GzbwnK\":[\"Se unió al canal\"],\"GzsUDB\":[\"Perfil extendido\"],\"H/PnT8\":[\"Insertar emoji\"],\"H6Izzl\":[\"Tu código de color preferido\"],\"H9jIv+\":[\"Mostrar entradas/salidas\"],\"HAKBY9\":[\"Subir archivos\"],\"HdE1If\":[\"Canal\"],\"Hk4AW9\":[\"Tu nombre de visualización preferido\"],\"HmHDk7\":[\"Seleccionar miembro\"],\"HrQzPU\":[\"Canales en \",[\"networkName\"]],\"I2tXQ5\":[\"Mensaje a @\",[\"0\"],\" (Intro para nueva línea, Mayús+Intro para enviar)\"],\"I6bw/h\":[\"Banear usuario\"],\"I92Z+b\":[\"Activar notificaciones\"],\"I9D72S\":[\"¿Estás seguro de que deseas eliminar este mensaje? Esta acción no se puede deshacer.\"],\"IA+1wo\":[\"Mostrar cuando los usuarios son expulsados de los canales\"],\"IDwkJx\":[\"IRC Operator\"],\"ILlU+s\":[\"Info:\"],\"IUwGEM\":[\"Guardar cambios\"],\"IVeGK6\":[[\"0\"],\", \",[\"1\"],\" y \",[\"2\"],\" están escribiendo...\"],\"IgrLD/\":[\"Pausar\"],\"Im6JED\":[\"WHISPER\"],\"ImOQa9\":[\"Responder\"],\"IoHMnl\":[\"El valor máximo es \",[\"0\"]],\"IvMj+0\":[\"Op\"],\"J28zul\":[\"Conectando...\"],\"J5T9NW\":[\"Información del usuario\"],\"J8Y5+z\":[\"¡Vaya! ¡División de red! ⚠️\"],\"JBHkBA\":[\"Abandonó el canal\"],\"JCwL0Q\":[\"Ingresa un motivo (opcional)\"],\"JFciKP\":[\"Alternar\"],\"JXGkhG\":[\"Cambiar el nombre del canal (solo operadores)\"],\"JcD7qf\":[\"Más acciones\"],\"JdkA+c\":[\"Secreto (+s)\"],\"Jmu12l\":[\"Canales del servidor\"],\"JvQ++s\":[\"Activar Markdown\"],\"K2jwh/\":[\"No hay datos WHOIS disponibles\"],\"KAXSwC\":[\"Voz\"],\"KDfTdX\":[\"Eliminar mensaje\"],\"KKBlUU\":[\"Insertar\"],\"KM0pLb\":[\"¡Bienvenido al canal!\"],\"KR6W2h\":[\"Dejar de ignorar usuario\"],\"KV+Bi1\":[\"Solo por invitación (+i)\"],\"KdCtwE\":[\"Cuántos segundos monitorear la actividad de flood antes de restablecer los contadores\"],\"Kkezga\":[\"Contraseña del servidor\"],\"KsiQ/8\":[\"Los usuarios deben ser invitados para unirse al canal\"],\"L+gB/D\":[\"Información del canal\"],\"LC1a7n\":[\"El servidor IRC ha informado que sus enlaces entre servidores tienen un nivel de seguridad bajo. Esto significa que cuando tus mensajes se retransmiten entre servidores IRC en la red, es posible que no estén correctamente cifrados o que los certificados SSL/TLS no se validen correctamente.\"],\"LNfLR5\":[\"Mostrar expulsiones\"],\"LQb0W/\":[\"Mostrar todos los eventos\"],\"LU7/yA\":[\"Nombre alternativo para mostrar en la interfaz. Puede contener espacios, emoji y caracteres especiales. El nombre real del canal (\",[\"channelName\"],\") seguirá usándose para los comandos IRC.\"],\"LUb9O7\":[\"Se requiere un puerto de servidor válido\"],\"LV4fT6\":[\"Description (optional, e.g. \\\"Beta testers Q3\\\")\"],\"Lb+BUl\":[\"https://example.com/avatar.jpg\"],\"LcET2C\":[\"Política de privacidad\"],\"LcuSDR\":[\"Administra la información y metadatos de tu perfil\"],\"LqLS9B\":[\"Mostrar cambios de apodo\"],\"LsDQt2\":[\"Configuración del canal\"],\"LtI9AS\":[\"Propietario\"],\"LuNhhL\":[\"reaccionó a este mensaje\"],\"M/AZNG\":[\"URL de tu imagen de avatar\"],\"M/WIer\":[\"Enviar mensaje\"],\"M8er/5\":[\"Nombre:\"],\"MHk+7g\":[\"Imagen anterior\"],\"MRorGe\":[\"MP al usuario\"],\"MVbSGP\":[\"Ventana de tiempo (segundos)\"],\"MkpcsT\":[\"Tus mensajes y ajustes se almacenan localmente en tu dispositivo\"],\"N/hDSy\":[\"Marcar como bot, normalmente 'on' o vacío\"],\"N7TQbE\":[\"Invitar usuario a \",[\"channelName\"]],\"NCca/o\":[\"Ingresa apodo predeterminado...\"],\"Nqs6B9\":[\"Muestra todos los medios externos. Cualquier URL puede generar una solicitud a un servidor desconocido.\"],\"Nt+9O7\":[\"Usar WebSocket en lugar de TCP sin procesar\"],\"NxIHzc\":[\"Expulsar usuario\"],\"O+v/cL\":[\"Ver todos los canales del servidor\"],\"ODwSCk\":[\"Enviar un GIF\"],\"OGQ5kK\":[\"Configurar sonidos de notificación y resaltados\"],\"OIPt1Z\":[\"Mostrar u ocultar la barra lateral de miembros\"],\"OKSNq/\":[\"Muy estricto\"],\"ONWvwQ\":[\"Subir\"],\"OVKoQO\":[\"Tu contraseña de cuenta para autenticación\"],\"ObsidianIRC - Bringing IRC to the future\":[\"ObsidianIRC - Llevando IRC al futuro\"],\"OhCpra\":[\"Establece un tema…\"],\"OkltoQ\":[\"Banear a \",[\"username\"],\" por apodo (impide que vuelva a unirse con el mismo nick)\"],\"P+t/Te\":[\"Sin datos adicionales\"],\"P42Wcc\":[\"Seguro\"],\"PD38l0\":[\"Vista previa del avatar del canal\"],\"PD9mEt\":[\"Escribe un mensaje...\"],\"PPqfdA\":[\"Abrir configuración del canal\"],\"PSCjfZ\":[\"El tema que se mostrará para este canal. Todos los usuarios pueden ver el tema.\"],\"PZCecv\":[\"Vista previa de PDF\"],\"PeLgsC\":[[\"c\",\"plural\",{\"one\":[\"1 vez\"],\"other\":[[\"c\"],\" veces\"]}]],\"PguS2C\":[\"Agregar máscara de excepción (p. ej., nick!*@*, *!*@host.com)\"],\"Pil5Ty\":[\"Mostrando \",[\"displayedChannelsCount\"],\" de \",[\"0\"],\" canales\"],\"PqhVlJ\":[\"Banear usuario (por hostmask)\"],\"Q+chwU\":[\"Nombre de usuario:\"],\"Q2QY4/\":[\"Delete this invite\"],\"Q6hhn8\":[\"Preferencias\"],\"QF4a34\":[\"Por favor, introduce un nombre de usuario\"],\"QGqSZ2\":[\"Color y formato\"],\"QJQd1J\":[\"Editar perfil\"],\"QSzGDE\":[\"Inactivo\"],\"QUlny5\":[\"¡Bienvenido a \",[\"0\"],\"!\"],\"Qoq+GP\":[\"Leer más\"],\"QuSkCF\":[\"Filtrar canales...\"],\"QwUrDZ\":[\"cambió el tema a: \",[\"topic\"]],\"R0UH07\":[\"Imagen \",[\"0\"],\" de \",[\"1\"]],\"R7SsBE\":[\"Silenciar\"],\"R8rf1X\":[\"Haz clic para establecer el tema\"],\"RArB3D\":[\"fue expulsado de \",[\"channelName\"],\" por \",[\"username\"]],\"RI3cWd\":[\"Descubre el mundo de IRC con ObsidianIRC\"],\"RIfHS5\":[\"Create a new invite link\"],\"RMMaN5\":[\"Moderado (+m)\"],\"RWw9Lg\":[\"Cerrar ventana\"],\"RZ2BuZ\":[\"Se requiere verificación para el registro de la cuenta \",[\"account\"],\": \",[\"message\"]],\"RySp6q\":[\"Ocultar comentarios\"],\"SPKQTd\":[\"El apodo es obligatorio\"],\"SPVjfj\":[\"Por defecto será 'sin motivo' si se deja vacío\"],\"SQKPvQ\":[\"Invitar usuario\"],\"SkZcl+\":[\"Elige un perfil de protección contra flood predefinido. Estos perfiles ofrecen configuraciones de protección equilibradas para diferentes casos de uso.\"],\"Slr+3C\":[\"Mínimo de usuarios\"],\"Spnlre\":[\"Has invitado a \",[\"target\"],\" a unirse a \",[\"channel\"]],\"T/ckN5\":[\"Abrir en el visor\"],\"T91vKp\":[\"Reproducir\"],\"TV2Wdu\":[\"Conoce cómo gestionamos tus datos y protegemos tu privacidad.\"],\"TgFpwD\":[\"Aplicando...\"],\"TkzSFB\":[\"Sin cambios\"],\"TtserG\":[\"Ingresa el nombre real\"],\"Ttz9J1\":[\"Ingresa contraseña...\"],\"Tz0i8g\":[\"Ajustes\"],\"U3pytU\":[\"Admin\"],\"UDb2YD\":[\"Reaccionar\"],\"UE4KO5\":[\"*channel*\"],\"UETAwW\":[\"You haven't created any invite links yet. Use the form above to mint your first one.\"],\"UGT5vp\":[\"Guardar configuración\"],\"UV5hLB\":[\"No se encontraron bans\"],\"Uaj3Nd\":[\"Mensajes de estado\"],\"Ue3uny\":[\"Predeterminado (sin perfil)\"],\"UkARhe\":[\"Normal – Protección estándar\"],\"Umn7Cj\":[\"Aún no hay comentarios. ¡Sé el primero!\"],\"UtUIRh\":[[\"0\"],\" mensajes anteriores\"],\"UwzP+U\":[\"Conexión segura\"],\"V0/A4O\":[\"Propietario del canal\"],\"V4qgxE\":[\"Creado hace menos de (min)\"],\"V8yTm6\":[\"Limpiar búsqueda\"],\"VJMMyz\":[\"ObsidianIRC - Llevando IRC al futuro\"],\"VJScHU\":[\"Motivo\"],\"VLsmVV\":[\"Silenciar notificaciones\"],\"VbyRUy\":[\"Comentarios\"],\"Vmx0mQ\":[\"Establecido por:\"],\"VqnIZz\":[\"Ver nuestra política de privacidad y prácticas de datos\"],\"VrMygG\":[\"La longitud mínima es \",[\"0\"]],\"VrnTui\":[\"Tus pronombres, mostrados en tu perfil\"],\"W8E3qn\":[\"Cuenta autenticada\"],\"WAakm9\":[\"Eliminar canal\"],\"WFxTHC\":[\"Agregar máscara de ban (p. ej., nick!*@*, *!*@host.com)\"],\"WN1g9F\":[\"El host del servidor es obligatorio\"],\"WRYdXW\":[\"Posición del audio\"],\"WUOH5B\":[\"Ignorar usuario\"],\"WWEXnZ\":[[\"0\",\"plural\",{\"one\":[\"Mostrar 1 elemento más\"],\"other\":[\"Mostrar \",[\"1\"],\" elementos más\"]}]],\"WYxRzo\":[\"Create and manage your invite links\"],\"Wd38W1\":[\"Leave channel blank for a generic network invite. Description is just for your records — visible only to you in this list.\"],\"Weq9zb\":[\"General\"],\"Wfj7Sk\":[\"Silenciar o activar los sonidos de notificación\"],\"Wm7gbG\":[\"GitHub:\"],\"WyeHWY\":[\"*spam*\"],\"WzMCru\":[\"Perfil de usuario\"],\"X6S3lt\":[\"Buscar ajustes, canales, servidores...\"],\"XEHan5\":[\"Continuar de todos modos\"],\"XI1+wb\":[\"Formato no válido\"],\"XIXeuC\":[\"Mensaje a @\",[\"0\"]],\"XMS+k4\":[\"Iniciar mensaje privado\"],\"XWgxXq\":[\"Álbum\"],\"Xd7+IT\":[\"Desfijar chat privado\"],\"Xm/s+u\":[\"Pantalla\"],\"Xp2n93\":[\"Muestra medios desde el host de archivos de confianza de tu servidor. No se realizan solicitudes a servicios externos.\"],\"XvjC4F\":[\"Guardando...\"],\"Y/qryO\":[\"No se encontraron usuarios que coincidan con tu búsqueda\"],\"YAqRpI\":[\"Registro de cuenta exitoso para \",[\"account\"],\": \",[\"message\"]],\"YEfzvP\":[\"Tema protegido (+t)\"],\"YQOn6a\":[\"Contraer lista de miembros\"],\"YRCoE9\":[\"Operador del canal\"],\"YURQaF\":[\"Ver perfil\"],\"YdBSvr\":[\"Controlar la visualización de medios y contenido externo\"],\"Yj6U3V\":[\"Sin servidor central:\"],\"YjvpGx\":[\"Pronombres\"],\"YqH4l4\":[\"Sin clave\"],\"YyUPpV\":[\"Cuenta:\"],\"ZJSWfw\":[\"Mensaje al desconectarse del servidor\"],\"ZR1dJ4\":[\"Invitaciones\"],\"ZdWg0V\":[\"Abrir en el navegador\"],\"ZhRBbl\":[\"Buscar mensajes…\"],\"Zmcu3y\":[\"Filtros avanzados\"],\"a2/8e5\":[\"Tema establecido hace más de (min)\"],\"aHKcKc\":[\"Página anterior\"],\"aJTbXX\":[\"Contraseña de oper\"],\"aQryQv\":[\"El patrón ya existe\"],\"aW9pLN\":[\"Número máximo de usuarios permitidos en el canal. Deja vacío para no establecer límite.\"],\"ah4fmZ\":[\"También muestra vistas previas de YouTube, Vimeo, SoundCloud y servicios conocidos similares.\"],\"aifXak\":[\"No hay medios en este canal\"],\"ap2zBz\":[\"Relajado\"],\"az8lvo\":[\"Desactivado\"],\"azXSNo\":[\"Expandir lista de miembros\"],\"azdliB\":[\"Iniciar sesión en una cuenta\"],\"b26wlF\":[\"ella/la\"],\"bD/+Ei\":[\"Estricto\"],\"bQ6BJn\":[\"Configura reglas detalladas de protección contra flood. Cada regla especifica qué tipo de actividad monitorear y qué acción tomar cuando se superan los umbrales.\"],\"beV7+y\":[\"El usuario recibirá una invitación para unirse a \",[\"channelName\"],\".\"],\"bk84cH\":[\"Mensaje de ausencia\"],\"bkHdLj\":[\"Agregar servidor IRC\"],\"bmQLn5\":[\"Añadir regla\"],\"bwRvnp\":[\"Acción\"],\"c8+EVZ\":[\"Cuenta verificada\"],\"cGYUlD\":[\"No se carga ninguna vista previa de medios.\"],\"cLF98o\":[\"Mostrar comentarios (\",[\"commentCount\"],\")\"],\"cLKIDO\":[\"No hay usuarios disponibles\"],\"cSgpoS\":[\"Fijar chat privado\"],\"cde3ce\":[\"Mensaje a <0>\",[\"0\"],\"</0>\"],\"chQsxg\":[\"Copiar salida formateada\"],\"cl/A5J\":[\"¡Bienvenido a \",[\"__DEFAULT_IRC_SERVER_NAME__\"],\"!\"],\"cnGeoo\":[\"Eliminar\"],\"coPLXT\":[\"No almacenamos tus comunicaciones IRC en nuestros servidores\"],\"crYH/6\":[\"Reproductor de SoundCloud\"],\"d3sis4\":[\"Agregar servidor\"],\"d9aN5k\":[\"Eliminar a \",[\"username\"],\" del canal\"],\"dEgA5A\":[\"Cancelar\"],\"dGi1We\":[\"Desfijar esta conversación de mensaje privado\"],\"dJVuyC\":[\"salió de \",[\"channelName\"],\" (\",[\"reason\"],\")\"],\"dMtLDE\":[\"a\"],\"dXqxlh\":[\"<0>⚠️ ¡Riesgo de seguridad!</0> Esta conexión puede ser vulnerable a intercepciones o ataques de intermediario.\"],\"da9Q/R\":[\"Modos del canal cambiados\"],\"dhJN3N\":[\"Mostrar comentarios\"],\"dj2xTE\":[\"Descartar notificación\"],\"dpCzmC\":[\"Configuración de protección contra flood\"],\"e9dQpT\":[\"¿Deseas abrir este enlace en una nueva pestaña?\"],\"ePK91l\":[\"Editar\"],\"eYBDuB\":[\"Sube una imagen o proporciona una URL con sustitución opcional de \",[\"size\"],\" para tamaño dinámico\"],\"edBbee\":[\"Banear a \",[\"username\"],\" por hostmask (impide que vuelva a unirse desde la misma IP/host)\"],\"ekfzWq\":[\"Configuración de usuario\"],\"elPDWs\":[\"Personaliza tu experiencia con el cliente IRC\"],\"eu2osY\":[\"<0>💡 Recomendación:</0> Continúa solo si confías en este servidor y entiendes los riesgos. Evita compartir información sensible o contraseñas a través de esta conexión.\"],\"euEhbr\":[\"Haz clic para unirte a \",[\"channel\"]],\"ez3vLd\":[\"Activar entrada multilínea\"],\"f0J5Ki\":[\"La comunicación entre servidores puede usar conexiones sin cifrar\"],\"f9BHJk\":[\"Advertir al usuario\"],\"fDOLLd\":[\"No se encontraron canales.\"],\"ffzDkB\":[\"Analíticas anónimas:\"],\"fq1GF9\":[\"Mostrar cuando los usuarios se desconectan del servidor\"],\"gEF57C\":[\"Este servidor solo admite un tipo de conexión\"],\"gJuLUI\":[\"Lista de ignorados\"],\"gNzMrk\":[\"Avatar actual\"],\"gjPWyO\":[\"Ingresa tu apodo...\"],\"gz6UQ3\":[\"Maximizar\"],\"h6razj\":[\"Excluir máscara de nombre de canal\"],\"hG6jnw\":[\"Sin tema establecido\"],\"hG89Ed\":[\"Imagen\"],\"hYgDIe\":[\"Create\"],\"hZ6znB\":[\"Puerto\"],\"ha+Bz5\":[\"ej., 100:1440\"],\"he3ygx\":[\"Copy\"],\"hehnjM\":[\"Cantidad\"],\"hzdLuQ\":[\"Solo los usuarios con Voice o superior pueden hablar\"],\"i0qMbr\":[\"Inicio\"],\"iDNBZe\":[\"Notificaciones\"],\"iH8pgl\":[\"Atrás\"],\"iL9SZg\":[\"Banear usuario (por apodo)\"],\"iNt+3c\":[\"Volver a la imagen\"],\"iQvi+a\":[\"No advertirme sobre la baja seguridad de enlaces para este servidor\"],\"iSLIjg\":[\"Conectar\"],\"iWXkHH\":[\"Halfop\"],\"iZeTtp\":[\"Host del servidor\"],\"idD8Ev\":[\"Guardado\"],\"iivqkW\":[\"Conectado desde\"],\"ij+Elv\":[\"Vista previa de imagen\"],\"ilIWp7\":[\"Alternar notificaciones\"],\"iuaqvB\":[\"Usa * como comodín. Ejemplos: baduser!*@*, *!*@spammer.com, troll*!*@*\"],\"ixkTse\":[\"Bot\"],\"j2DGR0\":[\"Banear por hostmask\"],\"jA4uoI\":[\"Tema:\"],\"jLXxGK\":[\"https://example.com\"],\"jPSk57\":[\"Motivo (opcional)\"],\"jUV7CU\":[\"Subir avatar\"],\"jW5Uwh\":[\"Controla cuántos medios externos se cargan. Desactivado / Seguro / Fuentes confiables / Todo el contenido.\"],\"jXzms5\":[\"Opciones de adjunto\"],\"jZlrte\":[\"Color\"],\"jfC/xh\":[\"Contacto\"],\"jywMpv\":[\"#new-channel-name\"],\"k112DD\":[\"Cargar mensajes anteriores\"],\"k3ID0F\":[\"Filtrar miembros…\"],\"k65gsE\":[\"Ver en detalle\"],\"k7Zgob\":[\"Cancelar conexión\"],\"kAVx5h\":[\"No se encontraron invitaciones\"],\"kCLEPU\":[\"Conectado a\"],\"kF5LKb\":[\"Patrones ignorados:\"],\"kGeOx/\":[\"Unirse a \",[\"0\"]],\"kITKr8\":[\"Cargando modos del canal...\"],\"kPpPsw\":[\"Eres un IRC Operator\"],\"kWJmRL\":[\"Tú\"],\"kfcRb0\":[\"Avatar\"],\"kjMqSj\":[\"Copiar JSON\"],\"krViRy\":[\"Clic para copiar como JSON\"],\"ks71ra\":[\"Excepciones\"],\"kw4lRv\":[\"Medio operador del canal\"],\"kxgIRq\":[\"Selecciona o agrega un canal para comenzar.\"],\"ky6dWe\":[\"Vista previa del avatar\"],\"l+GxCv\":[\"Cargando canales...\"],\"l+IUVW\":[\"Verificación de cuenta exitosa para \",[\"account\"],\": \",[\"message\"]],\"l/siQz\":[[\"reconnectCount\",\"plural\",{\"one\":[\"se reconectó\"],\"other\":[\"se reconectó \",[\"reconnectCount\"],\" veces\"]}]],\"l1l8sj\":[[\"0\"],\"d ago\"],\"l5NhnV\":[\"#channel (optional)\"],\"l5jmzx\":[[\"0\"],\" y \",[\"1\"],\" están escribiendo...\"],\"lCF0wC\":[\"Refresh\"],\"lHy8N5\":[\"Cargando más canales...\"],\"lasgrr\":[\"used\"],\"lbpf14\":[\"Unirse a \",[\"value\"]],\"lfFsZ4\":[\"Canales\"],\"lkNdiH\":[\"Nombre de cuenta\"],\"ln500L\":[\"ObsidianIRC\"],\"lnCMdg\":[\"Subir imagen\"],\"loQxaJ\":[\"He vuelto\"],\"lvfaxv\":[\"INICIO\"],\"m16xKo\":[\"Agregar\"],\"m8flAk\":[\"Vista previa (aún no subido)\"],\"mEPxTp\":[\"<0>⚠️ ¡Ten cuidado!</0> Solo abre enlaces de fuentes de confianza. Los enlaces maliciosos pueden comprometer tu seguridad o privacidad.\"],\"mHGdhG\":[\"Información del servidor\"],\"mHS8lb\":[\"Mensaje en #\",[\"0\"]],\"mMYBD9\":[\"Amplio – Ámbito de protección más amplio\"],\"mTGsPd\":[\"Tema del canal\"],\"mU8j6O\":[\"Sin mensajes externos (+n)\"],\"mZp8FL\":[\"Retorno automático a línea única\"],\"mdQu8G\":[\"TuApodo\"],\"miSSBQ\":[\"Comentarios (\",[\"commentCount\"],\")\"],\"mvyLSy\":[\"El usuario está autenticado\"],\"mwtcGl\":[\"Cerrar comentarios\"],\"mzI/c+\":[\"Descargar\"],\"n3fGRk\":[\"establecido por \",[\"0\"]],\"nE9jsU\":[\"Relajado – Protección menos agresiva\"],\"nNflMD\":[\"Salir del canal\"],\"nPXkBi\":[\"Cargando datos WHOIS...\"],\"nQnxxF\":[\"Mensaje en #\",[\"0\"],\" (Mayús+Intro para nueva línea)\"],\"nWMRxa\":[\"Desfijar\"],\"nkC032\":[\"Sin perfil de flood\"],\"o69z4d\":[\"Enviar un mensaje de advertencia a \",[\"username\"]],\"o9ylQi\":[\"Busca GIFs para empezar\"],\"oFGkER\":[\"Avisos del servidor\"],\"oOi11l\":[\"Ir al final\"],\"oPYIL5\":[\"network\"],\"oQEzQR\":[\"Nuevo mensaje directo\"],\"oXOSPE\":[\"En línea\"],\"oal760\":[\"Son posibles ataques de intermediario en los enlaces del servidor\"],\"oeqmmJ\":[\"Fuentes de confianza\"],\"optX0N\":[[\"0\"],\"h ago\"],\"ovBPCi\":[\"Predeterminado\"],\"p0Z69r\":[\"El patrón no puede estar vacío\"],\"p1KgtK\":[\"Error al cargar el audio\"],\"p59pEv\":[\"Detalles adicionales\"],\"p7sRI6\":[\"Avisar a otros cuando estás escribiendo\"],\"pBm1od\":[\"Canal secreto\"],\"pNmiXx\":[\"Tu apodo predeterminado para todos los servidores\"],\"pUUo9G\":[\"Hostname:\"],\"pVGPmz\":[\"Contraseña de la cuenta\"],\"peNE68\":[\"Permanente\"],\"plhHQt\":[\"Sin datos\"],\"pm6+q5\":[\"Advertencia de seguridad\"],\"pn5qSs\":[\"Información adicional\"],\"q0cR4S\":[\"ahora se llama **\",[\"newNick\"],\"**\"],\"qFcunY\":[\"El canal no aparecerá en los comandos LIST ni NAMES\"],\"qLpTm/\":[\"Eliminar reacción \",[\"emoji\"]],\"qVkGWK\":[\"Fijar\"],\"qY8wNa\":[\"Página de inicio\"],\"qb0xJ7\":[\"Usa comodines: * coincide con cualquier secuencia, ? coincide con cualquier carácter individual. Ejemplos: nick!*@*, *!*@host.com, *!*user@*\"],\"qhzpRq\":[\"Clave del canal (+k)\"],\"qtoOYG\":[\"Sin límite\"],\"r1W2AS\":[\"Imagen del servidor de archivos\"],\"rIPR2O\":[\"Tema establecido hace menos de (min)\"],\"rMMSYo\":[\"La longitud máxima es \",[\"0\"]],\"rWtzQe\":[\"La red se dividió y se reconectó. ✅\"],\"rYG2u6\":[\"Por favor espera...\"],\"rdUucN\":[\"Vista previa\"],\"rjGI/Q\":[\"Privacidad\"],\"rk8iDX\":[\"Cargando GIFs...\"],\"rn6SBY\":[\"Activar sonido\"],\"s/UKqq\":[\"Fue expulsado del canal\"],\"s8cATI\":[\"se unió a \",[\"channelName\"]],\"sCO9ue\":[\"La conexión a <0>\",[\"serverName\"],\"</0> presenta los siguientes problemas de seguridad:\"],\"sGH11W\":[\"Servidor\"],\"sHI1H+\":[\"ahora se llama **\",[\"newNick\"],\"**\"],\"sJyV04\":[[\"inviter\"],\" te ha invitado a unirte a \",[\"channel\"]],\"sby+1/\":[\"Haz clic para copiar\"],\"sfN25C\":[\"Tu nombre real o completo\"],\"sliuzR\":[\"Abrir enlace\"],\"sqrO9R\":[\"Menciones personalizadas\"],\"sr6RdJ\":[\"Multilínea con Shift+Enter\"],\"swrCpB\":[\"El canal ha sido renombrado de \",[\"oldName\"],\" a \",[\"newName\"],\" por \",[\"user\"],[\"0\"]],\"sxkWRg\":[\"Avanzado\"],\"t/YqKh\":[\"Eliminar\"],\"t47eHD\":[\"Tu identificador único en este servidor\"],\"tAkAh0\":[\"URL con sustitución opcional de \",[\"size\"],\" para tamaño dinámico. Ejemplo: https://example.com/avatar/\",[\"size\"],\"/channel.jpg\"],\"tXLJS3\":[\"Mostrar u ocultar la barra lateral de canales\"],\"tfDRzk\":[\"Guardar\"],\"tiBsJk\":[\"salió de \",[\"channelName\"]],\"tt4/UD\":[\"salió (\",[\"reason\"],\")\"],\"u0TcnO\":[\"El apodo {nick} ya está en uso, reintentando con {newNick}\"],\"u0a8B4\":[\"Autenticarse como operador IRC para acceso administrativo\"],\"u0rWFU\":[\"Creado hace más de (min)\"],\"u72w3t\":[\"Usuarios y patrones a ignorar\"],\"u7jc2L\":[\"salió\"],\"uAQUqI\":[\"Estado\"],\"uB85T3\":[\"Error al guardar: \",[\"msg\"]],\"uV3DOL\":[\"G-Line\"],\"uW3lLI\":[\"Servidores IRC:\"],\"ukyW4o\":[\"Your invite links\"],\"usSSr/\":[\"Nivel de zoom\"],\"v7uvcf\":[\"Software:\"],\"vE8kb+\":[\"Shift+Enter para nuevas líneas (Enter envía)\"],\"vERlcd\":[\"Perfil\"],\"vK0RL8\":[\"Sin tema\"],\"vSJd18\":[\"Video\"],\"vXIe7J\":[\"Idioma\"],\"vaHYxN\":[\"Nombre real\"],\"vhjbKr\":[\"Ausente\"],\"w4NYox\":[\"cliente \",[\"title\"]],\"w8xQRx\":[\"Valor no válido\"],\"wFjjxZ\":[\"fue expulsado de \",[\"channelName\"],\" por \",[\"username\"],\" (\",[\"reason\"],\")\"],\"wGjaGl\":[\"No se encontraron excepciones de ban\"],\"wPrGnM\":[\"Administrador del canal\"],\"wRkP2d\":[\"GIF\"],\"wbm86v\":[\"Mostrar cuando los usuarios entran o salen de canales\"],\"whqZ9r\":[\"Palabras o frases adicionales para resaltar\"],\"wm7RV4\":[\"Sonido de notificación\"],\"wz/Yoq\":[\"Tus mensajes podrían ser interceptados al retransmitirse entre servidores\"],\"x3+y8b\":[\"This many people registered through this link\"],\"xCJdfg\":[\"Limpiar\"],\"xOTzt5\":[\"just now\"],\"xUHRTR\":[\"Autenticarse automáticamente como operador al conectar\"],\"xWHwwQ\":[\"Bans\"],\"xYilR2\":[\"Medios\"],\"xbi8D6\":[\"This server doesn't support invite links (the<0>obby.world/invitation</0>capability isn't advertised). You can still chat normally; this panel is for obbyircd-powered networks.\"],\"xceQrO\":[\"Solo se admiten websockets seguros\"],\"xdtXa+\":[\"nombre-del-canal\"],\"xfXC7q\":[\"Canales de texto\"],\"xlCYOE\":[\"Cargando más mensajes...\"],\"xlhswE\":[\"El valor mínimo es \",[\"0\"]],\"xq97Ci\":[\"Agregar una palabra o frase...\"],\"xuRqRq\":[\"Límite de usuarios (+l)\"],\"xwF+7J\":[[\"0\"],\" está escribiendo...\"],\"y1eoq1\":[\"Copy link\"],\"yNeucF\":[\"Este servidor no admite metadatos de perfil extendido (extensión IRCv3 METADATA). Los campos adicionales como avatar, nombre a mostrar y estado no están disponibles.\"],\"yPlrca\":[\"Avatar del canal\"],\"yQE2r9\":[\"Cargando\"],\"ySU+JY\":[\"tu@correo.com\"],\"yTX1Rt\":[\"Nombre de usuario Oper\"],\"yYOzWD\":[\"registros\"],\"yfx9Re\":[\"Contraseña de operador IRC\"],\"ygCKqB\":[\"Detener\"],\"ymDxJx\":[\"Nombre de usuario de operador IRC\"],\"yrpRsQ\":[\"Ordenar por nombre\"],\"yz7wBu\":[\"Cerrar\"],\"zJw+jA\":[\"establece modo: \",[\"0\"]],\"zbymaY\":[[\"0\"],\"m ago\"],\"zebeLu\":[\"Ingresa el nombre de usuario de oper\"],\"zpr0Bw\":[\"GZ-Line\"]}"); No newline at end of file
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Spanish invite-link strings are still untranslated.

This bundle includes many new invite-link entries left in English ("Confirm?", "Click again to confirm", "Create", "Refresh", "Copy link", "No server is selected...", etc.), so the new Invitations UI is not actually localized for es.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/locales/es/messages.mjs` at line 1, The Spanish messages JSON still
contains invite-link UI strings in English; locate the entries by their unique
keys (e.g. "/AkXyp" -> "Confirm?", "GdhD7H" -> "Click again to confirm",
"hYgDIe" -> "Create", "lCF0wC" -> "Refresh", "y1eoq1" -> "Copy link", "BPm98R"
-> "No server is selected. Pick a server from the sidebar first; invite links
are managed per-server.", etc.) and replace the English text with proper Spanish
translations, preserving any placeholders/array structures and escaping so the
outer JSON.parse string remains valid; after updating these keys (and any other
invite-link related keys left in English) re-validate the JSON string and run
the localization/lint tests.

Comment on lines +69 to +82
#. placeholder {0}: Math.floor(secs / 86400)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}d ago"
msgstr ""

#. placeholder {0}: Math.floor(secs / 3600)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}h ago"
msgstr ""

#. placeholder {0}: Math.floor(secs / 60)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}m ago"
msgstr ""
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Complete the missing Spanish translations before merge.

Many new Invitations strings were added with empty msgstr "", so Spanish users will see untranslated text in this feature.

As per coding guidelines, "When adding new user-visible strings, translate them before committing — run npm run i18n:extract to identify missing strings, then fill in all empty msgstr \"\" entries across every non-English .po file before committing".

Also applies to: 116-118, 564-567, 665-667, 710-712, 726-728, 734-745, 815-817, 823-825, 1276-1278, 1314-1316, 1554-1556, 1667-1669, 2017-2020, 2444-2454, 2602-2604, 2795-2797, 2815-2817

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/locales/es/messages.po` around lines 69 - 82, Several Spanish
translations are missing for new Invitation UI strings (e.g. msgid "{0}d ago",
"{0}h ago", "{0}m ago" used in InvitationsPanel.tsx); populate the empty msgstr
"" entries with accurate Spanish equivalents (preserving placeholders like {0})
for these msgids and all other reported ranges (e.g., lines listed in the
comment). Run npm run i18n:extract to list missing translations, update every
non-English .po file's empty msgstr entries accordingly, ensure placeholder
order/format remains unchanged, and save the updated .po files before merging.

Comment on lines +69 to +82
#. placeholder {0}: Math.floor(secs / 86400)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}d ago"
msgstr ""

#. placeholder {0}: Math.floor(secs / 3600)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}h ago"
msgstr ""

#. placeholder {0}: Math.floor(secs / 60)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}m ago"
msgstr ""
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fill all new Polish invite-link translations before merge.

These new msgid entries are committed with empty msgstr values, so the Polish locale will fall back to untranslated strings in the new Invitations UI.

As per coding guidelines, "When adding new user-visible strings, translate them before committing — run npm run i18n:extract to identify missing strings, then fill in all empty msgstr "" entries across every non-English .po file before committing".

Also applies to: 116-118, 564-567, 665-668, 710-713, 726-729, 734-745, 815-818, 823-826, 1276-1279, 1314-1317, 1554-1557, 1667-1670, 2017-2021, 2444-2455, 2602-2605, 2795-2798, 2815-2818

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/locales/pl/messages.po` around lines 69 - 82, Add Polish translations for
the new invite-link time strings that were left empty: set msgstr for "{0}d
ago", "{0}h ago", and "{0}m ago" (the msgid strings used by
src/components/ui/InvitationsPanel.tsx) in src/locales/pl/messages.po; run the
i18n extraction command (npm run i18n:extract) to locate any other empty msgstr
entries listed in the review and fill them all consistently, preserving the
placeholder {0} in each translation.

@@ -1 +1 @@
/*eslint-disable*/export const messages=JSON.parse("{\"+5VMrz\":[\"Formato de padrão inválido. Use o formato nick!user@host (curingas * permitidos)\"],\"+6NQQA\":[\"Canal de Suporte Geral\"],\"+6NyRG\":[\"Cliente\"],\"+K0AvT\":[\"Desconectar\"],\"+cyFdH\":[\"Mensagem padrão ao marcar-se como ausente\"],\"+mVPqU\":[\"Renderizar formatação Markdown nas mensagens\"],\"+vqCJH\":[\"Seu nome de usuário de conta para autenticação\"],\"+yPBXI\":[\"Escolher arquivo\"],\"+zy2Nq\":[\"Tipo\"],\"/09cao\":[\"Baixa Segurança de Link (Nível \",[\"securityLevel\"],\")\"],\"/3BQ4J\":[\"Usuários fora do canal não podem enviar mensagens\"],\"/6BzZF\":[\"Alternar Lista de Membros\"],\"/TNOPk\":[\"O usuário está ausente\"],\"/XQgft\":[\"Descobrir\"],\"/cF7Rs\":[\"Volume\"],\"/dqduX\":[\"Próxima página\"],\"/fc3q4\":[\"Todo o Conteúdo\"],\"/kISDh\":[\"Ativar sons de notificação\"],\"/n04sB\":[\"Kill\"],\"/rTz0M\":[\"Áudio\"],\"/rfkZe\":[\"Reproduzir sons para menções e mensagens\"],\"0/0ZGA\":[\"Máscara do nome do canal\"],\"0D6j7U\":[\"Saiba mais sobre regras personalizadas →\"],\"0XsHcR\":[\"Expulsar Usuário\"],\"0ZpE//\":[\"Ordenar por usuários\"],\"0bEPwz\":[\"Definir como Ausente\"],\"0dGkPt\":[\"Expandir lista de canais\"],\"0gS7M5\":[\"Nome de exibição\"],\"0kS+M8\":[\"ExemploREDE\"],\"0rgoY7\":[\"Conectar apenas a servidores que você escolher\"],\"0wdd7X\":[\"Entrar\"],\"0wkVYx\":[\"Mensagens privadas\"],\"111uHX\":[\"Visualização do link\"],\"196EG4\":[\"Excluir Conversa Privada\"],\"1DSr1i\":[\"Registrar uma conta\"],\"1O/24y\":[\"Alternar Lista de Canais\"],\"1VPJJ2\":[\"Aviso de Link Externo\"],\"1ZC/dv\":[\"Nenhuma menção ou mensagem não lida\"],\"1pO1zi\":[\"Nome do servidor é obrigatório\"],\"1uwfzQ\":[\"Ver Tópico do Canal\"],\"268g7c\":[\"Digite o nome de exibição\"],\"2FOFq1\":[\"Operadores de servidor na rede podem potencialmente ler suas mensagens\"],\"2FYpfJ\":[\"Mais\"],\"2HF1Y2\":[[\"inviter\"],\" convidou \",[\"target\"],\" para entrar em \",[\"channel\"]],\"2I70QL\":[\"Ver informações do perfil do usuário\"],\"2QYdmE\":[\"Usuários:\"],\"2QpEjG\":[\"saiu\"],\"2YE223\":[\"Mensagem #\",[\"0\"],\" (Enter para nova linha, Shift+Enter para enviar)\"],\"2bimFY\":[\"Usar senha do servidor\"],\"2iTmdZ\":[\"Armazenamento local:\"],\"2odkwe\":[\"Estrito – Proteção mais agressiva\"],\"2uDhbA\":[\"Digite o nome de usuário para convidar\"],\"2ygf/L\":[\"← Voltar\"],\"2zEgxj\":[\"Pesquisar GIFs...\"],\"3RdPhl\":[\"Renomear Canal\"],\"3THokf\":[\"Usuário com voz\"],\"3TSz9S\":[\"Minimizar\"],\"3jBDvM\":[\"Nome de exibição do canal\"],\"3ryuFU\":[\"Relatórios de falha opcionais para melhorar o app\"],\"3uBF/8\":[\"Fechar visualizador\"],\"3uwW8F\":[\"https://example.com/avatar/\",[\"size\"],\"/channel.jpg\"],\"3xf8Kz\":[\"Inserir nome da conta...\"],\"4/Rr0R\":[\"Convidar um usuário para o canal atual\"],\"4EZrJN\":[\"Regras\"],\"4JJtW9\":[\"#overflow\"],\"4NqeT4\":[\"Perfil de flood (+F)\"],\"4RZQRK\":[\"O que você está fazendo?\"],\"4hfTrB\":[\"Apelido\"],\"4n99LO\":[\"Já em \",[\"0\"]],\"4t6vMV\":[\"Mudar automaticamente para linha única em mensagens curtas\"],\"4vsHmf\":[\"Tempo (min)\"],\"5+INAX\":[\"Destacar mensagens que mencionam você\"],\"5R5Pv/\":[\"Nome Oper\"],\"678PKt\":[\"Nome da Rede\"],\"6Aih4U\":[\"Offline\"],\"6CO3WE\":[\"Senha necessária para entrar no canal. Deixe vazio para remover a chave.\"],\"6HhMs3\":[\"Mensagem de saída\"],\"6V3Ea3\":[\"Copiado\"],\"6lGV3K\":[\"Mostrar menos\"],\"6yFOEi\":[\"Inserir senha do oper...\"],\"7+IHTZ\":[\"Nenhum arquivo escolhido\"],\"73hrRi\":[\"nick!user@host (ex.: spam*!*@*, *!*@badhost.com)\"],\"7QkKyN\":[\"Enviar mensagem privada\"],\"7U1W7c\":[\"Muito Relaxado\"],\"7Y1YQj\":[\"Nome real:\"],\"7YHArF\":[\"— abrir no visualizador\"],\"7fjnVl\":[\"Pesquisar usuários...\"],\"7jL88x\":[\"Excluir esta mensagem? Esta ação não pode ser desfeita.\"],\"7nGhhM\":[\"O que você está pensando?\"],\"7sEpu1\":[\"Membros — \",[\"0\"]],\"7sNhEz\":[\"Nome de usuário\"],\"8H0Q+x\":[\"Saiba mais sobre perfis →\"],\"8Phu0A\":[\"Exibir quando usuários mudam seu apelido\"],\"8XTG9e\":[\"Digite a senha oper\"],\"8XsV2J\":[\"Tentar enviar novamente\"],\"8ZsakT\":[\"Senha\"],\"8kR84m\":[\"Você está prestes a abrir um link externo:\"],\"8lCgih\":[\"Remover regra\"],\"8p/xVT\":[[\"0\",\"plural\",{\"one\":[[\"1\"]],\"other\":[[\"2\"]]}]],\"8wRzac\":[[\"joinCount\",\"plural\",{\"one\":[\"entrou\"],\"other\":[\"entrou \",[\"joinCount\"],\" vezes\"]}]],\"9BMLnJ\":[\"Reconectar ao servidor\"],\"9OEgyT\":[\"Adicionar reação\"],\"9PQ8m2\":[\"G-Line (ban global)\"],\"9Qs99X\":[\"E-mail:\"],\"9QupBP\":[\"Remover padrão\"],\"9bG48P\":[\"Enviando\"],\"9f5f0u\":[\"Dúvidas sobre privacidade? Entre em contato:\"],\"9unqs3\":[\"Ausente:\"],\"9v3hwv\":[\"Nenhum servidor encontrado.\"],\"9zb2WA\":[\"Conectando\"],\"A1taO8\":[\"Pesquisar\"],\"A2adVi\":[\"Enviar notificações de digitação\"],\"A9Rhec\":[\"Nome do canal\"],\"AWOSPo\":[\"Ampliar\"],\"AXSpEQ\":[\"Oper ao conectar\"],\"AeXO77\":[\"Conta\"],\"AhNP40\":[\"Avançar\"],\"Ai2U7L\":[\"Host\"],\"AjBQnf\":[\"Apelido alterado\"],\"AmXVh6\":[\"https://example.com/avatar.png\"],\"AnRu/j\":[\"Cancelar resposta\"],\"ApSx0O\":[\"Encontradas \",[\"0\"],\" mensagens correspondentes a \\\"\",[\"searchQuery\"],\"\\\"\"],\"AxPAXW\":[\"Nenhum resultado encontrado\"],\"AyNqAB\":[\"Exibir todos os eventos do servidor no chat\"],\"B/QqGw\":[\"Longe do teclado\"],\"B8AaMI\":[\"Este campo é obrigatório\"],\"BA2c49\":[\"O servidor não suporta filtragem avançada de LIST\"],\"BDKt3I\":[[\"0\"],\", \",[\"1\"],\", \",[\"2\"],\" e mais \",[\"3\"],\" estão digitando...\"],\"BGul2A\":[\"Você tem alterações não salvas. Tem certeza que deseja fechar sem salvar?\"],\"BIf9fi\":[\"Sua mensagem de status\"],\"BZz3md\":[\"Seu site pessoal\"],\"Bgm/H7\":[\"Permitir inserção de múltiplas linhas de texto\"],\"BiQIl1\":[\"Fixar esta conversa de mensagem privada\"],\"BlNZZ2\":[\"Clique para ir à mensagem\"],\"Bowq3c\":[\"Apenas operadores podem alterar o tópico\"],\"Btozzp\":[\"Esta imagem expirou\"],\"Bycfjm\":[\"Total: \",[\"0\"]],\"C6IBQc\":[\"Copiar JSON completo\"],\"C9L9wL\":[\"Coleta de dados\"],\"CDq4wC\":[\"Moderar Usuário\"],\"CHVRxG\":[\"Mensagem @\",[\"0\"],\" (Shift+Enter para nova linha)\"],\"CN9zdR\":[\"Nome oper e senha são obrigatórios\"],\"CW3sYa\":[\"Adicionar reação \",[\"emoji\"]],\"CaAkqd\":[\"Mostrar desconexões\"],\"CbvaYj\":[\"Banir por apelido\"],\"CcK+Ft\":[\"PDF\"],\"Ce8q3L\":[\"Selecionar um canal\"],\"CsekCi\":[\"Normal\"],\"D+NlUC\":[\"Sistema\"],\"D28t6+\":[\"entrou e saiu\"],\"DB8zMK\":[\"Aplicar\"],\"DBcWHr\":[\"Arquivo de som de notificação personalizado\"],\"DTy9Xw\":[\"Pré-visualizações de mídia\"],\"Dj4pSr\":[\"Escolha uma senha segura\"],\"Du+zn+\":[\"Pesquisando...\"],\"Du2T2f\":[\"Configuração não encontrada\"],\"DwsSVQ\":[\"Aplicar filtros e atualizar\"],\"E3W/zd\":[\"Apelido padrão\"],\"E6nRW7\":[\"Copiar URL\"],\"E703RG\":[\"Modos:\"],\"EAeu1Z\":[\"Enviar convite\"],\"EFKJQT\":[\"Configuração\"],\"EGPQBv\":[\"Regras de flood personalizadas (+f)\"],\"ELik0r\":[\"Ver política de privacidade completa\"],\"EPbeC2\":[\"Ver ou editar o tópico do canal\"],\"EQCDNT\":[\"Inserir nome de usuário oper...\"],\"EUvulZ\":[\"Encontrada 1 mensagem correspondente a \\\"\",[\"searchQuery\"],\"\\\"\"],\"EatZYJ\":[\"Próxima imagem\"],\"EdQY6l\":[\"Nenhum\"],\"EnqLYU\":[\"Pesquisar servidores...\"],\"F0OKMc\":[\"Editar Servidor\"],\"F6Int2\":[\"Ativar destaques\"],\"FDoLyE\":[\"Usuários máx.\"],\"FUU/hZ\":[\"Controla quanto conteúdo de mídia externa é carregado no chat.\"],\"Fdp03t\":[\"ativo\"],\"FfPWR0\":[\"Modal\"],\"FjkaiT\":[\"Reduzir\"],\"FlqOE9\":[\"O que isso significa:\"],\"FolHNl\":[\"Gerenciar sua conta e autenticação\"],\"Fp2Dif\":[\"Saiu do servidor\"],\"G5KmCc\":[\"GZ-Line (Z-Line global)\"],\"GDs0lz\":[\"<0>Risco:</0> Informações sensíveis (mensagens, conversas privadas, dados de autenticação) podem ser expostas a administradores de rede ou atacantes posicionados entre servidores IRC.\"],\"GR+2I3\":[\"Adicionar máscara de convite (ex.: nick!*@*, *!*@host.com)\"],\"GRLyMU\":[\"Fechar avisos do servidor em destaque\"],\"GlHnXw\":[\"Falha ao alterar apelido: \",[\"error\"],\" \",[\"0\"]],\"GswZF3\":[\"Prévia:\"],\"GtmO8/\":[\"de\"],\"GtuHUQ\":[\"Renomear este canal no servidor. Todos os usuários verão o novo nome.\"],\"GuGfFX\":[\"Alternar pesquisa\"],\"GxkJXS\":[\"Enviando...\"],\"GzbwnK\":[\"Entrou no canal\"],\"GzsUDB\":[\"Perfil estendido\"],\"H/PnT8\":[\"Inserir emoji\"],\"H6Izzl\":[\"Seu código de cor preferido\"],\"H9jIv+\":[\"Mostrar entradas/saídas\"],\"HAKBY9\":[\"Enviar ficheiros\"],\"HdE1If\":[\"Canal\"],\"Hk4AW9\":[\"Seu nome de exibição preferido\"],\"HmHDk7\":[\"Selecionar Membro\"],\"HrQzPU\":[\"Canais em \",[\"networkName\"]],\"I2tXQ5\":[\"Mensagem @\",[\"0\"],\" (Enter para nova linha, Shift+Enter para enviar)\"],\"I6bw/h\":[\"Banir usuário\"],\"I92Z+b\":[\"Ativar notificações\"],\"I9D72S\":[\"Tem certeza que deseja excluir esta mensagem? Esta ação não pode ser desfeita.\"],\"IA+1wo\":[\"Exibir quando usuários são expulsos de canais\"],\"IDwkJx\":[\"IRC Operator\"],\"ILlU+s\":[\"Info:\"],\"IUwGEM\":[\"Salvar Alterações\"],\"IVeGK6\":[[\"0\"],\", \",[\"1\"],\" e \",[\"2\"],\" estão digitando...\"],\"IgrLD/\":[\"Pausar\"],\"Im6JED\":[\"WHISPER\"],\"ImOQa9\":[\"Responder\"],\"IoHMnl\":[\"O valor máximo é \",[\"0\"]],\"IvMj+0\":[\"Op\"],\"J28zul\":[\"Conectando...\"],\"J5T9NW\":[\"Informações do usuário\"],\"J8Y5+z\":[\"Ops! Divisão de rede! ⚠️\"],\"JBHkBA\":[\"Saiu do canal\"],\"JCwL0Q\":[\"Digite o motivo (opcional)\"],\"JFciKP\":[\"Alternar\"],\"JXGkhG\":[\"Alterar o nome do canal (apenas operadores)\"],\"JcD7qf\":[\"Mais ações\"],\"JdkA+c\":[\"Secreto (+s)\"],\"Jmu12l\":[\"Canais do Servidor\"],\"JvQ++s\":[\"Ativar Markdown\"],\"K2jwh/\":[\"Nenhum dado WHOIS disponível\"],\"KAXSwC\":[\"Voz\"],\"KDfTdX\":[\"Excluir mensagem\"],\"KKBlUU\":[\"Incorporar\"],\"KM0pLb\":[\"Bem-vindo ao canal!\"],\"KR6W2h\":[\"Deixar de ignorar usuário\"],\"KV+Bi1\":[\"Apenas por convite (+i)\"],\"KdCtwE\":[\"Quantos segundos monitorar a atividade de flood antes de redefinir os contadores\"],\"Kkezga\":[\"Senha do Servidor\"],\"KsiQ/8\":[\"Os usuários devem ser convidados para entrar no canal\"],\"L+gB/D\":[\"Informações do canal\"],\"LC1a7n\":[\"O servidor IRC relatou que seus links servidor a servidor têm um nível de segurança baixo. Isso significa que quando suas mensagens são retransmitidas entre servidores IRC na rede, elas podem não estar devidamente criptografadas ou os certificados SSL/TLS podem não ser validados corretamente.\"],\"LNfLR5\":[\"Mostrar expulsões\"],\"LQb0W/\":[\"Mostrar todos os eventos\"],\"LU7/yA\":[\"Nome alternativo para exibição. Pode conter espaços, emojis e caracteres especiais. O nome real (\",[\"channelName\"],\") ainda será usado para comandos IRC.\"],\"LUb9O7\":[\"Porta de servidor válida é obrigatória\"],\"Lb+BUl\":[\"https://example.com/avatar.jpg\"],\"LcET2C\":[\"Política de privacidade\"],\"LcuSDR\":[\"Gerenciar suas informações de perfil e metadados\"],\"LqLS9B\":[\"Mostrar mudanças de apelido\"],\"LsDQt2\":[\"Configurações do Canal\"],\"LtI9AS\":[\"Dono\"],\"LuNhhL\":[\"reagiu a esta mensagem\"],\"M/AZNG\":[\"URL da sua imagem de avatar\"],\"M/WIer\":[\"Enviar mensagem\"],\"M8er/5\":[\"Nome:\"],\"MHk+7g\":[\"Imagem anterior\"],\"MRorGe\":[\"Mensagem Privada\"],\"MVbSGP\":[\"Janela de tempo (segundos)\"],\"MkpcsT\":[\"Suas mensagens e configurações são armazenadas localmente\"],\"N/hDSy\":[\"Marcar como bot, geralmente 'on' ou vazio\"],\"N7TQbE\":[\"Convidar usuário para \",[\"channelName\"]],\"NCca/o\":[\"Inserir apelido padrão...\"],\"Nqs6B9\":[\"Exibe toda a mídia externa. Qualquer URL pode causar uma requisição a um servidor desconhecido.\"],\"Nt+9O7\":[\"Usar WebSocket em vez de TCP bruto\"],\"NxIHzc\":[\"Expulsar usuário\"],\"O+v/cL\":[\"Navegar por todos os canais do servidor\"],\"ODwSCk\":[\"Enviar um GIF\"],\"OGQ5kK\":[\"Configurar sons de notificação e destaques\"],\"OIPt1Z\":[\"Mostrar ou ocultar a barra lateral de membros\"],\"OKSNq/\":[\"Muito Estrito\"],\"ONWvwQ\":[\"Carregar\"],\"OVKoQO\":[\"Sua senha de conta para autenticação\"],\"ObsidianIRC - Bringing IRC to the future\":[\"ObsidianIRC - Levando o IRC para o futuro\"],\"OhCpra\":[\"Definir um tópico…\"],\"OkltoQ\":[\"Banir \",[\"username\"],\" por apelido (impede que entre novamente com o mesmo nick)\"],\"P+t/Te\":[\"Sem dados adicionais\"],\"P42Wcc\":[\"Seguro\"],\"PD38l0\":[\"Visualização do avatar do canal\"],\"PD9mEt\":[\"Digite uma mensagem...\"],\"PPqfdA\":[\"Abrir configurações do canal\"],\"PSCjfZ\":[\"O tópico exibido para este canal. Todos os usuários podem ver.\"],\"PZCecv\":[\"Pré-visualização de PDF\"],\"PeLgsC\":[[\"c\",\"plural\",{\"one\":[\"1 vez\"],\"other\":[[\"c\"],\" vezes\"]}]],\"PguS2C\":[\"Adicionar máscara de exceção (ex.: nick!*@*, *!*@host.com)\"],\"Pil5Ty\":[\"Mostrando \",[\"displayedChannelsCount\"],\" de \",[\"0\"],\" canais\"],\"PqhVlJ\":[\"Banir Usuário (por Hostmask)\"],\"Q+chwU\":[\"Nome de usuário:\"],\"Q6hhn8\":[\"Preferências\"],\"QF4a34\":[\"Por favor, insira um nome de usuário\"],\"QGqSZ2\":[\"Cor e Formatação\"],\"QJQd1J\":[\"Editar perfil\"],\"QSzGDE\":[\"Ocioso\"],\"QUlny5\":[\"Bem-vindo ao \",[\"0\"],\"!\"],\"Qoq+GP\":[\"Ler mais\"],\"QuSkCF\":[\"Filtrar canais...\"],\"QwUrDZ\":[\"alterou o tópico para: \",[\"topic\"]],\"R0UH07\":[\"Imagem \",[\"0\"],\" de \",[\"1\"]],\"R7SsBE\":[\"Silenciar\"],\"R8rf1X\":[\"Clique para definir o tópico\"],\"RArB3D\":[\"foi expulso de \",[\"channelName\"],\" por \",[\"username\"]],\"RI3cWd\":[\"Descubra o mundo do IRC com o ObsidianIRC\"],\"RMMaN5\":[\"Moderado (+m)\"],\"RWw9Lg\":[\"Fechar janela\"],\"RZ2BuZ\":[\"O registro da conta \",[\"account\"],\" requer verificação: \",[\"message\"]],\"RySp6q\":[\"Ocultar comentários\"],\"SPKQTd\":[\"Apelido é obrigatório\"],\"SPVjfj\":[\"Será definido como 'sem motivo' se deixado em branco\"],\"SQKPvQ\":[\"Convidar Usuário\"],\"SkZcl+\":[\"Escolha um perfil de proteção contra flood predefinido. Estes perfis fornecem configurações de proteção equilibradas para diferentes casos de uso.\"],\"Slr+3C\":[\"Usuários mín.\"],\"Spnlre\":[\"Você convidou \",[\"target\"],\" para entrar em \",[\"channel\"]],\"T/ckN5\":[\"Abrir no visualizador\"],\"T91vKp\":[\"Reproduzir\"],\"TV2Wdu\":[\"Saiba como tratamos seus dados e protegemos sua privacidade.\"],\"TgFpwD\":[\"Aplicando...\"],\"TkzSFB\":[\"Sem Alterações\"],\"TtserG\":[\"Digite o nome real\"],\"Ttz9J1\":[\"Inserir senha...\"],\"Tz0i8g\":[\"Configurações\"],\"U3pytU\":[\"Admin\"],\"UDb2YD\":[\"Reagir\"],\"UE4KO5\":[\"*channel*\"],\"UGT5vp\":[\"Salvar configurações\"],\"UV5hLB\":[\"Nenhum banimento encontrado\"],\"Uaj3Nd\":[\"Mensagens de Status\"],\"Ue3uny\":[\"Padrão (sem perfil)\"],\"UkARhe\":[\"Normal – Proteção padrão\"],\"Umn7Cj\":[\"Ainda sem comentários. Seja o primeiro!\"],\"UtUIRh\":[[\"0\"],\" mensagens antigas\"],\"UwzP+U\":[\"Conexão segura\"],\"V0/A4O\":[\"Proprietário do canal\"],\"V4qgxE\":[\"Criado antes (min atrás)\"],\"V8yTm6\":[\"Limpar pesquisa\"],\"VJMMyz\":[\"ObsidianIRC - Levando o IRC ao futuro\"],\"VJScHU\":[\"Motivo\"],\"VLsmVV\":[\"Silenciar notificações\"],\"VbyRUy\":[\"Comentários\"],\"Vmx0mQ\":[\"Definido por:\"],\"VqnIZz\":[\"Ver nossa política de privacidade e práticas de dados\"],\"VrMygG\":[\"O comprimento mínimo é \",[\"0\"]],\"VrnTui\":[\"Seus pronomes, exibidos no seu perfil\"],\"W8E3qn\":[\"Conta autenticada\"],\"WAakm9\":[\"Excluir Canal\"],\"WFxTHC\":[\"Adicionar máscara de banimento (ex.: nick!*@*, *!*@host.com)\"],\"WN1g9F\":[\"Host do servidor é obrigatório\"],\"WRYdXW\":[\"Posição do áudio\"],\"WUOH5B\":[\"Ignorar usuário\"],\"WWEXnZ\":[[\"0\",\"plural\",{\"one\":[\"Mostrar 1 item a mais\"],\"other\":[\"Mostrar \",[\"1\"],\" itens a mais\"]}]],\"Weq9zb\":[\"Geral\"],\"Wfj7Sk\":[\"Silenciar ou ativar sons de notificação\"],\"Wm7gbG\":[\"GitHub:\"],\"WyeHWY\":[\"*spam*\"],\"WzMCru\":[\"Perfil do Usuário\"],\"X6S3lt\":[\"Pesquisar configurações, canais, servidores...\"],\"XEHan5\":[\"Continuar Assim Mesmo\"],\"XI1+wb\":[\"Formato inválido\"],\"XIXeuC\":[\"Mensagem @\",[\"0\"]],\"XMS+k4\":[\"Iniciar Mensagem Privada\"],\"XWgxXq\":[\"Álbum\"],\"Xd7+IT\":[\"Desafixar Conversa Privada\"],\"Xm/s+u\":[\"Exibição\"],\"Xp2n93\":[\"Exibe mídia do host de arquivos confiável do seu servidor. Nenhuma requisição é feita a serviços externos.\"],\"XvjC4F\":[\"Salvando...\"],\"Y/qryO\":[\"Nenhum usuário encontrado para sua pesquisa\"],\"YAqRpI\":[\"Registro da conta \",[\"account\"],\" bem-sucedido: \",[\"message\"]],\"YEfzvP\":[\"Tópico protegido (+t)\"],\"YQOn6a\":[\"Recolher lista de membros\"],\"YRCoE9\":[\"Operador do canal\"],\"YURQaF\":[\"Ver perfil\"],\"YdBSvr\":[\"Controlar exibição de mídia e conteúdo externo\"],\"Yj6U3V\":[\"Sem servidor central:\"],\"YjvpGx\":[\"Pronomes\"],\"YqH4l4\":[\"Sem chave\"],\"YyUPpV\":[\"Conta:\"],\"ZJSWfw\":[\"Mensagem exibida ao desconectar do servidor\"],\"ZR1dJ4\":[\"Convites\"],\"ZdWg0V\":[\"Abrir no navegador\"],\"ZhRBbl\":[\"Pesquisar mensagens…\"],\"Zmcu3y\":[\"Filtros avançados\"],\"a2/8e5\":[\"Tópico definido após (min atrás)\"],\"aHKcKc\":[\"Página anterior\"],\"aJTbXX\":[\"Senha Oper\"],\"aQryQv\":[\"O padrão já existe\"],\"aW9pLN\":[\"Número máximo de usuários permitidos. Deixe vazio para sem limite.\"],\"ah4fmZ\":[\"Também exibe visualizações do YouTube, Vimeo, SoundCloud e serviços conhecidos similares.\"],\"aifXak\":[\"Nenhuma mídia neste canal\"],\"ap2zBz\":[\"Relaxado\"],\"az8lvo\":[\"Desligado\"],\"azXSNo\":[\"Expandir lista de membros\"],\"azdliB\":[\"Entrar em uma conta\"],\"b26wlF\":[\"ela/dela\"],\"bD/+Ei\":[\"Estrito\"],\"bQ6BJn\":[\"Configure regras detalhadas de proteção contra flood. Cada regra especifica que tipo de atividade monitorar e que ação tomar quando os limites são excedidos.\"],\"beV7+y\":[\"O usuário receberá um convite para entrar em \",[\"channelName\"],\".\"],\"bk84cH\":[\"Mensagem de ausência\"],\"bkHdLj\":[\"Adicionar servidor IRC\"],\"bmQLn5\":[\"Adicionar regra\"],\"bwRvnp\":[\"Ação\"],\"c8+EVZ\":[\"Conta verificada\"],\"cGYUlD\":[\"Nenhuma visualização de mídia é carregada.\"],\"cLF98o\":[\"Mostrar comentários (\",[\"commentCount\"],\")\"],\"cLKIDO\":[\"Nenhum usuário disponível\"],\"cSgpoS\":[\"Fixar Conversa Privada\"],\"cde3ce\":[\"Mensagem <0>\",[\"0\"],\"</0>\"],\"chQsxg\":[\"Copiar saída formatada\"],\"cl/A5J\":[\"Bem-vindo ao \",[\"__DEFAULT_IRC_SERVER_NAME__\"],\"!\"],\"cnGeoo\":[\"Excluir\"],\"coPLXT\":[\"Não armazenamos suas comunicações IRC em nossos servidores\"],\"crYH/6\":[\"Player do SoundCloud\"],\"d3sis4\":[\"Adicionar Servidor\"],\"d9aN5k\":[\"Remover \",[\"username\"],\" do canal\"],\"dEgA5A\":[\"Cancelar\"],\"dGi1We\":[\"Desafixar esta conversa de mensagem privada\"],\"dJVuyC\":[\"saiu de \",[\"channelName\"],\" (\",[\"reason\"],\")\"],\"dMtLDE\":[\"para\"],\"dXqxlh\":[\"<0>⚠️ Risco de Segurança!</0> Esta conexão pode ser vulnerável a interceptação ou ataques man-in-the-middle.\"],\"da9Q/R\":[\"Modos do canal alterados\"],\"dhJN3N\":[\"Mostrar comentários\"],\"dj2xTE\":[\"Dispensar notificação\"],\"dpCzmC\":[\"Configurações de proteção contra flood\"],\"e9dQpT\":[\"Deseja abrir este link em uma nova aba?\"],\"ePK91l\":[\"Editar\"],\"eYBDuB\":[\"Faça upload de uma imagem ou forneça uma URL com substituição opcional \",[\"size\"]],\"edBbee\":[\"Banir \",[\"username\"],\" por hostmask (impede que entre novamente pelo mesmo IP/host)\"],\"ekfzWq\":[\"Configurações do usuário\"],\"elPDWs\":[\"Personalize sua experiência no cliente IRC\"],\"eu2osY\":[\"<0>💡 Recomendação:</0> Prossiga apenas se você confiar neste servidor e compreender os riscos. Evite compartilhar informações sensíveis ou senhas nesta conexão.\"],\"euEhbr\":[\"Clique para entrar em \",[\"channel\"]],\"ez3vLd\":[\"Ativar entrada multilinha\"],\"f0J5Ki\":[\"A comunicação servidor a servidor pode usar conexões não criptografadas\"],\"f9BHJk\":[\"Avisar Usuário\"],\"fDOLLd\":[\"Nenhum canal encontrado.\"],\"ffzDkB\":[\"Análises anônimas:\"],\"fq1GF9\":[\"Exibir quando usuários se desconectam do servidor\"],\"gEF57C\":[\"Este servidor suporta apenas um tipo de conexão\"],\"gJuLUI\":[\"Lista de ignorados\"],\"gNzMrk\":[\"Avatar atual\"],\"gjPWyO\":[\"Inserir apelido...\"],\"gz6UQ3\":[\"Maximizar\"],\"h6razj\":[\"Excluir máscara do nome do canal\"],\"hG6jnw\":[\"Nenhum tópico definido\"],\"hG89Ed\":[\"Imagem\"],\"hZ6znB\":[\"Porta\"],\"ha+Bz5\":[\"ex.: 100:1440\"],\"hehnjM\":[\"Quantidade\"],\"hzdLuQ\":[\"Apenas usuários com voz ou superior podem falar\"],\"i0qMbr\":[\"Início\"],\"iDNBZe\":[\"Notificações\"],\"iH8pgl\":[\"Voltar\"],\"iL9SZg\":[\"Banir Usuário (por Apelido)\"],\"iNt+3c\":[\"Voltar para a imagem\"],\"iQvi+a\":[\"Não me avisar sobre baixa segurança de link para este servidor\"],\"iSLIjg\":[\"Conectar\"],\"iWXkHH\":[\"Halfop\"],\"iZeTtp\":[\"Host do Servidor\"],\"idD8Ev\":[\"Salvo\"],\"iivqkW\":[\"Conectado em\"],\"ij+Elv\":[\"Visualização da imagem\"],\"ilIWp7\":[\"Alternar Notificações\"],\"iuaqvB\":[\"Use * para curingas. Exemplos: baduser!*@*, *!*@spammer.com, troll*!*@*\"],\"ixkTse\":[\"Bot\"],\"j2DGR0\":[\"Banir por máscara de host\"],\"jA4uoI\":[\"Tópico:\"],\"jLXxGK\":[\"https://example.com\"],\"jPSk57\":[\"Motivo (opcional)\"],\"jUV7CU\":[\"Fazer upload do avatar\"],\"jW5Uwh\":[\"Controla quanto conteúdo de mídia externa é carregado. Desativado / Seguro / Fontes confiáveis / Todo conteúdo.\"],\"jXzms5\":[\"Opções de anexo\"],\"jZlrte\":[\"Cor\"],\"jfC/xh\":[\"Contato\"],\"jywMpv\":[\"#new-channel-name\"],\"k112DD\":[\"Carregar mensagens antigas\"],\"k3ID0F\":[\"Filtrar membros…\"],\"k65gsE\":[\"Mergulho profundo\"],\"k7Zgob\":[\"Cancelar Conexão\"],\"kAVx5h\":[\"Nenhum convite encontrado\"],\"kCLEPU\":[\"Conectado a\"],\"kF5LKb\":[\"Padrões ignorados:\"],\"kGeOx/\":[\"Entrar em \",[\"0\"]],\"kITKr8\":[\"Carregando modos do canal...\"],\"kPpPsw\":[\"Você é um IRC Operator\"],\"kWJmRL\":[\"Você\"],\"kfcRb0\":[\"Avatar\"],\"kjMqSj\":[\"Copiar JSON\"],\"krViRy\":[\"Clique para copiar como JSON\"],\"ks71ra\":[\"Exceções\"],\"kw4lRv\":[\"Meio operador do canal\"],\"kxgIRq\":[\"Selecione ou adicione um canal para começar.\"],\"ky6dWe\":[\"Visualização do avatar\"],\"l+GxCv\":[\"Carregando canais...\"],\"l+IUVW\":[\"Verificação da conta \",[\"account\"],\" bem-sucedida: \",[\"message\"]],\"l/siQz\":[[\"reconnectCount\",\"plural\",{\"one\":[\"reconectou\"],\"other\":[\"reconectou \",[\"reconnectCount\"],\" vezes\"]}]],\"l5jmzx\":[[\"0\"],\" e \",[\"1\"],\" estão digitando...\"],\"lHy8N5\":[\"Carregando mais canais...\"],\"lbpf14\":[\"Entrar em \",[\"value\"]],\"lfFsZ4\":[\"Canais\"],\"lkNdiH\":[\"Nome da conta\"],\"ln500L\":[\"ObsidianIRC\"],\"lnCMdg\":[\"Enviar Imagem\"],\"loQxaJ\":[\"Estou de Volta\"],\"lvfaxv\":[\"INÍCIO\"],\"m16xKo\":[\"Adicionar\"],\"m8flAk\":[\"Prévia (ainda não enviado)\"],\"mEPxTp\":[\"<0>⚠️ Cuidado!</0> Abra apenas links de fontes confiáveis. Links maliciosos podem comprometer sua segurança ou privacidade.\"],\"mHGdhG\":[\"Informações do servidor\"],\"mHS8lb\":[\"Mensagem #\",[\"0\"]],\"mMYBD9\":[\"Amplo – Escopo de proteção mais amplo\"],\"mTGsPd\":[\"Tópico do canal\"],\"mU8j6O\":[\"Sem mensagens externas (+n)\"],\"mZp8FL\":[\"Retorno automático para linha única\"],\"mdQu8G\":[\"SeuApelido\"],\"miSSBQ\":[\"Comentários (\",[\"commentCount\"],\")\"],\"mvyLSy\":[\"Usuário autenticado\"],\"mwtcGl\":[\"Fechar comentários\"],\"mzI/c+\":[\"Baixar\"],\"n3fGRk\":[\"definido por \",[\"0\"]],\"nE9jsU\":[\"Relaxado – Proteção menos agressiva\"],\"nNflMD\":[\"Sair do canal\"],\"nPXkBi\":[\"Carregando dados WHOIS...\"],\"nQnxxF\":[\"Mensagem #\",[\"0\"],\" (Shift+Enter para nova linha)\"],\"nWMRxa\":[\"Desafixar\"],\"nkC032\":[\"Sem perfil de flood\"],\"o69z4d\":[\"Enviar uma mensagem de aviso para \",[\"username\"]],\"o9ylQi\":[\"Pesquise GIFs para começar\"],\"oFGkER\":[\"Avisos do Servidor\"],\"oOi11l\":[\"Rolar para o fim\"],\"oQEzQR\":[\"Nova mensagem direta\"],\"oXOSPE\":[\"Online\"],\"oal760\":[\"Ataques man-in-the-middle em links de servidor são possíveis\"],\"oeqmmJ\":[\"Fontes Confiáveis\"],\"ovBPCi\":[\"Padrão\"],\"p0Z69r\":[\"O padrão não pode estar vazio\"],\"p1KgtK\":[\"Falha ao carregar áudio\"],\"p59pEv\":[\"Detalhes adicionais\"],\"p7sRI6\":[\"Avisar outros quando você está digitando\"],\"pBm1od\":[\"Canal secreto\"],\"pNmiXx\":[\"Seu apelido padrão para todos os servidores\"],\"pUUo9G\":[\"Hostname:\"],\"pVGPmz\":[\"Senha da conta\"],\"peNE68\":[\"Permanente\"],\"plhHQt\":[\"Sem dados\"],\"pm6+q5\":[\"Aviso de Segurança\"],\"pn5qSs\":[\"Informações adicionais\"],\"q0cR4S\":[\"agora é conhecido como **\",[\"newNick\"],\"**\"],\"qFcunY\":[\"O canal não aparecerá nos comandos LIST ou NAMES\"],\"qLpTm/\":[\"Remover reação \",[\"emoji\"]],\"qVkGWK\":[\"Fixar\"],\"qY8wNa\":[\"Página inicial\"],\"qb0xJ7\":[\"Curingas: * corresponde a qualquer sequência, ? a um único caractere. Exemplos: nick!*@*, *!*@host.com, *!*user@*\"],\"qhzpRq\":[\"Chave do canal (+k)\"],\"qtoOYG\":[\"Sem limite\"],\"r1W2AS\":[\"Imagem do servidor de arquivos\"],\"rIPR2O\":[\"Tópico definido antes (min atrás)\"],\"rMMSYo\":[\"O comprimento máximo é \",[\"0\"]],\"rWtzQe\":[\"A rede se dividiu e reconectou. ✅\"],\"rYG2u6\":[\"Aguarde...\"],\"rdUucN\":[\"Visualização\"],\"rjGI/Q\":[\"Privacidade\"],\"rk8iDX\":[\"Carregando GIFs...\"],\"rn6SBY\":[\"Ativar som\"],\"s/UKqq\":[\"Foi expulso do canal\"],\"s8cATI\":[\"entrou em \",[\"channelName\"]],\"sCO9ue\":[\"A conexão com <0>\",[\"serverName\"],\"</0> apresenta as seguintes preocupações de segurança:\"],\"sGH11W\":[\"Servidor\"],\"sHI1H+\":[\"agora é conhecido como **\",[\"newNick\"],\"**\"],\"sJyV04\":[[\"inviter\"],\" convidou você para entrar em \",[\"channel\"]],\"sby+1/\":[\"Clique para copiar\"],\"sfN25C\":[\"Seu nome real ou completo\"],\"sliuzR\":[\"Abrir Link\"],\"sqrO9R\":[\"Menções personalizadas\"],\"sr6RdJ\":[\"Multilinha com Shift+Enter\"],\"swrCpB\":[\"O canal foi renomeado de \",[\"oldName\"],\" para \",[\"newName\"],\" por \",[\"user\"],[\"0\"]],\"sxkWRg\":[\"Avançado\"],\"t/YqKh\":[\"Remover\"],\"t47eHD\":[\"Seu identificador único neste servidor\"],\"tAkAh0\":[\"URL com substituição opcional \",[\"size\"],\". Exemplo: https://example.com/avatar/\",[\"size\"],\"/channel.jpg\"],\"tXLJS3\":[\"Mostrar ou ocultar a barra lateral de canais\"],\"tfDRzk\":[\"Salvar\"],\"tiBsJk\":[\"saiu de \",[\"channelName\"]],\"tt4/UD\":[\"saiu (\",[\"reason\"],\")\"],\"u0TcnO\":[\"O apelido {nick} já está em uso, tentando com {newNick}\"],\"u0a8B4\":[\"Autenticar como operador IRC para acesso administrativo\"],\"u0rWFU\":[\"Criado após (min atrás)\"],\"u72w3t\":[\"Usuários e padrões a ignorar\"],\"u7jc2L\":[\"saiu\"],\"uAQUqI\":[\"Status\"],\"uB85T3\":[\"Falha ao salvar: \",[\"msg\"]],\"uV3DOL\":[\"G-Line\"],\"uW3lLI\":[\"Servidores IRC:\"],\"usSSr/\":[\"Nível de zoom\"],\"v7uvcf\":[\"Software:\"],\"vE8kb+\":[\"Shift+Enter para novas linhas (Enter envia)\"],\"vERlcd\":[\"Perfil\"],\"vK0RL8\":[\"Sem tópico\"],\"vSJd18\":[\"Vídeo\"],\"vXIe7J\":[\"Idioma\"],\"vaHYxN\":[\"Nome real\"],\"vhjbKr\":[\"Ausente\"],\"w4NYox\":[\"cliente \",[\"title\"]],\"w8xQRx\":[\"Valor inválido\"],\"wFjjxZ\":[\"foi expulso de \",[\"channelName\"],\" por \",[\"username\"],\" (\",[\"reason\"],\")\"],\"wGjaGl\":[\"Nenhuma exceção de banimento encontrada\"],\"wPrGnM\":[\"Administrador do canal\"],\"wRkP2d\":[\"GIF\"],\"wbm86v\":[\"Exibir quando usuários entram ou saem de canais\"],\"whqZ9r\":[\"Palavras ou frases adicionais para destacar\"],\"wm7RV4\":[\"Som de notificação\"],\"wz/Yoq\":[\"Suas mensagens podem ser interceptadas ao serem retransmitidas entre servidores\"],\"xCJdfg\":[\"Limpar\"],\"xUHRTR\":[\"Autenticar automaticamente como operador ao conectar\"],\"xWHwwQ\":[\"Banimentos\"],\"xYilR2\":[\"Mídia\"],\"xceQrO\":[\"Apenas websockets seguros são suportados\"],\"xdtXa+\":[\"nome-do-canal\"],\"xfXC7q\":[\"Canais de texto\"],\"xlCYOE\":[\"Carregando mais mensagens...\"],\"xlhswE\":[\"O valor mínimo é \",[\"0\"]],\"xq97Ci\":[\"Adicionar uma palavra ou frase...\"],\"xuRqRq\":[\"Limite de clientes (+l)\"],\"xwF+7J\":[[\"0\"],\" está digitando...\"],\"yNeucF\":[\"Este servidor não suporta metadados de perfil estendidos (extensão IRCv3 METADATA). Campos como avatar, nome de exibição e status não estão disponíveis.\"],\"yPlrca\":[\"Avatar do canal\"],\"yQE2r9\":[\"Carregando\"],\"ySU+JY\":[\"seu@email.com\"],\"yTX1Rt\":[\"Nome de usuário Oper\"],\"yYOzWD\":[\"logs\"],\"yfx9Re\":[\"Senha de operador IRC\"],\"ygCKqB\":[\"Parar\"],\"ymDxJx\":[\"Nome de usuário de operador IRC\"],\"yrpRsQ\":[\"Ordenar por nome\"],\"yz7wBu\":[\"Fechar\"],\"zJw+jA\":[\"define modo: \",[\"0\"]],\"zebeLu\":[\"Digite o nome de usuário oper\"],\"zpr0Bw\":[\"GZ-Line\"]}"); No newline at end of file
/*eslint-disable*/export const messages=JSON.parse("{\"+5VMrz\":[\"Formato de padrão inválido. Use o formato nick!user@host (curingas * permitidos)\"],\"+6NQQA\":[\"Canal de Suporte Geral\"],\"+6NyRG\":[\"Cliente\"],\"+K0AvT\":[\"Desconectar\"],\"+cyFdH\":[\"Mensagem padrão ao marcar-se como ausente\"],\"+mVPqU\":[\"Renderizar formatação Markdown nas mensagens\"],\"+vqCJH\":[\"Seu nome de usuário de conta para autenticação\"],\"+yPBXI\":[\"Escolher arquivo\"],\"+zy2Nq\":[\"Tipo\"],\"/09cao\":[\"Baixa Segurança de Link (Nível \",[\"securityLevel\"],\")\"],\"/3BQ4J\":[\"Usuários fora do canal não podem enviar mensagens\"],\"/6BzZF\":[\"Alternar Lista de Membros\"],\"/AkXyp\":[\"Confirm?\"],\"/TNOPk\":[\"O usuário está ausente\"],\"/XQgft\":[\"Descobrir\"],\"/cF7Rs\":[\"Volume\"],\"/dqduX\":[\"Próxima página\"],\"/fc3q4\":[\"Todo o Conteúdo\"],\"/kISDh\":[\"Ativar sons de notificação\"],\"/n04sB\":[\"Kill\"],\"/rTz0M\":[\"Áudio\"],\"/rfkZe\":[\"Reproduzir sons para menções e mensagens\"],\"0/0ZGA\":[\"Máscara do nome do canal\"],\"0D6j7U\":[\"Saiba mais sobre regras personalizadas →\"],\"0XsHcR\":[\"Expulsar Usuário\"],\"0ZpE//\":[\"Ordenar por usuários\"],\"0bEPwz\":[\"Definir como Ausente\"],\"0dGkPt\":[\"Expandir lista de canais\"],\"0gS7M5\":[\"Nome de exibição\"],\"0kS+M8\":[\"ExemploREDE\"],\"0rgoY7\":[\"Conectar apenas a servidores que você escolher\"],\"0wdd7X\":[\"Entrar\"],\"0wkVYx\":[\"Mensagens privadas\"],\"111uHX\":[\"Visualização do link\"],\"196EG4\":[\"Excluir Conversa Privada\"],\"1DSr1i\":[\"Registrar uma conta\"],\"1O/24y\":[\"Alternar Lista de Canais\"],\"1VPJJ2\":[\"Aviso de Link Externo\"],\"1ZC/dv\":[\"Nenhuma menção ou mensagem não lida\"],\"1pO1zi\":[\"Nome do servidor é obrigatório\"],\"1uwfzQ\":[\"Ver Tópico do Canal\"],\"268g7c\":[\"Digite o nome de exibição\"],\"2FOFq1\":[\"Operadores de servidor na rede podem potencialmente ler suas mensagens\"],\"2FYpfJ\":[\"Mais\"],\"2HF1Y2\":[[\"inviter\"],\" convidou \",[\"target\"],\" para entrar em \",[\"channel\"]],\"2I70QL\":[\"Ver informações do perfil do usuário\"],\"2QYdmE\":[\"Usuários:\"],\"2QpEjG\":[\"saiu\"],\"2YE223\":[\"Mensagem #\",[\"0\"],\" (Enter para nova linha, Shift+Enter para enviar)\"],\"2bimFY\":[\"Usar senha do servidor\"],\"2iTmdZ\":[\"Armazenamento local:\"],\"2odkwe\":[\"Estrito – Proteção mais agressiva\"],\"2uDhbA\":[\"Digite o nome de usuário para convidar\"],\"2ygf/L\":[\"← Voltar\"],\"2zEgxj\":[\"Pesquisar GIFs...\"],\"3RdPhl\":[\"Renomear Canal\"],\"3THokf\":[\"Usuário com voz\"],\"3TSz9S\":[\"Minimizar\"],\"3jBDvM\":[\"Nome de exibição do canal\"],\"3ryuFU\":[\"Relatórios de falha opcionais para melhorar o app\"],\"3uBF/8\":[\"Fechar visualizador\"],\"3uwW8F\":[\"https://example.com/avatar/\",[\"size\"],\"/channel.jpg\"],\"3xf8Kz\":[\"Inserir nome da conta...\"],\"4/Rr0R\":[\"Convidar um usuário para o canal atual\"],\"4EZrJN\":[\"Regras\"],\"4JJtW9\":[\"#overflow\"],\"4NqeT4\":[\"Perfil de flood (+F)\"],\"4RZQRK\":[\"O que você está fazendo?\"],\"4hfTrB\":[\"Apelido\"],\"4n99LO\":[\"Já em \",[\"0\"]],\"4t6vMV\":[\"Mudar automaticamente para linha única em mensagens curtas\"],\"4vsHmf\":[\"Tempo (min)\"],\"5+INAX\":[\"Destacar mensagens que mencionam você\"],\"5R5Pv/\":[\"Nome Oper\"],\"678PKt\":[\"Nome da Rede\"],\"6Aih4U\":[\"Offline\"],\"6CO3WE\":[\"Senha necessária para entrar no canal. Deixe vazio para remover a chave.\"],\"6HhMs3\":[\"Mensagem de saída\"],\"6V3Ea3\":[\"Copiado\"],\"6lGV3K\":[\"Mostrar menos\"],\"6yFOEi\":[\"Inserir senha do oper...\"],\"7+IHTZ\":[\"Nenhum arquivo escolhido\"],\"73hrRi\":[\"nick!user@host (ex.: spam*!*@*, *!*@badhost.com)\"],\"7QkKyN\":[\"Enviar mensagem privada\"],\"7U1W7c\":[\"Muito Relaxado\"],\"7Y1YQj\":[\"Nome real:\"],\"7YHArF\":[\"— abrir no visualizador\"],\"7fjnVl\":[\"Pesquisar usuários...\"],\"7jL88x\":[\"Excluir esta mensagem? Esta ação não pode ser desfeita.\"],\"7nGhhM\":[\"O que você está pensando?\"],\"7sEpu1\":[\"Membros — \",[\"0\"]],\"7sNhEz\":[\"Nome de usuário\"],\"8H0Q+x\":[\"Saiba mais sobre perfis →\"],\"8Phu0A\":[\"Exibir quando usuários mudam seu apelido\"],\"8XTG9e\":[\"Digite a senha oper\"],\"8XsV2J\":[\"Tentar enviar novamente\"],\"8ZsakT\":[\"Senha\"],\"8kR84m\":[\"Você está prestes a abrir um link externo:\"],\"8lCgih\":[\"Remover regra\"],\"8p/xVT\":[[\"0\",\"plural\",{\"one\":[[\"1\"]],\"other\":[[\"2\"]]}]],\"8wRzac\":[[\"joinCount\",\"plural\",{\"one\":[\"entrou\"],\"other\":[\"entrou \",[\"joinCount\"],\" vezes\"]}]],\"9BMLnJ\":[\"Reconectar ao servidor\"],\"9OEgyT\":[\"Adicionar reação\"],\"9PQ8m2\":[\"G-Line (ban global)\"],\"9Qs99X\":[\"E-mail:\"],\"9QupBP\":[\"Remover padrão\"],\"9bG48P\":[\"Enviando\"],\"9f5f0u\":[\"Dúvidas sobre privacidade? Entre em contato:\"],\"9unqs3\":[\"Ausente:\"],\"9v3hwv\":[\"Nenhum servidor encontrado.\"],\"9zb2WA\":[\"Conectando\"],\"A1taO8\":[\"Pesquisar\"],\"A2adVi\":[\"Enviar notificações de digitação\"],\"A9Rhec\":[\"Nome do canal\"],\"AWOSPo\":[\"Ampliar\"],\"AXSpEQ\":[\"Oper ao conectar\"],\"AeXO77\":[\"Conta\"],\"AhNP40\":[\"Avançar\"],\"Ai2U7L\":[\"Host\"],\"AjBQnf\":[\"Apelido alterado\"],\"AmXVh6\":[\"https://example.com/avatar.png\"],\"AnRu/j\":[\"Cancelar resposta\"],\"ApSx0O\":[\"Encontradas \",[\"0\"],\" mensagens correspondentes a \\\"\",[\"searchQuery\"],\"\\\"\"],\"AxPAXW\":[\"Nenhum resultado encontrado\"],\"AyNqAB\":[\"Exibir todos os eventos do servidor no chat\"],\"B/QqGw\":[\"Longe do teclado\"],\"B8AaMI\":[\"Este campo é obrigatório\"],\"BA2c49\":[\"O servidor não suporta filtragem avançada de LIST\"],\"BDKt3I\":[[\"0\"],\", \",[\"1\"],\", \",[\"2\"],\" e mais \",[\"3\"],\" estão digitando...\"],\"BGul2A\":[\"Você tem alterações não salvas. Tem certeza que deseja fechar sem salvar?\"],\"BIf9fi\":[\"Sua mensagem de status\"],\"BPm98R\":[\"No server is selected. Pick a server from the sidebar first; invite links are managed per-server.\"],\"BZz3md\":[\"Seu site pessoal\"],\"Bgm/H7\":[\"Permitir inserção de múltiplas linhas de texto\"],\"BiQIl1\":[\"Fixar esta conversa de mensagem privada\"],\"BlNZZ2\":[\"Clique para ir à mensagem\"],\"Bowq3c\":[\"Apenas operadores podem alterar o tópico\"],\"Btozzp\":[\"Esta imagem expirou\"],\"Bycfjm\":[\"Total: \",[\"0\"]],\"C6IBQc\":[\"Copiar JSON completo\"],\"C9L9wL\":[\"Coleta de dados\"],\"CDq4wC\":[\"Moderar Usuário\"],\"CHVRxG\":[\"Mensagem @\",[\"0\"],\" (Shift+Enter para nova linha)\"],\"CN9zdR\":[\"Nome oper e senha são obrigatórios\"],\"CW3sYa\":[\"Adicionar reação \",[\"emoji\"]],\"CaAkqd\":[\"Mostrar desconexões\"],\"CbvaYj\":[\"Banir por apelido\"],\"CcK+Ft\":[\"PDF\"],\"Ce8q3L\":[\"Selecionar um canal\"],\"CsekCi\":[\"Normal\"],\"D+NlUC\":[\"Sistema\"],\"D28t6+\":[\"entrou e saiu\"],\"DB8zMK\":[\"Aplicar\"],\"DBcWHr\":[\"Arquivo de som de notificação personalizado\"],\"DTy9Xw\":[\"Pré-visualizações de mídia\"],\"Dj4pSr\":[\"Escolha uma senha segura\"],\"Du+zn+\":[\"Pesquisando...\"],\"Du2T2f\":[\"Configuração não encontrada\"],\"DwsSVQ\":[\"Aplicar filtros e atualizar\"],\"E3W/zd\":[\"Apelido padrão\"],\"E6nRW7\":[\"Copiar URL\"],\"E703RG\":[\"Modos:\"],\"EAeu1Z\":[\"Enviar convite\"],\"EFKJQT\":[\"Configuração\"],\"EGPQBv\":[\"Regras de flood personalizadas (+f)\"],\"ELik0r\":[\"Ver política de privacidade completa\"],\"EPbeC2\":[\"Ver ou editar o tópico do canal\"],\"EQCDNT\":[\"Inserir nome de usuário oper...\"],\"EUvulZ\":[\"Encontrada 1 mensagem correspondente a \\\"\",[\"searchQuery\"],\"\\\"\"],\"EatZYJ\":[\"Próxima imagem\"],\"EdQY6l\":[\"Nenhum\"],\"EnqLYU\":[\"Pesquisar servidores...\"],\"F0OKMc\":[\"Editar Servidor\"],\"F6Int2\":[\"Ativar destaques\"],\"FDoLyE\":[\"Usuários máx.\"],\"FUU/hZ\":[\"Controla quanto conteúdo de mídia externa é carregado no chat.\"],\"Fdp03t\":[\"ativo\"],\"FfPWR0\":[\"Modal\"],\"FjkaiT\":[\"Reduzir\"],\"FlqOE9\":[\"O que isso significa:\"],\"FolHNl\":[\"Gerenciar sua conta e autenticação\"],\"Fp2Dif\":[\"Saiu do servidor\"],\"G5KmCc\":[\"GZ-Line (Z-Line global)\"],\"GDs0lz\":[\"<0>Risco:</0> Informações sensíveis (mensagens, conversas privadas, dados de autenticação) podem ser expostas a administradores de rede ou atacantes posicionados entre servidores IRC.\"],\"GR+2I3\":[\"Adicionar máscara de convite (ex.: nick!*@*, *!*@host.com)\"],\"GRLyMU\":[\"Fechar avisos do servidor em destaque\"],\"GdhD7H\":[\"Click again to confirm\"],\"GlHnXw\":[\"Falha ao alterar apelido: \",[\"error\"],\" \",[\"0\"]],\"GswZF3\":[\"Prévia:\"],\"GtmO8/\":[\"de\"],\"GtuHUQ\":[\"Renomear este canal no servidor. Todos os usuários verão o novo nome.\"],\"GuGfFX\":[\"Alternar pesquisa\"],\"GxkJXS\":[\"Enviando...\"],\"GzbwnK\":[\"Entrou no canal\"],\"GzsUDB\":[\"Perfil estendido\"],\"H/PnT8\":[\"Inserir emoji\"],\"H6Izzl\":[\"Seu código de cor preferido\"],\"H9jIv+\":[\"Mostrar entradas/saídas\"],\"HAKBY9\":[\"Enviar ficheiros\"],\"HdE1If\":[\"Canal\"],\"Hk4AW9\":[\"Seu nome de exibição preferido\"],\"HmHDk7\":[\"Selecionar Membro\"],\"HrQzPU\":[\"Canais em \",[\"networkName\"]],\"I2tXQ5\":[\"Mensagem @\",[\"0\"],\" (Enter para nova linha, Shift+Enter para enviar)\"],\"I6bw/h\":[\"Banir usuário\"],\"I92Z+b\":[\"Ativar notificações\"],\"I9D72S\":[\"Tem certeza que deseja excluir esta mensagem? Esta ação não pode ser desfeita.\"],\"IA+1wo\":[\"Exibir quando usuários são expulsos de canais\"],\"IDwkJx\":[\"IRC Operator\"],\"ILlU+s\":[\"Info:\"],\"IUwGEM\":[\"Salvar Alterações\"],\"IVeGK6\":[[\"0\"],\", \",[\"1\"],\" e \",[\"2\"],\" estão digitando...\"],\"IgrLD/\":[\"Pausar\"],\"Im6JED\":[\"WHISPER\"],\"ImOQa9\":[\"Responder\"],\"IoHMnl\":[\"O valor máximo é \",[\"0\"]],\"IvMj+0\":[\"Op\"],\"J28zul\":[\"Conectando...\"],\"J5T9NW\":[\"Informações do usuário\"],\"J8Y5+z\":[\"Ops! Divisão de rede! ⚠️\"],\"JBHkBA\":[\"Saiu do canal\"],\"JCwL0Q\":[\"Digite o motivo (opcional)\"],\"JFciKP\":[\"Alternar\"],\"JXGkhG\":[\"Alterar o nome do canal (apenas operadores)\"],\"JcD7qf\":[\"Mais ações\"],\"JdkA+c\":[\"Secreto (+s)\"],\"Jmu12l\":[\"Canais do Servidor\"],\"JvQ++s\":[\"Ativar Markdown\"],\"K2jwh/\":[\"Nenhum dado WHOIS disponível\"],\"KAXSwC\":[\"Voz\"],\"KDfTdX\":[\"Excluir mensagem\"],\"KKBlUU\":[\"Incorporar\"],\"KM0pLb\":[\"Bem-vindo ao canal!\"],\"KR6W2h\":[\"Deixar de ignorar usuário\"],\"KV+Bi1\":[\"Apenas por convite (+i)\"],\"KdCtwE\":[\"Quantos segundos monitorar a atividade de flood antes de redefinir os contadores\"],\"Kkezga\":[\"Senha do Servidor\"],\"KsiQ/8\":[\"Os usuários devem ser convidados para entrar no canal\"],\"L+gB/D\":[\"Informações do canal\"],\"LC1a7n\":[\"O servidor IRC relatou que seus links servidor a servidor têm um nível de segurança baixo. Isso significa que quando suas mensagens são retransmitidas entre servidores IRC na rede, elas podem não estar devidamente criptografadas ou os certificados SSL/TLS podem não ser validados corretamente.\"],\"LNfLR5\":[\"Mostrar expulsões\"],\"LQb0W/\":[\"Mostrar todos os eventos\"],\"LU7/yA\":[\"Nome alternativo para exibição. Pode conter espaços, emojis e caracteres especiais. O nome real (\",[\"channelName\"],\") ainda será usado para comandos IRC.\"],\"LUb9O7\":[\"Porta de servidor válida é obrigatória\"],\"LV4fT6\":[\"Description (optional, e.g. \\\"Beta testers Q3\\\")\"],\"Lb+BUl\":[\"https://example.com/avatar.jpg\"],\"LcET2C\":[\"Política de privacidade\"],\"LcuSDR\":[\"Gerenciar suas informações de perfil e metadados\"],\"LqLS9B\":[\"Mostrar mudanças de apelido\"],\"LsDQt2\":[\"Configurações do Canal\"],\"LtI9AS\":[\"Dono\"],\"LuNhhL\":[\"reagiu a esta mensagem\"],\"M/AZNG\":[\"URL da sua imagem de avatar\"],\"M/WIer\":[\"Enviar mensagem\"],\"M8er/5\":[\"Nome:\"],\"MHk+7g\":[\"Imagem anterior\"],\"MRorGe\":[\"Mensagem Privada\"],\"MVbSGP\":[\"Janela de tempo (segundos)\"],\"MkpcsT\":[\"Suas mensagens e configurações são armazenadas localmente\"],\"N/hDSy\":[\"Marcar como bot, geralmente 'on' ou vazio\"],\"N7TQbE\":[\"Convidar usuário para \",[\"channelName\"]],\"NCca/o\":[\"Inserir apelido padrão...\"],\"Nqs6B9\":[\"Exibe toda a mídia externa. Qualquer URL pode causar uma requisição a um servidor desconhecido.\"],\"Nt+9O7\":[\"Usar WebSocket em vez de TCP bruto\"],\"NxIHzc\":[\"Expulsar usuário\"],\"O+v/cL\":[\"Navegar por todos os canais do servidor\"],\"ODwSCk\":[\"Enviar um GIF\"],\"OGQ5kK\":[\"Configurar sons de notificação e destaques\"],\"OIPt1Z\":[\"Mostrar ou ocultar a barra lateral de membros\"],\"OKSNq/\":[\"Muito Estrito\"],\"ONWvwQ\":[\"Carregar\"],\"OVKoQO\":[\"Sua senha de conta para autenticação\"],\"ObsidianIRC - Bringing IRC to the future\":[\"ObsidianIRC - Levando o IRC para o futuro\"],\"OhCpra\":[\"Definir um tópico…\"],\"OkltoQ\":[\"Banir \",[\"username\"],\" por apelido (impede que entre novamente com o mesmo nick)\"],\"P+t/Te\":[\"Sem dados adicionais\"],\"P42Wcc\":[\"Seguro\"],\"PD38l0\":[\"Visualização do avatar do canal\"],\"PD9mEt\":[\"Digite uma mensagem...\"],\"PPqfdA\":[\"Abrir configurações do canal\"],\"PSCjfZ\":[\"O tópico exibido para este canal. Todos os usuários podem ver.\"],\"PZCecv\":[\"Pré-visualização de PDF\"],\"PeLgsC\":[[\"c\",\"plural\",{\"one\":[\"1 vez\"],\"other\":[[\"c\"],\" vezes\"]}]],\"PguS2C\":[\"Adicionar máscara de exceção (ex.: nick!*@*, *!*@host.com)\"],\"Pil5Ty\":[\"Mostrando \",[\"displayedChannelsCount\"],\" de \",[\"0\"],\" canais\"],\"PqhVlJ\":[\"Banir Usuário (por Hostmask)\"],\"Q+chwU\":[\"Nome de usuário:\"],\"Q2QY4/\":[\"Delete this invite\"],\"Q6hhn8\":[\"Preferências\"],\"QF4a34\":[\"Por favor, insira um nome de usuário\"],\"QGqSZ2\":[\"Cor e Formatação\"],\"QJQd1J\":[\"Editar perfil\"],\"QSzGDE\":[\"Ocioso\"],\"QUlny5\":[\"Bem-vindo ao \",[\"0\"],\"!\"],\"Qoq+GP\":[\"Ler mais\"],\"QuSkCF\":[\"Filtrar canais...\"],\"QwUrDZ\":[\"alterou o tópico para: \",[\"topic\"]],\"R0UH07\":[\"Imagem \",[\"0\"],\" de \",[\"1\"]],\"R7SsBE\":[\"Silenciar\"],\"R8rf1X\":[\"Clique para definir o tópico\"],\"RArB3D\":[\"foi expulso de \",[\"channelName\"],\" por \",[\"username\"]],\"RI3cWd\":[\"Descubra o mundo do IRC com o ObsidianIRC\"],\"RIfHS5\":[\"Create a new invite link\"],\"RMMaN5\":[\"Moderado (+m)\"],\"RWw9Lg\":[\"Fechar janela\"],\"RZ2BuZ\":[\"O registro da conta \",[\"account\"],\" requer verificação: \",[\"message\"]],\"RySp6q\":[\"Ocultar comentários\"],\"SPKQTd\":[\"Apelido é obrigatório\"],\"SPVjfj\":[\"Será definido como 'sem motivo' se deixado em branco\"],\"SQKPvQ\":[\"Convidar Usuário\"],\"SkZcl+\":[\"Escolha um perfil de proteção contra flood predefinido. Estes perfis fornecem configurações de proteção equilibradas para diferentes casos de uso.\"],\"Slr+3C\":[\"Usuários mín.\"],\"Spnlre\":[\"Você convidou \",[\"target\"],\" para entrar em \",[\"channel\"]],\"T/ckN5\":[\"Abrir no visualizador\"],\"T91vKp\":[\"Reproduzir\"],\"TV2Wdu\":[\"Saiba como tratamos seus dados e protegemos sua privacidade.\"],\"TgFpwD\":[\"Aplicando...\"],\"TkzSFB\":[\"Sem Alterações\"],\"TtserG\":[\"Digite o nome real\"],\"Ttz9J1\":[\"Inserir senha...\"],\"Tz0i8g\":[\"Configurações\"],\"U3pytU\":[\"Admin\"],\"UDb2YD\":[\"Reagir\"],\"UE4KO5\":[\"*channel*\"],\"UETAwW\":[\"You haven't created any invite links yet. Use the form above to mint your first one.\"],\"UGT5vp\":[\"Salvar configurações\"],\"UV5hLB\":[\"Nenhum banimento encontrado\"],\"Uaj3Nd\":[\"Mensagens de Status\"],\"Ue3uny\":[\"Padrão (sem perfil)\"],\"UkARhe\":[\"Normal – Proteção padrão\"],\"Umn7Cj\":[\"Ainda sem comentários. Seja o primeiro!\"],\"UtUIRh\":[[\"0\"],\" mensagens antigas\"],\"UwzP+U\":[\"Conexão segura\"],\"V0/A4O\":[\"Proprietário do canal\"],\"V4qgxE\":[\"Criado antes (min atrás)\"],\"V8yTm6\":[\"Limpar pesquisa\"],\"VJMMyz\":[\"ObsidianIRC - Levando o IRC ao futuro\"],\"VJScHU\":[\"Motivo\"],\"VLsmVV\":[\"Silenciar notificações\"],\"VbyRUy\":[\"Comentários\"],\"Vmx0mQ\":[\"Definido por:\"],\"VqnIZz\":[\"Ver nossa política de privacidade e práticas de dados\"],\"VrMygG\":[\"O comprimento mínimo é \",[\"0\"]],\"VrnTui\":[\"Seus pronomes, exibidos no seu perfil\"],\"W8E3qn\":[\"Conta autenticada\"],\"WAakm9\":[\"Excluir Canal\"],\"WFxTHC\":[\"Adicionar máscara de banimento (ex.: nick!*@*, *!*@host.com)\"],\"WN1g9F\":[\"Host do servidor é obrigatório\"],\"WRYdXW\":[\"Posição do áudio\"],\"WUOH5B\":[\"Ignorar usuário\"],\"WWEXnZ\":[[\"0\",\"plural\",{\"one\":[\"Mostrar 1 item a mais\"],\"other\":[\"Mostrar \",[\"1\"],\" itens a mais\"]}]],\"WYxRzo\":[\"Create and manage your invite links\"],\"Wd38W1\":[\"Leave channel blank for a generic network invite. Description is just for your records — visible only to you in this list.\"],\"Weq9zb\":[\"Geral\"],\"Wfj7Sk\":[\"Silenciar ou ativar sons de notificação\"],\"Wm7gbG\":[\"GitHub:\"],\"WyeHWY\":[\"*spam*\"],\"WzMCru\":[\"Perfil do Usuário\"],\"X6S3lt\":[\"Pesquisar configurações, canais, servidores...\"],\"XEHan5\":[\"Continuar Assim Mesmo\"],\"XI1+wb\":[\"Formato inválido\"],\"XIXeuC\":[\"Mensagem @\",[\"0\"]],\"XMS+k4\":[\"Iniciar Mensagem Privada\"],\"XWgxXq\":[\"Álbum\"],\"Xd7+IT\":[\"Desafixar Conversa Privada\"],\"Xm/s+u\":[\"Exibição\"],\"Xp2n93\":[\"Exibe mídia do host de arquivos confiável do seu servidor. Nenhuma requisição é feita a serviços externos.\"],\"XvjC4F\":[\"Salvando...\"],\"Y/qryO\":[\"Nenhum usuário encontrado para sua pesquisa\"],\"YAqRpI\":[\"Registro da conta \",[\"account\"],\" bem-sucedido: \",[\"message\"]],\"YEfzvP\":[\"Tópico protegido (+t)\"],\"YQOn6a\":[\"Recolher lista de membros\"],\"YRCoE9\":[\"Operador do canal\"],\"YURQaF\":[\"Ver perfil\"],\"YdBSvr\":[\"Controlar exibição de mídia e conteúdo externo\"],\"Yj6U3V\":[\"Sem servidor central:\"],\"YjvpGx\":[\"Pronomes\"],\"YqH4l4\":[\"Sem chave\"],\"YyUPpV\":[\"Conta:\"],\"ZJSWfw\":[\"Mensagem exibida ao desconectar do servidor\"],\"ZR1dJ4\":[\"Convites\"],\"ZdWg0V\":[\"Abrir no navegador\"],\"ZhRBbl\":[\"Pesquisar mensagens…\"],\"Zmcu3y\":[\"Filtros avançados\"],\"a2/8e5\":[\"Tópico definido após (min atrás)\"],\"aHKcKc\":[\"Página anterior\"],\"aJTbXX\":[\"Senha Oper\"],\"aQryQv\":[\"O padrão já existe\"],\"aW9pLN\":[\"Número máximo de usuários permitidos. Deixe vazio para sem limite.\"],\"ah4fmZ\":[\"Também exibe visualizações do YouTube, Vimeo, SoundCloud e serviços conhecidos similares.\"],\"aifXak\":[\"Nenhuma mídia neste canal\"],\"ap2zBz\":[\"Relaxado\"],\"az8lvo\":[\"Desligado\"],\"azXSNo\":[\"Expandir lista de membros\"],\"azdliB\":[\"Entrar em uma conta\"],\"b26wlF\":[\"ela/dela\"],\"bD/+Ei\":[\"Estrito\"],\"bQ6BJn\":[\"Configure regras detalhadas de proteção contra flood. Cada regra especifica que tipo de atividade monitorar e que ação tomar quando os limites são excedidos.\"],\"beV7+y\":[\"O usuário receberá um convite para entrar em \",[\"channelName\"],\".\"],\"bk84cH\":[\"Mensagem de ausência\"],\"bkHdLj\":[\"Adicionar servidor IRC\"],\"bmQLn5\":[\"Adicionar regra\"],\"bwRvnp\":[\"Ação\"],\"c8+EVZ\":[\"Conta verificada\"],\"cGYUlD\":[\"Nenhuma visualização de mídia é carregada.\"],\"cLF98o\":[\"Mostrar comentários (\",[\"commentCount\"],\")\"],\"cLKIDO\":[\"Nenhum usuário disponível\"],\"cSgpoS\":[\"Fixar Conversa Privada\"],\"cde3ce\":[\"Mensagem <0>\",[\"0\"],\"</0>\"],\"chQsxg\":[\"Copiar saída formatada\"],\"cl/A5J\":[\"Bem-vindo ao \",[\"__DEFAULT_IRC_SERVER_NAME__\"],\"!\"],\"cnGeoo\":[\"Excluir\"],\"coPLXT\":[\"Não armazenamos suas comunicações IRC em nossos servidores\"],\"crYH/6\":[\"Player do SoundCloud\"],\"d3sis4\":[\"Adicionar Servidor\"],\"d9aN5k\":[\"Remover \",[\"username\"],\" do canal\"],\"dEgA5A\":[\"Cancelar\"],\"dGi1We\":[\"Desafixar esta conversa de mensagem privada\"],\"dJVuyC\":[\"saiu de \",[\"channelName\"],\" (\",[\"reason\"],\")\"],\"dMtLDE\":[\"para\"],\"dXqxlh\":[\"<0>⚠️ Risco de Segurança!</0> Esta conexão pode ser vulnerável a interceptação ou ataques man-in-the-middle.\"],\"da9Q/R\":[\"Modos do canal alterados\"],\"dhJN3N\":[\"Mostrar comentários\"],\"dj2xTE\":[\"Dispensar notificação\"],\"dpCzmC\":[\"Configurações de proteção contra flood\"],\"e9dQpT\":[\"Deseja abrir este link em uma nova aba?\"],\"ePK91l\":[\"Editar\"],\"eYBDuB\":[\"Faça upload de uma imagem ou forneça uma URL com substituição opcional \",[\"size\"]],\"edBbee\":[\"Banir \",[\"username\"],\" por hostmask (impede que entre novamente pelo mesmo IP/host)\"],\"ekfzWq\":[\"Configurações do usuário\"],\"elPDWs\":[\"Personalize sua experiência no cliente IRC\"],\"eu2osY\":[\"<0>💡 Recomendação:</0> Prossiga apenas se você confiar neste servidor e compreender os riscos. Evite compartilhar informações sensíveis ou senhas nesta conexão.\"],\"euEhbr\":[\"Clique para entrar em \",[\"channel\"]],\"ez3vLd\":[\"Ativar entrada multilinha\"],\"f0J5Ki\":[\"A comunicação servidor a servidor pode usar conexões não criptografadas\"],\"f9BHJk\":[\"Avisar Usuário\"],\"fDOLLd\":[\"Nenhum canal encontrado.\"],\"ffzDkB\":[\"Análises anônimas:\"],\"fq1GF9\":[\"Exibir quando usuários se desconectam do servidor\"],\"gEF57C\":[\"Este servidor suporta apenas um tipo de conexão\"],\"gJuLUI\":[\"Lista de ignorados\"],\"gNzMrk\":[\"Avatar atual\"],\"gjPWyO\":[\"Inserir apelido...\"],\"gz6UQ3\":[\"Maximizar\"],\"h6razj\":[\"Excluir máscara do nome do canal\"],\"hG6jnw\":[\"Nenhum tópico definido\"],\"hG89Ed\":[\"Imagem\"],\"hYgDIe\":[\"Create\"],\"hZ6znB\":[\"Porta\"],\"ha+Bz5\":[\"ex.: 100:1440\"],\"he3ygx\":[\"Copy\"],\"hehnjM\":[\"Quantidade\"],\"hzdLuQ\":[\"Apenas usuários com voz ou superior podem falar\"],\"i0qMbr\":[\"Início\"],\"iDNBZe\":[\"Notificações\"],\"iH8pgl\":[\"Voltar\"],\"iL9SZg\":[\"Banir Usuário (por Apelido)\"],\"iNt+3c\":[\"Voltar para a imagem\"],\"iQvi+a\":[\"Não me avisar sobre baixa segurança de link para este servidor\"],\"iSLIjg\":[\"Conectar\"],\"iWXkHH\":[\"Halfop\"],\"iZeTtp\":[\"Host do Servidor\"],\"idD8Ev\":[\"Salvo\"],\"iivqkW\":[\"Conectado em\"],\"ij+Elv\":[\"Visualização da imagem\"],\"ilIWp7\":[\"Alternar Notificações\"],\"iuaqvB\":[\"Use * para curingas. Exemplos: baduser!*@*, *!*@spammer.com, troll*!*@*\"],\"ixkTse\":[\"Bot\"],\"j2DGR0\":[\"Banir por máscara de host\"],\"jA4uoI\":[\"Tópico:\"],\"jLXxGK\":[\"https://example.com\"],\"jPSk57\":[\"Motivo (opcional)\"],\"jUV7CU\":[\"Fazer upload do avatar\"],\"jW5Uwh\":[\"Controla quanto conteúdo de mídia externa é carregado. Desativado / Seguro / Fontes confiáveis / Todo conteúdo.\"],\"jXzms5\":[\"Opções de anexo\"],\"jZlrte\":[\"Cor\"],\"jfC/xh\":[\"Contato\"],\"jywMpv\":[\"#new-channel-name\"],\"k112DD\":[\"Carregar mensagens antigas\"],\"k3ID0F\":[\"Filtrar membros…\"],\"k65gsE\":[\"Mergulho profundo\"],\"k7Zgob\":[\"Cancelar Conexão\"],\"kAVx5h\":[\"Nenhum convite encontrado\"],\"kCLEPU\":[\"Conectado a\"],\"kF5LKb\":[\"Padrões ignorados:\"],\"kGeOx/\":[\"Entrar em \",[\"0\"]],\"kITKr8\":[\"Carregando modos do canal...\"],\"kPpPsw\":[\"Você é um IRC Operator\"],\"kWJmRL\":[\"Você\"],\"kfcRb0\":[\"Avatar\"],\"kjMqSj\":[\"Copiar JSON\"],\"krViRy\":[\"Clique para copiar como JSON\"],\"ks71ra\":[\"Exceções\"],\"kw4lRv\":[\"Meio operador do canal\"],\"kxgIRq\":[\"Selecione ou adicione um canal para começar.\"],\"ky6dWe\":[\"Visualização do avatar\"],\"l+GxCv\":[\"Carregando canais...\"],\"l+IUVW\":[\"Verificação da conta \",[\"account\"],\" bem-sucedida: \",[\"message\"]],\"l/siQz\":[[\"reconnectCount\",\"plural\",{\"one\":[\"reconectou\"],\"other\":[\"reconectou \",[\"reconnectCount\"],\" vezes\"]}]],\"l1l8sj\":[[\"0\"],\"d ago\"],\"l5NhnV\":[\"#channel (optional)\"],\"l5jmzx\":[[\"0\"],\" e \",[\"1\"],\" estão digitando...\"],\"lCF0wC\":[\"Refresh\"],\"lHy8N5\":[\"Carregando mais canais...\"],\"lasgrr\":[\"used\"],\"lbpf14\":[\"Entrar em \",[\"value\"]],\"lfFsZ4\":[\"Canais\"],\"lkNdiH\":[\"Nome da conta\"],\"ln500L\":[\"ObsidianIRC\"],\"lnCMdg\":[\"Enviar Imagem\"],\"loQxaJ\":[\"Estou de Volta\"],\"lvfaxv\":[\"INÍCIO\"],\"m16xKo\":[\"Adicionar\"],\"m8flAk\":[\"Prévia (ainda não enviado)\"],\"mEPxTp\":[\"<0>⚠️ Cuidado!</0> Abra apenas links de fontes confiáveis. Links maliciosos podem comprometer sua segurança ou privacidade.\"],\"mHGdhG\":[\"Informações do servidor\"],\"mHS8lb\":[\"Mensagem #\",[\"0\"]],\"mMYBD9\":[\"Amplo – Escopo de proteção mais amplo\"],\"mTGsPd\":[\"Tópico do canal\"],\"mU8j6O\":[\"Sem mensagens externas (+n)\"],\"mZp8FL\":[\"Retorno automático para linha única\"],\"mdQu8G\":[\"SeuApelido\"],\"miSSBQ\":[\"Comentários (\",[\"commentCount\"],\")\"],\"mvyLSy\":[\"Usuário autenticado\"],\"mwtcGl\":[\"Fechar comentários\"],\"mzI/c+\":[\"Baixar\"],\"n3fGRk\":[\"definido por \",[\"0\"]],\"nE9jsU\":[\"Relaxado – Proteção menos agressiva\"],\"nNflMD\":[\"Sair do canal\"],\"nPXkBi\":[\"Carregando dados WHOIS...\"],\"nQnxxF\":[\"Mensagem #\",[\"0\"],\" (Shift+Enter para nova linha)\"],\"nWMRxa\":[\"Desafixar\"],\"nkC032\":[\"Sem perfil de flood\"],\"o69z4d\":[\"Enviar uma mensagem de aviso para \",[\"username\"]],\"o9ylQi\":[\"Pesquise GIFs para começar\"],\"oFGkER\":[\"Avisos do Servidor\"],\"oOi11l\":[\"Rolar para o fim\"],\"oPYIL5\":[\"network\"],\"oQEzQR\":[\"Nova mensagem direta\"],\"oXOSPE\":[\"Online\"],\"oal760\":[\"Ataques man-in-the-middle em links de servidor são possíveis\"],\"oeqmmJ\":[\"Fontes Confiáveis\"],\"optX0N\":[[\"0\"],\"h ago\"],\"ovBPCi\":[\"Padrão\"],\"p0Z69r\":[\"O padrão não pode estar vazio\"],\"p1KgtK\":[\"Falha ao carregar áudio\"],\"p59pEv\":[\"Detalhes adicionais\"],\"p7sRI6\":[\"Avisar outros quando você está digitando\"],\"pBm1od\":[\"Canal secreto\"],\"pNmiXx\":[\"Seu apelido padrão para todos os servidores\"],\"pUUo9G\":[\"Hostname:\"],\"pVGPmz\":[\"Senha da conta\"],\"peNE68\":[\"Permanente\"],\"plhHQt\":[\"Sem dados\"],\"pm6+q5\":[\"Aviso de Segurança\"],\"pn5qSs\":[\"Informações adicionais\"],\"q0cR4S\":[\"agora é conhecido como **\",[\"newNick\"],\"**\"],\"qFcunY\":[\"O canal não aparecerá nos comandos LIST ou NAMES\"],\"qLpTm/\":[\"Remover reação \",[\"emoji\"]],\"qVkGWK\":[\"Fixar\"],\"qY8wNa\":[\"Página inicial\"],\"qb0xJ7\":[\"Curingas: * corresponde a qualquer sequência, ? a um único caractere. Exemplos: nick!*@*, *!*@host.com, *!*user@*\"],\"qhzpRq\":[\"Chave do canal (+k)\"],\"qtoOYG\":[\"Sem limite\"],\"r1W2AS\":[\"Imagem do servidor de arquivos\"],\"rIPR2O\":[\"Tópico definido antes (min atrás)\"],\"rMMSYo\":[\"O comprimento máximo é \",[\"0\"]],\"rWtzQe\":[\"A rede se dividiu e reconectou. ✅\"],\"rYG2u6\":[\"Aguarde...\"],\"rdUucN\":[\"Visualização\"],\"rjGI/Q\":[\"Privacidade\"],\"rk8iDX\":[\"Carregando GIFs...\"],\"rn6SBY\":[\"Ativar som\"],\"s/UKqq\":[\"Foi expulso do canal\"],\"s8cATI\":[\"entrou em \",[\"channelName\"]],\"sCO9ue\":[\"A conexão com <0>\",[\"serverName\"],\"</0> apresenta as seguintes preocupações de segurança:\"],\"sGH11W\":[\"Servidor\"],\"sHI1H+\":[\"agora é conhecido como **\",[\"newNick\"],\"**\"],\"sJyV04\":[[\"inviter\"],\" convidou você para entrar em \",[\"channel\"]],\"sby+1/\":[\"Clique para copiar\"],\"sfN25C\":[\"Seu nome real ou completo\"],\"sliuzR\":[\"Abrir Link\"],\"sqrO9R\":[\"Menções personalizadas\"],\"sr6RdJ\":[\"Multilinha com Shift+Enter\"],\"swrCpB\":[\"O canal foi renomeado de \",[\"oldName\"],\" para \",[\"newName\"],\" por \",[\"user\"],[\"0\"]],\"sxkWRg\":[\"Avançado\"],\"t/YqKh\":[\"Remover\"],\"t47eHD\":[\"Seu identificador único neste servidor\"],\"tAkAh0\":[\"URL com substituição opcional \",[\"size\"],\". Exemplo: https://example.com/avatar/\",[\"size\"],\"/channel.jpg\"],\"tXLJS3\":[\"Mostrar ou ocultar a barra lateral de canais\"],\"tfDRzk\":[\"Salvar\"],\"tiBsJk\":[\"saiu de \",[\"channelName\"]],\"tt4/UD\":[\"saiu (\",[\"reason\"],\")\"],\"u0TcnO\":[\"O apelido {nick} já está em uso, tentando com {newNick}\"],\"u0a8B4\":[\"Autenticar como operador IRC para acesso administrativo\"],\"u0rWFU\":[\"Criado após (min atrás)\"],\"u72w3t\":[\"Usuários e padrões a ignorar\"],\"u7jc2L\":[\"saiu\"],\"uAQUqI\":[\"Status\"],\"uB85T3\":[\"Falha ao salvar: \",[\"msg\"]],\"uV3DOL\":[\"G-Line\"],\"uW3lLI\":[\"Servidores IRC:\"],\"ukyW4o\":[\"Your invite links\"],\"usSSr/\":[\"Nível de zoom\"],\"v7uvcf\":[\"Software:\"],\"vE8kb+\":[\"Shift+Enter para novas linhas (Enter envia)\"],\"vERlcd\":[\"Perfil\"],\"vK0RL8\":[\"Sem tópico\"],\"vSJd18\":[\"Vídeo\"],\"vXIe7J\":[\"Idioma\"],\"vaHYxN\":[\"Nome real\"],\"vhjbKr\":[\"Ausente\"],\"w4NYox\":[\"cliente \",[\"title\"]],\"w8xQRx\":[\"Valor inválido\"],\"wFjjxZ\":[\"foi expulso de \",[\"channelName\"],\" por \",[\"username\"],\" (\",[\"reason\"],\")\"],\"wGjaGl\":[\"Nenhuma exceção de banimento encontrada\"],\"wPrGnM\":[\"Administrador do canal\"],\"wRkP2d\":[\"GIF\"],\"wbm86v\":[\"Exibir quando usuários entram ou saem de canais\"],\"whqZ9r\":[\"Palavras ou frases adicionais para destacar\"],\"wm7RV4\":[\"Som de notificação\"],\"wz/Yoq\":[\"Suas mensagens podem ser interceptadas ao serem retransmitidas entre servidores\"],\"x3+y8b\":[\"This many people registered through this link\"],\"xCJdfg\":[\"Limpar\"],\"xOTzt5\":[\"just now\"],\"xUHRTR\":[\"Autenticar automaticamente como operador ao conectar\"],\"xWHwwQ\":[\"Banimentos\"],\"xYilR2\":[\"Mídia\"],\"xbi8D6\":[\"This server doesn't support invite links (the<0>obby.world/invitation</0>capability isn't advertised). You can still chat normally; this panel is for obbyircd-powered networks.\"],\"xceQrO\":[\"Apenas websockets seguros são suportados\"],\"xdtXa+\":[\"nome-do-canal\"],\"xfXC7q\":[\"Canais de texto\"],\"xlCYOE\":[\"Carregando mais mensagens...\"],\"xlhswE\":[\"O valor mínimo é \",[\"0\"]],\"xq97Ci\":[\"Adicionar uma palavra ou frase...\"],\"xuRqRq\":[\"Limite de clientes (+l)\"],\"xwF+7J\":[[\"0\"],\" está digitando...\"],\"y1eoq1\":[\"Copy link\"],\"yNeucF\":[\"Este servidor não suporta metadados de perfil estendidos (extensão IRCv3 METADATA). Campos como avatar, nome de exibição e status não estão disponíveis.\"],\"yPlrca\":[\"Avatar do canal\"],\"yQE2r9\":[\"Carregando\"],\"ySU+JY\":[\"seu@email.com\"],\"yTX1Rt\":[\"Nome de usuário Oper\"],\"yYOzWD\":[\"logs\"],\"yfx9Re\":[\"Senha de operador IRC\"],\"ygCKqB\":[\"Parar\"],\"ymDxJx\":[\"Nome de usuário de operador IRC\"],\"yrpRsQ\":[\"Ordenar por nome\"],\"yz7wBu\":[\"Fechar\"],\"zJw+jA\":[\"define modo: \",[\"0\"]],\"zbymaY\":[[\"0\"],\"m ago\"],\"zebeLu\":[\"Digite o nome de usuário oper\"],\"zpr0Bw\":[\"GZ-Line\"]}"); No newline at end of file
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Portuguese runtime bundle still ships multiple English invite strings.

The generated messages payload includes untranslated English strings for the new Invitations UI, which causes mixed-language UX in pt.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/locales/pt/messages.mjs` at line 1, The runtime Portuguese bundle exports
a messages JSON that still contains untranslated English invite-related entries
(the exported const messages in the file contains keys like RIfHS5, WYxRzo,
UETAwW, etc. that map to English invite strings); open the exported messages
payload (the JSON string assigned to messages), translate the English invite UI
strings to Portuguese for those keys (and any other invite-related keys left in
English), update the JSON string (or regenerate the locale bundle via the i18n
build step) and rebuild the bundle so src/locales/pt/messages.mjs ships complete
Portuguese translations.

Comment on lines +69 to +82
#. placeholder {0}: Math.floor(secs / 86400)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}d ago"
msgstr ""

#. placeholder {0}: Math.floor(secs / 3600)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}h ago"
msgstr ""

#. placeholder {0}: Math.floor(secs / 60)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}m ago"
msgstr ""
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Complete Portuguese translations for new Invitations strings.

These newly added entries are still empty (msgstr ""), so users in pt will see untranslated text in this feature.

As per coding guidelines, "When adding new user-visible strings, translate them before committing — run npm run i18n:extract to identify missing strings, then fill in all empty msgstr "" entries across every non-English .po file before committing".

Also applies to: 116-118, 564-567, 665-668, 710-713, 726-729, 734-745, 815-818, 823-826, 1276-1279, 1314-1317, 1554-1557, 1667-1670, 2017-2021, 2444-2455, 2602-2605, 2795-2798, 2815-2818

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/locales/pt/messages.po` around lines 69 - 82, The pt translation file has
empty msgstr entries for the InvitationsPanel time-ago strings (msgid "{0}d
ago", "{0}h ago", "{0}m ago" referenced from
src/components/ui/InvitationsPanel.tsx); fill those msgstr values with
Portuguese translations (for example "há {0}d", "há {0}h", "há {0}m" or prefer
full words like "há {0} dias", "há {0} horas", "há {0} minutos" as appropriate),
then run npm run i18n:extract and ensure you populate all other empty msgstr ""
entries across non-English .po files mentioned in the review before committing.

Comment on lines +69 to +83
#. placeholder {0}: Math.floor(secs / 86400)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}d ago"
msgstr ""

#. placeholder {0}: Math.floor(secs / 3600)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}h ago"
msgstr ""

#. placeholder {0}: Math.floor(secs / 60)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}m ago"
msgstr ""

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fill all newly added Romanian invite strings before merge.

Many new invite-related entries are still msgstr "", so Romanian users will see untranslated English UI text in this flow.

As per coding guidelines, "When adding new user-visible strings, translate them before committing — run npm run i18n:extract to identify missing strings, then fill in all empty msgstr "" entries across every non-English .po file before committing".

Also applies to: 116-118, 564-567, 665-667, 710-712, 726-728, 734-745, 815-817, 823-826, 1267-1278, 1314-1316, 1554-1556, 1667-1669, 2017-2020, 2444-2455, 2602-2604, 2795-2817

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/locales/ro/messages.po` around lines 69 - 83, Several Romanian
translations for invite-related strings are blank; open
src/locales/ro/messages.po and fill the empty msgstr entries for the entries
referenced (e.g., the "{0}d ago", "{0}h ago", "{0}m ago" entries tied to
src/components/ui/InvitationsPanel.tsx and the other ranges called out) with
proper Romanian equivalents using the same placeholder {0} (for example "acum
{0}z", "acum {0}h", "acum {0}m" or correct localized forms), then run npm run
i18n:extract to verify no other non-English .po files have empty msgstr entries
before committing. Ensure you preserve placeholders exactly as {0} and update
any other listed ranges (116-118, 564-567, etc.) in the same file set.

Comment on lines +69 to +83
#. placeholder {0}: Math.floor(secs / 86400)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}d ago"
msgstr ""

#. placeholder {0}: Math.floor(secs / 3600)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}h ago"
msgstr ""

#. placeholder {0}: Math.floor(secs / 60)
#: src/components/ui/InvitationsPanel.tsx
msgid "{0}m ago"
msgstr ""

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Fill all newly added Russian msgstr values before merge.

These new user-facing Invitation strings are still empty (msgstr ""), so RU users will see untranslated text in this flow.

As per coding guidelines, "When adding new user-visible strings, translate them before committing — run npm run i18n:extract to identify missing strings, then fill in all empty msgstr "" entries across every non-English .po file before committing".

Also applies to: 116-118, 564-566, 665-667, 710-712, 726-728, 734-736, 738-740, 742-744, 815-817, 823-825, 1276-1278, 1314-1316, 1554-1556, 1667-1669, 2017-2020, 2444-2446, 2452-2454, 2602-2604, 2795-2797, 2815-2817

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/locales/ru/messages.po` around lines 69 - 83, The new Russian
translations in src/locales/ru/messages.po are left empty (msgstr ""), causing
untranslated UI strings; open the file and fill every newly added msgstr for the
Invitation-related msgid entries (e.g., "{0}d ago", "{0}h ago", "{0}m ago" and
all other empty msgstr occurrences called out in the review) with proper Russian
text preserving placeholders like {0}; run npm run i18n:extract to locate any
other missing translations across non-English .po files, update all empty msgstr
entries accordingly, and commit the updated .po files before merging.

The settings UI has two parallel render branches (mobile and desktop)
and the previous patch only touched the mobile one. On desktop the
Invitations tab fell through to nothing, which is what the user was
seeing.
These vendor caps weren't in `ourCaps`, so even when the server
advertised them in CAP LS the client never requested them, the
server never ACKed them, and `server.capabilities` never contained
them. Net effect: the Invitations panel kept rendering the
'capability isn't advertised' fallback against servers that fully
support the protocol.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant