Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .claude/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -615,6 +615,7 @@ The CI workflow checks:

- `en.json` is in sync with source code (`--check`)
- No orphaned keys exist (`--orphans`)
- Translation file key order matches `en.json` (`sort-i18n.py --check`)
- Translation files have valid JSON format
- Placeholders `{name}` are consistent across languages

Expand All @@ -623,4 +624,13 @@ The CI workflow checks:
```bash
python tools/extract-i18n.py --check
python tools/extract-i18n.py --orphans
python tools/sort-i18n.py --check
```

If `sort-i18n.py --check` fails, fix it with:

```bash
python tools/sort-i18n.py --write
```

This reorders non-English translation files so their keys follow `en.json`'s order (with `_meta` first, then keys in en.json order, then any extra keys alphabetically).
4 changes: 4 additions & 0 deletions .github/workflows/pr-i18n.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ on:
- "src/**"
- "package/SKSE/Plugins/CommunityShaders/Translations/**"
- "tools/extract-i18n.py"
- "tools/sort-i18n.py"

permissions:
contents: read
Expand All @@ -30,6 +31,9 @@ jobs:
- name: Check for orphaned keys
run: python tools/extract-i18n.py --orphans

- name: Check translation file key order matches en.json
run: python tools/sort-i18n.py --check

- name: Validate translation file formats
run: |
python -c "
Expand Down
19 changes: 19 additions & 0 deletions TRANSLATING.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,28 @@ The `pr-i18n.yaml` workflow checks:

- `en.json` is in sync with source code (`--check`)
- No orphaned keys exist (`--orphans`)
- Translation file key order matches `en.json` (`sort-i18n.py --check`)
- Translation files have valid JSON format
- Placeholders `{name}` are consistent across languages

### Translation Key Ordering

All non-English translation files must have their keys ordered to match `en.json`. This ensures consistency and makes diffs easier to review.

```bash
# Check if translation files are correctly ordered
python tools/sort-i18n.py --check

# Automatically reorder translation files to match en.json
python tools/sort-i18n.py --write
```

Ordering rules:

1. `_meta` always comes first
2. Keys present in `en.json` follow `en.json`'s order
3. Any extra keys not in `en.json` are appended alphabetically at the end

### Key Naming Convention

```
Expand Down
116 changes: 58 additions & 58 deletions package/SKSE/Plugins/CommunityShaders/Translations/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -997,13 +997,71 @@
"feature.renderdoc.restart_to_enable": "Requires restart to enable RenderDoc capture.",
"feature.renderdoc.space_required": "At least {} MB of free space is required.",
"feature.renderdoc.yes_delete": "Yes, Delete All",
"feature.screen_space_gi.ao_only": "AO only",
"feature.screen_space_gi.ao_power": "AO Power",
"feature.screen_space_gi.ao_radius": "AO radius",
"feature.screen_space_gi.ao_radius_tooltip": "A smaller radius produces tighter AO.",
"feature.screen_space_gi.blur": "Blur",
"feature.screen_space_gi.blur_radius": "Blur Radius",
"feature.screen_space_gi.buffer_viewer": "Buffer Viewer",
"feature.screen_space_gi.debug": "Debug",
"feature.screen_space_gi.denoising": "Denoising",
"feature.screen_space_gi.depth_fade_range": "Depth Fade Range",
"feature.screen_space_gi.depth_fade_range_tooltip": "Distance range where depth-based effects fade out.",
"feature.screen_space_gi.description": "Screen Space Global Illumination adds realistic indirect lighting and ambient occlusion to the game. This technique simulates how light bounces off surfaces to illuminate other objects naturally.",
"feature.screen_space_gi.enabled": "Enabled",
"feature.screen_space_gi.enabled_tooltip": "Enable Screen Space Global Illumination. When disabled, all other settings are ignored.",
"feature.screen_space_gi.extreme": "Extreme",
"feature.screen_space_gi.extreme_tooltip": "Full res and clean.",
"feature.screen_space_gi.full_res": "Full Res",
"feature.screen_space_gi.geometry_weight": "Geometry Weight",
"feature.screen_space_gi.geometry_weight_tooltip": "Higher value makes the blur more sensitive to differences in geometry.",
"feature.screen_space_gi.half_res": "Half Res",
"feature.screen_space_gi.hq_specular_il": "(Experimental) HQ Specular IL",
"feature.screen_space_gi.hq_specular_il_tooltip": "An experimental specular GI that is more accurate but requires more samples. Won't be blurred.",
"feature.screen_space_gi.il_distance_compensation": "IL Distance Compensation",
"feature.screen_space_gi.il_distance_compensation_tooltip": "Brighten/Dimming further radiance samples.",
"feature.screen_space_gi.il_radius": "IL radius",
"feature.screen_space_gi.il_radius_tooltip": "A larger radius produces wider IL.",
"feature.screen_space_gi.il_saturation": "IL Saturation",
"feature.screen_space_gi.il_source_brightness": "IL Source Brightness",
"feature.screen_space_gi.indirect_lighting": "Indirect Lighting (IL)",
"feature.screen_space_gi.key_feature_1": "Realistic indirect lighting",
"feature.screen_space_gi.key_feature_2": "Enhanced ambient occlusion",
"feature.screen_space_gi.key_feature_3": "Improved visual depth and atmosphere",
"feature.screen_space_gi.key_feature_4": "Temporal denoising for smooth results",
"feature.screen_space_gi.key_feature_5": "Configurable quality and performance settings",
"feature.screen_space_gi.low": "Low",
"feature.screen_space_gi.low_tooltip": "Quarter res and blurry.",
"feature.screen_space_gi.max_frame_accumulation": "Max Frame Accumulation",
"feature.screen_space_gi.max_frame_accumulation_tooltip": "How many past frames to accumulate results with. Higher values are less noisy but potentially cause ghosting.",
"feature.screen_space_gi.min_screen_radius": "Min Screen Radius",
"feature.screen_space_gi.min_screen_radius_tooltip": "The minimum screen-space effect radius as proportion of display width, to prevent far field AO being too small.",
"feature.screen_space_gi.movement_disocclusion": "Movement Disocclusion",
"feature.screen_space_gi.movement_disocclusion_tooltip": "If a pixel has moved too far from the last frame, its radiance will not be carried to this frame.\nLower values are stricter.",
"feature.screen_space_gi.name": "Screen Space GI",
"feature.screen_space_gi.quality_performance": "Quality/Performance",
"feature.screen_space_gi.quarter_res": "Quarter Res",
"feature.screen_space_gi.reference": "Reference",
"feature.screen_space_gi.reference_tooltip": "Reference mode.",
"feature.screen_space_gi.shader_compile_error": "Compute shaders failed to compile!",
"feature.screen_space_gi.show_advanced": "Show Advanced Options",
"feature.screen_space_gi.slices": "Slices",
"feature.screen_space_gi.slices_tooltip": "How many directions do the samples take.\nControls noise.",
"feature.screen_space_gi.standard": "Standard",
"feature.screen_space_gi.standard_tooltip": "Half res and somewhat stable.",
"feature.screen_space_gi.steps_per_slice": "Steps Per Slice",
"feature.screen_space_gi.steps_per_slice_tooltip": "How many samples does it take in one direction.\nControls accuracy of lighting, and noise when effect radius is large.",
"feature.screen_space_gi.temporal_denoiser": "Temporal Denoiser",
"feature.screen_space_gi.thickness": "Thickness",
"feature.screen_space_gi.thickness_tooltip": "How thick the occluders are. Only affects AO.",
"feature.screen_space_gi.toggles": "Toggles",
"feature.screen_space_gi.vanilla_ssao": "Vanilla SSAO",
"feature.screen_space_gi.vanilla_ssao_tooltip": "Enable Skyrim's built-in SSAO. Usually disabled when using SSGI to avoid double-darkening.",
"feature.screen_space_gi.vanilla_ssao_tooltip_vr": "Vanilla SSAO is not supported in VR.",
"feature.screen_space_gi.view_resize": "View Resize",
"feature.screen_space_gi.visual": "Visual",
"feature.screen_space_gi.visual_il": "Visual - IL",
"feature.screen_space_gi.vr_warning": "\n\nWarning: In VR, this feature may have visual artifacts and can have a significant performance impact due to the nature of screen space effects.",
"feature.screen_space_shadows.bilinear_threshold": "Bilinear Threshold",
"feature.screen_space_shadows.bilinear_threshold_tooltip": "Depth threshold for edge detection during bilinear interpolation. Higher values smooth more aggressively across edges.",
Expand Down Expand Up @@ -1154,64 +1212,6 @@
"feature.skylighting.rebuild": "Rebuild Skylighting",
"feature.skylighting.rebuild_tooltip": "Changes below require rebuilding, a loading screen, or moving away from the current location to apply.",
"feature.skylighting.specular_min_visibility": "Specular Min Visibility",
"feature.ssgi.ao_only": "AO only",
"feature.ssgi.ao_power": "AO Power",
"feature.ssgi.ao_radius": "AO radius",
"feature.ssgi.ao_radius_tooltip": "A smaller radius produces tighter AO.",
"feature.ssgi.blur": "Blur",
"feature.ssgi.blur_radius": "Blur Radius",
"feature.ssgi.buffer_viewer": "Buffer Viewer",
"feature.ssgi.debug": "Debug",
"feature.ssgi.denoising": "Denoising",
"feature.ssgi.depth_fade_range": "Depth Fade Range",
"feature.ssgi.depth_fade_range_tooltip": "Distance range where depth-based effects fade out.",
"feature.ssgi.enabled": "Enabled",
"feature.ssgi.enabled_tooltip": "Enable Screen Space Global Illumination. When disabled, all other settings are ignored.",
"feature.ssgi.extreme": "Extreme",
"feature.ssgi.extreme_tooltip": "Full res and clean.",
"feature.ssgi.full_res": "Full Res",
"feature.ssgi.geometry_weight": "Geometry Weight",
"feature.ssgi.geometry_weight_tooltip": "Higher value makes the blur more sensitive to differences in geometry.",
"feature.ssgi.half_res": "Half Res",
"feature.ssgi.hq_specular_il": "(Experimental) HQ Specular IL",
"feature.ssgi.hq_specular_il_tooltip": "An experimental specular GI that is more accurate but requires more samples. Won't be blurred.",
"feature.ssgi.il_distance_compensation": "IL Distance Compensation",
"feature.ssgi.il_distance_compensation_tooltip": "Brighten/Dimming further radiance samples.",
"feature.ssgi.il_radius": "IL radius",
"feature.ssgi.il_radius_tooltip": "A larger radius produces wider IL.",
"feature.ssgi.il_saturation": "IL Saturation",
"feature.ssgi.il_source_brightness": "IL Source Brightness",
"feature.ssgi.indirect_lighting": "Indirect Lighting (IL)",
"feature.ssgi.low": "Low",
"feature.ssgi.low_tooltip": "Quarter res and blurry.",
"feature.ssgi.max_frame_accumulation": "Max Frame Accumulation",
"feature.ssgi.max_frame_accumulation_tooltip": "How many past frames to accumulate results with. Higher values are less noisy but potentially cause ghosting.",
"feature.ssgi.min_screen_radius": "Min Screen Radius",
"feature.ssgi.min_screen_radius_tooltip": "The minimum screen-space effect radius as proportion of display width, to prevent far field AO being too small.",
"feature.ssgi.movement_disocclusion": "Movement Disocclusion",
"feature.ssgi.movement_disocclusion_tooltip": "If a pixel has moved too far from the last frame, its radiance will not be carried to this frame.\nLower values are stricter.",
"feature.ssgi.quality_performance": "Quality/Performance",
"feature.ssgi.quarter_res": "Quarter Res",
"feature.ssgi.reference": "Reference",
"feature.ssgi.reference_tooltip": "Reference mode.",
"feature.ssgi.shader_compile_error": "Compute shaders failed to compile!",
"feature.ssgi.show_advanced": "Show Advanced Options",
"feature.ssgi.slices": "Slices",
"feature.ssgi.slices_tooltip": "How many directions do the samples take.\nControls noise.",
"feature.ssgi.standard": "Standard",
"feature.ssgi.standard_tooltip": "Half res and somewhat stable.",
"feature.ssgi.steps_per_slice": "Steps Per Slice",
"feature.ssgi.steps_per_slice_tooltip": "How many samples does it take in one direction.\nControls accuracy of lighting, and noise when effect radius is large.",
"feature.ssgi.temporal_denoiser": "Temporal Denoiser",
"feature.ssgi.thickness": "Thickness",
"feature.ssgi.thickness_tooltip": "How thick the occluders are. Only affects AO.",
"feature.ssgi.toggles": "Toggles",
"feature.ssgi.vanilla_ssao": "Vanilla SSAO",
"feature.ssgi.vanilla_ssao_tooltip": "Enable Skyrim's built-in SSAO. Usually disabled when using SSGI to avoid double-darkening.",
"feature.ssgi.vanilla_ssao_tooltip_vr": "Vanilla SSAO is not supported in VR.",
"feature.ssgi.view_resize": "View Resize",
"feature.ssgi.visual": "Visual",
"feature.ssgi.visual_il": "Visual - IL",
"feature.sss.base_profile": "Base Profile",
"feature.sss.blur_radius": "Blur Radius",
"feature.sss.blur_radius_tooltip": "Blur radius.",
Expand Down
Loading
Loading