PHP2Shell: Is Your Joomla Site Safe? What to Do Today Introducing Next Boards: Kanban project and task boards for Joomla Next Exams 6.2.0: Exam Studio, six visual question types, exam embeds and six new languages Building the Future of Joomla Extensions
NextSoftware
Featured Tutorials

Joomla Language Overrides: Change Any Text Without Touching Core Files (and How WordPress Compares)

· · 12 min read
Joomla Language Overrides: Change Any Text Without Touching Core Files (and How WordPress Compares)

Sooner or later every site owner wants to change a piece of text they didn't write: a "Read more" button, a login label, a form message from an extension. In Joomla you do that from the administrator with Language Overrides, a core feature that needs no plugin and survives every update. This tutorial walks through it on Joomla 6.2, then compares it with the ways WordPress 7.1 handles the same job.

What a language override is

Joomla never prints interface text directly. Every label, button and message is a language constant that points to a value in an INI file. For example, the button under a blog article's intro text comes from this line in language/en-GB/joomla.ini:

JGLOBAL_READ_MORE_TITLE="Read more: %s"

An override is a second line with the same constant and your own value. Joomla stores it in a separate file and reads it after the original, so your version wins:

; language/overrides/en-GB.override.ini
JGLOBAL_READ_MORE_TITLE="Continue reading: %s"

Three things follow from that design:

  • Updates don't touch it. Joomla and extension updates replace the files in language/en-GB/, but they leave language/overrides/ alone.
  • It works for extensions too. Any component, module, plugin or template that uses Joomla's language system can be overridden the same way, without editing its files.
  • Front end and administrator are separate. Site overrides live in language/overrides/, administrator overrides in administrator/language/overrides/, one file per installed language.

You never have to edit these files by hand. The admin screen writes them for you.

When you need a language override

Any text that comes from Joomla or an extension, rather than from content you typed yourself, can be changed with an override. These are the situations where people reach for it most:

  • Your site has its own vocabulary. A school has "students", a club has "members", a shop has "customers". Joomla's generic "Username" or "Create an account" can say what your visitors actually call things.
  • Brand voice. "Read more …" and "Thank you for your email." are fine but bland. Overrides let buttons and messages sound like the rest of your site.
  • A translation is wrong or awkward. Language packs are written by volunteers, and sometimes a string is too literal, too formal, or just a mistake. Fix that one string for your language without forking the pack or waiting for the next release.
  • Regional spelling and wording. Joomla's default English is British. If your audience is American, an override turns "Use Dark colour scheme" in the user profile into "color".
  • An extension's wording doesn't fit your use. A booking extension says "Add to cart" when you want "Book now". A form extension's success message doesn't mention your reply time. You don't need to wait for the developer or edit their files.
  • Clearer messages and instructions. Login errors, form validation messages and empty-state text are written for every site at once. You can make them specific to yours, which cuts down on support emails.
  • Simpler wording for clients in the administrator. Agencies often rename confusing back-end labels so the people editing the site understand them, with no effect on the front end.
  • One language on a multilingual site. Change the French wording without touching the English or German, because each language has its own override file.

It's the wrong tool in a few cases:

  • Text you wrote yourself. Article text, menu item titles, module titles and custom fields are content. Edit them where you created them.
  • Layout or HTML changes. Moving a button, adding an icon or removing an element is a job for a template override.
  • Hard-coded text. If an extension prints text directly instead of using a language constant, there's nothing for an override to replace. The Debug Language check below shows you which case you're in.

Step by step: your first override

We'll change the blog's "Read more: …" button to "Continue reading: …". The screenshots are from a clean Joomla 6.2 install with the Blog sample data and the default Cassiopeia template. If you're still on 6.1, the screens are the same. Our Joomla 6.2 "Mwezi" overview covers what else changed in that release.

1. Open Language Overrides

Go to System and find Language Overrides in the Manage panel.

Joomla 6 System dashboard, Manage panel, with the Language Overrides link highlighted between Content Languages and Plugins
System → Manage → Language Overrides.

2. Choose the language and location

The dropdown at the top lists every installed language twice, once for Site (the front end) and once for Administrator. The "Read more" button is on the front end, so pick English (United Kingdom) - Site. A new install has no overrides yet, so the list is empty.

Joomla Languages: Overrides screen with English (United Kingdom) - Site selected and the message No Matching Results
The Overrides list, filtered to the English front end.

3. Search for the text you want to change

Click New. The right-hand panel searches every language string Joomla knows about. Leave Search For on Value, type the text as you see it on the page (Read more:) and press Search.

You'll often get more than one result. Here there are three: COM_CONTENT_READ_MORE_TITLE, JGLOBAL_READ_MORE_TITLE and MOD_ARTICLES_CATEGORY_READ_MORE. They hold the same words but are used in different places. The blog layout in Joomla 6 uses JGLOBAL_READ_MORE_TITLE. If you aren't sure which one a page uses, the Debug Language trick further down tells you.

4. Pick the constant and write your text

Click the result you want. Joomla copies the constant into Language Constant and the current value into Text. Change the text to Continue reading: %s and keep the %s: that's where Joomla inserts the article title. Then click Save & Close.

Joomla Edit Override form with Language Constant JGLOBAL_READ_MORE_TITLE and Text Continue reading: %s, next to search results for Read more: listing three matching constants
Search on the right, override on the left. The For Both Locations box saves the same override for Site and Administrator in one go.

The new override appears in the list, where you can edit or delete it later.

Joomla Overrides list after saving, showing JGLOBAL_READ_MORE_TITLE with the text Continue reading: %s for en-GB Site
Saved. Joomla wrote the line to language/overrides/en-GB.override.ini.

5. Check the front end

Reload the home page. Every button that uses that constant has changed, including the ones in modules.

Cassiopeia blog module before and after the override: buttons read Read more: Joomla, Love, Millions before and Continue reading: Joomla, Love, Millions after
Same page, one override, no files edited.

Three overrides worth making on most sites

  • Read more buttons. JGLOBAL_READ_MORE_TITLE (with the title) and JGLOBAL_READ_MORE (without it). Wording like "Continue reading" or "Full story" fits your voice better. Joomla also uses JGLOBAL_READ_MORE_TITLE for the button's aria-label, so screen-reader users hear your wording too.
  • Login module labels. MOD_LOGIN_VALUE_USERNAME ("Username") and MOD_LOGIN_REGISTER ("Create an account"). If your members know their login as a "member number" or "customer ID", say so on the form.
  • Contact form confirmation. COM_CONTACT_EMAIL_THANKS ("Thank you for your email.") is a good place to tell people when to expect a reply.

The same approach works for extension strings. If a component's button label or email subject doesn't fit your site, search for the text, override it, done. When you choose extensions, it's worth checking that they ship proper language files. An extension that hard-codes its text can't be changed this way. If you're shopping for one, our Joomla extensions catalogue is a good place to start.

Finding the constant when search isn't enough

Searching by value works until the same words appear in a dozen constants, or the text on the page has been shortened or styled. Joomla has a built-in way to see which constant produced each string: Debug Language.

  1. Open System → Global Configuration → System.
  2. Set Debug Language to Yes and Language Display to Constant, then save.
  3. Reload the page you want to change.
Joomla Global Configuration Debug section with Debug Language set to Yes and Language Display set to Constant
Global Configuration → System → Debug.

Every translated string is now shown as its constant, wrapped in **. A string wrapped in ?? has no translation loaded. Text with no markers at all is hard-coded, which means an override can't reach it and you'll need a template override instead.

Blog module with Debug Language on: each button shows **JGLOBAL_READ_MORE_TITLE** instead of its text
With Debug Language on, the button shows the exact constant to override.

Turn Debug Language off again when you're done. Visitors see the markers too.

How WordPress handles the same job

WordPress has no screen for this in core. Its text also runs through translation functions (__(), _e() and friends) with a text domain such as default for core or woocommerce for that plugin, but changing the English text means picking one of the following.

Option 1: a gettext filter in code

The developer route is a filter in your child theme's functions.php or in a small custom plugin. Since WordPress 5.5 you can target one text domain with gettext_{$domain}, which is lighter than the catch-all gettext filter:

add_filter( 'gettext_default', function ( $translation, $text ) {
    if ( 'Lost your password?' === $text ) {
        return 'Forgot your password?';
    }
    return $translation;
}, 10, 2 );

It works, and it can do things Joomla overrides can't, such as changing a string only on one post type. The downsides: you need to know the exact original string and its text domain, plural strings (_n()) and strings with context (_x()) need their own filters, and the WordPress reference itself warns that gettext callbacks run for every translated string on the page. If you put the snippet in a parent theme's functions.php, the next theme update deletes it.

Option 2: edit the translation files

You can create your own .po/.mo files, but files in wp-content/languages/ are replaced whenever WordPress installs a language-pack update. Since WordPress 6.5, language packs also ship a .l10n.php file, and WordPress loads that instead of the .mo when both exist. So an edited .mo can be silently ignored even before the next update overwrites it.

Option 3: Loco Translate

Loco Translate (over a million active installs) adds a translation editor to the dashboard. It scans source files for strings and lets you save your edits in a protected languages/loco/ folder that updates don't overwrite. That folder is the important part: pick the System location shown below and the next language update erases your work.

Loco Translate New language screen in WordPress 7.1 with English (United States) selected and a choice between the Custom location languages/loco/en_US.po and the System location languages/en_US.po
Loco Translate asks where to store the file. Only Custom is safe from updates.

It's a capable tool, but it's a full translation editor built for translating sites into other languages. Changing one English label means creating an English "translation" of the whole text domain, and on a fresh English install Loco first warns that there's no template file and suggests you create one.

Option 4: Say What?

Say What? is the closest thing to Joomla's screen: a list of replacements under Tools → Text changes. You enter the original string, its text domain and the replacement, and it's stored in the database, safe from updates.

Say What? Text changes form in WordPress with Original string Lost your password?, Text domain default and Replacement string Forgot your password?
Say What? on WordPress 7.1. You must already know the exact string and its text domain.

What it doesn't do in the free version is help you find the string. There's no search across installed strings. You type the original exactly, or you look it up in the source code. String discovery is part of the paid Pro version.

Side by side

Joomla 6 Language OverridesWordPress 7.1
In coreYes, System → Language OverridesNo. Code snippet or plugin
Find the string from the adminSearch all strings by text or constantLoco scans files; Say What? free needs the exact string
See which string is on the pageDebug Language shows constants in placeNo core equivalent
Survives core and extension updatesYes, separate override filesOnly if stored in the right place (child theme, languages/loco/, plugin database)
Front end and admin separatelyYes, Site and Administrator are separateOnly by text domain, or with conditions in code
Per language on multilingual sitesYes, one override file per installed languagePer locale with Loco; in code you add the checks yourself
Conditional changes (one page, one post type)No, overrides apply site-wide per languageYes, with a gettext filter
Skills neededAdmin accessPHP, or a plugin and its settings

Why Joomla's approach holds up better

WordPress can change almost any string. The difference is who can do it, how they find the string, and whether the change is still there next month.

  • It's part of the product. Every Joomla site has the same screen in the same place. There's no plugin to choose, update, or replace when it's abandoned, and no snippet that only the developer who wrote it understands.
  • You can find the string without reading code. Search by visible text, or turn on Debug Language and read the constant off the page. On WordPress, finding the original string and text domain is often the hardest part.
  • Updates are a non-event. Overrides sit in their own files that Joomla's updater doesn't touch. On WordPress, whether a change survives depends on where you put it, and the wrong choice fails silently.
  • It respects the structure of the site. Front end and administrator, and each installed language, have their own overrides, which matters for agencies running multilingual client sites.

Where WordPress is ahead is conditional logic. A developer can change a string only on the checkout page, and Joomla overrides can't do that. For the everyday job of making a site say what its owner wants it to say, Joomla's built-in tool is faster and safer, and you can hand it to a non-developer.

Troubleshooting: the override doesn't show

  • Wrong location. A Site override doesn't affect the administrator, and the other way round. Check the dropdown, or tick For Both Locations.
  • Wrong language. On a multilingual site, add the override to each language that needs it.
  • Wrong constant. If search returned several constants with the same text, you may have overridden one the page doesn't use. Confirm with Debug Language.
  • Cached pages. If page caching is on, clear it under System → Clear Cache, along with any CDN or server cache.
  • A new extension's strings don't appear in search. The search uses its own index. Click Clear Cache in the Overrides toolbar to rebuild it.
  • Placeholders went missing. If the original contains %s or %d, keep them in your text. Joomla fills them with titles, names or numbers.
  • The text is hard-coded. If Debug Language shows no markers around it, the template or extension prints it directly. Use a template override, or ask the developer to move the text into a language file.

All Extensions