Skip to content

Commit af8351e

Browse files
committed
chore(release): 3.1.0-fork
Bump RELEASE_DATE and promote the [Unreleased] changelog section to the 3.1.0-fork release dated 2026-04-21. Regenerate the docs-src/ mirrors of CHANGELOG.md and CONTRIBUTING.md via docs-pre-build.
1 parent 398464e commit af8351e

4 files changed

Lines changed: 119 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ other versions come from the canonical LWT ("official" branch on Git).
55
For git tags, official releases are marked like "v1.0.0", while unofficial
66
ones are marked like "v1.0.0-fork".
77

8-
## [Unreleased]
8+
## [3.1.0-fork] - 2026-04-21
99

1010
### Added
1111

docs-src/changelog.md

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,97 @@ other versions come from the canonical LWT ("official" branch on Git).
1010
For git tags, official releases are marked like "v1.0.0", while unofficial
1111
ones are marked like "v1.0.0-fork".
1212

13+
## [3.1.0-fork] - 2026-04-21
14+
15+
### Added
16+
17+
* **Internationalization (i18n)** (#223): PHP `__()` and JS `t()` /
18+
Alpine `$t` helpers backed by per-namespace JSON files under `locale/`,
19+
with English fallback and a per-user `app_language` setting. The
20+
preferences page exposes a language picker.
21+
* **Spanish translation** of the home page, main navbar and user
22+
preferences page (#223).
23+
* **Activity tracking with streaks and calendar heatmap** (#227): New
24+
`activity_log` table tracks daily terms created, terms reviewed, and texts
25+
read. A backfill migration populates historical data from existing word
26+
timestamps. The home page now shows current streak, best streak, today's
27+
activity summary, and a GitHub-style calendar heatmap of the last 12 months.
28+
New API endpoints at `/api/v1/activity/{dashboard,streak,calendar,today}`.
29+
* **PHP 8.5 support**: All dependencies now support PHP 8.5. Added PHP 8.5 to
30+
the CI test matrix.
31+
32+
### Changed
33+
34+
* **Update notification**: The "new LWT version available" banner on the
35+
home page is now dismissible (remembered per-version via localStorage),
36+
only shown to admins, and can be disabled entirely via a new
37+
`set-check-for-updates` admin setting in the settings page.
38+
* **Navbar**: Merged the admin dropdown into the user dropdown to save space.
39+
* **Per-user statistics**: Moved the statistics page from `/admin/statistics` to `/profile/statistics` since it shows per-user learning data. The old URL redirects to the new one.
40+
* **Cleaner setting definition keys**: `SettingDefinitions` entries now use
41+
`default` (string) and `numeric` (bool) instead of the cryptic `dft` (string)
42+
and `num` (int 0/1). The legacy keys are still accepted on read for
43+
backwards compatibility but are deprecated.
44+
* **Renamed `dev` branch to `develop`**: All CI workflows and documentation
45+
updated to reference the new branch name.
46+
* **Upgraded dev tooling to latest major versions**:
47+
* PHPUnit 10 → 11: migrated all test annotations (`@dataProvider`, `@covers`,
48+
`@group`, `@runTestsInSeparateProcesses`) to PHP 8 attributes. Replaced the
49+
duplicate integration testsuite in `phpunit.xml` with `#[Group('integration')]`.
50+
* ESLint 9 → 10, TypeScript 5 → 6: removed deprecated `baseUrl` from
51+
`tsconfig.json`, fixed two new `no-useless-assignment` lint errors.
52+
* Vite 6 → 8 (Rolldown bundler): converted `manualChunks` from object to
53+
function, removed redundant `inlineDynamicImports`.
54+
* Also bumped `@eslint/css` 0.14 → 1, `@eslint/js` 9 → 10,
55+
`@eslint/markdown` 7 → 8, `@types/node` 24 → 25, `jsdom` 27 → 29,
56+
`globals` 16 → 17.
57+
* **Cleaned up all PHPCS violations in the test suite**: removed 80+ redundant
58+
`require_once` / bootstrap side-effect blocks (already handled by
59+
`tests/bootstrap.php`), extracted inline helper classes to separate files,
60+
fixed line-length warnings. Result: 0 errors, 0 warnings across all tests.
61+
* **Separated build output from static assets**: Build output (Vite bundles,
62+
theme CSS, base CSS) now goes to `dist/` instead of `assets/`. Static files
63+
(images, sounds, manifest) stay in `assets/`. The `dist/` directory is fully
64+
gitignored — cloning requires `npm run build:all`. Includes a DB migration to
65+
update stored theme directory paths.
66+
* **Replaced legacy PNG/GIF icons with pure CSS in dark themes**: The Dark,
67+
Dark_Muted, and Underline_Dark themes used a PNG sprite sheet for custom
68+
checkbox/radio styling. Replaced with CSS borders and inline SVG. Also removed
69+
36 unused image files (spinners, speaker icons, test result icons, etc.) that
70+
had already been superseded by Lucide SVG icons.
71+
* **Optimized Vite build chunks**: Reduced the main entry bundle from 228 KB to
72+
180 KB (gzip: 68→56 KB) by moving page-specific modules (home, media, auth,
73+
tags, dictionary, sorttable, searchable-select, bulk-actions, word-form-auto)
74+
to dynamic imports loaded on demand. Tree-shook chart.js (203→179 KB) by
75+
registering only used components. Pruned 50 unused Lucide icons (143→97) and
76+
added 5 missing ones. Added a Vite plugin to clean stale hashed bundles
77+
between builds.
78+
79+
### Fixed
80+
81+
* **Version number not updated since 3.0.0**: `ApplicationInfo::VERSION` was
82+
never bumped for the 3.0.1 and 3.0.2 releases, causing the app to display
83+
"3.0.0-fork" in the UI.
84+
85+
### Removed
86+
87+
* **Dead route `/text/set-mode`**: This endpoint (and its view, controller
88+
method, and frontend JS) was no longer reachable from any UI. The "Show All"
89+
and "Learning Translations" toggles now save settings via the
90+
`POST /api/v1/settings` API and reload the page.
91+
* **Dead route `/admin/save-setting`**: This legacy `?k=…&v=…&u=…` endpoint was
92+
fully superseded by `POST /api/v1/settings`. No UI or frontend code referenced
93+
it.
94+
95+
### Deprecated
96+
97+
* **Legacy query-parameter routes** now emit `Deprecation`, `Sunset`, and `Link`
98+
HTTP headers. The routes still work but will be removed in the next major
99+
version. Affected routes: `/text/read`, `/text/display`, `/text/print-plain`,
100+
`/text/edit`, `/word/new`, `/word/show`, `/vocabulary/term/status`,
101+
`/feeds/edit`, `/dictionaries`, `/dictionaries/import`, and the
102+
`/api.php/v1/*` prefix.
103+
13104
## [3.0.2-fork] - 2026-04-05
14105

15106
### Changed

docs-src/developer/contributing.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,32 @@ When adding new features or fixing bugs that affect user-facing functionality, c
240240
2. Use fixtures for test data
241241
3. Run tests locally before submitting PRs
242242

243+
## Curated Feed Sources
244+
245+
LWT ships a registry of curated RSS/Atom news feeds for language learners in `data/curated_feeds.json`. Each entry includes pre-configured extraction selectors and options matching the app's feed system.
246+
247+
### Checking Feed Health
248+
249+
A health-check script detects link rot, XML format changes, and stale feeds:
250+
251+
```bash
252+
php bin/check-feeds.php # Check all feeds
253+
php bin/check-feeds.php --language=fr # Check only French feeds
254+
php bin/check-feeds.php --json # Machine-readable output (for CI)
255+
php bin/check-feeds.php --sample-article # Also test article selectors on a live page
256+
php bin/check-feeds.php --fix # Update _lastVerified date on success
257+
```
258+
259+
Exit codes: `0` = all healthy, `1` = issues found, `2` = registry file error.
260+
261+
Run this script before submitting changes to `curated_feeds.json`, and periodically to catch feed URL changes early.
262+
263+
### Adding or Updating Feeds
264+
265+
1. Edit `data/curated_feeds.json` — each source needs `name` (max 40 chars), `url`, `articleSectionTags` (tag name for content extraction), `filterTags` (XPath selectors to remove), `options`, `category`, and `level`.
266+
2. Run `php bin/check-feeds.php` and verify the new feed is healthy.
267+
3. Prefer well-known, publicly funded broadcasters (BBC, DW, NHK, etc.) as they tend to maintain stable RSS endpoints.
268+
243269
## Improving Documentation
244270

245271
To regenerate all documentation (VitePress, JSDoc, phpDoc), use ``composer doc``.

src/Shared/Infrastructure/ApplicationInfo.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class ApplicationInfo
3535
/**
3636
* Date of the latest published release of LWT.
3737
*/
38-
public const RELEASE_DATE = '2026-04-05';
38+
public const RELEASE_DATE = '2026-04-21';
3939

4040
/**
4141
* Get the application version for display to humans.

0 commit comments

Comments
 (0)