mirror of
https://github.com/Frooodle/Stirling-PDF.git
synced 2026-02-01 20:10:35 +01:00
# Description of Changes This pull request updates the Arabic translation file (`frontend/public/locales/ar-AR/translation.toml`) with a large number of new and improved strings, adding support for new features and enhancing clarity and coverage across the application. Additionally, it makes several improvements to the TOML language check script (`.github/scripts/check_language_toml.py`) and updates the corresponding GitHub Actions workflow to better track and validate translation changes. **Translation updates and enhancements:** * Added translations for new features and UI elements, including annotation tools, PDF/A-3b conversion, line art compression, background removal, split modes, onboarding tours, and more. [[1]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR343-R346) [[2]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR442-R460) [[3]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR514-R523) [[4]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR739-R743) [[5]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR1281-R1295) [[6]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR1412-R1416) [[7]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR2362-R2365) [[8]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR2411-R2415) [[9]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR2990) [[10]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR3408-R3420) [[11]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR3782-R3794) [[12]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR3812-R3815) [[13]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR3828-R3832) [[14]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effL3974-R4157) [[15]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR4208-R4221) [[16]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR5247) [[17]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR5414-R5423) [[18]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR5444-R5447) * Improved and expanded coverage for settings, security, onboarding, and help menus, including detailed descriptions and tooltips for new and existing features. [[1]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR442-R460) [[2]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR5247) [[3]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR5414-R5423) [[4]](diffhunk://#diff-460d5f61a7649a5b149373af2e52a8a87d9a1964cf54240a78ad4747e7233effR5444-R5447) **TOML language check script improvements:** * Increased the maximum allowed TOML file size from 500 KB to 570 KB to accommodate larger translation files. * Improved file validation logic to more accurately skip or process files based on directory structure and file type, and added informative print statements for skipped files. * Enhanced reporting in the difference check: now, instead of raising exceptions for unsafe files or oversized files, the script logs warnings and continues processing, improving robustness and clarity in CI reports. * Adjusted the placement of file check report lines for clarity in the generated report. **Workflow and CI improvements:** * Updated the GitHub Actions workflow (`.github/workflows/check_toml.yml`) to trigger on changes to the translation script and workflow files, in addition to translation TOMLs, ensuring all relevant changes are validated. These changes collectively improve the translation quality and coverage for Arabic users, enhance the reliability and clarity of the translation validation process, and ensure smoother CI/CD workflows for localization updates. <img width="654" height="133" alt="image" src="https://github.com/user-attachments/assets/9f3e505d-927f-4dc0-9098-cee70bbe85ca" /> --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### Translations (if applicable) - [ ] I ran [`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md#6-testing) for more details.
298 lines
12 KiB
YAML
298 lines
12 KiB
YAML
name: Check TOML Translation Files on PR
|
|
|
|
# This workflow validates TOML translation files
|
|
|
|
on:
|
|
pull_request_target:
|
|
types: [opened, synchronize, reopened]
|
|
paths:
|
|
- "frontend/public/locales/*/translation.toml"
|
|
- ".github/scripts/check_language_toml.py"
|
|
- ".github/workflows/check_toml.yml"
|
|
|
|
# cancel in-progress jobs if a new job is triggered
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event.pull_request.number || github.ref_name || github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
permissions:
|
|
contents: read # Allow read access to repository content
|
|
|
|
jobs:
|
|
check-files:
|
|
if: github.event_name == 'pull_request_target'
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
issues: write # Allow posting comments on issues/PRs
|
|
pull-requests: write # Allow writing to pull requests
|
|
steps:
|
|
- name: Harden Runner
|
|
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
|
with:
|
|
egress-policy: audit
|
|
|
|
- name: Checkout main branch first
|
|
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
|
|
|
- name: Setup GitHub App Bot
|
|
id: setup-bot
|
|
uses: ./.github/actions/setup-bot
|
|
with:
|
|
app-id: ${{ secrets.GH_APP_ID }}
|
|
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
|
|
|
|
- name: Get PR data
|
|
id: get-pr-data
|
|
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
|
|
with:
|
|
github-token: ${{ steps.setup-bot.outputs.token }}
|
|
script: |
|
|
const prNumber = context.payload.pull_request.number;
|
|
const repoOwner = context.payload.repository.owner.login;
|
|
const repoName = context.payload.repository.name;
|
|
const branch = context.payload.pull_request.head.ref;
|
|
|
|
console.log(`PR Number: ${prNumber}`);
|
|
console.log(`Repo Owner: ${repoOwner}`);
|
|
console.log(`Repo Name: ${repoName}`);
|
|
console.log(`Branch: ${branch}`);
|
|
|
|
core.setOutput("pr_number", prNumber);
|
|
core.setOutput("repo_owner", repoOwner);
|
|
core.setOutput("repo_name", repoName);
|
|
core.setOutput("branch", branch);
|
|
continue-on-error: true
|
|
|
|
- name: Fetch PR changed files
|
|
id: fetch-pr-changes
|
|
env:
|
|
GH_TOKEN: ${{ steps.setup-bot.outputs.token }}
|
|
run: |
|
|
echo "Fetching PR changed files..."
|
|
echo "Getting list of changed files from PR..."
|
|
# Check if PR number exists
|
|
if [ -z "${{ steps.get-pr-data.outputs.pr_number }}" ]; then
|
|
echo "Error: PR number is empty"
|
|
exit 1
|
|
fi
|
|
# Get changed files and filter for TOML translation files
|
|
gh pr view ${{ steps.get-pr-data.outputs.pr_number }} --json files -q ".files[].path" | grep -E '^frontend/public/locales/[a-zA-Z-]+/translation\.toml$' > changed_files.txt || echo "No matching TOML files found in PR"
|
|
# Check if any files were found
|
|
if [ ! -s changed_files.txt ]; then
|
|
echo "No TOML translation files changed in this PR"
|
|
echo "Workflow will exit early as no relevant files to check"
|
|
exit 0
|
|
fi
|
|
echo "Found $(wc -l < changed_files.txt) matching TOML files"
|
|
|
|
- name: Determine reference file
|
|
id: determine-file
|
|
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
|
|
with:
|
|
github-token: ${{ steps.setup-bot.outputs.token }}
|
|
script: |
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
const prNumber = ${{ steps.get-pr-data.outputs.pr_number }};
|
|
const repoOwner = "${{ steps.get-pr-data.outputs.repo_owner }}";
|
|
const repoName = "${{ steps.get-pr-data.outputs.repo_name }}";
|
|
|
|
const prRepoOwner = "${{ github.event.pull_request.head.repo.owner.login }}";
|
|
const prRepoName = "${{ github.event.pull_request.head.repo.name }}";
|
|
const branch = "${{ steps.get-pr-data.outputs.branch }}";
|
|
|
|
console.log(`Determining reference file for PR #${prNumber}`);
|
|
|
|
// Validate inputs
|
|
const validateInput = (input, regex, name) => {
|
|
if (!regex.test(input)) {
|
|
throw new Error(`Invalid ${name}: ${input}`);
|
|
}
|
|
};
|
|
|
|
validateInput(repoOwner, /^[a-zA-Z0-9_-]+$/, "repository owner");
|
|
validateInput(repoName, /^[a-zA-Z0-9._-]+$/, "repository name");
|
|
validateInput(branch, /^[a-zA-Z0-9._/-]+$/, "branch name");
|
|
|
|
// Get the list of changed files in the PR
|
|
const { data: files } = await github.rest.pulls.listFiles({
|
|
owner: repoOwner,
|
|
repo: repoName,
|
|
pull_number: prNumber,
|
|
});
|
|
|
|
// Filter for relevant TOML files based on the PR changes
|
|
const changedFiles = files
|
|
.filter(file =>
|
|
file.status !== "removed" &&
|
|
/^frontend\/public\/locales\/[a-zA-Z-]+\/translation\.toml$/.test(file.filename)
|
|
)
|
|
.map(file => file.filename);
|
|
|
|
console.log("Changed files:", changedFiles);
|
|
|
|
// Create a temporary directory for PR files
|
|
const tempDir = "pr-branch";
|
|
if (!fs.existsSync(tempDir)) {
|
|
fs.mkdirSync(tempDir, { recursive: true });
|
|
}
|
|
|
|
// Download and save each changed file
|
|
for (const file of changedFiles) {
|
|
const { data: fileContent } = await github.rest.repos.getContent({
|
|
owner: prRepoOwner,
|
|
repo: prRepoName,
|
|
path: file,
|
|
ref: branch,
|
|
});
|
|
|
|
const content = Buffer.from(fileContent.content, "base64").toString("utf-8");
|
|
const filePath = path.join(tempDir, file);
|
|
const dirPath = path.dirname(filePath);
|
|
|
|
if (!fs.existsSync(dirPath)) {
|
|
fs.mkdirSync(dirPath, { recursive: true });
|
|
}
|
|
|
|
fs.writeFileSync(filePath, content);
|
|
console.log(`Saved file: ${filePath}`);
|
|
}
|
|
|
|
// Output the list of changed files for further processing
|
|
const fileList = changedFiles.join(" ");
|
|
core.exportVariable("FILES_LIST", fileList);
|
|
console.log("Files saved and listed in FILES_LIST.");
|
|
|
|
// Determine reference file
|
|
let referenceFilePath;
|
|
if (changedFiles.includes("frontend/public/locales/en-GB/translation.toml")) {
|
|
console.log("Using PR branch reference file.");
|
|
const { data: fileContent } = await github.rest.repos.getContent({
|
|
owner: prRepoOwner,
|
|
repo: prRepoName,
|
|
path: "frontend/public/locales/en-GB/translation.toml",
|
|
ref: branch,
|
|
});
|
|
|
|
referenceFilePath = "pr-branch-translation-en-GB.toml";
|
|
const content = Buffer.from(fileContent.content, "base64").toString("utf-8");
|
|
fs.writeFileSync(referenceFilePath, content);
|
|
} else {
|
|
console.log("Using main branch reference file.");
|
|
const { data: fileContent } = await github.rest.repos.getContent({
|
|
owner: repoOwner,
|
|
repo: repoName,
|
|
path: "frontend/public/locales/en-GB/translation.toml",
|
|
ref: "main",
|
|
});
|
|
|
|
referenceFilePath = "main-branch-translation-en-GB.toml";
|
|
const content = Buffer.from(fileContent.content, "base64").toString("utf-8");
|
|
fs.writeFileSync(referenceFilePath, content);
|
|
}
|
|
|
|
console.log(`Reference file path: ${referenceFilePath}`);
|
|
core.exportVariable("REFERENCE_FILE", referenceFilePath);
|
|
|
|
- name: Set up Python
|
|
uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
|
|
with:
|
|
python-version: "3.12"
|
|
|
|
- name: Install Python dependencies
|
|
run: pip install --require-hashes -r ./.github/scripts/requirements_sync_readme.txt
|
|
|
|
- name: Run Python script to check files
|
|
id: run-check
|
|
run: |
|
|
echo "Running Python script to check TOML files..."
|
|
python .github/scripts/check_language_toml.py \
|
|
--actor ${{ github.event.pull_request.user.login }} \
|
|
--reference-file "${REFERENCE_FILE}" \
|
|
--branch "pr-branch" \
|
|
--files "${FILES_LIST[@]}" > result.txt
|
|
continue-on-error: true # Continue the job even if this step fails
|
|
|
|
- name: Capture output
|
|
id: capture-output
|
|
run: |
|
|
if [ -f result.txt ] && [ -s result.txt ]; then
|
|
echo "Capturing output..."
|
|
SCRIPT_OUTPUT=$(cat result.txt)
|
|
echo "SCRIPT_OUTPUT<<EOF" >> $GITHUB_ENV
|
|
echo "$SCRIPT_OUTPUT" >> $GITHUB_ENV
|
|
echo "EOF" >> $GITHUB_ENV
|
|
echo "${SCRIPT_OUTPUT}"
|
|
|
|
# Determine job failure based on script output
|
|
if [[ "$SCRIPT_OUTPUT" == *"❌"* ]]; then
|
|
echo "FAIL_JOB=true" >> $GITHUB_ENV
|
|
else
|
|
echo "FAIL_JOB=false" >> $GITHUB_ENV
|
|
fi
|
|
else
|
|
echo "No output found."
|
|
echo "SCRIPT_OUTPUT=" >> $GITHUB_ENV
|
|
echo "FAIL_JOB=false" >> $GITHUB_ENV
|
|
fi
|
|
|
|
- name: Post comment on PR
|
|
if: env.SCRIPT_OUTPUT != ''
|
|
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
|
|
with:
|
|
github-token: ${{ steps.setup-bot.outputs.token }}
|
|
script: |
|
|
const { GITHUB_REPOSITORY, SCRIPT_OUTPUT } = process.env;
|
|
const [repoOwner, repoName] = GITHUB_REPOSITORY.split('/');
|
|
const issueNumber = context.issue.number;
|
|
|
|
// Find existing comment
|
|
const comments = await github.rest.issues.listComments({
|
|
owner: repoOwner,
|
|
repo: repoName,
|
|
issue_number: issueNumber
|
|
});
|
|
|
|
const comment = comments.data.find(c => c.body.includes("## 🌐 TOML Translation Verification Summary"));
|
|
|
|
// Only update or create comments by the action user
|
|
const expectedActor = "${{ steps.setup-bot.outputs.app-slug }}[bot]";
|
|
|
|
if (comment && comment.user.login === expectedActor) {
|
|
// Update existing comment
|
|
await github.rest.issues.updateComment({
|
|
owner: repoOwner,
|
|
repo: repoName,
|
|
comment_id: comment.id,
|
|
body: `## 🌐 TOML Translation Verification Summary\n\n\n${SCRIPT_OUTPUT}\n`
|
|
});
|
|
console.log("Updated existing comment.");
|
|
} else if (!comment) {
|
|
// Create new comment if no existing comment is found
|
|
await github.rest.issues.createComment({
|
|
owner: repoOwner,
|
|
repo: repoName,
|
|
issue_number: issueNumber,
|
|
body: `## 🌐 TOML Translation Verification Summary\n\n\n${SCRIPT_OUTPUT}\n`
|
|
});
|
|
console.log("Created new comment.");
|
|
} else {
|
|
console.log("Comment update attempt denied. Actor does not match.");
|
|
}
|
|
|
|
- name: Fail job if errors found
|
|
if: env.FAIL_JOB == 'true'
|
|
run: |
|
|
echo "Failing the job because errors were detected."
|
|
exit 1
|
|
|
|
- name: Cleanup temporary files
|
|
if: always()
|
|
run: |
|
|
echo "Cleaning up temporary files..."
|
|
rm -rf pr-branch
|
|
rm -f pr-branch-translation-en-GB.toml main-branch-translation-en-GB.toml changed_files.txt result.txt
|
|
echo "Cleanup complete."
|
|
continue-on-error: true # Ensure cleanup runs even if previous steps fail
|