Skip to content

Releases: HugoFara/lwt

LWT 3.1.0: Internationalization, activity tracking, and PHP 8.5

20 Apr 22:52

Choose a tag to compare

Added

  • Internationalization (i18n) (#223): PHP __() and JS t() / Alpine $t helpers backed by per-namespace JSON files under locale/, with English fallback and a per-user app_language setting. The preferences page exposes a language picker.
  • Translations: Spanish, Simplified Chinese, Brazilian Portuguese, Japanese, Italian, and Russian coverage for the home page, main navbar, and user preferences.
  • Activity tracking with streaks and calendar heatmap (#227): new activity_log table and home-page widgets (current streak, best streak, today's summary, 12-month GitHub-style heatmap). New API endpoints under /api/v1/activity/.
  • PHP 8.5 support: dependencies and CI matrix updated.

Changed

  • Dismissible update notification, admin-only, with a new set-check-for-updates admin setting.
  • Per-user statistics page moved from /admin/statistics to /profile/statistics (old URL redirects).
  • Cleaner setting-definition keys: default/numeric replace the legacy dft/num.
  • Build output separated from static assets: Vite bundles and themes now go to dist/ (gitignored); assets/ holds static files. Fresh clones require npm run build:all.
  • Dev-tool upgrades: PHPUnit 10 → 11 (attributes migration), ESLint 9 → 10, TypeScript 5 → 6, Vite 6 → 8 (Rolldown).
  • Renamed dev branch to develop.
  • Replaced PNG/GIF icons with pure CSS/SVG in dark themes; removed 36 unused image files.
  • Optimized Vite build chunks: main entry bundle 228 KB → 180 KB (gzip 68 → 56 KB). Tree-shook chart.js, pruned 50 unused Lucide icons.

Fixed

  • Version number not updated since 3.0.0: ApplicationInfo::VERSION now correctly reflects releases.

Removed

  • Dead routes /text/set-mode and /admin/save-setting, fully superseded by POST /api/v1/settings.

Deprecated

  • Legacy query-parameter routes now emit Deprecation, Sunset, and Link HTTP headers. Affected: /text/read, /text/display, /text/print-plain, /text/edit, /word/new, /word/show, /vocabulary/term/status, /feeds/edit, /dictionaries, /dictionaries/import, and the /api.php/v1/* prefix. They still work but will be removed in the next major version.

Full Changelog: 3.0.2...3.1.0

LWT 3.0.2: EPUB fix, reader controls, and export improvements

05 Apr 10:58

Choose a tag to compare

Added

  • Reading area width and text size controls (#225): Display dropdown in the reader toolbar with width slider (40–100%) and text size buttons. Settings persist across sessions.

Changed

  • Removed @vitejs/plugin-legacy, cutting JS build output by ~70%.

Fixed

  • EPUB import always failing (#231): Extension check was validating the PHP temp path instead of the original filename.
  • Glosbe translation blocked: Upgraded API calls to HTTPS and added CSP allowlist.
  • Anki export missing sentences: Words without {word} markup in their sentences are now included.
  • License link broken in page headers after file rename.
  • Docker image builds failing on arm/v7 due to multi-stage build issue.

Full Changelog:

3.0.1...3.0.2

LWT 3.0.1 — Minor Docker fix

15 Mar 13:49

Choose a tag to compare

Fixed

  • Docker image build for arm/v7 and other architectures: MeCab system packages and mecab-python3 now skip gracefully on unsupported platforms instead of failing the entire build. Japanese parsing remains available on amd64 and arm64.

Full Changelog: 3.0.0...3.0.1

LWT 3.0.0 — The Great Rewrite

14 Mar 23:00

Choose a tag to compare

This is the largest release in LWT's history. The entire application has been restructured from the ground up — new architecture, new frontend, new database engine, new security model — while preserving full compatibility with your existing data.

Screenshot From 2026-03-14 23-25-52 Screenshot From 2026-03-15 00-00-30

Highlights

Completely new architecture

  • MVC + Front Controller: All requests route through index.php with proper Controllers (17 classes), Services (35 classes), and Views. The root folder no longer contains dozens of PHP files. (#212, #213, #215). Contributing becomes easy!
  • Extensible Language Parsers (#222): Clean parser architecture using the Strategy Pattern — Regex (default), Character (CJK), and MeCab (Japanese). New parsers can be added by implementing ParserInterface and registering in ParserRegistry. We can now parse Chinese, Korean, and more!

Modern frontend

  • Alpine.js + TypeScript: 90+ TypeScript files with reactive Alpine.js components replace the legacy jQuery/iframe/overlib stack. (#208, #209, #211). The app will feel easier to use and be faster.
  • Lucide SVG icons: All 97 legacy Fugue PNG icons replaced with scalable, CSS-customizable SVG icons via the IconHelper class. Modern icons!
  • Iframe removal (#166): Legacy iframe-based layout replaced with Alpine.js components and REST API calls. Only dictionary iframes remain for external dictionary display. It brings better mobile support.

Multi-user support (#221)

  • Dedicated users table with proper foreign key relationships.
  • User authentication, registration, and role-based access (user/admin) with per-user data isolation.
  • All user-owned data (languages, texts, words, tags, feeds) linked to the users table with CASCADE delete.

Database overhaul (#220)

  • All tables migrated from MyISAM to InnoDB — ACID transactions, row-level locking, crash recovery.
  • 16 foreign key constraints for referential integrity across tables.
  • All SQL queries in validation functions now use proper input sanitization — multiple SQL injection vulnerabilities fixed.

Added

  • Notes field for terms (#128): Personal notes separate from translations, with database migration, updated entity classes, service layer, UI forms, and API endpoints.
  • Inline Markdown in translations and notes (#126): Support for **bold**, *italic*, ~~strikethrough~~, and [links](url). Rendered in word modals, annotations, word lists, test screens, and detail views. Custom lightweight parsers in both TypeScript and PHP with XSS protection.
  • Official support for PHP 8.3 and 8.4.
  • Modular Monolith + MVC Architecture (#212, #215): Complete restructure with Controllers in src/backend/Controllers/, Services in src/backend/Services/, Views in src/backend/Views/, Router in src/backend/Router/. Then, the architecture was refactored as Modular Monolith.
  • Front Controller Pattern (#213): All requests route through index.php. Only index.php and router.php remain in the root folder.
  • Alpine.js Frontend Framework (#208): Reactive UI components reducing reliance on PHP-rendered pages.
  • TypeScript Migration (#209): 90+ .ts files in src/frontend/js/ with proper module structure (api/, core/, reading/, testing/, feeds/, languages/, etc.).
  • jQuery Removal (#211): Replaced with modern vanilla JavaScript and Alpine.js.
  • Overlib Replacement (#214): The 20-year-old overlib tooltip library has been removed.
  • HoverIntent Replacement (#210): jQuery plugin replaced with a native TypeScript implementation.
  • Extensible Language Parsers (#222): Strategy Pattern with ParserInterface, ParserRegistry, ParsingCoordinator, and value objects (Token, ParserResult, ParserConfig). Each language specifies its parser via the LgParserType column. Language edit form dynamically adjusts to the selected parser.
  • Multi-user support (#221): Dedicated users table with foreign keys, authentication, registration, and role-based access (user/admin).

Changed

  • Database Engine Migration (#220): All permanent tables converted from MyISAM to InnoDB (ACID transactions, row-level locking, foreign keys, crash recovery).
  • Inter-Table Foreign Keys (#220): 16 foreign key constraints added. Language references, text references, word references, and tag references all enforce referential integrity with CASCADE behavior. Migration: 20251221_120000_add_inter_table_foreign_keys.sql.
  • TTS Settings Storage (#186): Text-to-Speech settings now use browser localStorage instead of cookies. Includes automatic migration from old cookie format.
  • Icon Migration to Lucide SVG: All 97 legacy Fugue PNG icons (16×16) replaced with scalable Lucide SVG icons. IconHelper class provides a unified rendering interface.
  • Removed SYSTEM_VARIABLES_ADMIN Privilege Requirement (#167): No more elevated database privileges for word imports. Replaced with chunked batch inserts (500 rows per batch) that stream files line-by-line.

Fixed

  • Tag Duplicate Key Error (#120): Fixed rare error when saving a word with a tag from a stale session cache. Changed to INSERT IGNORE for race condition handling.
  • Japanese Annotations (#101): Fixed off-by-one index in annotationToJson() causing ~50% of annotations to fail.
  • Text Parsing (#114): Last word of text now recognized when text ends without punctuation.
  • PHP 8.3 Compatibility: Fixed deprecation warnings in langFromDict() and targetLangFromDict() (null checks before parse_str()).
  • Database Maintenance: Fixed initWordCount() generating invalid SQL for CJK languages. Word count now defaults to 1 minimum.
  • SQL Prefix Queries: Fixed prefixQuery() to handle DROP TABLE IF EXISTS and case-insensitive SQL keywords.
  • Punctuation Formatting (#125): Punctuation marks no longer break onto separate lines — wrapped in non-breaking groups.

Security

  • Session security cookie to protect against session hijacking.
  • Fixed SQL injection vulnerabilities in validateLang(), validateText(), validateTag(), and validateArchTextTag() — all validation functions now properly sanitize non-numeric input.
  • Fixed SQL injection vulnerabilities in inc/tags.php: getTextTitle(), saveWordTags(), saveTextTags(), and saveArchivedTextTags() now validate numeric input.
  • Fixed SQL syntax errors in tag list functions when handling empty lists or failed tag creation.

Deprecated

  • PHP 8.0 testing & support removed.
  • PHP 8.1 support removed.
  • Legacy table prefix system ($tbpref) is deprecated in favor of user-based multi-tenancy. Existing prefixed tables will be migrated automatically (if things go well). It has been a long way from #76 to #164

Removed

  • Orphaned Frame Settings (#116): Removed all 7 legacy frame-related settings from the admin settings page (frame heights, widths for text and test interfaces). These became non-functional after the iframe replacement (#166). Also removed the dead initFrameResizable() TypeScript function.

Breaking Changes

Back up your database before upgrading.

  • textitems2.Ti2WoID now uses NULL instead of 0 for unknown words (required for FK constraints).
  • Legacy table prefix system ($tbpref) is deprecated — existing prefixed tables are migrated automatically.
  • Frame-related settings removed (non-functional since iframe replacement). (#116)
  • Elevated database privileges (SYSTEM_VARIABLES_ADMIN) no longer required. (#167)

Upgrading

# Docker (recommended)
docker compose pull && docker compose up -d

# Manual
composer install
npm install && npm run build:all
# Database migrations run automatically on first request

Contributors

Thanks to @ProgramComputer, @quopquai, @rahimnathwani and everyone who filed issues and participated in discussions. Particular thanks to @jzohrab, creator of Lute. Discussions with him, and his work on Lute, has been foundational to many of the DB changes. Have a look at his guide to managing database changes.

Full Changelog: 2.10.0...3.0.0

External text reader, cleaner database management, and much more!

01 Apr 17:49

Choose a tag to compare

This release is composed of many small enhancements, but also of many regular bug fixes.

Added

  • Support for Japanese with MeCab on Mac! This was added thanks to quopquai on #135.
  • New globals (#163):
    • On inc/kernel_utility.php: LWT_APP_VERSION and LWT_RELEASE_DATE.
    • On api.php: LWT_API_VERSION and LWT_API_RELEASE_DATE.
    • src/js/jq_pgm.js: LWT_DATA.
    • unloadformcheck.js now declares a new object lwtFormCheck that contains all the functions needed.
  • Important additions to Text-To-Speech (TTS):
    • Word can be read on hover or on click. Pull request #147 by @ProgramComputer.
    • You can add a custom text reader with the new voice API feature! A courtesy of @ProgramComputer on pull request #153. A feature first requested on #143. Discussion in open on #174.
    • New JS functions: readTextWithExternal to read a text with an external application and speechDispatcher that can choose a text reader (browser or third party).
  • Starts a cleaner database management. Database schema is defined in db/schema/baseline.sql and no longer in PHP code.
  • You can choose to add romanization for languages that don't need it in the language settings (#119).
  • Docker images are now built for multiple platforms, see PR #169, closing discussion
    #141. Many thanks to @ProgramComputer!
  • On word review:
    • The "Read words aloud" setting is now saved, PR #185.
    • UX change: You can click on "Read words aloud" text to check the checkbox.

Changed

  • Adds missing documentation in the Docker image:
    • MarkDown files in the root folder are now included. See #160. It adds README.md and UNLICENSE.md.
    • Adds docs/info.html and docs/index.html from #146.
  • Multi-word creation was reviewed to use a simpler JS code.
  • Word review:
    • Status + 1 can be set only after word display. Before, you could press key up at any time to increase term status, but keydown was effective only after solution display (#159).
    • When testing sentences, sentences are always displayed, even when less than 70% of words in the sentence are known. See #194.
  • New files:
    • inc/feeds.php and inc/tags.php, stemmed from inc/session_utility.php. It should not lead to any code or behaviour change.
    • src/js/overlib_interface.js, stemmed from src/js/pgm.js. It contains all the overlib interactions.
    • src/js/src/js/text_events.js, stemmed from src/js/jq_pgm.js. It defines interactions with a text on reading.
  • For audio URI, raises the characters length limit from 200 to 2048
    (#144).
  • Database:
    • For Linux users, the official database RDBMS recommended is now MariaDB as a drop-in replacement of MySQL.
    • Database creation and migration is now handled directly in SQL, for a safer behavior.
    • You do no longer need to give to LWT SYSTEM_VARIABLES_ADMIN for text reparsing. (new function checkExpressions) (#167). It is still necessary for words import.
  • Docker changes:
    • By default, the images now runs at localhot/lwt and no longer in the
      root folder (installer #4
      and #169).
    • Image updated from apache-buster to apache-bullseye.
  • Composer dependencies up to date 2024-03-24.

Fixed

  • The database wizard was broken since 2.9.0.
  • Word status:
    • It was impossible to change a word status on hover since 2.9.1.
    • Having wrong dictionary link and error reporting enabled prevented word status from being changed.
  • Avoids JavaScript error on editing a language when the dictionary field is empty.
  • For some feeds, feed wizard session was not working due to ill-configured session. Solves #129, thanks to the help of PR #168.
  • Text reading position was not working consistently when adding several known words.
  • Multi-words:
    • Tooltip was not properly saved (#170).
    • Translation may be escaped two times (#170).
    • Fixes #170: on creation, multi-word was always displayed before the text it encompasses, without removing this text.
    • Tootltip title was not properly saved, normally without incidence on user display.
    • Fixes #69: having the same multi-word on multiple texts was displaying it at many positions on creation.
  • Japanese:
    • Parsing Japanese texts with MeCab was creating warnings when the text was not finishing by a punctuation mark.
    • Multi-words were not saved with MeCab parsing on Japanese.
    • Japanese was always requiring MeCab for TTS, even if it was not used (#155) and #182.
  • On word review (test):
    • Space keyboard shortcut may have been inoperative.
    • On api.php, tests were always set to "multi-word" due to a missing variable type conversion. Pull request #175.
    • Text-To-Speech was not working (suggested by #187).
    • Testing terms (Terms > Multi Actions > Test ALL Terms) was broken since 2.9.0. #192.
  • An explicit dependency to php-dom was missing in INSTALL.sh (and composer.json), as stated in #178.
  • API: the REST API was not accessible for users running LWT in a root folder.
  • On audio, the replay button is fixed: issue #138 and PR #191.
  • The field SeFirstPos was missing in table sentences of demo database, resulting in failed installation the first time.
  • Editing test annotation would not display since 2.9.1 #193.

Deprecated

  • Using any function from unloadformcheck.js without using lwtFormCheck is deprecated.
  • get_database_prefixes is deprecated, superseded by getDatabasePrefix which is much cleaner.
  • Globals defined in jq_pgm.js are going into a single global LWT_DATA.
  • New text creation workflow simplified in inc/database_connect.php: update_default_values replaced by
    registerSentencesTextItems and check_text by displayTextStatistics.

Full Changelog for 2.10.0-fork

2.9.1

29 Dec 11:44

Choose a tag to compare

This patch is mainly made of bug fixes.

Yet it also features a new JS documentation https://hugofara.github.io/lwt/docs/js/ and an enhanced PHP documentation https://hugofara.github.io/lwt/docs/php/.

Special @ProgramComputer for his insights, pull requests and issues. @HenryWales and @PeterHero were also great to contributor to this release by documenting bugs. Thank you all!

Added

  • New tools for documentation:
    • New JavaScript documentation with JSDoc! You will find it under docs/js/.
    • Better PHP documentation using phpDocumentor. The new documentation is at docs/php/.
  • New constant LWT_LANGUAGES_ARRAY, that replaces $langDefs (in inc/langdefs.php). Part of #163.

Changed

  • PHP files header docblocks are expanded, notably with a PHP version, package and category name.
  • Japanese number are now parsed by MeCab. Big thanks to @ProgramComputer for his pull request #149!
  • Removes dead feeds from the demo database, as signaled in #148.
  • Patch update to the REST API to 0.1.1: requests on GET with empty payload were
    resulting in error.

Fixed

  • Fixes #113: changing a language name was making text-to-speech unusable and may prompt a warning.
  • Since 2.9.0, tests may be unable to run due to a missing key in an AJAX request ("type").
  • Since 2.9.0, audio position was not saved properly.
  • On upload_words.php, "update only empty fields" was broken.
  • Translation were not set by default properly when editing terms translations table.
  • The field MeCab was set for Japanese even when not asked for. Signaled on PR #155], thanks to @ProgramComputer.
  • Since 2.8.1, Japanese word romanization was not displayed any more. Thanks to 아르노 for signalling the bug on Discord!
  • The go slower/faster feature on audio was broken (#138), as functions click_slower
    and click_faster were declared two times in src/js/audio_controller.js.
  • When opening a text, text position was not saved and a text_id is unknown error was triggered.
  • Do not display an error on step 2 of feed wizard at first initialization (#129).
  • It was impossible to install the demo database if they was more or less than one instruction a line.
    This is fixed, and the SQL file was made more readable.
  • Changes WoStatusChange default value to '1970-01-01 01:00:01', it was impossible to install the demo DB out of LWT (related to (#78).
  • Deleting a language deletes the language (#151). Before it was setting the language to empty values.
  • On media select, the lwt folder name was prepended to the media folder,
    resulting in broken path (#161).
  • With the REST API, requests with an empty query were resulting in an error.
  • no-minify composer command was fixed, suggested as a part of PR #154 by
    @ProgramComputer.

Deprecated

  • PHP documentation using Doxygen (under docs/html) is now deprecated and will be removed in 3.0.0.
  • Using $langDefs is deprecated in favor of LWT_LANGUAGES_ARRAY (#163).
  • Calling the global function new_pos to set audio position is deprecated. Please use lwt_audio_controller.setPosition.

Full Changelog

2.9.0: RESTful and fixes

24 Dec 12:29

Choose a tag to compare

After more than half a year since the latest release, LWT 2.9.0 fixes numerous bugs and brings something big: a new REST API! It is now possible to interface LWT with other apps, and the development will feel better than ever!

Added

  • langFromDict and targetLangFromDict are now officially going to the
    kernel utility functions.
  • Text and title boxes change language according to the text's language for
    short text creation/edition, long text creation and text check
    (#111).
  • Refactored texts with OOP:
    • New class: Text (in inc/classes/Text.php).
    • New function: edit_texts_form (in edit_texts.php) that takes a Text object as input.
  • Tests (checking if you know words) now use AJAX (#112), it has several advantages:
    • Musics play fully
    • Page do not need to reload.
    • The timer continues instead of resetting.
  • REST API, the new api.php is intended to continue developing itself
    as a REST API. It features the following interaction:
    • On GET, the endpoints are:
      • /media-files: the list of audio and video files in the media folder.
      • /sentences-with-term: sentences containing a new term.
      • /sentences-with-term/{term-id}: sentences containing a registered term.
      • /similar-terms: terms similar to a given one.
      • /theme-path: the path for a media using theme.
      • /terms
        • /imported: imported terms.
        • /{term-id}/translations: translations for a term.
      • /review
        • /next-word: next word to review.
        • /tomorrow-count: number of reviews for the next day.
      • /phonetic-reading: phonetic reading for a term or sentence.
      • /texts/statistics: word statistics on texts.
      • /version: REST API version.
    • On POST, the endpoints are:
      • /settings: save a setting.
      • /terms followed by:
        • /{term-id} for any term update, in particular:
          • /status, to change the status, followed by either:
            • /down: decrement status of a term by one unit.
            • /up: increment status of a term by one unit.
            • /set/{new-status}: set the status of a term.
          • /translations: add a translation for an existing word.
        • /new: add a translation for a new word.
      • /texts/{text-id} followed by:
        • /annotation: change the text annotation
        • /audio-position: change audio position.
        • /reading-position: change the reading position.
  • Similar terms mark the word edit form as edited only if something was
    actually changed.
  • You can now specify a socket for your database through $socket in
    connect.inc.php. This feature was brought to you by
    @hangug-eo in his PR
    #132.
  • You can now change the voice of the TTT feature through
    text_to_speech_settings.php.
  • server_data.php was reorganized and is more informative with details
    about the REST API.

Changed

  • User Interface Improvements:
    • Prettier UI to navigate between text creation/edition/archive pages.
    • flex-spaced now sets the property of text-align: center;. This property was inherited before.
    • The long text import page looks a bit nicer.
  • User Experience:
    • When reading text, you can click on "Show All" and "Translations" to click the checkbox.
    • When changing a word status, the displayed messaged is now more informative: before database change, success message, now: waiting screen, tentative database change, result message (error or success). Under the hood, we are transitioning from pure PHP to AJAX.
    • It is faster to exit a text page: audio and reading position saves are now asynchronous.
  • Annotations "order" are now identical to Ti2Order (in textitems2). It makes management easier, but users may need to reload the annotations once.
  • Updated composer dependencies (up-to-date 2023-11-23).

Fixed

  • When editing an existing text, surrounding spaces are no longer inserted (#92).
  • Language code is better detected from translator URL when editing an existing language.
  • The field "Short Text Import" on long text import and was not redirecting to
    the intended page. Same goes for "New Text" on "Archived Texts" page.
  • It was impossible to archive more than one text (#118).
  • Testing a word was not changing it's color.
  • A warning was sent 'Undefined array key "query"' when creating a new word (#121).
  • A warning when savings settings in settings.php was sometimes displayed (#121).
  • Test header was different when testing languages or terms since 2.1.0-fork.
  • Wrong link to documentation (info.php instead of docs/info.html). Signaled by Mooncake on Discord.
  • Text reading:
    • The reading button is usable at last! Clicking the button a second time stops the reading process (#108).
    • Text language code was often not recognized in TTT settings (text_to_speech_settings.php).
    • Clicking the "Read" button in TTT Settings was refreshing the page.
  • It was impossible to copy a similar term that had apostrophes (#127).
  • A deprecation warning for trim was sent in simterms when no similar term was found.
  • During a text creation, the media_uri property of Text was used instead of source. Thanks to @hangug-eo for his PR #133!
  • When looking for an audio file on file edit/creation, the displayed path may have been wrong for characters between 0x80 and 0x9F.
  • Multi-words were not properly highlighted for languages separating each
    character as a word (e. g.: Chinese). Big thanks to @hangug-eo for signaling the issue and solving it in his PR #140!
  • The database wizard was not correctly saving the password. This is fixed by
    @hangug-eo in #132.
  • The list of translations of a term was sometimes not found on
    text annotation edition.

Deprecated

  • Legacy AJAX API. The following AJAX interactions are now deprecated in favor to the new REST API (at api.php):
    • inc/ajax_show_similar_terms.php, use /similar-terms on GET, simterms_lgid becomes lg_id and simterms_word term.
    • inc/ajax_add_term_transl.php
      • For a new term, use /terms/new. lang becomes lg_id, text is term_text.
      • To update an existing term, use /terms/{term-id}/translations. Same arguments.
    • inc/ajax_check_regexp.php should no longer be used and will be removed.
    • inc/ajax_chg_term_status.php should be accessed through /terms/{term-id}/status. Argument data is now part of the URL, on post only.
    • inc/ajax_get_phonetic.php should be accessed through /phonetic-reading, same arguments.
    • inc/ajax_get_theme.php should be accessed through /settings/theme-path. Argument filepath is now path.
    • inc/ajax_save_setting.php should be accessed through /settings, k becomes key and v value.
    • inc/ajax_save_text_position.php should be accessed through /texts/{text-id}/reading-position, tposition is now position.
    • inc/ajax_word_counts.php should be accessed through /texts/statistics, on GET. Argument id is now texts_id.
    • inc/ajax_update_media_select.php should be accessed through /media-files.
    • inc/ajax_show_sentences.php should be accessed through /sentences-with-term, on GET. Argument lang is now lg_id, word is word_lc and woid is word_id, ctl is no longer required.
    • inc/ajax_show_imported_terms.php should be accessed through /terms/imported, same arguments.
    • inc/ajax_save_impr_text.php should be accessed through /texts/{text-id}/annotation, id is now optional.
    • inc/ajax_edit_impr_text.php:
      • On display, using word="" is now deprecated as the page loads in pure PHP.
      • On term edition, should be accessed through /terms/{term-id}/translations, id is now text_id and word becomes text_lc.
  • During a word review (test), a "free" test where the user design there own test SQL is now deprecated and will be removed.

Security

  • During tests (word review), test data is no longer be send as raw SQL string, except for "free" test.

Full Changelog

2.8.1: regular bug crushing

14 Apr 05:35

Choose a tag to compare

This release fixes some small issues. In particular, you should see multi-words more often!

Changed

  • Updated some documentation screenshots: home screen, language edition and terms upload.

Fixed

  • Since 2.8.0-fork, PHP installations with ext-dom absent or disabled could not display text.
  • Using the import terms feature, it is better detected if local infile is enabled.
  • Since 2.2.2-fork, many multi-words were not displayed, as explained in #70. Issues may remain.
  • Auto-translation of all words (bulk translate) could not open dictionaries starting with '*'.
  • Since 2.7.0-fork, using a dictionary starting with "ggl.php" was creating a fatal error on opening text.

Full Changelog

2.8.0: UX/UI refreshment

08 Apr 07:51

Choose a tag to compare

This somehow shorter release brings a bunch of small but important fixes, and a much better responsive design (it'll both look nicer on your phone and 4K TV!).

Added

  • Responsive design improved: LWT gets easier to visualize on phone and big screens!

Changed

  • The language settings wizard is now open by default on new language creation.
  • Potential breaking change in the way words are displayed while reading. The target was to make the code more robust.
  • item_parser and echo_term in do_text_text.php now both takes an optional $expr argument.
  • Terms import form changed for a simpler presentation. It becomes easier to use to use on your phone.
  • Many tables are now displayed larger (when your screen has the available space).
  • Updated composer dependencies.

Fixed

  • Removed warnings: dictionaries URL without query do no longer raise warnings.
  • Feeds:
    • Click "New Text" on the first page of do_feeds.php had no effect. Changed to "New Feed".
    • Step 2 of feed wizard was sometimes failing because $_SESSION['wizard']['host'] was a string an not an array.
    • Type error in get_links_from_new_feed was breaking step 2 of feed wizard.
    • Loading feeds could result in malformed SQL, see #100. Thanks @maanh96 for the hint!
  • Docker: media/ was neither accessible nor saved to a container (#106). Thanks to @parradam for signaling and solving the issue!
  • On creating a language, the Glosbe dictionary comes with a "?lwt_popup=1" to open in new window by default.
  • Japanese pronunciation: works even if the language is not exactly called "Japanese", see #103.
  • Expressions containing word feature repaired! #90.
  • On text-to-speech settings, the region was often not displayed.

Full Changelog

2.7.0: the Dust-blower

14 Mar 03:46

Choose a tag to compare

This is a huge release implementing many things I wanted to have in LWT. As for the most important features you get:

  • Auto-translation (using ggl.php)
  • Auto-romanization of Japanese
  • Responsive design
  • And much more...

Added

  • The translation and romanization of new words can now be automatic.
    • Supported automatic translation is achieved using LibreTranslate.
    • Romanization using MeCab (Japanese only) toward katakana only.
  • A lot of improvements for language creation/edition:
    • More intuitive fields, better interactions with the user, etc...
    • A "Pop-Up" checkbox helps you choose if the website should be displayed in a pop-up.
  • LWT becomes easier to install and maintain for users:
    • An installer for Linux users at INSTALL.sh helps installing requirements and configuration.
    • Database creation wizard (database_wizard.php) to help setting the connection with the database.
    • A server data page at server_data.php showing all relevant information.
  • In index.php:
    • get_server_data_table replaces get_server_data as a better designed function.
    • index_do_main_page now renders the page to avoid global variables.
    • You get warnings if the PHP version is too low, or if a newer version of LWT is released.
  • pagestart_kernel_nobody in inc/kernel.php that displays the minimal HTML formatting.
  • inc/classes/ folder for a better incorporation of OOP.
    • inc/classes/Term defines the Term class representing a word or multi-word.
    • inc/classes/Language defines the Language class representing a language.
  • Post-Install Documentation added:
    • MeCab without and with Docker, Thanks to @99MengXin for the link (#94).
    • LibreTranslate integration.
    • TTS issues, as suggested by @asdrubalivan in #85.

Changed

  • Graphic review:
    • Headers reviewed. Most h4 headers became div.bigger, and h3 became h1 level headers.
    • We now use responsive design instead of fixed-size.
    • All themes updated accordingly, so themes were modified.
    • do_text_page (do_text.php) and do_test_page (do_test.php) now enlarge the body.
  • echo_lwt_logo in inc/session_utility.php echoes a logo, without information on the table set used
    because it was useless. This information is now displayed on the welcome page.
  • Access to the database prefix edition at start.php was reviewed and simplified. It is still considered a legacy feature.
  • Language creation reviewed:
    • When creating a new language, the language wizard do no longer display in a pop-up but in the main window.
    • Select option boxes replaced by checkboxes (better accessibility).
  • Updated hoverIntent jQuery Plug-in
    from 1.8.0 to 1.10.2. This brings some bug fixes.
  • "TO DO" changed to a more explicit "Unknown words" in text header.
  • Refactored bulk_translate_word.php. It has a better visual aspect and works better.
  • Updated composer dependencies.
    • vimeo/psalm updated from ^4.12 to ^5.6.
    • phpunit/phpunit updated from ^9.5 to ^10.0.
  • Changed to the text from YouTube feature (text_from_yt.php):
    • Refactored.
    • Moved from root folder to inc/.
    • This is still an experimental feature!
  • Moved Google API files:
    • Moved googleTimeToken.php from root folder to inc/google_time_token.php.
    • Moved googleTranslateClass.php from root folder to inc/classes/GoogleTranslate.php.
  • Updates in demo database:
    • Faster to install. install_demo_db_sql.gz uncompressed to install_demo_db.sql. Functions adapted.
    • Dict links changed: ### replaced by lwt_term, * replaced by lwt_popup=1, some dict url protocol changed to https.

Fixed

  • Markdown: enforced consistency with official style recommendations. The documentation display got improved.
  • The default date for new words was note accepted depending on the SQL configuration, causing issues with Docker installation. See #78.
  • Bulk translate words:
    • Translating with bulk translate was not updating word rendering.
    • All broom icons icon were display in the screen top-right corner, and not
      at the right if text field.
  • Main page (index.php) was not rendered properly on non-default theme.
  • Changing language name was breaking this, this is fixed:
    • Text header was sometimes not available.
    • It was breaking full text-to-speech dispatcher. Issue signaled with issue #80
  • Support for PHP 7.4 restored, wrappers for str_starts_with, str_ends_with, str_contains.
  • The encoding of docs/info.html is finally fixed!
  • ggl.php feature fixed!
  • Multi-words:
    • Sometimes multi-words indicator was cut, resulting in strange display (#89).
    • For Japanese: multi-words indicator was before each character, this is fixed #96.
  • Wrong link to documentation (docs/info.php instead of docs/info.html) on the help button (main page). Signaled by babaeali on Discord.
  • Depending on browser, clicking on deletion button for active texts had no effect.

Deprecated

  • Dictionary and translator URIs changed:
    • They should always be proper URLs.
    • Replacing ### by lwt_term is strongly recommended!
    • "*" At the beginning of an URI should be replaced by lwt_popup=1 as an argument.
    • ggl.php should be replaced by the file full URL, for instance "http://localhost/lwt/ggl.php".

Full Changelog