Marketplace end-to-end guide: Remove inventory section and update som… #26
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# ------------------------------------------------------------------------------ | |
# Frenglish Translation GitHub Action | |
# | |
# Core Workflow: | |
# - Triggered on branch push, skipping merge commits. | |
# - Fetches translation configuration (source/target languages). | |
# - Detects renamed/deleted source files and mirrors these changes in target language directories. | |
# - Runs scripts to translate and format files. | |
# - Stages, commits, and pushes updates only if changes exist. | |
# ------------------------------------------------------------------------------ | |
name: Frenglish Translation | |
on: | |
push: | |
branches: | |
- '**' # Trigger on push to any branch | |
permissions: # <-- Control what the automatic GITHUB_TOKEN can do | |
contents: read | |
jobs: | |
translate_and_format: | |
# Run on push events, but skip if the commit message indicates it's a merge commit | |
if: github.event_name == 'push' && !contains(github.event.head_commit.message, 'Merge pull request') | |
runs-on: ubuntu-latest | |
permissions: | |
contents: write | |
pull-requests: write | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
token: ${{ secrets.GITHUB_TOKEN }} | |
fetch-depth: 0 # Fetch all history for git diff to work reliably | |
- name: Setup Node.js | |
uses: actions/setup-node@v3 | |
with: | |
node-version: '18' # Or your preferred Node.js version >= 16 | |
- name: Install dependencies | |
run: | | |
# Ensure you have a package.json and package-lock.json | |
# Add @frenglish/sdk to your package.json: npm install @frenglish/sdk --save | |
npm install | |
- name: Setup Git User | |
run: | | |
git config --global user.email "github-actions[bot]@users.noreply.github.com" | |
git config --global user.name "github-actions[bot]" | |
- name: Get Language Configuration | |
id: get_lang_config | |
run: node .github/scripts/fetch-frenglish-configuration.js | |
env: | |
FRENGLISH_API_KEY: ${{ secrets.FRENGLISH_API_KEY }} | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
# --- Step to Handle Renamed/Deleted Files --- | |
- name: Handle Renamed and Deleted Source Files | |
id: handle_changes | |
run: | | |
set -e # Exit immediately if a command exits with a non-zero status. | |
# Get target languages and commit SHAs | |
# SOURCE_DIR_RAW from get_lang_config is now IGNORED for path determination | |
TARGET_DIRS_STRING="${{ steps.get_lang_config.outputs.target_langs }}" | |
BEFORE_SHA="${{ github.event.before }}" | |
CURRENT_SHA="${{ github.sha }}" | |
# --- Define the source path CONSISTENTLY with translate.js --- | |
# ORIGIN_LANGUAGE_DIR in translate.js is path.resolve('.'), so we use '.' here. | |
EFFECTIVE_SOURCE_PATH="." | |
echo "Source file location for rename/delete check: Root Directory (.)" | |
# --- Validate Target Languages --- | |
if [ -z "$TARGET_DIRS_STRING" ]; then | |
echo "::warning::No target languages determined. Rename/delete actions for target directories will be skipped." | |
echo "processed_changes=false" >> $GITHUB_OUTPUT | |
exit 0 | |
fi | |
read -r -a TARGET_DIRS <<< "$TARGET_DIRS_STRING" | |
if [ ${#TARGET_DIRS[@]} -eq 0 ]; then | |
echo "::warning::No target languages parsed. Rename/delete actions for target directories will be skipped." | |
echo "processed_changes=false" >> $GITHUB_OUTPUT | |
exit 0 | |
fi | |
# --- List of top-level files/dirs to EXCLUDE from rename/delete handling --- | |
# Add any other known non-locale files/folders residing in your root directory | |
# Use trailing slash for directories to avoid matching files starting with the same name | |
EXCLUDED_PATTERNS=( | |
'package.json' | |
'package-lock.json' | |
'node_modules/' | |
'.github/' | |
'.git/' | |
'.gitignore' | |
'README.md' | |
# Add other files/dirs like 'vite.config.js', 'tsconfig.json', etc. if they exist in root | |
) | |
echo "Excluding patterns: ${EXCLUDED_PATTERNS[*]}" | |
# --- Check for Renamed/Deleted Files in the Root Directory --- | |
echo "Checking for renamed/deleted files in '$EFFECTIVE_SOURCE_PATH' between $BEFORE_SHA and $CURRENT_SHA..." | |
processed_any_change=false | |
# Use NUL delimiters, check within the root directory (.) | |
git diff --name-status --find-renames -z $BEFORE_SHA $CURRENT_SHA -- "$EFFECTIVE_SOURCE_PATH" | while IFS= read -r -d $'\0' status && IFS= read -r -d $'\0' old_path && IFS= read -r -d $'\0' new_path; do | |
# Handle cases where new_path might not be present (for deletions) | |
if [ -z "$new_path" ]; then | |
new_path=$old_path | |
fi | |
# --- Calculate relative paths (already relative to root) --- | |
relative_old_path="$old_path" | |
relative_new_path="$new_path" | |
# --- Filter out EXCLUDED top-level files/directories --- | |
is_excluded=false | |
for pattern in "${EXCLUDED_PATTERNS[@]}"; do | |
# Check if old_path starts with or exactly matches the pattern | |
if [[ "$old_path" == "$pattern"* ]]; then | |
is_excluded=true | |
echo "Skipping excluded file/path based on pattern '$pattern': $old_path" | |
break # Exit inner loop once matched | |
fi | |
done | |
if [ "$is_excluded" = true ]; then | |
continue # Skip to the next file in the diff | |
fi | |
# --- End of exclusion filter --- | |
# Proceed only if the file wasn't excluded | |
echo "Detected potentially relevant change: Status=$status, Old Path=$old_path, New Path=$new_path" | |
for TARGET_DIR in "${TARGET_DIRS[@]}"; do # Iterate over array elements correctly | |
# Ensure target *directory* exists (e.g., 'ja', 'es') | |
if [ ! -d "$TARGET_DIR" ]; then | |
echo "::warning::Target directory '$TARGET_DIR' not found. Skipping for this language." | |
continue | |
fi | |
# Construct target paths using the relative path from root | |
target_old_path="$TARGET_DIR/$relative_old_path" | |
if [[ "$status" == D* ]]; then | |
# Delete corresponding file in target dir IF it exists | |
if [ -f "$target_old_path" ]; then | |
echo "Deleting corresponding file: $target_old_path" | |
git rm "$target_old_path" | |
processed_any_change=true | |
else | |
# It's okay if the target file doesn't exist, don't warn loudly. | |
echo "Corresponding file for deletion not found (or already deleted): $target_old_path" | |
fi | |
elif [[ "$status" == R* ]]; then | |
# Rename corresponding file in target dir IF it exists | |
target_new_path="$TARGET_DIR/$relative_new_path" | |
target_new_path_dir=$(dirname "$target_new_path") | |
if [ -f "$target_old_path" ]; then | |
# Create parent directory for target if needed | |
if [ ! -d "$target_new_path_dir" ]; then | |
echo "Creating directory for renamed file: $target_new_path_dir" | |
mkdir -p "$target_new_path_dir" | |
fi | |
echo "Renaming corresponding file: $target_old_path -> $target_new_path" | |
git mv "$target_old_path" "$target_new_path" | |
processed_any_change=true | |
else | |
# It's okay if the target file doesn't exist, don't warn loudly. | |
echo "Corresponding file for rename not found: $target_old_path" | |
fi | |
fi # End status check (D or R) | |
done # end loop target dirs | |
done # end loop git diff | |
# Output based on the flag | |
echo "processed_changes=$processed_any_change" >> $GITHUB_OUTPUT | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Run translation script (Writes/Updates files) | |
env: | |
FRENGLISH_API_KEY: ${{ secrets.FRENGLISH_API_KEY }} | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: node .github/scripts/translate.js | |
- name: Run formatting script | |
run: node .github/scripts/format-locales.js | |
- name: Stage ALL changes (new, modified, deleted, renamed) | |
run: | | |
echo "Staging all tracked changes (adds, modifications, deletes, renames)..." | |
git add . # This stages all changes in the working directory | |
- name: Commit changes | |
id: commit | |
run: | | |
# Check index status after all operations (add, rm, mv) | |
# Use --cached to check staged changes specifically | |
if git diff --cached --quiet; then | |
echo "No changes staged for commit." | |
echo "changes_committed=false" >> $GITHUB_OUTPUT | |
else | |
echo "Committing translation updates, formatting, renames, and deletions..." | |
# Use the dynamically fetched source language in the commit message | |
COMMIT_SOURCE_LANG="${{ steps.get_lang_config.outputs.source_lang }}" # Capture output first | |
git commit -m "chore(i18n): update translations [${COMMIT_SOURCE_LANG:-unknown}]" \ | |
-m "Sync file structure, format locales. Branch: ${{ github.ref_name }}" | |
echo "changes_committed=true" >> $GITHUB_OUTPUT | |
git show --stat # Show commit details | |
fi | |
- name: Push changes | |
# Only run if the commit step actually committed something | |
if: steps.commit.outputs.changes_committed == 'true' | |
run: | | |
echo "Pushing changes to origin/${{ github.ref_name }}..." | |
# Use --atomic for safety if supported, otherwise standard push | |
git push origin HEAD:${{ github.ref_name }} |