Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
174 commits
Select commit Hold shift + click to select a range
401792e
blog: add "'Publicación del blog de Ravi 1'"
Infi-Knight Jan 22, 2026
c087c21
blog: delete "'Publicación del blog de Ravi 1'"
Infi-Knight Jan 22, 2026
226e9da
blog: add "'Publicación del blog de Ravi 1'"
Infi-Knight Jan 22, 2026
24d79fe
blog: delete "'Publicación del blog de Ravi 1'"
Infi-Knight Jan 22, 2026
0a30a9d
blog: add "Test Spanish Post"
Infi-Knight Jan 22, 2026
fc760bb
blog: add "Test Spanish Post 2"
Infi-Knight Jan 22, 2026
41731e1
blog: add "Test Spanish Post 3"
Infi-Knight Jan 22, 2026
163dc16
blog: add "Test Spanish Post 4"
Infi-Knight Jan 22, 2026
0c27e91
blog: add "Test Spanish Post 5"
Infi-Knight Jan 22, 2026
505c6d6
blog: add "Test Spanish Post 6"
Infi-Knight Jan 22, 2026
1f54267
blog: add "Test Spanish Post Final"
Infi-Knight Jan 22, 2026
1489635
blog: add "Test Spanish Post Final 2"
Infi-Knight Jan 22, 2026
e90be64
blog: delete "Test Spanish Post 5"
Infi-Knight Jan 22, 2026
2143412
blog: delete "Test Spanish Post Final 2"
Infi-Knight Jan 22, 2026
514b890
blog: add "ravi blog post 1"
Infi-Knight Jan 22, 2026
ade705e
blog: delete "ravi blog post 1"
Infi-Knight Jan 22, 2026
cdf8bcf
blog: add "ravi blog post 1"
Infi-Knight Jan 22, 2026
b1f4a8c
blog: add "'Publicación del blog de Ravi 1'"
Infi-Knight Jan 22, 2026
08b20b4
blog: delete "'Publicación del blog de Ravi 1'"
Infi-Knight Jan 22, 2026
f6afaaa
blog: unpublish "ravi blog post 1"
Infi-Knight Jan 22, 2026
d584352
blog: add "ravi blog post 1"
Infi-Knight Jan 22, 2026
8873c50
blog: add "'Publicación del blog de Ravi 1'"
Infi-Knight Jan 22, 2026
6ccb295
blog: delete "'Publicación del blog de Ravi 1'"
Infi-Knight Jan 22, 2026
bb28029
blog: add "'Publicación del blog de Ravi 1'"
Infi-Knight Jan 22, 2026
fcea7fc
blog: unpublish "'Publicación del blog de Ravi 1'"
Infi-Knight Jan 22, 2026
db43051
blog: add "'Publicación del blog de Ravi 1'"
Infi-Knight Jan 22, 2026
bf9c1e4
blog: unpublish "'Publicación del blog de Ravi 1'"
Infi-Knight Jan 22, 2026
bc49c1d
blog: add "'Publicación del blog de Ravi 1'"
Infi-Knight Jan 22, 2026
98ab485
blog: delete "'Publicación del blog de Ravi 1'"
Infi-Knight Jan 22, 2026
97abeb5
blog: add "'Publicación del blog de Ravi 1'"
Infi-Knight Jan 22, 2026
f3c0d60
blog: delete "'Publicación del blog de Ravi 1'"
Infi-Knight Jan 22, 2026
5d8c2ee
blog: add "'ravi blog post 1 es'"
Infi-Knight Jan 22, 2026
161af40
blog: delete "'ravi blog post 1 es'"
Infi-Knight Jan 22, 2026
6060532
blog: add "'ravi blog post 1 es es'"
Infi-Knight Jan 22, 2026
3123ab6
blog: delete "'ravi blog post 1 es es'"
Infi-Knight Jan 22, 2026
7f544e5
blog: add "'ravi blog post 1 es'"
Infi-Knight Jan 22, 2026
cf90028
blog: delete "'ravi blog post 1 es'"
Infi-Knight Jan 22, 2026
1e51499
blog: unpublish "Test blog english"
Infi-Knight Jan 22, 2026
e0e5f54
blog: add "Test blog english"
Infi-Knight Jan 22, 2026
76eff21
blog: delete "Test blog english"
Infi-Knight Jan 22, 2026
6e39cc8
blog: add "Test blog english"
Infi-Knight Jan 22, 2026
f815edd
blog: add "'Test blog english Es'"
Infi-Knight Jan 22, 2026
9c2d929
blog: add "'Test blog english Es'"
Infi-Knight Jan 22, 2026
aa925ec
blog: add "'New Test Blog with Image'"
Infi-Knight Jan 22, 2026
bceca27
blog: delete "'Test blog english Es'"
Infi-Knight Jan 22, 2026
077ef7e
blog: add "'Test blog english es'"
Infi-Knight Jan 22, 2026
49adba8
blog: delete "'Test blog english es'"
Infi-Knight Jan 22, 2026
f364f74
blog: add "'Es test blog'"
Infi-Knight Jan 22, 2026
37b5d6e
blog: delete "'Es test blog'"
Infi-Knight Jan 22, 2026
9c09e1b
blog: add "'Es blog'"
Infi-Knight Jan 22, 2026
8934b0b
blog: delete "'Es blog'"
Infi-Knight Jan 23, 2026
bcfeff5
blog: add "'esd english'"
Infi-Knight Jan 23, 2026
2244d04
blog: delete "'esd english'"
Infi-Knight Jan 23, 2026
f4da2ec
blog: add "'esd english'"
Infi-Knight Jan 23, 2026
93f6e21
blog: delete "'esd english'"
Infi-Knight Jan 23, 2026
e603afc
blog: add "'sksks blog english'"
Infi-Knight Jan 23, 2026
178df45
blog: delete "'sksks blog english'"
Infi-Knight Jan 23, 2026
993d063
blog: add "'Es blog english'"
Infi-Knight Jan 23, 2026
9d5c3fb
blog: delete "'Es blog english'"
Infi-Knight Jan 23, 2026
1b7e011
blog: add "'Es blog english'"
Infi-Knight Jan 23, 2026
086c695
blog: delete "'Es blog english'"
Infi-Knight Jan 23, 2026
97883d7
blog: add "'Es blog english'"
Infi-Knight Jan 23, 2026
4b71e06
blog: delete "'Es blog english'"
Infi-Knight Jan 23, 2026
6820468
blog: add "'Es blog english'"
Infi-Knight Jan 23, 2026
2ea456e
blog: delete "'Es blog english'"
Infi-Knight Jan 23, 2026
62a8c05
blog: add "'Es blog english'"
Infi-Knight Jan 23, 2026
0f55f81
blog: delete "'Es blog english'"
Infi-Knight Jan 23, 2026
1915cb3
blog: add "'Es blog english'"
Infi-Knight Jan 23, 2026
89c4389
blog: delete "'Es blog english'"
Infi-Knight Jan 23, 2026
874fa7b
blog: add "'Es blog english'"
Infi-Knight Jan 23, 2026
7f6b6ad
blog: delete "'Es blog english'"
Infi-Knight Jan 23, 2026
da6dc40
blog: add "'Es blog english'"
Infi-Knight Jan 23, 2026
116f9ce
blog: delete "'Es blog english'"
Infi-Knight Jan 23, 2026
0993af0
blog: add "'Es blog english'"
Infi-Knight Jan 23, 2026
17fc8c7
blog: delete "'Es blog english'"
Infi-Knight Jan 23, 2026
32efc1f
blog: add "'Spanish english'"
Infi-Knight Jan 23, 2026
cb54122
blog: add "'french english'"
Infi-Knight Jan 23, 2026
a1263d2
blog: delete "'french english'"
Infi-Knight Jan 23, 2026
460235b
blog: add "Test blog Es"
Infi-Knight Jan 23, 2026
1699c68
blog: add "Test blog Fr"
Infi-Knight Jan 23, 2026
0e467ca
fix locale generation
Infi-Knight Jan 23, 2026
87c1945
main blog lang switcher
Infi-Knight Jan 23, 2026
e62450a
localised urls
Infi-Knight Jan 23, 2026
7f2d691
blog: add "Test blog Es"
Infi-Knight Jan 26, 2026
7fb46d6
blog: add "Test blog Fr"
Infi-Knight Jan 26, 2026
ae87e2e
blog: delete "Test blog Fr"
Infi-Knight Jan 26, 2026
7ba89d8
blog: add "test blog"
Infi-Knight Jan 26, 2026
d700e4e
blog: delete "test blog"
Infi-Knight Jan 26, 2026
b84d3cf
blog: add "test blog eng"
Infi-Knight Jan 26, 2026
d2266cb
blog: add "test blog spanish"
Infi-Knight Jan 26, 2026
3ab4ace
blog: add "test blog eng"
Infi-Knight Jan 26, 2026
b66ba99
blog: delete "test blog spanish"
Infi-Knight Jan 26, 2026
6e87dbf
blog: add "test blog"
Infi-Knight Jan 26, 2026
2f57069
blog: add "test blog"
Infi-Knight Jan 26, 2026
a7b9a86
blog: add "test blog"
Infi-Knight Jan 26, 2026
deccee1
blog: delete "test blog"
Infi-Knight Jan 26, 2026
55f86ad
blog: add "eng blog"
Infi-Knight Jan 26, 2026
8571eef
blog: add "eng blog"
Infi-Knight Jan 26, 2026
73344ab
blog: delete "eng blog"
Infi-Knight Jan 26, 2026
fac24f2
blog: add "test blog"
Infi-Knight Jan 26, 2026
6edcff9
blog: add "test blog"
Infi-Knight Jan 26, 2026
a2ee1b5
blog: add "test blog"
Infi-Knight Jan 26, 2026
803e877
blog: delete "test blog"
Infi-Knight Jan 27, 2026
c2ffb9a
blog: add "test blog"
Infi-Knight Jan 27, 2026
c0ddd74
blog: add "test blog"
Infi-Knight Jan 27, 2026
e76a745
blog: add "test blog"
Infi-Knight Jan 27, 2026
6b5a6cd
blog: add "test blog"
Infi-Knight Jan 27, 2026
97bc849
blog: add "test blog"
Infi-Knight Jan 27, 2026
fb84d4e
blog: add "test blog"
Infi-Knight Jan 27, 2026
3018bea
blog: add "test blog"
Infi-Knight Jan 27, 2026
c3a1074
blog: add "test blog"
Infi-Knight Jan 27, 2026
c6bee31
blog: add "test blog"
Infi-Knight Jan 27, 2026
82914e2
blog: add "test blog"
Infi-Knight Jan 27, 2026
bf945ae
blog: add "test blog"
Infi-Knight Jan 27, 2026
60da608
blog: add "test blog"
Infi-Knight Jan 27, 2026
9ed0214
blog: add "test blog"
Infi-Knight Jan 27, 2026
ffda7e3
blog: add "test blog"
Infi-Knight Jan 27, 2026
667a813
blog: add "test blog"
Infi-Knight Jan 27, 2026
363497d
blog: add "test blog"
Infi-Knight Jan 27, 2026
72c33ea
blog: delete "test blog"
Infi-Knight Jan 27, 2026
b43f700
blog: delete "test blog"
Infi-Knight Jan 27, 2026
1967dd5
blog: delete "test blog"
Infi-Knight Jan 27, 2026
4262cac
blog: add "test blog"
Infi-Knight Jan 27, 2026
b57d36c
blog: add "test blog"
Infi-Knight Jan 27, 2026
015d20b
blog: add "test blog"
Infi-Knight Jan 27, 2026
84da834
blog: delete "test blog"
Infi-Knight Jan 27, 2026
761a384
blog: delete "test blog"
Infi-Knight Jan 27, 2026
77c0c68
blog: delete "test blog"
Infi-Knight Jan 27, 2026
9b3c5a8
blog: delete "test blog"
Infi-Knight Jan 27, 2026
f835f4b
blog: add "test blog"
Infi-Knight Jan 27, 2026
0403ec6
blog: add "test blog"
Infi-Knight Jan 27, 2026
0edd069
blog: unpublish "test blog"
Infi-Knight Jan 27, 2026
94d11f8
blog: add "test blog"
Infi-Knight Jan 27, 2026
ee586ad
blog: add "test blog"
Infi-Knight Jan 27, 2026
f58123e
blog: unpublish "test blog"
Infi-Knight Jan 27, 2026
0b3d43f
blog: add "test blog"
Infi-Knight Jan 27, 2026
c2aa605
fix in-blog switcher
Infi-Knight Jan 27, 2026
2fb0e28
blog: add "test english blog"
Infi-Knight Jan 27, 2026
f32a5c8
blog: add "test english blog"
Infi-Knight Jan 27, 2026
6c8df8d
blog: unpublish "test english blog"
Infi-Knight Jan 27, 2026
aad817c
blog: add "test english blog"
Infi-Knight Jan 27, 2026
0f6fb72
blog: unpublish "test english blog"
Infi-Knight Jan 27, 2026
62230e5
blog: add "test english blog"
Infi-Knight Jan 27, 2026
8210aa6
blog: add "test english blog"
Infi-Knight Jan 27, 2026
a5892f4
blog: unpublish "test english blog"
Infi-Knight Jan 27, 2026
d7c17c9
blog: add "test english blog"
Infi-Knight Jan 27, 2026
6910c28
blog: unpublish "test english blog"
Infi-Knight Jan 27, 2026
4d21475
blog: add "test english blog"
Infi-Knight Jan 27, 2026
94784a4
blog: delete "test english blog"
Infi-Knight Jan 27, 2026
eaad9d6
blog: delete "test english blog"
Infi-Knight Jan 27, 2026
4726cc7
blog: delete "test english blog"
Infi-Knight Jan 27, 2026
1b36a7f
blog: add "test blog"
Infi-Knight Jan 27, 2026
9ee5d28
blog: add "test blog"
Infi-Knight Jan 27, 2026
eb292a8
blog: unpublish "test blog"
Infi-Knight Jan 27, 2026
465314e
blog: add "test blog"
Infi-Knight Jan 27, 2026
4a0d966
blog: unpublish "test blog"
Infi-Knight Jan 27, 2026
d71f9f6
blog: add "test blog"
Infi-Knight Jan 27, 2026
1ac980c
blog: add "test blog"
Infi-Knight Jan 27, 2026
fe51ee2
blog: unpublish "test blog"
Infi-Knight Jan 27, 2026
b8d8574
blog: add "test blog"
Infi-Knight Jan 27, 2026
3cb0e1b
blog: unpublish "test blog"
Infi-Knight Jan 27, 2026
c24a70a
blog: add "test blog"
Infi-Knight Jan 27, 2026
7cdde9b
fix astro start
Infi-Knight Jan 27, 2026
097e65b
add translated post
JonathanMatthey Jan 27, 2026
877f6ba
update in blog lang switcher design
Infi-Knight Jan 27, 2026
714ed94
breadcrumbs text localised
Infi-Knight Jan 27, 2026
30f07f1
blog: unpublish "test blog - UPDATED"
Infi-Knight Jan 27, 2026
ab3aec4
blog: add "test blog - UPDATED"
Infi-Knight Jan 27, 2026
6319b88
blog: unpublish "test blog"
Infi-Knight Jan 27, 2026
6792025
blog: add "test blog"
Infi-Knight Jan 27, 2026
e053dba
blog: unpublish "test blog - UPDATED"
Infi-Knight Jan 27, 2026
7e2fa12
blog: add "test blog - UPDATED"
Infi-Knight Jan 27, 2026
8c04ce4
improve export and import scripts
Infi-Knight Jan 27, 2026
c0f37b4
allow reexporting already imported content
Infi-Knight Jan 27, 2026
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
9 changes: 8 additions & 1 deletion cms/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
"develop": "strapi develop",
"start": "strapi start",
"build": "strapi build",
"strapi": "strapi"
"strapi": "strapi",
"translations:export": "tsx scripts/export-translations.ts",
"translations:import": "tsx scripts/import-translations.ts"
},
"strapi": {
"uuid": "d5c8f4e2-9a1b-4c3d-8e7f-6a5b4c3d2e1f"
Expand All @@ -17,14 +19,19 @@
"@ckeditor/strapi-plugin-ckeditor": "^1.1.1",
"@strapi/strapi": "5.31.3",
"better-sqlite3": "11.5.0",
"dotenv": "^16.4.5",
"esbuild": "0.25.11",
"node-html-markdown": "^2.0.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.30.2",
"styled-components": "^6.1.19"
},
"devDependencies": {
"@types/dotenv": "^6.1.1",
"@types/markdown-it": "^14.1.2",
"@types/node": "^22.10.1",
"tsx": "^4.21.0",
"typescript": "^5.7.2"
},
"engines": {
Expand Down
101 changes: 101 additions & 0 deletions cms/scripts/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# Translation Scripts

This directory contains TypeScript scripts for managing blog post translations through a file-based workflow.

**Note:** The `exports/translations/` folder is `.gitignore`'d because it contains temporary work files for translation agencies. The final generated MDX files in `src/content/blog/` ARE committed.

## Testing Translation Flow

### Prerequisites

1. **Start Strapi Server**:

```bash
cd cms
npm run develop
```

2. **Generate an API Token**:
- Go to http://localhost:1337/admin/settings/api-tokens
- Click "Create new API Token"
- Name: "Translation Scripts"
- Token type: Full access (or configure specific permissions for blog-post)
- Copy the generated token
- Add to `cms/.env`:
```
STRAPI_API_TOKEN=your_token_here
STRAPI_URL=http://localhost:1337
STRAPI_UPLOADS_BASE_URL=http://localhost:1337
```

### Test Flow

#### Step 1: Export a Blog Post

```bash
cd cms
npm run translations:export
```

This creates MDX files in `cms/exports/translations/` with the format:

- `YYYY-MM-DD-slug.mdx` (English posts)

**Note**: The export script automatically converts all image paths (both featured and body images) from `/uploads/xxx.jpg` to full URLs like `http://localhost:1337/uploads/xxx.jpg`. This ensures images work correctly when importing back.

#### Step 2: Create a Translated Version

Translate the content (title, description, body) while preserving the image URLs.

#### Step 3: Import the Translation

```bash
npm run translations:import
```

The script will:

- Create a new blog post entry in Strapi
- Set the `lang` field to "es"
- Use image URLs as-is
- Generate a unique slug by appending language code (e.g., `my-post-es`)
- Publish the post

After the import completes, the lifecycle hook will automatically generate the final MDX file in `src/content/blog/`:

- `YYYY-MM-DD-slug-es.es.mdx` (Spanish version)

#### Step 4: Verify the Generated File

Check that the translated MDX file was created with both featured image and body images:

```bash
cat src/content/blog/2025-01-22-my-post-es.es.mdx
```

**What to check in Strapi Admin:**

- Go to **Blog Posts** → Click on your imported post
- The featured image should appear in the **Featured Image** field
- Scroll to the **Content** editor - body images should render correctly
- If images don't appear, try clicking the "Refresh" button or re-saving the post

## How Images Work

### Featured Image

- **Export**: Converts `/uploads/image.jpg` to `http://localhost:1337/uploads/image.jpg`
- **Import**: Uses the full URL directly (no re-upload needed)
- **Result**: Featured image shows in Strapi admin and in the blog post

## Scripts

- `export-translations.ts` - Export all published blog posts to MDX with full image URLs
- `import-translations.ts` - Import translated MDX files to Strapi

## Filename Format

- **Original**: `YYYY-MM-DD-slug.mdx`
- **Translated**: `YYYY-MM-DD-slug.{lang}.mdx` (e.g., `post.es.mdx`, `post.fr.mdx`)

**Note**: The import script appends language code to slug to ensure uniqueness (e.g., `slug-es`), so the generated MDX filename will be `YYYY-MM-DD-slug-es.{lang}.mdx`. This is intentional to maintain slug uniqueness in Strapi.
Loading