mirror of
https://github.com/codeguy/php-the-right-way.git
synced 2025-08-17 03:03:57 +02:00
Adding basic explanation on i18n and section TODOs
- what's i18n, l10n and pluralization forms for - common methods of implementation - added the rest of the sub-sections, with TODOs
This commit is contained in:
75
_posts/05-06-01-Internationalization-and-Localization.md
Normal file
75
_posts/05-06-01-Internationalization-and-Localization.md
Normal file
@@ -0,0 +1,75 @@
|
||||
---
|
||||
title: Internationalization and Localization
|
||||
isChild: true
|
||||
anchor: i18n_l10n
|
||||
---
|
||||
|
||||
## Internationalization (i18n) and Localization (l10n) {#i18n_l10n_title}
|
||||
|
||||
_Disclaimer for newcomers: i18n and l10n are numeronyms, a kind of abbreviation where numbers are used to shorten
|
||||
words - in our case, internationalization becomes i18n and localization, l10n._
|
||||
|
||||
First of all, we need to define those two similar concepts and other related things:
|
||||
|
||||
- **Internationalization** is when you organize your code so it can be adapted to different languages or regions
|
||||
without refactors. This is usually done once - preferably, in the beginning of the project, or else you'll probably
|
||||
need some huge changes in the source!
|
||||
- **Localization** happens when you adapt the interface (mainly) by translating contents, based on the i18n work done
|
||||
before. It usually us done every time a new language or region needs support, and is updated when new interface pieces
|
||||
are added, as they need to be available in all supported languages.
|
||||
- **Pluralization** defines the rules needed between different languages to interoperate strings containing numbers and
|
||||
counters. For instance, in English when you have only one item, it's singular, and anything different from that is
|
||||
called plural; plural is this language is indicated by adding an S after some words, and sometimes changes parts of it.
|
||||
In other languages such as Russian or Serbian there are two plural forms plus the singular one - you may even find
|
||||
languages with a total of four, five or six forms, such as Slovenian, Irish or Arabic.
|
||||
|
||||
## Common ways to implement
|
||||
|
||||
The easiest way to internationalize PHP software is by using array files and using those strings in templates, such as
|
||||
`<h1><?=$TRANS['title_about_page']?></h1>`. This is, however, hardly a recommended way for serious projects, as it poses
|
||||
some maintenance issues along the road - some might appear in the very beginning, such as pluralization. So, please,
|
||||
don't try this if your project will contain more than a couple of pages.
|
||||
|
||||
Some frameworks will sport their own i18n packages. Those usually are a more powerful version of the above approach,
|
||||
but including features needed for real localization, such as plural forms and string replacement. You're free to use
|
||||
those if you feel like, but you might find bothering to edit array source files, having to deal with pure code issues
|
||||
(such as string scaping and so on). The main pro here is integration with the environment you're using - the framework
|
||||
is called _full-stack_ for a reason, right?
|
||||
|
||||
However, the most classic way and often taken as reference for i18n and l10n is a [UNIX tool called `gettext`][gettext].
|
||||
It dates back to 1995 and is still the most complete implementation for translating software. It is pretty easy to get
|
||||
running, while it still sports powerful supporting tools. It's about Gettext we will be talking here. Also, to help you
|
||||
not get messy over the command-line, we will be presenting a great GUI application that can be used to easily update
|
||||
your l10n source files.
|
||||
|
||||
### Discussion on l10n keys
|
||||
TODO: talk about static keys versus text keys, as in https://lingohub.com/blog/2013/07/php-internationalization-with-gettext-tutorial/#What_form_of_msgids_should_be_used
|
||||
|
||||
## Gettext
|
||||
|
||||
### Installation
|
||||
TODO: You might need to install Gettext and the related PHP library by using your package manager, like `apt-get` or `yum`.
|
||||
|
||||
### Structure
|
||||
TODO: Talk about POT/PO/MO files and Poedit. Explain details about plural forms, directory structures and domains.
|
||||
|
||||
### Sample implementation
|
||||
TODO: Add sample code implementing i18n using gettext.
|
||||
|
||||
### Everyday usage
|
||||
TODO: Explain what's the l10n routine for a project with existing i18n in place, using Poedit (and maybe command line as seen
|
||||
in the LingoHub file).
|
||||
|
||||
#### Tips & Tricks
|
||||
TODO: Talk about possible issue with caching.
|
||||
TODO: Suggest creation of helper functions.
|
||||
|
||||
### References
|
||||
|
||||
* [Wikipedia: i18n and l10n](https://en.wikipedia.org/wiki/Internationalization_and_localization)
|
||||
* [Wikipedia: Gettext](https://en.wikipedia.org/wiki/Gettext)
|
||||
* [LingoHub: PHP internationalization with gettext tutorial](https://lingohub.com/blog/2013/07/php-internationalization-with-gettext-tutorial/)
|
||||
* [PHP Manual: Gettext](http://br2.php.net/manual/en/book.gettext.php)
|
||||
|
||||
|
||||
[gettext]: https://en.wikipedia.org/wiki/Gettext
|
Reference in New Issue
Block a user