Skip to content

Conversation

@ildyria
Copy link
Member

@ildyria ildyria commented Jan 3, 2026

Summary by CodeRabbit

  • Bug Fixes
    • Updated license expiration dialog links to open in a new tab with enhanced security attributes across all supported languages.

✏️ Tip: You can customize this high-level summary in your review settings.

@ildyria ildyria requested a review from a team as a code owner January 3, 2026 16:40
@coderabbitai
Copy link

coderabbitai bot commented Jan 3, 2026

📝 Walkthrough

Walkthrough

Updated 21 language translation files to add target="_blank" rel="noopener noreferrer" attributes to the license key link in the expired_license dialog message, enabling it to open in a new tab with security safeguards.

Changes

Cohort / File(s) Summary
Language Translation Files
lang/ar/dialogs.php, lang/cz/dialogs.php, lang/de/dialogs.php, lang/el/dialogs.php, lang/en/dialogs.php, lang/es/dialogs.php, lang/fa/dialogs.php, lang/fr/dialogs.php, lang/hu/dialogs.php, lang/it/dialogs.php, lang/ja/dialogs.php, lang/nl/dialogs.php, lang/no/dialogs.php, lang/pl/dialogs.php, lang/pt/dialogs.php, lang/ru/dialogs.php, lang/sk/dialogs.php, lang/sv/dialogs.php, lang/vi/dialogs.php, lang/zh_CN/dialogs.php, lang/zh_TW/dialogs.php
Updated register.expired_license string to add target="_blank" rel="noopener noreferrer" to the keygen.lycheeorg.dev anchor tag across all 21 supported languages. No functional or logic changes—purely HTML attribute addition to the translation string.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐰 Hop, hop—translations take flight,
Security wards in every site,
Twenty-one tongues, one hearts' delight,
Links bloom safely, target in sight!

Pre-merge checks

✅ Passed checks (1 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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.

Copy link

@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: 3

🧹 Nitpick comments (5)
lang/el/dialogs.php (1)

74-74: Security attributes correctly added.

The target="_blank" and rel="noopener noreferrer" attributes are properly implemented, ensuring the link opens securely in a new tab and preventing potential security issues like tabnapping.

Optional: Consider translating the message to Greek.

The expired_license message is currently in English. While this doesn't block the PR, translating it to Greek would improve consistency with the rest of the file.

lang/nl/dialogs.php (1)

74-74: Security attributes correctly added.

The target="_blank" and rel="noopener noreferrer" attributes are properly implemented, ensuring the link opens securely in a new tab.

Optional: Consider translating the message to Dutch.

The expired_license message is currently in English. While this doesn't block the PR, translating it to Dutch would improve consistency with other translated messages in this file (e.g., enter_license, license_key, invalid_license).

lang/it/dialogs.php (1)

74-74: Security attributes correctly added.

The target="_blank" and rel="noopener noreferrer" attributes are properly implemented, ensuring the link opens securely in a new tab.

Optional: Consider translating the message to Italian.

The expired_license message is currently in English. While this doesn't block the PR, translating it to Italian would improve consistency with other translated messages in this file.

lang/es/dialogs.php (1)

74-74: Security attributes correctly added.

The target="_blank" and rel="noopener noreferrer" attributes are properly implemented, ensuring the link opens securely in a new tab.

Optional: Consider translating the message to Spanish.

The expired_license message is currently in English. While this doesn't block the PR, translating it to Spanish would improve consistency with other translated messages in this file (e.g., lines 71-73, 75).

lang/fr/dialogs.php (1)

74-74: Good security practice with rel="noopener noreferrer".

The addition of target="_blank" and rel="noopener noreferrer" correctly prevents potential security issues (tabnabbing, window.opener access) when opening the external keygen link. This improves both security and user experience.

Note: The message text appears to be in English rather than French. This seems to be a pre-existing condition and outside the scope of this PR, but consider translating this string in a future update for consistency with the rest of the French locale.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2048004 and 6a56094.

📒 Files selected for processing (21)
  • lang/ar/dialogs.php
  • lang/cz/dialogs.php
  • lang/de/dialogs.php
  • lang/el/dialogs.php
  • lang/en/dialogs.php
  • lang/es/dialogs.php
  • lang/fa/dialogs.php
  • lang/fr/dialogs.php
  • lang/hu/dialogs.php
  • lang/it/dialogs.php
  • lang/ja/dialogs.php
  • lang/nl/dialogs.php
  • lang/no/dialogs.php
  • lang/pl/dialogs.php
  • lang/pt/dialogs.php
  • lang/ru/dialogs.php
  • lang/sk/dialogs.php
  • lang/sv/dialogs.php
  • lang/vi/dialogs.php
  • lang/zh_CN/dialogs.php
  • lang/zh_TW/dialogs.php
🧰 Additional context used
📓 Path-based instructions (1)
**/*.php

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

**/*.php: Any new PHP file should contain the license header and have a single blank line after the opening PHP tag
Variable names should be in snake_case in PHP
Apply the PSR-4 coding standard in PHP
Use in_array() with true as the third parameter in PHP
Only use booleans in if statements, not integers or strings
Use strict comparison (===) instead of loose comparison (==)
Avoid code duplication in both if and else statements
Do not use empty() in PHP
Use the moneyphp/money library for handling monetary values in PHP
Never use floats or doubles to represent monetary values; use integers representing the smallest currency unit (e.g., cents for USD)

**/*.php: Write or extend executable specifications (unit, behaviour, or scenario tests) ahead of implementation, confirm they fail, and then drive code to green before refactoring. List the expected success, validation, and failure branches and add thin failing tests for each path.
For PHP code, adhere to conventions: license headers in new files, strict comparison (===), no empty(), in_array() with third parameter true, snake_case variables, PSR-4 standard, test base classes (AbstractTestCase for Unit, BaseApiWithDataTest for Feature_v2).
Always run phpunit tests. If a test remains red, disable it with a TODO, note the reason, and capture the follow-up in the relevant plan.
Spotless now uses Palantir Java Format 2.78.0 with a 120-character wrap; configure IDE formatters to match before pushing code changes.
Keep each increment's control flow flat by delegating validation/normalisation into tiny pure helpers that return simple enums or result records, then compose them instead of introducing inline branching that inflates the branch count per change.
When introducing new helpers/utilities or editing files prone to style violations (records, DTOs, generated adapters), run the narrowest applicable lint target (for example phpstan) before the full pipeline. Note the command in the related plan/task.
For PHP changes, ru...

Files:

  • lang/ja/dialogs.php
  • lang/sv/dialogs.php
  • lang/el/dialogs.php
  • lang/en/dialogs.php
  • lang/it/dialogs.php
  • lang/vi/dialogs.php
  • lang/pl/dialogs.php
  • lang/pt/dialogs.php
  • lang/es/dialogs.php
  • lang/zh_CN/dialogs.php
  • lang/de/dialogs.php
  • lang/hu/dialogs.php
  • lang/no/dialogs.php
  • lang/cz/dialogs.php
  • lang/sk/dialogs.php
  • lang/fa/dialogs.php
  • lang/ru/dialogs.php
  • lang/fr/dialogs.php
  • lang/zh_TW/dialogs.php
  • lang/ar/dialogs.php
  • lang/nl/dialogs.php
🧠 Learnings (3)
📚 Learning: 2025-12-19T21:01:32.168Z
Learnt from: ildyria
Repo: LycheeOrg/Lychee PR: 3838
File: lang/pl/webshop.php:1-2
Timestamp: 2025-12-19T21:01:32.168Z
Learning: In the Lychee repository, PHP files under the lang/ directory (and its subdirectories) do not require the standard license header. This is an exception to the general PHP license header rule. Ensure all non-lang PHP files continue to include the license header.

Applied to files:

  • lang/ja/dialogs.php
  • lang/sv/dialogs.php
  • lang/el/dialogs.php
  • lang/en/dialogs.php
  • lang/it/dialogs.php
  • lang/vi/dialogs.php
  • lang/pl/dialogs.php
  • lang/pt/dialogs.php
  • lang/es/dialogs.php
  • lang/zh_CN/dialogs.php
  • lang/de/dialogs.php
  • lang/hu/dialogs.php
  • lang/no/dialogs.php
  • lang/cz/dialogs.php
  • lang/sk/dialogs.php
  • lang/fa/dialogs.php
  • lang/ru/dialogs.php
  • lang/fr/dialogs.php
  • lang/zh_TW/dialogs.php
  • lang/ar/dialogs.php
  • lang/nl/dialogs.php
📚 Learning: 2025-12-19T21:01:45.910Z
Learnt from: ildyria
Repo: LycheeOrg/Lychee PR: 3838
File: lang/ar/webshop.php:1-2
Timestamp: 2025-12-19T21:01:45.910Z
Learning: Do not require license headers for language translation files under the lang/ directory (e.g., lang/ar/webshop.php). These resource files are exempt from header checks; apply header enforcement to other PHP source files in the repo.

Applied to files:

  • lang/ja/dialogs.php
  • lang/sv/dialogs.php
  • lang/el/dialogs.php
  • lang/en/dialogs.php
  • lang/it/dialogs.php
  • lang/vi/dialogs.php
  • lang/pl/dialogs.php
  • lang/pt/dialogs.php
  • lang/es/dialogs.php
  • lang/zh_CN/dialogs.php
  • lang/de/dialogs.php
  • lang/hu/dialogs.php
  • lang/no/dialogs.php
  • lang/cz/dialogs.php
  • lang/sk/dialogs.php
  • lang/fa/dialogs.php
  • lang/ru/dialogs.php
  • lang/fr/dialogs.php
  • lang/zh_TW/dialogs.php
  • lang/ar/dialogs.php
  • lang/nl/dialogs.php
📚 Learning: 2025-12-28T18:12:55.752Z
Learnt from: ildyria
Repo: LycheeOrg/Lychee PR: 3901
File: app/Providers/AppServiceProvider.php:0-0
Timestamp: 2025-12-28T18:12:55.752Z
Learning: When using Laravel Octane's tick API, Octane::tick(...) returns an InvokeTickCallable that only has ->seconds(int) and ->immediate() methods. There is no ->every(N) method. Use the correct usage: Octane::tick('name', fn() => ...)->seconds(N) or Octane::tick('name', fn() => ..., N). Apply this guideline to PHP files across the project (not just AppServiceProvider.php).

Applied to files:

  • lang/ja/dialogs.php
  • lang/sv/dialogs.php
  • lang/el/dialogs.php
  • lang/en/dialogs.php
  • lang/it/dialogs.php
  • lang/vi/dialogs.php
  • lang/pl/dialogs.php
  • lang/pt/dialogs.php
  • lang/es/dialogs.php
  • lang/zh_CN/dialogs.php
  • lang/de/dialogs.php
  • lang/hu/dialogs.php
  • lang/no/dialogs.php
  • lang/cz/dialogs.php
  • lang/sk/dialogs.php
  • lang/fa/dialogs.php
  • lang/ru/dialogs.php
  • lang/fr/dialogs.php
  • lang/zh_TW/dialogs.php
  • lang/ar/dialogs.php
  • lang/nl/dialogs.php
⏰ Context from checks skipped due to timeout of 180000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (19)
  • GitHub Check: 2️⃣ PHP dist / 8.5 - postgresql
  • GitHub Check: 2️⃣ PHP dist / 8.5 - mariadb
  • GitHub Check: 2️⃣ PHP dist / 8.5 - sqlite
  • GitHub Check: 2️⃣ PHP dist / 8.4 - sqlite
  • GitHub Check: 1️⃣ PHP tests / 8.5 - mariadb -- Webshop
  • GitHub Check: 1️⃣ PHP tests / 8.5 - mariadb -- Precomputing
  • GitHub Check: 1️⃣ PHP tests / 8.5 - sqlite -- Webshop
  • GitHub Check: 1️⃣ PHP tests / 8.5 - postgresql -- Unit
  • GitHub Check: 1️⃣ PHP tests / 8.5 - mariadb -- ImageProcessing
  • GitHub Check: 1️⃣ PHP tests / 8.5 - postgresql -- Webshop
  • GitHub Check: 1️⃣ PHP tests / 8.5 - sqlite -- Unit
  • GitHub Check: 1️⃣ PHP tests / 8.5 - sqlite -- ImageProcessing
  • GitHub Check: 1️⃣ PHP tests / 8.5 - postgresql -- Precomputing
  • GitHub Check: 1️⃣ PHP tests / 8.5 - postgresql -- ImageProcessing
  • GitHub Check: 1️⃣ PHP tests / 8.5 - sqlite -- Feature_v2
  • GitHub Check: 1️⃣ PHP tests / 8.5 - sqlite -- Precomputing
  • GitHub Check: 1️⃣ PHP tests / 8.5 - postgresql -- Feature_v2
  • GitHub Check: 1️⃣ PHP tests / 8.5 - mariadb -- Unit
  • GitHub Check: 1️⃣ PHP tests / 8.5 - mariadb -- Feature_v2
🔇 Additional comments (13)
lang/hu/dialogs.php (1)

74-74: Missing Hungarian translation for expired license message.

The technical implementation of target="_blank" rel="noopener noreferrer" is correct. However, this Hungarian language file should contain Hungarian translations for better localization coverage.

⛔ Skipped due to learnings
Learnt from: ildyria
Repo: LycheeOrg/Lychee PR: 3641
File: lang/no/settings.php:9-9
Timestamp: 2025-08-22T06:11:18.329Z
Learning: For lang/* translation files in the Lychee project: only review PHP-related issues (syntax, structure, etc.), not translation content, grammar, or language-related nitpicks. The maintainer ildyria has explicitly requested this approach.
lang/de/dialogs.php (1)

74-74: Missing German translation for expired license message.

The technical implementation is correct (target="_blank" rel="noopener noreferrer" properly secures the external link), but the message text remains in English instead of German. This is inconsistent with the surrounding translations and affects UX for German-speaking users.

🔎 Consider translating to German
-        'expired_license' => 'Your license key has expired. Empty the field or get a new one at <a href="https://keygen.lycheeorg.dev" class="text-primary-500 underline" target="_blank" rel="noopener noreferrer">keygen.lycheeorg.dev</a>.',
+        'expired_license' => 'Ihr Lizenzschlüssel ist abgelaufen. Leeren Sie das Feld oder erhalten Sie einen neuen unter <a href="https://keygen.lycheeorg.dev" class="text-primary-500 underline" target="_blank" rel="noopener noreferrer">keygen.lycheeorg.dev</a>.',
⛔ Skipped due to learnings
Learnt from: ildyria
Repo: LycheeOrg/Lychee PR: 3641
File: lang/no/settings.php:9-9
Timestamp: 2025-08-22T06:11:18.329Z
Learning: For lang/* translation files in the Lychee project: only review PHP-related issues (syntax, structure, etc.), not translation content, grammar, or language-related nitpicks. The maintainer ildyria has explicitly requested this approach.
Learnt from: ildyria
Repo: LycheeOrg/Lychee PR: 3637
File: lang/nl/renamer.php:10-94
Timestamp: 2025-08-20T20:35:04.474Z
Learning: In Lychee, translation files are initially created with English strings as placeholders, and actual translations are handled through Weblate (a web-based translation management system). This means finding English text in non-English locale files (like lang/nl/, lang/de/, etc.) is expected and part of their translation workflow, not an issue to flag.
lang/cz/dialogs.php (1)

74-74: LGTM! Security best practice applied.

The addition of target="_blank" opens the link in a new tab, and rel="noopener noreferrer" prevents the new page from accessing the opener window and leaking referrer information.

lang/ja/dialogs.php (1)

74-74: LGTM! Security best practice applied.

The addition of target="_blank" opens the link in a new tab, and rel="noopener noreferrer" prevents the new page from accessing the opener window and leaking referrer information.

lang/vi/dialogs.php (1)

74-74: LGTM! Security best practice applied.

The addition of target="_blank" opens the link in a new tab, and rel="noopener noreferrer" prevents the new page from accessing the opener window and leaking referrer information.

lang/no/dialogs.php (1)

74-74: LGTM! Security best practice applied.

The addition of target="_blank" opens the link in a new tab, and rel="noopener noreferrer" prevents the new page from accessing the opener window and leaking referrer information.

lang/sv/dialogs.php (1)

74-74: LGTM! Security best practice applied.

The addition of target="_blank" opens the link in a new tab, and rel="noopener noreferrer" prevents the new page from accessing the opener window and leaking referrer information.

lang/en/dialogs.php (1)

75-75: LGTM! Security attributes correctly implemented.

The addition of target="_blank" and rel="noopener noreferrer" follows security best practices by opening the link in a new tab while preventing the new page from accessing window.opener and avoiding referrer leakage.

lang/ar/dialogs.php (1)

74-74: Consistent security improvement across locales.

The same security attributes have been correctly applied here as in other locale files. As with lang/fr/dialogs.php, the English message text appears to be pre-existing and could be translated to Arabic in a future localization pass.

lang/sk/dialogs.php (1)

74-74: LGTM!

Security attributes correctly applied, consistent with the other locale files in this PR.

lang/fa/dialogs.php (1)

74-74: LGTM!

The security improvement is correctly implemented here as well.

lang/pl/dialogs.php (1)

74-74: LGTM!

The change is correctly applied, matching the security improvements across all other locale files in this PR.

lang/pt/dialogs.php (1)

74-74: LGTM! Secure external link implementation.

The addition of target="_blank" opens the link in a new tab as intended, and rel="noopener noreferrer" correctly prevents security vulnerabilities (window.opener exploitation and referrer leakage). This follows web security best practices for external links.

@codecov
Copy link

codecov bot commented Jan 3, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 90.11%. Comparing base (2048004) to head (6a56094).
⚠️ Report is 1 commits behind head on master.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@ildyria ildyria merged commit a886d08 into master Jan 3, 2026
42 checks passed
@ildyria ildyria deleted the open-in-new-page branch January 3, 2026 17:06
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.

2 participants