Pengantarabangsaan Servlet


Sebelum kita bermula, mari kita lihat tiga istilah penting:

  • Pengantarabangsaan (i18n): Ini bermakna Tapak web menyediakan versi yang berbeza kandungan yang diterjemahkan ke dalam bahasa atau kewarganegaraan pelawat.

  • Penyetempatan (l10n): Ini bermakna menambah sumber pada tapak web untuk menyesuaikannya dengan kawasan geografi atau budaya tertentu, seperti menterjemah tapak web ke bahasa Hindi (Hindi ).

  • Tempat: Ini ialah kawasan budaya atau geografi yang istimewa. Ia biasanya merujuk kepada simbol bahasa diikuti dengan garis bawah dan simbol negara. Contohnya "en_US" mewakili tempat Inggeris untuk AS.

Terdapat beberapa pertimbangan semasa membina tapak web global. Tutorial ini tidak akan menerangkan butiran penuh tentang pertimbangan ini, tetapi ia akan memberi anda contoh yang baik tentang cara menggunakan penyasaran pembezaan (iaitu tetapan tempat) untuk memaparkan halaman dalam bahasa yang berbeza.

Servlet boleh memilih versi tapak web yang sesuai berdasarkan tempat peminta dan menyediakan versi tapak web yang sesuai berdasarkan bahasa, budaya dan keperluan tempatan. Berikut ialah kaedah dalam objek permintaan yang mengembalikan objek Tempatan.

java.util.Locale request.getLocale()

Mengesan tempattempat

Disenaraikan di bawah ialah kaedah tempattempat penting yang boleh anda gunakan untuk mengesan geolokasi, bahasa dan tempat peminta. Semua kaedah di bawah memaparkan nama negara dan nama bahasa yang ditetapkan dalam penyemak imbas peminta.

Nombor siriKaedah & Perihalan
1
序号方法 & 描述
1String getCountry()
该方法以 2 个大写字母形式的 ISO 3166 格式返回该区域设置的国家/地区代码。
2String getDisplayCountry()
该方法返回适合向用户显示的区域设置的国家的名称。
3String getLanguage()
该方法以小写字母形式的 ISO 639 格式返回该区域设置的语言代码。
4String getDisplayLanguage()
该方法返回适合向用户显示的区域设置的语言的名称。
5String getISO3Country()
该方法返回该区域设置的国家的三个字母缩写。
6String getISO3Language()
该方法返回该区域设置的语言的三个字母的缩写。
String getCountry()<🎜>
Kaedah ini mengembalikan negara tempat ini dalam format ISO 3166 dengan 2 huruf besar Kawasan kod.
2<🎜>String getDisplayCountry()<🎜>
Kaedah ini mengembalikan nama negara yang sesuai untuk tempat yang dipaparkan kepada pengguna itu.
3<🎜>String getLanguage()<🎜>
Kaedah ini mengembalikan tempat dalam kod bahasa format ISO 639 huruf kecil.
4<🎜>String getDisplayLanguage()<🎜>
Kaedah ini mengembalikan nama bahasa yang sesuai untuk tempat yang dipaparkan kepada pengguna itu.
5<🎜>String getISO3Country()<🎜>
Kaedah ini mengembalikan singkatan tiga huruf negara untuk tempat ini .
6<🎜>String getISO3Language()<🎜>
Kaedah ini mengembalikan singkatan tiga huruf bagi bahasa tempat ini .

Contoh

Contoh ini menunjukkan cara memaparkan bahasa dan negara berkaitan permintaan:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;

public class GetLocale extends HttpServlet{
    
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 获取客户端的区域设置
      Locale locale = request.getLocale();
      String language = locale.getLanguage();
      String country = locale.getCountry();

      // 设置响应内容类型
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();

      String title = "检测区域设置";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
        "<html>\n" +
        "<head><title>" + title + "</title></head>\n" +
        "<body bgcolor=\"#f0f0f0\">\n" +
        "<h1 align=\"center\">" + language + "</h1>\n" +
        "<h2 align=\"center\">" + country + "</h2>\n" +
        "</body></html>");
  }
}

Tetapan Bahasa

Servlet boleh mengeluarkan dalam bahasa Eropah Barat ​​( seperti Inggeris, Sepanyol, Jerman, Perancis, Itali, Belanda, dll.). Di sini, untuk memaparkan semua aksara dengan betul, adalah sangat penting untuk menetapkan pengepala Kandungan-Bahasa.

Perkara kedua ialah menggunakan entiti HTML untuk memaparkan semua aksara khas, contohnya, "ñ" bermaksud "ñ", "¡" bermaksud "¡", seperti berikut:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;

public class DisplaySpanish extends HttpServlet{
    
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
    // 设置响应内容类型
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    // 设置西班牙语言代码
    response.setHeader("Content-Language", "es");

    String title = "En Espa&ntilde;ol";
    String docType =
     "<!doctype html public \"-//w3c//dtd html 4.0 " +
     "transitional//en\">\n";
     out.println(docType +
     "<html>\n" +
     "<head><title>" + title + "</title></head>\n" +
     "<body bgcolor=\"#f0f0f0\">\n" +
     "<h1>" + "En Espa&ntilde;ol:" + "</h1>\n" +
     "<h1>" + "&iexcl;Hola Mundo!" + "</h1>\n" +
     "</body></html>");
  }
}

Tarikh khusus setempat

Anda boleh menggunakan kelas java.text.DateFormat dan kaedah statiknya getDateTimeInstance() untuk memformat tarikh dan masa khusus setempat. Contoh berikut menunjukkan cara memformat tarikh khusus untuk tempat tertentu:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;
import java.text.DateFormat;
import java.util.Date;

public class DateLocale extends HttpServlet{
    
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
    // 设置响应内容类型
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    // 获取客户端的区域设置
    Locale locale = request.getLocale( );
    String date = DateFormat.getDateTimeInstance(
                                  DateFormat.FULL, 
                                  DateFormat.SHORT, 
                                  locale).format(new Date( ));

    String title = "特定于区域设置的日期";
    String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
      "<html>\n" +
      "<head><title>" + title + "</title></head>\n" +
      "<body bgcolor=\"#f0f0f0\">\n" +
      "<h1 align=\"center\">" + date + "</h1>\n" +
      "</body></html>");
  }
}

Mata wang khusus tempatan

Anda boleh menggunakan kelas java.text.NumberFormat dan kaedah Statiknya getCurrencyInstance() untuk formatkan nombor (seperti panjang atau dua kali ganda) ke dalam mata wang khusus setempat. Contoh berikut menunjukkan cara memformat mata wang khusus untuk tempat tertentu:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;
import java.text.NumberFormat;
import java.util.Date;

public class CurrencyLocale extends HttpServlet{
    
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
    // 设置响应内容类型
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    // 获取客户端的区域设置
    Locale locale = request.getLocale( );
    NumberFormat nft = NumberFormat.getCurrencyInstance(locale);
    String formattedCurr = nft.format(1000000);

    String title = "特定于区域设置的货币";
    String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
      "<html>\n" +
      "<head><title>" + title + "</title></head>\n" +
      "<body bgcolor=\"#f0f0f0\">\n" +
      "<h1 align=\"center\">" + formattedCurr + "</h1>\n" +
      "</body></html>");
  }
}

Peratusan khusus setempat

Anda boleh menggunakan kelas java.text.NumberFormat dan kaedah Statiknya getPercentInstance() untuk memformat peratusan khusus setempat. Contoh berikut menunjukkan cara memformat peratusan khusus untuk tempat tertentu:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;
import java.text.NumberFormat;
import java.util.Date;

public class PercentageLocale extends HttpServlet{
    
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
    // 设置响应内容类型
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    // 获取客户端的区域设置
    Locale locale = request.getLocale( );
    NumberFormat nft = NumberFormat.getPercentInstance(locale);
    String formattedPerc = nft.format(0.51);

    String title = "特定于区域设置的百分比";
    String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
      "<html>\n" +
      "<head><title>" + title + "</title></head>\n" +
      "<body bgcolor=\"#f0f0f0\">\n" +
      "<h1 align=\"center\">" + formattedPerc + "</h1>\n" +
      "</body></html>");
  }
}