




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、上來就給源碼,這就是我做事風(fēng)格package langue;/* * author HDSSHTLL */import javax.swing.JRadioButtonMenuItem;import javax.swing.SwingUtilities;public class NewJFrame extends javax.swing.JFrame private static java.util.ResourceBundle resources= java.util.ResourceBundle.getBundle(langue/softwareResources); public New
2、JFrame() initComponents(); private void initComponents() jLabel1 = new javax.swing.JLabel(); jTextField1 = new javax.swing.JTextField(); jLabel2 = new javax.swing.JLabel(); jTextField2 = new javax.swing.JTextField(); jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); jMenuBa
3、r1 = new javax.swing.JMenuBar(); jMenu1 = new javax.swing.JMenu(); jRadioButtonMenuItem1 = new JRadioButtonMenuItem(); jRadioButtonMenuItem2 = new JRadioButtonMenuItem(); jRadioButtonMenuItem3 =new JRadioButtonMenuItem(); jRadioButtonMenuItem4=new JRadioButtonMenuItem(); jRadioButtonMenuItem5=new JR
4、adioButtonMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jMenu1.setText(File); /英語 jRadioButtonMenuItem1.setText(English); jRadioButtonMenuItem1.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent evt) jRadioB
5、uttonMenuItem2.setSelected(false); jRadioButtonMenuItem3.setSelected(false); jRadioButtonMenuItem4.setSelected(false); jRadioButtonMenuItem5.setSelected(false); resources=java.util.ResourceBundle.getBundle(langue/softwareResources,java.util.Locale.ENGLISH); updateLabel(); ); jMenu1.add(jRadioButtonM
6、enuItem1); /法語 jRadioButtonMenuItem3.setText(france); jRadioButtonMenuItem3.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent evt) jRadioButtonMenuItem2.setSelected(false); jRadioButtonMenuItem1.setSelected(false); jRadioButtonMenuItem4.setS
7、elected(false); jRadioButtonMenuItem5.setSelected(false); resources=java.util.ResourceBundle.getBundle(langue/softwareResources,java.util.Locale.FRANCE); updateLabel(); ); jMenu1.add(jRadioButtonMenuItem3); /韓語 jRadioButtonMenuItem4.setText(KOREA); jRadioButtonMenuItem4.addActionListener(new java.aw
8、t.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent evt) jRadioButtonMenuItem2.setSelected(false); jRadioButtonMenuItem1.setSelected(false); jRadioButtonMenuItem3.setSelected(false); jRadioButtonMenuItem5.setSelected(false); resources=java.util.ResourceBundle.getBundle(la
9、ngue/softwareResources,java.util.Locale.KOREA); updateLabel(); ); jMenu1.add(jRadioButtonMenuItem4); /泰文 jRadioButtonMenuItem5.setText(Thai); jRadioButtonMenuItem5.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent evt) jRadioButtonMenuItem2.
10、setSelected(false); jRadioButtonMenuItem1.setSelected(false); jRadioButtonMenuItem3.setSelected(false); jRadioButtonMenuItem4.setSelected(false); resources=java.util.ResourceBundle.getBundle(langue/softwareResources_th); updateLabel(); ); jMenu1.add(jRadioButtonMenuItem5); /中文 jRadioButtonMenuItem2.
11、setSelected(true); jRadioButtonMenuItem2.setText(Chinese); jRadioButtonMenuItem2.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent evt) jRadioButtonMenuItem1.setSelected(false); jRadioButtonMenuItem3.setSelected(false); jRadioButtonMenuItem4
12、.setSelected(false); jRadioButtonMenuItem5.setSelected(false); resources=java.util.ResourceBundle.getBundle(langue/softwareResources,java.util.Locale.CHINA); updateLabel(); ); jMenu1.add(jRadioButtonMenuItem2); jMenuBar1.add(jMenu1); setJMenuBar(jMenuBar1); updateLabel(); setLayOut(); this.setLocati
13、onRelativeTo(null); pack(); private void setLayOut() javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane(); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGr
14、oup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(layout.createSequentialGroup() .addComponent(jLabel1) .ad
15、dGap(18, 18, 18) .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 159, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addComponent(jLabel2) .addGap(18, 18, 18) .addComponent(jTextField2) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(lay
16、out.createSequentialGroup() .addGap(13, 13, 13) .addComponent(jButton1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 34, Short.MAX_VALUE) .addComponent(jButton2) .addGap(56, 56, 56) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI
17、NG) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PRE
18、FERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel2) .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.s
19、wing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jButton1) .addComponent(jButton2) .addContainerGap(19, Short.MAX_VALUE) ); private void updateLabel() jLabel1.setText(resources.getString(Label_Text_Nam
20、e); jLabel2.setText(resources.getString(Label_Text_Class); jButton1.setText(resources.getString(Button_Label_Sure); jButton2.setText(resources.getString(Button_Label_cancel); jMenu1.setText(resources.getString(jMenu_text_file); public static void main(String args) SwingUtilities.invokeLater(new Runn
21、able() public void run() new NewJFrame().setVisible(true);); private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JMenu jMenu1; private javax.swing.JMenu jMenu2; private javax.swing.JMe
22、nuBar jMenuBar1; private javax.swing.JRadioButtonMenuItem jRadioButtonMenuItem1; private javax.swing.JRadioButtonMenuItem jRadioButtonMenuItem2; private javax.swing.JRadioButtonMenuItem jRadioButtonMenuItem3; private javax.swing.JRadioButtonMenuItem jRadioButtonMenuItem4; private javax.swing.JRadioB
23、uttonMenuItem jRadioButtonMenuItem5; private javax.swing.JTextField jTextField1; private javax.swing.JTextField jTextField2; 附上幾個配置文件softwareResources_perties 英文Button_Label_Sure=Sure Button_Label_cancel=cancel Label_Text_Name=NameLabel_Text_Class=ClassjMenu_text_file=filesoftwareResources_zh_
24、CN.properties 中文Button_Label_Sure=u786eu5b9a Button_Label_cancel=u53d6u6d88 Label_Text_Name=u59d3u540d Label_Text_Class=u73edu7ea7jMenu_text_file=u6587u4EF6softwareResources_ko_KR.properties 韓文Button_Label_Sure=uBB3CuB860 uC774uC8E0 Button_Label_cancel=uCDE8uC18C Label_Text_Name=uC774uB984Label_Text
25、_Class=uD074uB798uC2A4jMenu_text_file=uD30CuC77C剩下兩個配置文件你們用google翻譯去softwareResources_fr_FR.propertiessoftwareResources_perties給大家分享下我學(xué)習(xí)中遇到的問題1,配置文件不顯示英文外的其它文字這是編碼問題,沒多大關(guān)系。如果你實在受不了這種方式可以去下載插件,具體可以google.2,為什么泰文讀配置文件這樣寫resources=java.util.ResourceBundle.getBundle(langue/softwareResources_th) 而其
26、它像韓文這樣寫resources=java.util.ResourceBundle.getBundle(langue/softwareResources,java.util.Locale.KOREA); 我為什么這樣寫呢,就是因為Locale僅點的出來幾個國家/地區(qū),沒有泰語按照規(guī)范應(yīng)該寫成韓文這樣的。Locale.KOREA 其實打印出來是 ko_KR所以它的配置文件就是 softwareResources_ko_KR.properties,如果懶點就直接寫成resources=java.util.ResourceBundle.getBundle(langue/softwareResourc
27、es_ko_KR); 不過對于編碼還是要盡量規(guī)范點給你們Java支持的語言例子:package langue;import java.util.Locale;public class supportlangupublic static void main(String args)/返回Java所支持的全部國家和語言的數(shù)組Locale localeList = Locale.getAvailableLocales();/遍歷數(shù)組的每個元素,依次獲取所支持的國家和語言for (int i = 0; i localeList.length ; i+ )/打印出所支持的國家和語言System.out.
28、println(i+ +localeListi.getDisplayCountry() + = + localeListi.getCountry()+ + localeListi.getDisplayLanguage() + = + localeListi.getLanguage();3,我這例子類和配置文件是放在同一個目錄下,不放一起也可以,改下路徑大家別糾結(jié)那語言是不是對應(yīng)的文字,我也只認(rèn)識中文和英文。附上界面結(jié)果:java中如何實現(xiàn)多語言切換一、國際化開發(fā)概述軟件的國際化:軟件開發(fā)時,要使它能同時應(yīng)對世界不同地區(qū)和國家的訪問,并針對不同地區(qū)和國家的訪問,提供相應(yīng)的、符合來訪者閱讀習(xí)慣的頁
29、面或數(shù)據(jù)。國際化(internationalization)又稱為 i18n(讀法為i 18 n,據(jù)說是因為internationalization(國際化)這個單詞從i到n之間有18個英文字母,i18n的名字由此而來)二、合格的國際化軟件軟件實現(xiàn)國際化,需具備以下兩個特征:1、對于程序中固定使用的文本元素,例如菜單欄、導(dǎo)航條等中使用的文本元素、或錯誤提示信息,狀態(tài)信息等,需要根據(jù)來訪者的地區(qū)和國家,選擇不同語言的文本為之服務(wù)。2、對于程序動態(tài)產(chǎn)生的數(shù)據(jù),例如(日期,貨幣等),軟件應(yīng)能根據(jù)當(dāng)前所在的國家或地區(qū)的文化習(xí)慣進行顯示。三、固定文本元素的國際化對于軟件中的菜單欄、導(dǎo)航條、錯誤提示信息,
30、狀態(tài)信息等這些固定不變的文本信息,可以把它們寫在一個properties文件中,并根據(jù)不同的國家編寫不同的properties文件。這一組properties文件稱之為一個資源包。3.1、創(chuàng)建資源包和資源文件一個資源包中的每個資源文件都必須擁有共同的基名。除了基名,每個資源文件的名稱中還必須有標(biāo)識其本地信息的附加部分。例如:一個資源包的基名是“myproperties”,則與中文、英文環(huán)境相對應(yīng)的資源文件名則為: myproperties_perties myproperties_perties每個資源包都應(yīng)有一個默認(rèn)資源文件,這個文件不帶有標(biāo)識本地信息的附加部分。若R
31、esourceBundle對象在資源包中找不到與用戶匹配的資源文件,它將選擇該資源包中與用戶最相近的資源文件,如果再找不到,則使用默認(rèn)資源文件。例如:perties3.2、資源文件的書寫格式資源文件的內(nèi)容通常采用關(guān)鍵字值的形式,軟件根據(jù)關(guān)鍵字檢索值顯示在頁面上。一個資源包中的所有資源文件的關(guān)鍵字必須相同,值則為相應(yīng)國家的文字。并且資源文件中采用的是properties格式文件,所以文件中的所有字符都必須是ASCII字碼,屬性(properties)文件是不能保存中文的,對于像中文這樣的非ACSII字符,須先進行編碼。例如:國際化的中文環(huán)境的properties文
32、件國際化的英文環(huán)境的properties文件java提供了一個native2ascII工具用于將中文字符進行編碼處理,native2ascII的用法如下所示:3.3、編程實現(xiàn)固定文本的國際化在JavaAPI中提供了一個ResourceBundle 類用于描述一個資源包,并且 ResourceBundle類提供了相應(yīng)的方法getBundle,這個方法可以根據(jù)來訪者的國家地區(qū)自動獲取與之對應(yīng)的資源文件予以顯示。ResourceBundle類提供了一個靜態(tài)方法getBundle,該方法用于裝載資源文件,并創(chuàng)建ResourceBundle實例:LocalecurrentLocale=Locale.ge
33、tDefault();ResourceBundlemyResources=ResourceBundle.getBundle(basename,currentLocale);basename為資源包基名(且必須為完整路徑)。如果與該locale對象匹配的資源包子類找不到。一般情況下,則選用默認(rèn)資源文件予以顯示。加載資源文件后, 程序就可以調(diào)用ResourceBundle 實例對象的 getString 方法獲取指定的資源信息名稱所對應(yīng)的值。Stringvalue=myResources.getString(“key);范例:根據(jù)國家地區(qū)自動獲取與之對應(yīng)的資源文件packageme.gacl.i1
34、8n;importjava.util.Locale;importjava.util.ResourceBundle;/*ClassName:I18NTest*Description:編程實現(xiàn)固定文本的國際化*author:孤傲蒼狼*date:2014-8-29下午9:34:05*/publicclassI18NTestpublicstaticvoidmain(Stringargs)/資源包基名(包名+myproperties)Stringbasename=me.gacl.i18n.resource.myproperties;/設(shè)置語言環(huán)境Localecn=Locale.CHINA;/中文Loca
35、leus=Locale.US;/英文/根據(jù)基名和語言環(huán)境加載對應(yīng)的語言資源文件ResourceBundlemyResourcesCN=ResourceBundle.getBundle(basename,cn);/加載myproperties_pertiesResourceBundlemyResourcesUS=ResourceBundle.getBundle(basename,us);/加載myproperties_perties/加載資源文件后,程序就可以調(diào)用ResourceBundle實例對象的getString方法獲取指定的資源信息名稱所對應(yīng)的值。/Stringv
36、alue=myResources.getString(“key);StringusernameCN=myResourcesCN.getString(username);StringpasswordCN=myResourcesCN.getString(password);StringusernameUS=myResourcesUS.getString(username);StringpasswordUS=myResourcesUS.getString(password);System.out.println(usernameCN+-+passwordCN);System.out.println(
37、usernameUS+-+passwordUS);運行結(jié)果:3.4、在WEB應(yīng)用中實現(xiàn)固定文本的國際化如下所示:國際化(i18n)測試:inputtype=submitvalue=運行結(jié)果:瀏覽器語言是中文環(huán)境下的顯示效果:瀏覽器語言是英文環(huán)境下的顯示效果:同樣一個頁面,在不同語言環(huán)境的瀏覽器下顯示出了不同的語言文字效果,這樣就實現(xiàn)了固定文本的國際化。IE瀏覽器切換使用語言:工具Internet選項四、動態(tài)數(shù)據(jù)的國際化數(shù)值,貨幣,時間,日期等數(shù)據(jù)由于可能在程序運行時動態(tài)產(chǎn)生,所以無法像文字一樣簡單地將它們從應(yīng)用程序中分離出來,而是需要特殊處理。Java 中提供了解決這些問題的 API 類(位于
38、 java.util 包和 java.text 包中)4.1、Locale 類Locale 實例對象代表一個特定的地理,政治、文化區(qū)域。一個 Locale 對象本身不會驗證它代表的語言和國家地區(qū)信息是否正確,只是向本地敏感的類提供國家地區(qū)信息,與國際化相關(guān)的格式化和解析任務(wù)由本地敏感的類去完成。(若JDK中的某個類在運行時需要根據(jù) Locale 對象來調(diào)整其功能,這個類就稱為本地敏感類)4.2、DateFormat類(日期格式化)DateFormat 類可以將一個日期/時間對象格式化為表示某個國家地區(qū)的日期/時間字符串。DateFormat 類除了可按國家地區(qū)格式化輸出日期外,它還定義了一些用
39、于描述日期/時間的顯示模式的 int 型的常量,包括FULL, LONG, MEDIUM, DEFAULT, SHORT,實例化DateFormat對象時,可以使用這些常量,控制日期/時間的顯示長度。4.2.1、實例化DateFormat類實例化DateFormat類有九種方式,以下三種為帶參形式,下面列出的三種方式也可以分別不帶參,或只帶顯示樣式的參數(shù)。getDateInstance(int style, Locale aLocale):以指定的日期顯示模式和本地信息來獲得DateFormat實例對象,該實例對象不處理時間值部分。getTimeInstance(int style, Loca
40、le aLocale):以指定的時間顯示模式和本地信息來獲得DateFormat實例對象,該實例對象不處理日期值部分。getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale):以單獨指定的日期顯示模式、時間顯示模式和本地信息來獲得DateFormat實例對象。4.2.2、DateFormat 對象的方法format:將date對象格式化為符合某個本地環(huán)境習(xí)慣的字符串。parse:將字符串解析為日期/時間對象注意:parse和format完全相反,一個是把date時間轉(zhuǎn)化為相應(yīng)地區(qū)和國家的顯示樣式,一個是把相應(yīng)地區(qū)的時間日
41、期轉(zhuǎn)化成date對象,該方法在使用時,解析的時間或日期要符合指定的國家、地區(qū)格式,否則會拋異常。DateFormat 對象通常不是線程安全的,每個線程都應(yīng)該創(chuàng)建自己的 DateFormat 實例對象4.2.3、DateFormat使用范例packageme.gacl.i18n;importjava.text.DateFormat;importjava.text.ParseException;importjava.util.Date;importjava.util.Locale;/*ClassName:DateFormatTest*Description:DateFormat類測試*DateFo
42、rmat類可以將一個日期/時間對象格式化為表示某個國家地區(qū)的日期/時間字符串*author:孤傲蒼狼*date:2014-8-29下午10:03:26*/publicclassDateFormatTestpublicstaticvoidmain(Stringargs)throwsParseExceptionDatedate=newDate();/當(dāng)前這一刻的時間(日期、時間)/輸出日期部分DateFormatdf=DateFormat.getDateInstance(DateFormat.FULL,Locale.GERMAN);Stringresult=df.format(date);Syst
43、em.out.println(result);/輸出時間部分df=DateFormat.getTimeInstance(DateFormat.FULL,Locale.CHINA);result=df.format(date);System.out.println(result);/輸出日期和時間df=DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.LONG,Locale.CHINA);result=df.format(date);System.out.println(result);/把字符串反向解析成一個date對象Str
44、ings=10-9-26下午02時49分53秒;df=DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.LONG,Locale.CHINA);Dated=df.parse(s);System.out.println(d);4.3、NumberFormat類(數(shù)字格式化)NumberFormat類可以將一個數(shù)值格式化為符合某個國家地區(qū)習(xí)慣的數(shù)值字符串,也可以將符合某個國家地區(qū)習(xí)慣的數(shù)值字符串解析為對應(yīng)的數(shù)值NumberFormat類的方法:format 方法:將一個數(shù)值格式化為符合某個國家地區(qū)習(xí)慣的數(shù)值字符串parse 方法:將
45、符合某個國家地區(qū)習(xí)慣的數(shù)值字符串解析為對應(yīng)的數(shù)值。實例化NumberFormat類時,可以使用locale對象作為參數(shù),也可以不使用,下面列出的是使用參數(shù)的。getNumberInstance(Locale locale):以參數(shù)locale對象所標(biāo)識的本地信息來獲得具有多種用途的NumberFormat實例對象getIntegerInstance(Locale locale):以參數(shù)locale對象所標(biāo)識的本地信息來獲得處理整數(shù)的NumberFormat實例對象getCurrencyInstance(Locale locale):以參數(shù)locale對象所標(biāo)識的本地信息來獲得處理貨幣的NumberFormat實例對象getPercentInstance(Locale locale):以參數(shù)locale對象所標(biāo)識的本地信息來獲得處理百分比數(shù)值的NumberFormat實例對象范例:packageme.gacl.i18n;importjava.tex
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國精喹禾靈數(shù)據(jù)監(jiān)測研究報告
- 科技與生活的融合家居中語音識別的應(yīng)用研究
- 二零二五年度人社部員工勞動合同企業(yè)年金與福利待遇合同
- 2025年度退貨商品退換貨時限協(xié)議
- 社區(qū)居民心理健康教育與文化傳承
- 業(yè)務(wù)信息合同范本
- 2025至2030年中國監(jiān)控病床數(shù)據(jù)監(jiān)測研究報告
- 科技發(fā)展下的新型石油化工設(shè)備防爆檢測技術(shù)
- 玉器加盟合同范本
- 科技助力商業(yè)發(fā)展-新產(chǎn)品前瞻
- 《魏書生班主任工作漫談》讀書心得體會課件
- 湖南高速鐵路職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試參考試題庫(含答案)
- 中考語文非連續(xù)性文本閱讀10篇專項練習(xí)及答案
- (新版)網(wǎng)絡(luò)攻防知識考試題庫(含答案)
- 教育評價學(xué)全套ppt課件完整版教學(xué)教程
- 市政工程主要施工機械設(shè)備
- 書香里的童年
- 三周滾動進度計劃
- 電焊機檢驗記錄
- 作文紙(可直接打印)
- E時代大學(xué)英語讀寫教程2答案
評論
0/150
提交評論