นึกชื่อไทยไม่ออกแฮะว่าจะเขียนเป็นหัวข้อภาษาไทยยังไง จริงๆแล้วก็แค่จะเปลี่ยนภาษาขณะที่รันโปรแกรมไปแล้วนั่นแหละ คิดว่าพึ่งมีใน Flex3 เพราะค้นใน google ก็เจอแต่เอกสารของ Flex3 แฮะถ้าเป็น Flex2 คนต้องใช้วิธีดิบเถื่อนนิดหน่อย ^^!

อย่างแรกที่ต้องทำเพื่อให้ compile flex กับภาษาอื่นๆ ได้คือต้อง copylocale ก่อนโดย flex เตรียม locale พื้นฐานให้สองภาษาคือ อังกฤษ(อังกฤษแบบอเมริกาด้วย แต่มันจะต่างจาก อังกฤษอื่นๆ ยังไงฟะ) กับ ญี่ปุ่น ซึ่งก็ไม่รู้ copy แล้วมันจะต่างกันยังไงอีกนั่นแหละ - -” โดยจากตอนก่อนนู้นๆ จำได้ว่าเคยแนะนำโปรแกรมต่างๆ ใน /bin ของ sdk ไปบ้างแล้วโปรแกรมหนึ่งก็คือ copylocale โดยมีทั้งสำหรับ windows และ linux/unix ของ windows ก็จะมี .exe ตามท้าย จากการทำงานแล้ว จริงๆ มันก็เหมือนกับ copy ไฟล์ธรรมดานะ แต่ดูละเอียดๆ เหมือนมันจะมี compile อะไรบางอย่างด้วยหละ


copylocale en_US th_TH

ผมก็เลือก copy จาก en_US หละ เพราะคิดว่า ja_JP คงเหมาะกับพวกภาษาจีนมากกว่า(มั้ง)

ต่อจากนั้นก็เตรียมไฟล์ที่เก็บคำต่างๆ ทั้งสองภาษาคือ ไทย กับ อังกฤษ (ที่ flash ไม่ทำตรงนี้แต่แรกก็เพราะ ถ้าเป็น flash ธรรมดาคงไม่ต้องการอะไรพวกนี้เท่าไหร่มั้ง แต่พอมาเป็นโปรแกรมใหญ่ การรองรับภาษาหลายๆ ภาษาเลยมีความสำคัญขึ้นมา)


File: /directory/to/resource/en_US/sample.properties
greeting=Greeting
goodbye=Goodbye

File: /directory/to/resource/th_TH/sample.properties
greeting=สวัสดี
goodbye=ลาก่อน

แล้วก็เขียนโปรแกรมเล็กๆ เพื่อจะมาใช้


File: /directory/to/project/sample.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

  <mx:Metadata>
    [ResourceBundle('sample')]
  </mx:Metadata>

  <mx:ArrayCollection id="langs">
    <mx:String>English</mx:String>
    <mx:String>ไทย</mx:String>
  </mx:ArrayCollection>

  <mx:Script>
    <![CDATA[
      import mx.resources.ResourceBundle;
      private function changeLocale(event:Event):void {
        if (langCombo.selectedItem == "English") {
          resourceManager.localeChain = [ "en_US" ]
        } else {
          resourceManager.localeChain = [ "th_TH" ]
        }
      }
    ]]>
  </mx:Script>

  <mx:VBox>
    <mx:ComboBox id="langCombo" dataProvider="{langs}" close="changeLocale(event)" />
    <mx:HBox>
      <mx:Label text="{resourceManager.getString('sample','greeting')}" fontSize="20" />
      <mx:Label text="{resourceManager.getString('sample','goodbye')}" fontSize="20" />
    </mx:HBox>
  </mx:VBox>
</mx:Application>

จากนั้นเวลา compile ก็ใส่ option เพิ่มอีกนิดหน่อยเป็น


mxmlc sample.mxml -locale=en_US,th_TH -source-path=/directory/to/resource/{locale}

ก็จะได้ไฟล์ .swf ออกมาที่สามารถสลับภาษาได้ในตัว สำหรับ Flex2 ตอนนี้คิดเล่นๆไว้สองอย่างคือ ทำ resource เหมือนกัน แต่ว่าเติม _locale เข้าไปด้วย เวลาสลับภาษาก็ให้สลับที่โค้ดเลย แต่แบบนี้ถึกน่าดู กับ compile ไว้สอง swf พอสลับภาษาก็โหลดอีก swf นึงแทน ก็ถึกที่ user อีก - -” งั้นเปลี่ยนมาใช้ Flex3 เถอะนะ ^^!

อ้างอิง:

  1. Flex 3:Feature Introductions:Runtime Localization
  2. Flex 3 Localization

เขียนเมื่อ: May 29th, 2008 | หมวด: ภาษาเครื่องกล | แถก: , | อ้างอิง |

2 คำบ่น

  1. arraiwa:

    ทำไมผมไม่มี resourceManager ให้ใช้อ่ะครับ ผมทำตามแล้ว ไม่น่าจะมีอะไรผิด

  2. llun:

    @arraiwa, งั้นลอง ResourceManager.getInstance() ดูครับ แต่ปกติ resourceManager จะมีมากับ UIComponent ทุกตัวอยู่แล้วนะ

ทิ้งคำบ่น

XHTML: สามารถใช้แถกเหล่านี้ในการบ่น: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="">