PHPackages                             simtecsystem/cakephp-i18n - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Validation &amp; Sanitization](/categories/validation)
4. /
5. simtecsystem/cakephp-i18n

ActiveCakephp-plugin[Validation &amp; Sanitization](/categories/validation)

simtecsystem/cakephp-i18n
=========================

A CakePHP plugin for I18n related tools.

2.0.1(5y ago)0108MITPHP

Since Dec 18Pushed 5y agoCompare

[ Source](https://github.com/simtecsystem/cakephp-i18n)[ Packagist](https://packagist.org/packages/simtecsystem/cakephp-i18n)[ Docs](https://github.com/ADmad/cakephp-i18n)[ RSS](/packages/simtecsystem-cakephp-i18n/feed)WikiDiscussions master Synced 6d ago

READMEChangelogDependencies (2)Versions (15)Used By (0)

CakePHP plugin for I18n related tools.
======================================

[](#cakephp-plugin-for-i18n-related-tools)

[![Build Status](https://camo.githubusercontent.com/fba5281153a81566f1ea8148d237466ea328cdc836bbca7b976495fa79a98c29/68747470733a2f2f696d672e736869656c64732e696f2f7472617669732f41446d61642f63616b657068702d6931386e2f6d61737465722e7376673f7374796c653d666c61742d737175617265)](https://travis-ci.org/ADmad/cakephp-i18n)[![Coverage Status](https://camo.githubusercontent.com/a7a3c0ebbe0c6ffbc74d52058e43c4746c5cc76d05d8c0fcb57e7db0ce7d28c4/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636f762f632f6769746875622f41446d61642f63616b657068702d6931386e2e7376673f7374796c653d666c61742d737175617265)](https://codecov.io/github/ADmad/cakephp-i18n)[![Total Downloads](https://camo.githubusercontent.com/49742a757cdd9b8360407dcae9694409589c882c51858f9e7890e83c23412252/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f41446d61642f63616b657068702d6931386e2e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/ADmad/cakephp-i18n)[![License](https://camo.githubusercontent.com/942e017bf0672002dd32a857c95d66f28c5900ab541838c6c664442516309c8a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e7376673f7374796c653d666c61742d737175617265)](LICENSE.txt)

Intro
=====

[](#intro)

This plugins provides:

- Route class for generating and matching urls with language prefix.
- Middleware which sets locale using `I18n::setLocale()`based on language prefix in URL and also provides redirection to appropriate URL with language prefix when accessing site root.
- Class for retrieving translation messages stored in database instead of po/mo files.
- Validation class for auto translating validation message.
- A widget to generate select box with list of timezone identifiers.

Installation
------------

[](#installation)

```
composer require admad/cakephp-i18n

```

Usage
-----

[](#usage)

Load the plugin by running command:

```
bin/cake plugin load ADmad/I18n

```

The plugin contains multiple classes useful for internationalization. You can pick and chose the ones you require.

### I18nRoute

[](#i18nroute)

The `I18nRoutes` helps generating language prefixed routes of style `/:lang/:controller/:action`.

For e.g. you can add routes to your `routes.php` similar to the ones shown below:

```
$routes->scope('/', function ($routes) {
    $routes->connect(
        '/:controller',
        ['action' => 'index'],
        ['routeClass' => 'ADmad/I18n.I18nRoute']
    );
    $routes->connect(
        '/:controller/:action/*',
        [],
        ['routeClass' => 'ADmad/I18n.I18nRoute']
    );
});
```

Fragment `/:lang` will be auto prefixed to the routes which allows matching URLs like `/en/posts`, `/en/posts/add` etc. The `:lang` element is persisted so that when generating URLs if you don't provide the `lang` key in URL array it will be automatically added based on current URL.

When connecting the routes you can use `lang` key in options to provide regular expression to match only languages which your app supports. Or your can set config value `I18n.languages` which the route class will use to auto generate regex for `lang` element matching:

```
Configure::write('I18n.languages', ['en', 'fr', 'de']);
```

Note: `I18nRoute` extends core's `DashedRoute` so the URL fragments will be inflected accordingly.

### I18nMiddleware

[](#i18nmiddleware)

While not necessary, one would generally use the `I18nMiddleware` too when using language prefixed routes with the help of `I18nRoute`.

You can setup the `I18nMiddleware` in your `src/Application::middleware()` as shown:

```
$middlware->add(new \ADmad\I18n\Middleware\I18nMiddleware([
    // If `true` will attempt to get matching languges in "languages" list based
    // on browser locale and redirect to that when going to site root.
    'detectLanguage' => true,
    // Default language for app. If language detection is disabled or no
    // matching language is found redirect to this language
    'defaultLanguage' => 'en',
    // Languages available in app. The keys should match the language prefix used
    // in URLs. Based on the language the locale will be also set.
    'languages' => [
        'en' => ['locale' => 'en_US'],
        'fr' => ['locale' => 'fr_FR']
    ],
]));
```

The keys of `languages` array are the language prefixes you use in your URL.

To ensure that the `lang` router param is available, you must add this middleware *after* adding CakePHP's default routing middleware (i.e. after `->add(new RoutingMiddleware($this))`).

The middleware does basically two things:

1. When accessing site root `/` it redirects the user to a language prefixed URL, for e.g. `/en`. The langauge is redirects to depends on the configuration keys `detectLanguage` and `defaultLanguage` shown above.

    Now in order to prevent CakePHP from complaining about missing route for `/`, you must connect a route for `/` to a controller action. That controller action will never be actually called as the middleware will intercept and redirect the request.

    For e.g. `$routes->connect('/', ['controller' => 'Foo']);`
2. When accesing any URL with language prefix it set's the app's locale based on the prefix. For that it checks the value of `lang` route element in current request's params. This route element would be available if the matched route has been connects using the `I18nRoute`.

    Using the array provided for the `languages` key it sets the `App.language`config to language prefix through `Configure::write()` and the value of `locale`is for `I18n::setLocale()` call.

### DbMessagesLoader

[](#dbmessagesloader)

By default CakePHP using `.po` files to store static string translations. If for whatever reason you don't want to use `.po` files you can use the `DbMessagesLoader`class to store the translation messaged in database instead. Personally I belive having the messages in a table instead of `.po` files make it much easier to make a web interface for managing translations.

To use this class first create database table using sql file provided in the plugin's `config` folder.

Add code similar to what's shown below in your app's `config/bootstrap.php`:

```
// NOTE: This is should be done below Cache config setup.

// Configure I18n to use DbMessagesLoader for default domain. You need to do
// this for each domain separately.
I18n::config('default', function ($domain, $locale) {
    $loader = new \ADmad\I18n\I18n\DbMessagesLoader(
        $domain,
        $locale
    );

    return $loader();
});
```

You can use `admad/i18n extract` command to extract the translation message from your code files and populate the translations table. Updating the db records with translations for each language is upto you.

```
bin/cake admad/i18n extract

```

Now you can use the translation funtions like `__()` etc. as you normally would. The `I18n` class will fetch the required translations from the database instead of `.po` files.

### TimezoneWidget

[](#timezonewidget)

In your `AppView::initialize()` configure the `FormHelper` to use `TimezoneWidget`.

```
// src/View/AppView.php
public function initialize(): void
{
    $this->loadHelper('Form', [
        'widgets' => [
            'timezone' => ['ADmad/I18n.Timezone']
        ]
    ]);
}
```

You can generate a select box with timezone identifiers like:

```
// Generates select box with list of all timezone identifiers grouped by regions.
$this->Form->control('fieldname', ['type' => 'timezone']);

// Generates select box with list of timezone identifiers for specified regions.
$this->Form->control('fieldname', [
    'type' => 'timezone',
    'options' => [
        'Asia' => DateTimeZone::ASIA,
        'Europe' => DateTimeZone::EUROPE
    ]
]);
```

As shown in example above note that unlike normal select box, `options` is now an associative array of valid timezone regions where the key will be used as `optgroup` in the select box.

###  Health Score

31

—

LowBetter than 68% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity9

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity71

Established project with proven stability

 Bus Factor1

Top contributor holds 98% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~106 days

Recently: every ~20 days

Total

14

Last Release

2054d ago

Major Versions

1.2.1 → 2.0.0-beta2019-12-17

### Community

Maintainers

![](https://www.gravatar.com/avatar/0fa21215cfd3df464f376b331dd62e00a635bd7ed46e3567437ee480b676df61?d=identicon)[simtecsystem](/maintainers/simtecsystem)

---

Top Contributors

[![ADmad](https://avatars.githubusercontent.com/u/142658?v=4)](https://github.com/ADmad "ADmad (194 commits)")[![JD-Robbs](https://avatars.githubusercontent.com/u/5319760?v=4)](https://github.com/JD-Robbs "JD-Robbs (1 commits)")[![joshwyrick](https://avatars.githubusercontent.com/u/12661899?v=4)](https://github.com/joshwyrick "joshwyrick (1 commits)")[![romainbu](https://avatars.githubusercontent.com/u/12477600?v=4)](https://github.com/romainbu "romainbu (1 commits)")[![simonduisburg](https://avatars.githubusercontent.com/u/46719156?v=4)](https://github.com/simonduisburg "simonduisburg (1 commits)")

---

Tags

validationi18ncakephproutingmessages

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/simtecsystem-cakephp-i18n/health.svg)

```
[![Health](https://phpackages.com/badges/simtecsystem-cakephp-i18n/health.svg)](https://phpackages.com/packages/simtecsystem-cakephp-i18n)
```

###  Alternatives

[admad/cakephp-i18n

A CakePHP plugin for I18n related tools.

4449.5k](/packages/admad-cakephp-i18n)[apy/jsfv-bundle

Symfony2 Javascript Form Validation Bundle with localisation support

92770.5k](/packages/apy-jsfv-bundle)[laravel-lang/attributes

Translation of form element names

273.8M11](/packages/laravel-lang-attributes)[ichikaway/cakeplus

Cake plus is cakephp plugin and provides some functions for CakePHP.

52101.1k1](/packages/ichikaway-cakeplus)[chrisshick/cakephp3-html-purifier

This is a CakePHP3 Purifier Plugin Behavior that cleanses data before it is marshalled into the entity.

12168.1k](/packages/chrisshick-cakephp3-html-purifier)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
