[แนวคิด] การทำ Multi languages ใน DB

อันนี้ออกตัวไว้ก่อนเลย ว่าเป็นแนวคิด ทีผมคิดเองทำเอง อาจจะไม่ได้มาตรฐานนักแต่สำหรับผม it work!

เรื่องการออกแบบ multi languages คิดว่าคงจะพอมีความรู้ความเข้าใจกันอยู่บ้าง ก็ แค่ทำไฟล์ แยก ออกไป

Dir: english
Dir: thai

จากนั้นข้างใน โฟลเดอร์ก็บรรจุ ไปด้วย perfix_lang.php โดยมีตัวแปร เหมือนกันทุกประการ และก็ เอาไป echo ออกก็เท่านั้นเอง

แต่ ถ้าเปลี่ยนมาเป็น content จาก db ล่ะ ซึ่งมัน fix field ไว้ จะไปเพิ่มเป็น title_thai, title_english มันก็ดูน่าเกลียด พิลึก เราจะแก้ปัญหาไงดี …

ผมมี idea มาเสนอครับ คือเราก็เก็บแบบนี้ สมมุติ ข้อมูลด้านล่างนี่ ออกมาจาก db ละกันนะ

  1. <?php
  2. $string = <<<LANG
  3. [lang=th]40 ส.ว.เปิดเวทีชำแหละโครงการเช่ารถเมล์ 4,000 คัน โดยที่ประชุมมีมติเป็นเอกฉันท์ บวกกับเสียงส.ว.ส่วนใหญ่ไม่เห็นด้วย แนะรัฐบาลไม่ควรปล่อยให้โครงการนี้ผ่านความเห็นชอบ พิสูจน์ความจริงใจของรัฐบาล ได้กลิ่นทะแม่งเสนอโครงการหวังสะสมเสบียงรับมือเลือกตั้ง[/lang]
  4.  
  5. [lang=en]• Death toll from Cyclone Aila climbs to 168 in India, Bangladesh
  6. • Suicide car bomber kills 30, wounds at least 250 in Pakistan
  7. • Underground nuclear test shows North Korean threat is growing
  8. • Smoke from tire fire forces evacuation of small East Texas town
  9. • $7,000 fine proposed for Wal-Mart worker’s stampede death
  10. • Study: Late perimenopause stage may affect memory
  11. • Peter Zezel, who played 15 seasons in the NHL, dies at 44
  12. • NBA · NHL · MLB · NFL · French Open · Soccer · NASCAR[/lang]
  13.  
  14. [lang=jp]
  15.  
  16.     * いつも殴り合うんだけど、すぐ仲直りするっておかしいですか?
  17.  
  18.       ケンカになると擦り傷、青タンができるほどの殴り合い。でもケンカした後はすぐ仲直り。これっておかしいですか?
  19.     * ケンカの後ずっと黙ってしまう夫にどう対処したらいい?
  20.  
  21.       ひたすらダンマリをし続ける夫に対して対処法が知りたい妻。回答には、同じタイプの男性からダンマリの理由とアドバイス。
  22.     * 仕事に支障なく家出はできる?
  23.  
  24.       実家は距離的に無理。仕事もしていて荷物を考えると面倒になって……妙案はありますか? という質問に厳しいアドバイスが。
  25.  
  26.  
  27. [/lang]
  28. LANG;
  29. ?>

จากนั้นเวลาเราจะแยกมันออกก็ใช้ ความสามารถของ regular มาจัดการ

  1. function string_lang($string, $lang)
  2. {
  3.         preg_match(‘~\[lang='.$lang.'\](.*?)\[\/lang\]~is’, $string, $matches);
  4.         return nl2br($matches[1]);
  5. }
  6.  
  7. echo string_lang($string, ‘th’);
  8. echo "<hr />";
  9. echo string_lang($string, ‘en’);
  10. echo "<hr />";
  11. echo string_lang($string, ‘jp’);
  12. echo "<hr />";

เท่านี้ เราก็สามารถจัดการได้แล้ว ง่ายนิดเดียวเอง

ที่สำคัญ regular อย่าลืม modifier s ด้วยละกัน

s (PCRE_DOTALL)
If this modifier is set, a dot metacharacter in the pattern matches all characters, including newlines. Without it, newlines are excluded. This modifier is equivalent to Perl’s /s modifier. A negative class such as [^a] always matches a newline character, independent of the setting of this modifier.

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

11 Comments »

 
  • 7 says:

    โอ้โฮ เก็บยังกับ .ini ยังงี้ใช้ parse_ini_file() ไปเลยดิ

  • Tee++; says:

    7 :

    โอ้โฮ เก็บยังกับ .ini ยังงี้ใช้ parse_ini_file() ไปเลยดิ

    มันเก็บแบบนั้นไม่ได้ไงครับ เพราะมันเป็น content ที่มาจาก input ฝั่ง client คือสมมุติ เค้ากรอก Title, Description แบบนี้ ผมจะเอาไปลง *.ini ได้ไงครับ มันก็ต้องเก็บลง DB สิ ถูกมั้ยครับ

  • 7 says:

    เข้าใจครับ แหะ แหะ ผมผิดเองแหละ ใน php ไม่ยักกะมี parse_ini() ให้ใช้ เลยไม่ได้อ้างถึง จะหา read_ini/write_ini จากข้างนอก ก็เกรงจะช้ากว่า function ของเฮียแหงมๆ โชว์โง่เลยผม

    แต่ที่ผมพูดถึงคือเก็บเป็น ini format หน่ะ ข้อมูลใน DB แหละ เอาออกมาแตกออกมาเป็น array จะแยกภาษา แยกหน้า นับจำนวนภาษาใน content ได้ด้วย(แบบไดนามิก) แต่จริงๆก็เก็บได้หลายแบบแหละเนอะ จะ INI,XML,Serialize ฯลฯ

  • ่joshino says:

    “ที่สำคัญ regular อย่าลืม modifier s ด้วยละกัน”

    อิอิ ไม่เข้าใจครับ ช่วยอธิบายอีกนิดน่ะครับ ขอบคุณครับ

  • EThaiZone says:

    เก็บๆ กำลังนึกอยู่เลยว่าจะเก็บ content ยังไง

  • heypetch says:

    แล้วถ้าใน content ผมมี tag [lang=en][/lang] หล่ะครับ

  • Tee++; says:

    heypetch :

    แล้วถ้าใน content ผมมี tag [lang=en][/lang] หล่ะครับ

    ก็ Replace มันออกสิ

  • heypetch says:

    ตัวอย่างอ่ะครับ [lang=en] การเขียน tag ควรเขียนดังต่อไปนี้ [lang=en]test[/lang][/lang]

  • bank says:

    เยียมมากเลยครับ ^_^

  • plengfree says:

    สุดยอดครับ ขออนุญาตินำไปใช้น่ะครับ ได้ทำเว็บ 2 ภาษาพอดีเลย

  • หุหุ says:

    เก็บแยก record ไปเลยดีกว่าไหมครับ

    cid lang content
    1 en abc
    1 th เอบีซี
    2 en xyz
    2 th เอ๊ก วาย แซด

 

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>