# Install&Update wordpress languages with composer

**URL:** https://discourse.roots.io/t/install-update-wordpress-languages-with-composer/2021
**Category:** bedrock
**Tags:** localization, composer
**Created:** 2014-07-29T11:21:29Z
**Posts:** 48

## Post 1 by @Koodimonni — 2014-07-29T11:21:29Z

#Wordpress translations as composer packages

**Breaking changes in 2016**  
If you were using: [http://languages.koodimonni.fi](http://languages.koodimonni.fi) please change to [https://wp-languages.github.io](https://wp-languages.github.io) instead.

* * *

I fell so much in love with using composer on wordpress that I just hated how there was no good solution to install languages with composer.

Well until I made this custom repository: [https://wp-languages.github.io](https://wp-languages.github.io)

It uses my [composer dropin installer](https://packagist.org/packages/koodimonni/composer-dropin-installer) which solves the problems with composer overwriting everything in the same folder.

So now you can extract multiple packages into same folder: `web/app/languages`

Site is hosted in github pages and uses translation zip-archives from [api.wordpress.org](http://api.wordpress.org). So big thanks for them.

##How to use

There’s 4 types of packages. These examples are for French ( **fr\_FR** ):

**koodimonni-language/fr\_FR** =\> All latest language files for French. This includes wordpress-importer,akismet, woocommerce and all twenty-themes (if available for that language). So use this shortcut to automatically include all packages mentioned below.

If you want to be picky you can choose which packages to include by using these examples:

**koodimonni-language/core-fr\_FR** =\> Just core language packages  
**koodimonni-plugin-language/akismet-fr\_FR** =\> akismet plugin translations  
**koodimonni-theme-language/twentyfifteen-fr\_FR** =\> twentyfifteen translations

You can search packages for your language from [https://wp-languages.github.io](https://wp-languages.github.io)-frontpage.

Just remember add this into `composer.json`:

```
"extra": {
      "dropin-paths": {
        "web/app/languages/": ["vendor:koodimonni-language"],
        "web/app/languages/plugins/": ["vendor:koodimonni-plugin-language"],
        "web/app/languages/themes/": ["vendor:koodimonni-theme-language"]
      }
    }
```

* * *

You can find complete working `composer.json` example over here: [composer.json for latest Wordpress using johnpbloch/wordpress and languages.koodimonni.fi. This file has also an example of how to handle wordpress dropin-files (e.g. object-cache.php, sunrise.php, ...) using composer.json · GitHub](https://gist.github.com/onnimonni/154cd5988cb93f2490c5)

Notices:

- Composer isn’t case sensitive so it doesn’t care if you require `koodimoni-language/fr_FR` or `koodimonni-language/fr_fr`. The files inside packages will still use correct naming (eg. fr\_FR.po).
- [composer dropin installer](https://packagist.org/packages/koodimonni/composer-dropin-installer) understands install/update operations but can’t handle composer delete operations (yet).
- Packages are updated into gh-pages every 30-minutes.

Source and issue tracking available in [Github](https://github.com/Koodimonni/koodimonni.github.io).

Big thanks for @haroldangenent for good feedback.

I hope you find it useful!

---

## Post 2 by @swalkinshaw — 2014-07-29T12:41:21Z

This looks great, thanks! I’ll test it out soon and might integrate it into Bedrock by default.

---

## Post 3 by @Koodimonni — 2014-07-29T12:49:09Z

I would be really honoured! If you find some bugs or errors just tell me about it in this conversation or by email so I can get them fixed.

---

## Post 4 by @ttss — 2014-07-31T16:20:59Z

Great work @Koodimonni! just one question: I can find `koodimonni-language/it` but what about e.g. `koodimonni-language/de`?

And furthermore which is correct: `"wordpress-languages-dir": "web/wp/wp-content/languages"` or `"wordpress-languages-dir": "web/app/languages"`, I presume the first one, anyway in booth cases the language folder doesn’t exist. Thanks.

---

## Post 5 by @Koodimonni — 2014-07-31T22:40:06Z

For default Bedrock this is The right way:

```
"wordpress-languages-dir":"web/app/languages"
```

I think bedrock only looks languages from there by default.

Just make sure languages dir exists before installing languages. I made it so because I sometimes mistyped the path and installed languages to totally wrong place. I will correct the output of script to make this more clear.

I will check out where /de is hiding.

---

## Post 6 by @ttss — 2014-08-01T12:19:51Z

Perfect, thanks. Just checked de, still missing.

![](https://discourse.roots.io/uploads/default/81/3627430cf75faede.png)

---

## Post 7 by @Koodimonni — 2014-08-01T17:07:29Z

Hey @ttss! I had some problems with the script not initiating all languages correctly. Now it’s working, Thanks for pointing that out.

Here is complete list of languages:

```
$language_names = array(
  'af' => 'Afrikaans',
  'ar' => 'عربي',
  'am' => 'አማርኛ',
  'as' => ' অসমীয়া ',
  'az' => 'آذربایجان دیلی',
  'be' => 'Беларускі',
  'bg' => 'Български',
  'bn' => 'বাংলা',
  'bs' => 'Bosanski',
  'by' => 'Беларускі',
  'byn' => 'ብሊና',
  'ca' => 'Сatalà',
  'ckb' => 'Kurdi',
  'cs' => 'Čeština',
  'da' => 'Dansk',
  'de' => 'Deutsch',
  'dv' => 'ދިވެހި',
  'dz' => 'རྫོང་ཁ་',
  'el' => 'Ελληνικά',
  'eo' => 'Esperanto',
  'es' => 'Español',
  'et' => 'Eesti',
  'eu' => 'Euskara',
  'fa' => '"فارسی"',
  'fi' => 'Suomi',
  'fo' => 'Føroyskt',
  'fr' => 'Français',
  'fy' => 'Frysk',
  'ga' => 'Gaeilge',
  'gl' => 'Galego',
  'haw' => 'ʻŌlelo Hawaiʻi',
  'he' => 'עברית',
  'hi' => 'हिन्दी',
  'hr' => 'Hrvatski',
  'hu' => 'Magyar',
  'id' => 'Bahasa',
  'in' => 'Bahasa',
  'is' => 'Íslenska',
  'it' => 'Italiano',
  'iu' => 'ᐃᓄᒃᑎᑐᑦ',
  'ja' => "日本語",
  'ka' => "ქართული",
  'kk' => 'Қазақша',
  'kl' => 'Kalaallisut',
  'km' => 'ភាសាខ្មែរ',
  'ko' => '한국어',
  'ky' => 'Кыргызча',
  'lb' => 'Lëtzebuergesch',
  'lo' => 'ປະເທດລາວ',
  'lt' => 'Lietuvių',
  'lv' => 'Latviešu',
  'mk' => 'Македонски',
  'mn' => 'ᠮᠣᠨᠭᠭᠣᠯ',
  'mt' => 'Malti',
  'my' => 'myanma bhasa',
  'nb' => '‪Norsk Bokmål‬',
  'nl' => 'Nederlands',
  'nn' => 'Norsk',
  'pl' => 'Polski',
  'pt' => 'Português',
  'ro' => 'Română',
  'ru' => 'Русский',
  'sk' => 'Slovenčina',
  'sl' => 'Slovenščina',
  'sq' => 'gjuha shqipe',
  'sr' => 'Српски',
  'sv' => 'Svenska',
  'th' => 'ไทย/ประเทศไทย',
  'tl' => 'Tagalog',
  'tr' => 'Türkçe',
  'ug' => '中文',
  'uk' => 'Українська',
  'ur' => 'پاکستان‎',
  'vi' => 'Tiếng Việt',
  'xh' => 'isiXhosa',
  'zh' => '中文',
  'zu' => 'isiZulu',
  'all' => 'All of the above languages',
  'nordic' => 'Finnish, Swedish, Estonian, Russian, Norwegian'
);
```

I will add more when asked. This is just a list that plugin wp-native-dashboard uses.

---

## Post 8 by @ttss — 2014-08-03T13:00:03Z

Thanks @Koodimonni works fine, languages seem to be in the right folder. Another question: Does this addon install languages only locally or also on remote server during cap deploy? Thanks.

---

## Post 9 by @Koodimonni — 2014-08-03T13:38:50Z

I haven’t tested with capistrano but if the `installLanguages()` function is in use it shouldn’t matter where you use this. So if you can install languages locally they will be installed correctly in remote server as well. Remote server just needs to have rsync installed (I think it’s almost always preinstalled). Just remember to run `composer install` or `composer update` with capistrano.

---

## Post 10 by @vdrnn — 2014-11-17T22:25:39Z

hey @Koodimonni I implemented your way of installing languages. I now wonder how I add the language files for different plugins I’m using. For example woocommerce? Any way to do that with your method?

---

## Post 11 by @Koodimonni — 2014-11-21T10:07:33Z

Hello @vdrnn!

Nice to see that this has been useful to you.

I haven’t really given any thought for that. I’m still using these Wordpress core language packages but my workflow is a mixture of wp-cli and composer. So this hasn’t been a problem for me.

I saw that woocommerce languages are located here: [https://github.com/woothemes/woocommerce-language-packs](https://github.com/woothemes/woocommerce-language-packs)

If you want to contribute you can make a repository on github/bitbucket that has:

- woocommerce Language files separated in `plugins/` folder
- composer.json explaining what that repo is

For example see the french language pack of mine: [https://bitbucket.org/koodimonni-languages/fr/src](https://bitbucket.org/koodimonni-languages/fr/src)

I’m happy to include contributions with that format in [languages.koodimonni.fi](http://languages.koodimonni.fi) and then you could install all woocommerce languages with koodimonni-language/woocommerce (or the name you chose to have). You just need have a cron script that keeps the repo up to date.

I can do all of that for you if you want to hire me. Just PM me here.

---

## Post 12 by @haroldangenent — 2014-12-16T15:00:00Z

@Koodimonni: This is pretty awesome. Seems like the only viable option for language packs in Composer right now. I’m thinking about using this for our version of Bedrock.

Could you tell me something about the stability of this Composer repository? Are you committed to keeping this online?

I was also wondering about semantic versioning - right now there’s only a way to download `dev-master`, right?

---

## Post 13 by @haroldangenent — 2014-12-17T13:52:01Z

By the way, just noticed: the language slugs seems off. For example, WordPress uses `nl_NL` for the Dutch language, while your repository uses `nl`. Almost all plugins that have translations rely on this `nl_NL`.

Could you clarify on how to correct this?

---

## Post 14 by @Koodimonni — 2014-12-18T13:40:31Z

Hey @haroldangenent and @vdrnn

**TL;DR** So from now on requiring: `koodimonni-language/nl_NL` should work and will install woocommerce translations as well.

Thanks for your feedback. I did some additions and now newest woocommerce languagepacks from [woothemes github](https://github.com/woothemes/woocommerce-language-packs/tree/master/packages) are automatically included to basic language packs when they exists.

I corrected the shortcodes and updated language list from: [http://wpcentral.io/internationalization/](http://wpcentral.io/internationalization/)

Now all of the shortcodes should be corrected. My server is still downloading translation files. but in couple of hours you should be able to use updated versions.

---

## Post 15 by @Koodimonni — 2014-12-23T13:22:21Z

Hey @ttss and @vdrnn!

I updated the method to be easier to use, added semantic version and original translation zip-archives straight from [wordpress.org](http://wordpress.org). Please update to new method mentioned above, sorry if this caused some inconvenience, but I had to change the method since [translate.wordpress.org](http://translate.wordpress.org) api started to misbehave.

---

## Post 16 by @haroldangenent — 2015-01-07T10:36:34Z

Anyone who uses Composer should use this for languages. Thanks, @Koodimonni!

---

## Post 17 by @jibazee — 2015-03-18T21:37:22Z

Thanks Koodimonni. My workflow is bedrock altered with grunt-wordpress-deploy and it works like a charm.

---

## Post 18 by @metaarts — 2015-05-12T14:03:18Z

I wonder if the added language files should be ignored by git. What do you say? @Koodimonni

---

## Post 19 by @Koodimonni — 2015-05-12T14:22:02Z

I’m ignoring them in git myself but I guess it is just my preference. The standard way seems to be to ignore all packages handled by composer

---

## Post 20 by @metaarts — 2015-05-12T14:28:45Z

> [@Koodimonni](#):
>
> I’m ignoring them in git myself but I guess it is just my preference. The standard way seems to be to ignore all packages handled by composer

It would be not bad to have such a function. Is there such a thing already?

---

## Post 21 by @Koodimonni — 2015-05-12T14:43:41Z

I’m not sure if I understood correctly but you can ignore things in your repo using .gitignore file (Google: .gitignore)

Here’s an example from bedrock: [https://github.com/roots/bedrock/blob/master/.gitignore](https://github.com/roots/bedrock/blob/master/.gitignore)

---

## Post 22 by @metaarts — 2015-05-12T14:49:08Z

Sorry, I have expressed myself wrong. I mean a function that extends the .gitignore automatically based on the installed composer packages.

---

## Post 23 by @Koodimonni — 2015-05-12T15:34:16Z

Ah, yes!  
I usually ignore all and then add exceptions to files which to add. I don’t know anything which does this automatically though, this would nice feature.

Maybe you could start a hobby project which does all this :smile:

---

## Post 24 by @metaarts — 2015-05-25T13:27:10Z

> [@Koodimonni](#):
>
> Maybe you could start a hobby project which does all this

That would be interesting. Maybe later this year :wink:

Now I have a problem with the composer on a remote server. It loads any language files in the specified folder. The language folders are available or in the repository. On my local VM everything works.

Does anyone have an idea?

---

## Post 25 by @dgbrt — 2015-07-23T19:25:19Z

This is stunning, very helpful.

Does anybody know how to use this to make the admin in a different language? I’ve tried adding `define('WPLANG', 'fr_FR');` in environments / development.php but with zero success, everything stays in english.

---

## Post 26 by @Koodimonni — 2015-08-06T09:05:44Z

Hey!

Did you find answer to your problem?

I usually just use [WP Native Dashboard](https://wordpress.org/plugins/wp-native-dashboard/) in all instances. This allows your enduser to choose which language they want to use in dashboard. Then you don’t have to worry about forcing admin to any specific language.

---

## Post 27 by @dgbrt — 2015-09-13T14:39:30Z

Awesome thank you, will use that next time! (I just let it be in english for this one)

---

## Post 28 by @o1y — 2015-10-27T11:51:12Z

Sadly this won’t work with the default trellis configuration. By default composer runs with the  
`--no-scripts` flag which disables any composer [scripts](https://getcomposer.org/doc/articles/scripts.md) used by koodimoonni.

---

## Post 29 by @swalkinshaw — 2015-10-28T02:17:59Z

Thanks for pointing that out. It’s pretty easy to override that default hook file but it might be worth looking into to remove that specific option.

---

## Post 30 by @Koodimonni — 2015-10-28T08:30:51Z

I think that --no-scripts is good for security especially for noobs. @swalkinshaw do you know if composer has option to allow specific script to run or specific package but deny all others? Like a whitelisting feature.

This might be pointless but anyone Is able to put harmless code in their composer packages and I guess that most users never look the code which is run in the implicit scripts like these language packages.

---

## Post 31 by @swalkinshaw — 2015-10-28T11:57:51Z

Don’t think that’s possible but you can always use `composer run-script` to manually trigger them.

---

## Post 32 by @o1y — 2016-02-25T12:03:25Z

This is my current workaround for a trellis-bedrock project to get the great composer language dropin up and running. If anyone has a better approach, please share :slightly_smiling:

1. Remove `--no-scripts` flag from `trellis/roles/deploy/hooks/build-after.yml`. This enables composer to move the language files to the configured language directory. Note: imho we currently cannot use `run-script`, because the dropin installer doesn’t support triggering scripts (yet).
2. Add `web/app/languages/*` to `site/.gitignore` (or wherever your bedrock project is located)
3. The language folder has to be a shared folder on the server. Open `trellis/roles/deploy/defaults/main.yml` and add the following path to `project_shared_children`

```
project_shared_children:
[...]
  - path: web/app/languages
    src: languages
```

---

## Post 33 by @swalkinshaw — 2016-02-25T16:00:41Z

@o1y thanks for sharing this!

Two improvements/tips which both have to do with trying to avoid modifying “core” Trellis files:

1. You could make a copy of `roles/deploy/hooks/build-after.yml` and make your customizations there. Then define the new hook file as see [here](https://roots.io/trellis/docs/deploys/#hooks).
2. Override `project_shared_children` in your own `group_vars` folder. Maybe `group_vars/all/main.yml`

This will make it easier to keep Trellis up to date (if that’s a concern of yours).

---

## Post 34 by @Koodimonni — 2016-03-02T17:41:24Z

**BREAKING CHANGES**  
This repository is now located in: [https://wp-languages.github.io](https://wp-languages.github.io)

I needed to change the address because composer changed and needs all repositories as https. I redirected [https://languages.koodimonni.fi](https://languages.koodimonni.fi) to the new repository as well, but please use [https://wp-languages.github.io](https://wp-languages.github.io) instead than my server.

---

## Post 35 by @Koodimonni — 2016-03-03T11:51:27Z

This repository only contains translations for core and few selected plugins (mainly core plugins + woocommerce, bbpress). I added details in [wp-languages.github.io repo](https://github.com/wp-languages/wp-languages.github.io#manually-adding-any-language-zip-to-your-composerjson) if you want to manually add any translation zip into your project.

If you can run wp-cli in your deploy please consider using [it’s language features](http://wp-cli.org/commands/core/language/):

```
$ wp core language install fi
Success: Language installed.

# Updates (or installs) all languages for core, plugins and themes.
# When I runned this I had jetpack installed but without any translations.

$ wp core language update
Updating 'Finnish' translation for Jetpack by WordPress.com 3.9.2...
Downloading translation from https://downloads.wordpress.org/translation/plugin/jetpack/3.9.2/fi.zip...
Translation updated successfully.
Success: Updated 1/1 translations.
```

It will contain every plugin translation package always. [https://wp-languages.github.io](https://wp-languages.github.io) can’t contain all translation data in it’s current form, but if you only need core translations it is a really handy tool.

---

## Post 36 by @scherii — 2016-04-13T08:15:35Z

@Koodimonni, thank you for your work! :slight_smile:

If anyone wants to integrate the WP-CLI way into their deployments, I posted my workflow here:

> [@Install & update WordPress languages with WP-CLI](https://discourse.roots.io/t/install-update-wordpress-languages-with-wp-cli/6454):
>
> My workflow now consists of the following lines in deploy-hooks/build-after.yml (which must be included in your deploy.yml): - name: Install language de\_CH command: php ~/bin/wp core language install de\_CH args: chdir: "{{ deploy\_helper.new\_release\_path }}" - name: Install language de\_DE command: php ~/bin/wp core language install de\_DE args: chdir: "{{ deploy\_helper.new\_release\_path }}" - name: Update language files command: php ~/bin/wp core language update args: chd…

---

## Post 37 by @jan — 2016-07-06T23:49:33Z

Thanks @Koodimonni for your great work. I noticed some strange behaviour though:

When switching to any other language but english (tried de and fr), the visual post editor will not show since the language files for tinymce are missing.

Am I missing something or should they be added to the packages?

Wordpress expects them to be in `web/wp/wp-includes/js/tinymce/langs`. However, with `"koodimonni-language/core-de_de"` for example, I am not getting any other languages installed there except the default `wp-langs-en.js`.

Here’s a screenshot on how to reproduce this:

 ![](https://discourse.roots.io/uploads/default/original/2X/6/6ace72c0b95cb48e7f32626345688b392487d38f.png)

---

## Post 38 by @Koodimonni — 2016-08-25T23:12:21Z

I haven’t installed anything extra besides the language packages from my composer packages.

Here’s a screenshot from finnish `koodimonni-language/core-fi` package in chrome:

 ![](https://discourse.roots.io/uploads/default/original/2X/4/4dcb2416eddad7a31030cf6c5f75c7ac31aaed4e.png)

So because it works for me I can’t really easily debug this for you.

If you really want my help please start an issue in Github instead rather than posting over here.

---

## Post 39 by @marcelgro — 2017-12-02T08:48:12Z

The example behind [your link](https://gist.github.com/onnimonni/154cd5988cb93f2490c5) doesn’t work .  
The dropin-paths don’t match the ones in your post.

---

## Post 40 by @marcelgro — 2017-12-02T10:04:33Z

I can’t get it to work at all. What would a working composer.json look like and where would the languages be installed?

---

## Post 41 by @Koodimonni — 2017-12-04T10:00:58Z

@marcelgro It works just fine for me.

Here’s the example steps you can follow:

```
# Create temporary folder for testing
$ mkdir /tmp/composer-test
$ cd /tmp/composer-test

# Download the example composer.json
$ curl -O https://gist.githubusercontent.com/onnimonni/154cd5988cb93f2490c5/raw/d80fecd50bcb191e19ea1f4b1607a16dc41a7321/composer.json

# Install packages with composer
$ composer install

# List all files
$ tree
.
├── composer.json
├── composer.lock
├── htdocs
│ ├── wordpress
│ │ ├── composer.json
│ │ ├── index.php
│ │ ├── license.txt
│ │ ├── readme.html
│ │ ├── wp-activate.php
│ │ ├── wp-admin
│ │ └── ...
│ └── wp-content
│ ├── languages
│ │ ├── admin-az.mo
│ │ ├── admin-az.po
│ │ ├── admin-ca.mo
│ │ ├── admin-ca.po
│ │ ├── admin-en_AU.mo
│ │ ├── admin-en_AU.po
│ │ ├── admin-en_GB.mo
│ │ ├── admin-en_GB.po
│ │ ├── admin-fi.mo
│ │ ├── admin-fi.po
│ │ ├── admin-fr_FR.mo
│ │ ├── admin-fr_FR.po
│ │ ├── admin-network-az.mo
│ │ ├── admin-network-az.po
│ │ ├── admin-network-ca.mo
│ │ ├── admin-network-ca.po
│ │ ├── admin-network-en_AU.mo
│ │ ├── admin-network-en_AU.po
│ │ ├── admin-network-en_GB.mo
│ │ ├── admin-network-en_GB.po
│ │ ├── admin-network-fi.mo
│ │ ├── admin-network-fi.po
│ │ ├── admin-network-fr_FR.mo
│ │ ├── admin-network-fr_FR.po
│ │ ├── admin-network-nl_NL.mo
│ │ ├── admin-network-nl_NL.po
│ │ ├── admin-network-ru_RU.mo
│ │ ├── admin-network-ru_RU.po
│ │ ├── admin-nl_NL.mo
│ │ ├── admin-nl_NL.po
│ │ ├── admin-ru_RU.mo
│ │ ├── admin-ru_RU.po
│ │ ├── az.mo
│ │ ├── az.po
│ │ ├── ca.mo
│ │ ├── ca.po
│ │ ├── continents-cities-az.mo
│ │ ├── continents-cities-az.po
│ │ ├── continents-cities-ca.mo
│ │ ├── continents-cities-ca.po
│ │ ├── continents-cities-fi.mo
│ │ ├── continents-cities-fi.po
│ │ ├── continents-cities-fr_FR.mo
│ │ ├── continents-cities-fr_FR.po
│ │ ├── continents-cities-nl_NL.mo
│ │ ├── continents-cities-nl_NL.po
│ │ ├── continents-cities-ru_RU.mo
│ │ ├── continents-cities-ru_RU.po
│ │ ├── en_AU.mo
│ │ ├── en_AU.po
│ │ ├── en_GB.mo
│ │ ├── en_GB.po
│ │ ├── fi.mo
│ │ ├── fi.po
│ │ ├── fr_FR.mo
│ │ ├── fr_FR.po
│ │ ├── nl_NL.mo
│ │ ├── nl_NL.po
│ │ ├── plugins
│ │ │ ├── akismet-az.mo
│ │ │ ├── akismet-az.po
│ │ │ ├── akismet-ca.mo
│ │ │ ├── akismet-ca.po
│ │ │ ├── akismet-en_AU.mo
│ │ │ ├── akismet-en_AU.po
│ │ │ ├── akismet-en_GB.mo
│ │ │ ├── akismet-en_GB.po
│ │ │ ├── akismet-fi.mo
│ │ │ ├── akismet-fi.po
│ │ │ ├── akismet-fr_FR.mo
│ │ │ ├── akismet-fr_FR.po
│ │ │ ├── akismet-nl_NL.mo
│ │ │ ├── akismet-nl_NL.po
│ │ │ ├── akismet-ru_RU.mo
│ │ │ ├── akismet-ru_RU.po
│ │ │ ├── bbpress-ca.mo
│ │ │ ├── bbpress-ca.po
│ │ │ ├── bbpress-en_AU.mo
│ │ │ ├── bbpress-en_AU.po
│ │ │ ├── bbpress-en_GB.mo
│ │ │ ├── bbpress-en_GB.po
│ │ │ ├── bbpress-fi.mo
│ │ │ ├── bbpress-fi.po
│ │ │ ├── bbpress-fr_FR.mo
│ │ │ ├── bbpress-fr_FR.po
│ │ │ ├── bbpress-nl_NL.mo
│ │ │ ├── bbpress-nl_NL.po
│ │ │ ├── bbpress-ru_RU.mo
│ │ │ ├── bbpress-ru_RU.po
│ │ │ ├── woocommerce-ca.mo
│ │ │ ├── woocommerce-ca.po
│ │ │ ├── woocommerce-en_AU.mo
│ │ │ ├── woocommerce-en_AU.po
│ │ │ ├── woocommerce-en_GB.mo
│ │ │ ├── woocommerce-en_GB.po
│ │ │ ├── woocommerce-fi.mo
│ │ │ ├── woocommerce-fi.po
│ │ │ ├── woocommerce-fr_FR.mo
│ │ │ ├── woocommerce-fr_FR.po
│ │ │ ├── woocommerce-nl_NL.mo
│ │ │ ├── woocommerce-nl_NL.po
│ │ │ ├── woocommerce-ru_RU.mo
│ │ │ ├── woocommerce-ru_RU.po
│ │ │ ├── wordpress-importer-az.mo
│ │ │ ├── wordpress-importer-az.po
│ │ │ ├── wordpress-importer-ca.mo
│ │ │ ├── wordpress-importer-ca.po
│ │ │ ├── wordpress-importer-en_AU.mo
│ │ │ ├── wordpress-importer-en_AU.po
│ │ │ ├── wordpress-importer-en_GB.mo
│ │ │ ├── wordpress-importer-en_GB.po
│ │ │ ├── wordpress-importer-fi.mo
│ │ │ ├── wordpress-importer-fi.po
│ │ │ ├── wordpress-importer-fr_FR.mo
│ │ │ ├── wordpress-importer-fr_FR.po
│ │ │ ├── wordpress-importer-nl_NL.mo
│ │ │ ├── wordpress-importer-nl_NL.po
│ │ │ ├── wordpress-importer-ru_RU.mo
│ │ │ └── wordpress-importer-ru_RU.po
│ │ ├── ru_RU.mo
│ │ ├── ru_RU.po
│ │ └── themes
│ │ ├── twentyeleven-az.mo
│ │ ├── twentyeleven-az.po
│ │ ├── twentyeleven-ca.mo
│ │ ├── twentyeleven-ca.po
│ │ ├── twentyeleven-en_AU.mo
│ │ ├── twentyeleven-en_AU.po
│ │ ├── twentyeleven-en_GB.mo
│ │ ├── twentyeleven-en_GB.po
│ │ ├── twentyeleven-fi.mo
│ │ ├── twentyeleven-fi.po
│ │ ├── twentyeleven-fr_FR.mo
│ │ ├── twentyeleven-fr_FR.po
│ │ ├── twentyeleven-nl_NL.mo
│ │ ├── twentyeleven-nl_NL.po
│ │ ├── twentyeleven-ru_RU.mo
│ │ ├── twentyeleven-ru_RU.po
│ │ ├── twentyfifteen-az.mo
│ │ ├── twentyfifteen-az.po
│ │ ├── twentyfifteen-ca.mo
│ │ ├── twentyfifteen-ca.po
│ │ ├── twentyfifteen-en_AU.mo
│ │ ├── twentyfifteen-en_AU.po
│ │ ├── twentyfifteen-en_GB.mo
│ │ ├── twentyfifteen-en_GB.po
│ │ ├── twentyfifteen-fi.mo
│ │ ├── twentyfifteen-fi.po
│ │ ├── twentyfifteen-fr_FR.mo
│ │ ├── twentyfifteen-fr_FR.po
│ │ ├── twentyfifteen-nl_NL.mo
│ │ ├── twentyfifteen-nl_NL.po
│ │ ├── twentyfifteen-ru_RU.mo
│ │ ├── twentyfifteen-ru_RU.po
│ │ ├── twentyfourteen-az.mo
│ │ ├── twentyfourteen-az.po
│ │ ├── twentyfourteen-ca.mo
│ │ ├── twentyfourteen-ca.po
│ │ ├── twentyfourteen-en_AU.mo
│ │ ├── twentyfourteen-en_AU.po
│ │ ├── twentyfourteen-en_GB.mo
│ │ ├── twentyfourteen-en_GB.po
│ │ ├── twentyfourteen-fi.mo
│ │ ├── twentyfourteen-fi.po
│ │ ├── twentyfourteen-fr_FR.mo
│ │ ├── twentyfourteen-fr_FR.po
│ │ ├── twentyfourteen-nl_NL.mo
│ │ ├── twentyfourteen-nl_NL.po
│ │ ├── twentyfourteen-ru_RU.mo
│ │ ├── twentyfourteen-ru_RU.po
│ │ ├── twentysixteen-az.mo
│ │ ├── twentysixteen-az.po
│ │ ├── twentysixteen-ca.mo
│ │ ├── twentysixteen-ca.po
│ │ ├── twentysixteen-en_AU.mo
│ │ ├── twentysixteen-en_AU.po
│ │ ├── twentysixteen-en_GB.mo
│ │ ├── twentysixteen-en_GB.po
│ │ ├── twentysixteen-fi.mo
│ │ ├── twentysixteen-fi.po
│ │ ├── twentysixteen-fr_FR.mo
│ │ ├── twentysixteen-fr_FR.po
│ │ ├── twentysixteen-nl_NL.mo
│ │ ├── twentysixteen-nl_NL.po
│ │ ├── twentysixteen-ru_RU.mo
│ │ ├── twentysixteen-ru_RU.po
│ │ ├── twentyten-az.mo
│ │ ├── twentyten-az.po
│ │ ├── twentyten-ca.mo
│ │ ├── twentyten-ca.po
│ │ ├── twentyten-en_AU.mo
│ │ ├── twentyten-en_AU.po
│ │ ├── twentyten-en_GB.mo
│ │ ├── twentyten-en_GB.po
│ │ ├── twentyten-fi.mo
│ │ ├── twentyten-fi.po
│ │ ├── twentyten-fr_FR.mo
│ │ ├── twentyten-fr_FR.po
│ │ ├── twentyten-nl_NL.mo
│ │ ├── twentyten-nl_NL.po
│ │ ├── twentyten-ru_RU.mo
│ │ ├── twentyten-ru_RU.po
│ │ ├── twentythirteen-az.mo
│ │ ├── twentythirteen-az.po
│ │ ├── twentythirteen-ca.mo
│ │ ├── twentythirteen-ca.po
│ │ ├── twentythirteen-en_AU.mo
│ │ ├── twentythirteen-en_AU.po
│ │ ├── twentythirteen-en_GB.mo
│ │ ├── twentythirteen-en_GB.po
│ │ ├── twentythirteen-fi.mo
│ │ ├── twentythirteen-fi.po
│ │ ├── twentythirteen-fr_FR.mo
│ │ ├── twentythirteen-fr_FR.po
│ │ ├── twentythirteen-nl_NL.mo
│ │ ├── twentythirteen-nl_NL.po
│ │ ├── twentythirteen-ru_RU.mo
│ │ ├── twentythirteen-ru_RU.po
│ │ ├── twentytwelve-az.mo
│ │ ├── twentytwelve-az.po
│ │ ├── twentytwelve-ca.mo
│ │ ├── twentytwelve-ca.po
│ │ ├── twentytwelve-en_AU.mo
│ │ ├── twentytwelve-en_AU.po
│ │ ├── twentytwelve-en_GB.mo
│ │ ├── twentytwelve-en_GB.po
│ │ ├── twentytwelve-fi.mo
│ │ ├── twentytwelve-fi.po
│ │ ├── twentytwelve-fr_FR.mo
│ │ ├── twentytwelve-fr_FR.po
│ │ ├── twentytwelve-nl_NL.mo
│ │ ├── twentytwelve-nl_NL.po
│ │ ├── twentytwelve-ru_RU.mo
│ │ └── twentytwelve-ru_RU.po
│ ├── object-cache.php
│ ├── plugins
│ │ └── wp-redis
│ │ ├── ...
│ └── themes
│ └── twentyfifteen
│ ├── ...
└── vendor
    ├── autoload.php
    ├─...
```

---

## Post 42 by @Jeroen_Custers — 2019-08-24T17:04:16Z

@koodimonni Great work! But I have a question. How to handle custom translations? I have overwritten a single translation in wp-content/languages/plugins/woocommmerce\_nl-NL.po file. Will this translation be lost when woocommerce ships a new translation file? If yes, how can I avoid this?

Thanks in advance for your help!

---

## Post 43 by @yangm97 — 2019-11-14T22:20:06Z

First, I’d like to thank you for the awesome work.

I’ve noticed that even if you use the catch-all meta-package approach, wordpress will still complain about out of date locales, and of course it won’t show you which ones unless you insert ftp credentials, so I’m left unable to know the status of locales.

I mean, this more of a wordpress deficiency than koodimonni related but posting here because there’s a chance people coming to this page have had this issue. It’s minor but still bothers me (:

---

## Post 44 by @strarsis — 2019-11-15T01:15:33Z

I am using the `wp` CLI for installing + updating the core, theme and plugin languages.  
This won’t lock the language version in, but it will work per deploy and still fast.  
See these docs: [https://github.com/roots/docs/pull/191;](https://github.com/roots/docs/pull/191;) [formatted version](https://github.com/roots/docs/pull/191/files?short_path=7240acc#diff-7240acc3511009b0560e6e431a6b4bd8)

---

## Post 45 by @ben — 2022-02-26T03:08:28Z



---

## Post 46 by @ben — 2022-02-26T04:14:34Z



---

## Post 47 by @carloseduardo — 2022-05-20T17:46:26Z

It’s fantastic!  
I just knew Bedrock and I’m loving it

---

## Post 48 by @strarsis — 2022-05-20T20:30:41Z

@carloseduardo: There is now also a documentation page for this:

> **[Trellis: How to Install WordPress Languages Files | Roots Documentation](https://docs.roots.io/trellis/master/guides/install-wordpress-language-files/)**
>
> How to install WordPress language files on a Trellis site.
