dongyou7292 2014-12-20 11:04
浏览 68


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条回答 默认 最新

  • douqiang6448 2014-12-20 11:24

    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
    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

    "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.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?



  • ¥15 如何使用单链表编写学生信息管理系统?
  • ¥15 完成课题以及ppt 在21号之前完成
  • ¥15 懂的来,你应该知道我在说什么,我需要你的帮助
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 maccms影视模板 制作影视网站失败 求
  • ¥15 stm32按键设置闹钟数进退位不正常
  • ¥15 自己写的测试驱动程序无法启动
  • ¥15 三电平逆变器中点电位平衡问题
  • ¥20 这怎么写啊 java课设
  • ¥15 用C语言完成一个复杂的游戏