dongyou7292 2014-12-20 11:04
浏览 68
已采纳

如何使我的CMS多语言

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

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

报告相同问题?

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办