Skip to content

Feat: Fallback locales#10307

Merged
Meldiron merged 6 commits into1.7.xfrom
feat-fallback-locale
Aug 12, 2025
Merged

Feat: Fallback locales#10307
Meldiron merged 6 commits into1.7.xfrom
feat-fallback-locale

Conversation

@Meldiron
Copy link
Copy Markdown
Contributor

What does this PR do?

  1. Removes unused translations
  2. Upgrades locale to support fallback locale
  3. Add fallback locale implementation
  4. Test fallback locale
  5. Add CI/CD job to ensure fallback locale (EN) includes all keys

Test Plan

  • Existing tests must pass
  • New tests must pass

Related PRs and Issues

x

Checklist

  • Have you read the Contributing Guidelines on issues?
  • If the PR includes a change to an API's metadata (desc, label, params, etc.), does it also include updated API specs and example docs?

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Aug 12, 2025

📝 Walkthrough

Walkthrough

Adds a GitHub Actions step "Run Locale check" and a small Node locale-audit script with package.json under .github/workflows/static-analysis/locale. Removes emails.magicSession.body and emails.magicSession.footer from many locale JSON files and adds a new "mock" key to en.json and de.json. Bumps utopia-php/locale in composer.json to 0.8.*. Configures Locale fallback in app/init/resources.php, app/controllers/api/projects.php, and Certificates worker. Adds a /v1/mock/tests/locale endpoint and an E2E test (testFallbackLocale) validating fallback behavior.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • 1.7.x #9897 — Related changes to locale initialization/resources and locale handling; similar area of code (resources and translations).
  • Fix template to use button #9590 — Modifies email-template handling in app/controllers/api/projects.php; overlaps with the locale fallback change.
  • Update documentation #10030 — Also touches getEmailTemplate/locale logic in app/controllers/api/projects.php; related to how email templates and locale parameters are handled.

Suggested reviewers

  • stnguyen90
  • abnegate
✨ Finishing Touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat-fallback-locale

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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Aug 12, 2025

Security Scan Results for PR

Docker Image Scan Results

Package Version Vulnerability Severity
binutils 2.42-r0 CVE-2025-0840 HIGH
git 2.45.3-r0 CVE-2025-48384 HIGH
git 2.45.3-r0 CVE-2025-48385 HIGH
git-init-template 2.45.3-r0 CVE-2025-48384 HIGH
git-init-template 2.45.3-r0 CVE-2025-48385 HIGH
icu 74.2-r0 CVE-2025-5222 HIGH
icu-data-en 74.2-r0 CVE-2025-5222 HIGH
icu-dev 74.2-r0 CVE-2025-5222 HIGH
icu-libs 74.2-r0 CVE-2025-5222 HIGH
libexpat 2.6.4-r0 CVE-2024-8176 HIGH
libxml2 2.12.7-r0 CVE-2024-56171 HIGH
libxml2 2.12.7-r0 CVE-2025-24928 HIGH
libxml2 2.12.7-r0 CVE-2025-27113 HIGH
libxml2 2.12.7-r0 CVE-2025-32414 HIGH
libxml2 2.12.7-r0 CVE-2025-32415 HIGH
pyc 3.12.9-r0 CVE-2024-12718 HIGH
pyc 3.12.9-r0 CVE-2025-4138 HIGH
pyc 3.12.9-r0 CVE-2025-4330 HIGH
pyc 3.12.9-r0 CVE-2025-4517 HIGH
python3 3.12.9-r0 CVE-2024-12718 HIGH
python3 3.12.9-r0 CVE-2025-4138 HIGH
python3 3.12.9-r0 CVE-2025-4330 HIGH
python3 3.12.9-r0 CVE-2025-4517 HIGH
python3-pyc 3.12.9-r0 CVE-2024-12718 HIGH
python3-pyc 3.12.9-r0 CVE-2025-4138 HIGH
python3-pyc 3.12.9-r0 CVE-2025-4330 HIGH
python3-pyc 3.12.9-r0 CVE-2025-4517 HIGH
python3-pycache-pyc0 3.12.9-r0 CVE-2024-12718 HIGH
python3-pycache-pyc0 3.12.9-r0 CVE-2025-4138 HIGH
python3-pycache-pyc0 3.12.9-r0 CVE-2025-4330 HIGH
python3-pycache-pyc0 3.12.9-r0 CVE-2025-4517 HIGH
sqlite-libs 3.45.3-r1 CVE-2025-29087 HIGH
xz 5.6.2-r0 CVE-2025-31115 HIGH
xz-libs 5.6.2-r0 CVE-2025-31115 HIGH
golang.org/x/crypto v0.31.0 CVE-2025-22869 HIGH
golang.org/x/oauth2 v0.24.0 CVE-2025-22868 HIGH
stdlib 1.22.10 CVE-2025-47907 HIGH

Source Code Scan Results

🎉 No vulnerabilities found!

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: 2

🧹 Nitpick comments (9)
app/config/locale/translations/en.json (1)

277-279: Consider namespacing test-only translation key

Adding a test-only key at the root ("mock") works, but consider namespacing (e.g., "tests.mock") to avoid future collisions and keep production keys distinct from test artifacts.

Apply this diff here:

-    "mock": "A mock translation for testing purposes."
+    "tests.mock": "A mock translation for testing purposes."

Outside this file, update usages accordingly:

  • app/controllers/mock.php: use "tests.mock"
  • tests referencing the key: use "tests.mock"
.github/workflows/static-analysis/locale/package.json (1)

1-13: Mark package as private and avoid mismatched licensing

This is an internal CI helper under .github; mark it private and avoid publishing/licensing confusion by using UNLICENSED (or match the repo’s BSD-3). Also optionally declare the Node engine to align with the workflow (node:24).

Apply this diff:

 {
   "name": "static-analysis-locale",
   "version": "1.0.0",
   "type": "module",
   "main": "index.js",
+  "private": true,
   "scripts": {
     "test": "echo \"Error: no test specified\" && exit 1"
   },
   "keywords": [],
   "author": "",
-  "license": "ISC",
+  "license": "UNLICENSED",
+  "engines": {
+    "node": ">=20"
+  },
   "description": ""
 }
.github/workflows/static-analysis/locale/index.js (6)

11-14: Make config overridable via env vars (for easy CI toggling)

Allow CI to switch strict mode or fallback without code changes.

Apply this diff:

-const config = {
-  strict: false,
-  fallbackLocale: "en.json",
-};
+const config = {
+  strict: process.env.LOCALE_STRICT === "true",
+  fallbackLocale: process.env.LOCALE_FALLBACK || "en.json",
+};

49-56: Harden JSON parsing with file-aware errors

If a locale file has invalid JSON, the current code throws without identifying the offending file. Add a try/catch to improve diagnostics and fail fast.

Apply this diff:

   for (const file of files) {
     const filePath = join(translationsPath, file);
     const content = await readFile(filePath, "utf8");
-    const translations = JSON.parse(content);
+    let translations;
+    try {
+      translations = JSON.parse(content);
+    } catch (e) {
+      console.error(`Invalid JSON in ${filePath}: ${e.message}`);
+      process.exit(1);
+    }
 
     // Add all keys from this file
     Object.keys(translations).forEach((key) => allKeys.add(key));
   }

70-75: Harden JSON parsing for the checked locale(s)

Mirror the above improvement for the per-locale read.

Apply this diff:

   for (const localeToCheck of localesToCheck) {
     // Read locale
     const path = join(translationsPath, localeToCheck);
     const content = await readFile(path, "utf8");
-    const translations = JSON.parse(content);
+    let translations;
+    try {
+      translations = JSON.parse(content);
+    } catch (e) {
+      console.error(`Invalid JSON in ${path}: ${e.message}`);
+      process.exit(1);
+    }

67-69: Rename counter to reflect actual meaning (missing keys, not locales)

The variable tracks missing keys, not missing locales.

Apply this diff:

-    let errorsCount = 0;
-    let missingLocaleCount = 0;
+    let errorsCount = 0;
+    let missingKeyCount = 0;

87-104: Clarify log messages and avoid “Fallback locale” wording in non-fallback cases

Messages should be accurate in both strict and non-strict modes and reflect missing keys.

Apply this diff:

-      if (missingKeys.length > 0) {
-        console.error(
-          `\nERROR: Fallback locale (${localeToCheck}) is missing ${missingKeys.length} key(s):`,
-        );
+      if (missingKeys.length > 0) {
+        console.error(
+          `\nERROR: Locale (${localeToCheck}) is missing ${missingKeys.length} key(s):`,
+        );
         missingKeys.sort().forEach((key) => {
           console.error(`  - ${key}`);
         });
         console.error(
-          `\nTo fix this issue, add the missing keys to ${translationsPath}/${localeToCheck}`,
+          `\nTo fix this issue, add the missing keys to ${translationsPath}/${localeToCheck}`,
         );
         errorsCount++;
-        missingLocaleCount += missingKeys.length;
+        missingKeyCount += missingKeys.length;
       } else {
         console.log(
-          `\nSUCCESS: Fallback locale (${localeToCheck}) contains all ${allKeys.size} keys.`,
+          `\nSUCCESS: Locale (${localeToCheck}) contains all ${allKeys.size} keys.`,
         );
       }

106-109: Fix summary grammar and counters

Use “missing keys” and reflect the renamed counter.

Apply this diff:

-    if (errorsCount > 0) {
-      console.log(`\n${missingLocaleCount} locales missing found across ${errorsCount} locales.`);
-      process.exit(1);
-    }
+    if (errorsCount > 0) {
+      console.log(`\n${missingKeyCount} missing keys found across ${errorsCount} locale(s).`);
+      process.exit(1);
+    }
app/config/locale/translations/de.json (1)

248-248: Align signature with existing German pattern: use '{{project}}-Team'

Other signatures in this locale use the hyphenated form (see lines 12, 16, 23, 30). For consistency, adjust this one as well.

-    "emails.otpSession.signature": "{{project}} Team",
+    "emails.otpSession.signature": "{{project}}-Team",
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a398776 and b816557.

⛔ Files ignored due to path filters (1)
  • composer.lock is excluded by !**/*.lock
📒 Files selected for processing (82)
  • .github/workflows/static-analysis.yml (1 hunks)
  • .github/workflows/static-analysis/locale/index.js (1 hunks)
  • .github/workflows/static-analysis/locale/package.json (1 hunks)
  • app/config/locale/translations/af.json (0 hunks)
  • app/config/locale/translations/ar-ma.json (0 hunks)
  • app/config/locale/translations/ar.json (0 hunks)
  • app/config/locale/translations/as.json (0 hunks)
  • app/config/locale/translations/az.json (0 hunks)
  • app/config/locale/translations/be.json (0 hunks)
  • app/config/locale/translations/bg.json (0 hunks)
  • app/config/locale/translations/bh.json (0 hunks)
  • app/config/locale/translations/bn.json (0 hunks)
  • app/config/locale/translations/bs.json (0 hunks)
  • app/config/locale/translations/ca.json (0 hunks)
  • app/config/locale/translations/cs.json (0 hunks)
  • app/config/locale/translations/da.json (0 hunks)
  • app/config/locale/translations/de.json (1 hunks)
  • app/config/locale/translations/el.json (0 hunks)
  • app/config/locale/translations/en.json (1 hunks)
  • app/config/locale/translations/eo.json (0 hunks)
  • app/config/locale/translations/es.json (0 hunks)
  • app/config/locale/translations/fa.json (0 hunks)
  • app/config/locale/translations/fi.json (0 hunks)
  • app/config/locale/translations/fo.json (0 hunks)
  • app/config/locale/translations/fr.json (0 hunks)
  • app/config/locale/translations/ga.json (0 hunks)
  • app/config/locale/translations/gu.json (0 hunks)
  • app/config/locale/translations/he.json (0 hunks)
  • app/config/locale/translations/hi.json (0 hunks)
  • app/config/locale/translations/hr.json (0 hunks)
  • app/config/locale/translations/hu.json (0 hunks)
  • app/config/locale/translations/hy.json (0 hunks)
  • app/config/locale/translations/id.json (0 hunks)
  • app/config/locale/translations/is.json (0 hunks)
  • app/config/locale/translations/it.json (0 hunks)
  • app/config/locale/translations/ja.json (0 hunks)
  • app/config/locale/translations/jv.json (0 hunks)
  • app/config/locale/translations/km.json (0 hunks)
  • app/config/locale/translations/kn.json (0 hunks)
  • app/config/locale/translations/ko.json (0 hunks)
  • app/config/locale/translations/la.json (0 hunks)
  • app/config/locale/translations/lb.json (0 hunks)
  • app/config/locale/translations/lt.json (0 hunks)
  • app/config/locale/translations/lv.json (0 hunks)
  • app/config/locale/translations/ml.json (0 hunks)
  • app/config/locale/translations/mr.json (0 hunks)
  • app/config/locale/translations/ms.json (0 hunks)
  • app/config/locale/translations/nb.json (0 hunks)
  • app/config/locale/translations/ne.json (0 hunks)
  • app/config/locale/translations/nl.json (0 hunks)
  • app/config/locale/translations/nn.json (0 hunks)
  • app/config/locale/translations/or.json (0 hunks)
  • app/config/locale/translations/pa.json (0 hunks)
  • app/config/locale/translations/pl.json (0 hunks)
  • app/config/locale/translations/pt-br.json (0 hunks)
  • app/config/locale/translations/pt-pt.json (0 hunks)
  • app/config/locale/translations/ro.json (0 hunks)
  • app/config/locale/translations/ru.json (0 hunks)
  • app/config/locale/translations/sa.json (0 hunks)
  • app/config/locale/translations/sd.json (0 hunks)
  • app/config/locale/translations/si.json (0 hunks)
  • app/config/locale/translations/sk.json (0 hunks)
  • app/config/locale/translations/sl.json (0 hunks)
  • app/config/locale/translations/sn.json (0 hunks)
  • app/config/locale/translations/sq.json (0 hunks)
  • app/config/locale/translations/sv.json (0 hunks)
  • app/config/locale/translations/ta.json (0 hunks)
  • app/config/locale/translations/te.json (0 hunks)
  • app/config/locale/translations/th.json (0 hunks)
  • app/config/locale/translations/tl.json (0 hunks)
  • app/config/locale/translations/tr.json (0 hunks)
  • app/config/locale/translations/uk.json (0 hunks)
  • app/config/locale/translations/ur.json (0 hunks)
  • app/config/locale/translations/vi.json (0 hunks)
  • app/config/locale/translations/zh-cn.json (0 hunks)
  • app/config/locale/translations/zh-tw.json (0 hunks)
  • app/controllers/api/projects.php (1 hunks)
  • app/controllers/mock.php (2 hunks)
  • app/init/resources.php (1 hunks)
  • composer.json (1 hunks)
  • src/Appwrite/Platform/Workers/Certificates.php (1 hunks)
  • tests/e2e/Services/Locale/LocaleBase.php (1 hunks)
💤 Files with no reviewable changes (71)
  • app/config/locale/translations/fr.json
  • app/config/locale/translations/nl.json
  • app/config/locale/translations/da.json
  • app/config/locale/translations/hr.json
  • app/config/locale/translations/ta.json
  • app/config/locale/translations/sd.json
  • app/config/locale/translations/lt.json
  • app/config/locale/translations/ru.json
  • app/config/locale/translations/pt-br.json
  • app/config/locale/translations/zh-cn.json
  • app/config/locale/translations/el.json
  • app/config/locale/translations/hy.json
  • app/config/locale/translations/az.json
  • app/config/locale/translations/pa.json
  • app/config/locale/translations/uk.json
  • app/config/locale/translations/bh.json
  • app/config/locale/translations/fo.json
  • app/config/locale/translations/sa.json
  • app/config/locale/translations/km.json
  • app/config/locale/translations/ml.json
  • app/config/locale/translations/eo.json
  • app/config/locale/translations/bn.json
  • app/config/locale/translations/zh-tw.json
  • app/config/locale/translations/pl.json
  • app/config/locale/translations/jv.json
  • app/config/locale/translations/it.json
  • app/config/locale/translations/vi.json
  • app/config/locale/translations/tl.json
  • app/config/locale/translations/si.json
  • app/config/locale/translations/as.json
  • app/config/locale/translations/cs.json
  • app/config/locale/translations/nn.json
  • app/config/locale/translations/ja.json
  • app/config/locale/translations/af.json
  • app/config/locale/translations/gu.json
  • app/config/locale/translations/tr.json
  • app/config/locale/translations/pt-pt.json
  • app/config/locale/translations/ar-ma.json
  • app/config/locale/translations/or.json
  • app/config/locale/translations/ar.json
  • app/config/locale/translations/ko.json
  • app/config/locale/translations/fa.json
  • app/config/locale/translations/lb.json
  • app/config/locale/translations/fi.json
  • app/config/locale/translations/ms.json
  • app/config/locale/translations/bg.json
  • app/config/locale/translations/he.json
  • app/config/locale/translations/es.json
  • app/config/locale/translations/is.json
  • app/config/locale/translations/kn.json
  • app/config/locale/translations/hi.json
  • app/config/locale/translations/th.json
  • app/config/locale/translations/bs.json
  • app/config/locale/translations/lv.json
  • app/config/locale/translations/hu.json
  • app/config/locale/translations/ne.json
  • app/config/locale/translations/sl.json
  • app/config/locale/translations/nb.json
  • app/config/locale/translations/ca.json
  • app/config/locale/translations/sk.json
  • app/config/locale/translations/te.json
  • app/config/locale/translations/be.json
  • app/config/locale/translations/mr.json
  • app/config/locale/translations/sq.json
  • app/config/locale/translations/ur.json
  • app/config/locale/translations/id.json
  • app/config/locale/translations/ga.json
  • app/config/locale/translations/la.json
  • app/config/locale/translations/ro.json
  • app/config/locale/translations/sv.json
  • app/config/locale/translations/sn.json
🧰 Additional context used
🧬 Code Graph Analysis (2)
tests/e2e/Services/Locale/LocaleBase.php (1)
src/Executor/Executor.php (1)
  • call (293-419)
app/init/resources.php (1)
src/Appwrite/Event/Audit.php (1)
  • setResource (32-37)
🪛 YAMLlint (1.37.1)
.github/workflows/static-analysis.yml

[error] 17-17: trailing spaces

(trailing-spaces)


[error] 21-21: no new line character at the end of file

(new-line-at-end-of-file)

🔇 Additional comments (7)
composer.json (1)

63-63: composer.lock is up to date with utopia-php/locale 0.8.0

The lock file already reflects the bump to version 0.8.*:

  • composer.lock (lines 3947–3950):
    "name": "utopia-php/locale",
    "version": "0.8.0",
    

No mismatches found—composer.lock has been updated accordingly.

src/Appwrite/Platform/Workers/Certificates.php (1)

376-376: LGTM: Consistent fallback locale implementation.

The addition of fallback locale configuration aligns with the broader fallback locale strategy implemented across the PR. This ensures email notifications use the environment locale as a fallback when translations are missing.

app/controllers/api/projects.php (1)

2269-2270: LGTM: Proper fallback locale configuration for email templates.

The fallback locale is correctly set after constructing the Locale object, ensuring that when custom email templates are retrieved, missing translations will fall back to the environment locale (defaulting to 'en'). This is consistent with the fallback implementation pattern used throughout the PR.

app/init/resources.php (1)

73-77: LGTM: Enhanced locale resource with fallback configuration.

The change from a simple arrow function to a multi-line closure properly configures the global Locale resource with fallback behavior. This ensures all injected locale instances throughout the application will have consistent fallback behavior to the environment locale.

app/controllers/mock.php (2)

16-16: LGTM: Proper import for Locale functionality.

The import of the Locale class is correctly added to support the new mock endpoint functionality.


39-56: LGTM: Well-implemented mock endpoint for locale testing.

The mock endpoint is properly implemented with:

  • Correct parameter handling from both query params and headers
  • Validation against available locale codes
  • Proper use of Locale's setDefault method
  • Clean response with the translated text

This endpoint effectively supports the E2E testing of fallback locale functionality.

tests/e2e/Services/Locale/LocaleBase.php (1)

273-324: LGTM: Comprehensive fallback locale testing.

The test method thoroughly validates fallback locale behavior by testing:

  • Default fallback when no locale header is provided
  • Explicit English locale selection
  • German locale selection with expected German translation
  • Fallback to English for unsupported locales (cs, non-existing)
  • Fallback to English for empty locale strings

The test cases cover all critical fallback scenarios and use appropriate assertions to verify both HTTP status codes and response content.

@github-actions
Copy link
Copy Markdown

✨ Benchmark results

  • Requests per second: 994
  • Requests with 200 status code: 179,008
  • P99 latency: 0.184099686

⚡ Benchmark Comparison

Metric This PR Latest version
RPS 994 994
200 179,008 178,949
P99 0.184099686 0.196789548

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: 0

♻️ Duplicate comments (1)
.github/workflows/static-analysis.yml (1)

17-17: Fix YAML lint: remove trailing whitespace on blank line

There’s trailing whitespace on the otherwise blank Line 17. This breaks YAML linting.

Apply this minimal diff:

-    
+
🧹 Nitpick comments (3)
.github/workflows/static-analysis.yml (3)

18-21: Simplify Docker invocation: use working directory and quote $PWD

  • Avoid subshell + cd by using Docker’s -w flag.
  • Quote "$PWD" to be safe.
-        docker run --rm -v $PWD:/app node:24-alpine sh -c \
-        "cd /app/.github/workflows/static-analysis/locale && node index.js"
+        docker run --rm -v "$PWD":/app -w /app/.github/workflows/static-analysis/locale node:24-alpine node index.js

13-16: Rename step to reflect actual command (not CodeQL)

The step runs composer checks, not CodeQL. Rename for clarity.

-    - name: Run CodeQL
+    - name: Run Composer checks

If desired, also align the job’s display name (outside this changed range):

jobs:
  lint:
    name: Static analysis

20-21: Consider pinning container images/actions to immutable digests

For supply-chain hardening, pin:

  • node:24-alpine to a specific digest (e.g., node@sha256:…)
  • actions/checkout@v4 to a commit SHA

Prevents unexpected changes from upstream tags.

Would you like me to propose a follow-up PR that resolves digests and pins them? I can generate the exact digests and update the workflow accordingly.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b816557 and 6eaa201.

📒 Files selected for processing (1)
  • .github/workflows/static-analysis.yml (1 hunks)
🧰 Additional context used
🪛 YAMLlint (1.37.1)
.github/workflows/static-analysis.yml

[error] 17-17: trailing spaces

(trailing-spaces)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (15)
  • GitHub Check: E2E Service Test (FunctionsSchedule)
  • GitHub Check: E2E Service Test (Migrations)
  • GitHub Check: E2E Service Test (Sites)
  • GitHub Check: E2E Service Test (Tokens)
  • GitHub Check: E2E Service Test (Realtime)
  • GitHub Check: E2E Service Test (Messaging)
  • GitHub Check: E2E Service Test (Functions)
  • GitHub Check: E2E Service Test (Storage)
  • GitHub Check: E2E Service Test (Webhooks)
  • GitHub Check: E2E Service Test (Projects)
  • GitHub Check: E2E Service Test (Avatars)
  • GitHub Check: E2E Service Test (Dev Keys)
  • GitHub Check: E2E Service Test (GraphQL)
  • GitHub Check: E2E Service Test (Databases)
  • GitHub Check: Benchmark

@Meldiron Meldiron merged commit dc25d8e into 1.7.x Aug 12, 2025
40 checks passed
@stnguyen90 stnguyen90 deleted the feat-fallback-locale branch October 1, 2025 23:58
This was referenced Oct 16, 2025
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