1
votes

I have made a CMS using PHP and MYSQL for the back-end. The problem is, I'd like to have the site available in multiple languages; So I've already translated the CMS itself and put it in files like:

  • en.ini
  • nl.ini

Which works fine for the CMS' contents itself, like the Administration etc. The actual problem occurs when I try to translate the website further: The blogposts and pages are stored in a database, so they're dynamic. My pages table's structure looks like this:

urlname | name | id | content | position | hidden | redirect | type | permission

So, if I were to translate a page into, for example, Dutch, I don't want to create a new table called pages_nl for example, because most of the information would be the same as the other table.
I could add a row which contains the page's available languages, and make php read the array and parse if the current $lang matches one of the page's available languages, and then read the content_nl and name_nl row as an example.
The same problem would occur with my blog posts, and I have searched for a solution, but most results were for specific CMSs and just plugins.

I'm asking what would be the best way (and database structure) to store multilingual pages/posts, where languages could be added dynamically and have a fallback on the original content if there's no translated version available.

1
I would add another column called language or something. Not a table per language. Have a look at how other CMSs do it.putvande

1 Answers

0
votes

Basically you add a lang-key to your database

urlname | name | id | content | position | hidden | redirect | type | permission | lang

Now lets say a request comes for a page with 5 content elements in it. Your CMS first search for the entries with the specific lang-code, for example nl. If it dont find an entry with the language code it falls back to the default language and take that entry.

Let say you have translated Content 1, 3 and 5:

Content 1       Content 1 nl
Content 2
Content 3       Content 3 nl
Content 4
Content 5       Content 5 nl

Result:

Content 1 nl
Content 2
Content 3 nl
Content 4
Content 5 nl

Another way would be to do the translation in the template files (like magento does it). In magento you have something like that:

"Hello, this is the " . $this->__("English") . " page"

And translation files. For example lang.nl:

"English", "Dutch"

In this case you will have only 1 Content Element, but you will wrap every element that shall be translated. This also works with images and everything you want. You can also abstract this wrapper to work in a backend RTE-Editor. For example, you will write Hello, this is the English page in your backend then mark Englishand click the translation button. This will add a Tag around English and when you render the content you scan for this tags and replace it if you find any translation for this string in the requested language.