ฉันต้องการที่จะตั้งค่าเริ่มต้นLocale
สำหรับ JVM fr_CA
ของฉันไป ตัวเลือกที่เป็นไปได้ในการทำเช่นนี้คืออะไร?
ฉันรู้ทางเลือกเดียวเท่านั้น Locale.setDefault()
ฉันต้องการที่จะตั้งค่าเริ่มต้นLocale
สำหรับ JVM fr_CA
ของฉันไป ตัวเลือกที่เป็นไปได้ในการทำเช่นนี้คืออะไร?
ฉันรู้ทางเลือกเดียวเท่านั้น Locale.setDefault()
คำตอบ:
จากการอ้างอิงของ Oracle :
ตำแหน่งที่ตั้งเริ่มต้นของแอปพลิเคชันของคุณถูกกำหนดในสามวิธี ก่อนอื่นยกเว้นว่าคุณได้เปลี่ยนค่าเริ่มต้นอย่างชัดเจน
Locale.getDefault()
เมธอดจะส่งคืนโลแคลที่ถูกกำหนดโดย Java Virtual Machine (JVM) ในครั้งแรกเมื่อโหลดครั้งแรก นั่นคือ JVM กำหนดโลแคลดีฟอลต์จากสภาวะแวดล้อมโฮสต์ โลแคลของสภาพแวดล้อมโฮสต์ถูกกำหนดโดยระบบปฏิบัติการโฮสต์และการกำหนดค่าตามความชอบของผู้ใช้ที่สร้างบนระบบนั้นประการที่สองในบาง Java Runtime การใช้งานผู้ใช้แอพลิเคชันสามารถแทนที่ตำแหน่งที่ตั้งเริ่มต้นของโฮสต์โดยการให้ข้อมูลนี้ในบรรทัดคำสั่งโดยการตั้งค่า
user.language
,user.country
และuser.variant
คุณสมบัติของระบบประการที่สามแอปพลิเคชันของคุณสามารถเรียก
Locale.setDefault(Locale)
วิธีการนี้ได้ เมธอด setDefault (Locale aLocale) ช่วยให้แอปพลิเคชันของคุณตั้งค่าทรัพยากรทั้งระบบ(จริง ๆ แล้วกว้างทั้ง VM) หลังจากคุณตั้งค่าโลแคลเริ่มต้นด้วยวิธีนี้แล้วการโทรไปที่ Locale.getDefault () ที่ตามมาจะส่งคืนโลแคลที่ตั้งค่าใหม่
คุณสามารถตั้งค่าบนบรรทัดคำสั่งผ่านพารามิเตอร์ JVM:
java -Duser.country=CA -Duser.language=fr ... com.x.Main
สำหรับข้อมูลเพิ่มเติมดูที่การทำให้เป็นสากล: การทำความเข้าใจกับสถานที่ในแพลตฟอร์ม Java - การใช้สถานที่เกิดเหตุ
setx _JAVA_OPTIONS -Dsun.locale.formatasdefault=true /m
คุณสามารถใช้ JVM args
java -Duser.country=ES -Duser.language=es -Duser.variant=Traditional_WIN
ในคำตอบที่นี่จนถึงตอนนี้เราพบสองวิธีในการเปลี่ยนการตั้งค่าภาษา JRE:
โดยทางโปรแกรมใช้Locale.setDefault () (ซึ่งในกรณีของฉันเป็นวิธีแก้ปัญหาเนื่องจากฉันไม่ต้องการให้ผู้ใช้ดำเนินการใด ๆ ):
Locale.setDefault(new Locale("pt", "BR"));
ผ่านการโต้แย้งกับ JVM:
java -jar anApp.jar -Duser.language=pt-BR
แต่ตามที่อ้างอิงฉันต้องการทราบว่าบน Windows มีวิธีหนึ่งในการเปลี่ยนภาษาที่ใช้โดย JRE ดังที่บันทึกไว้ที่นี่ : เปลี่ยนภาษาทั่วทั้งระบบ
หมายเหตุ : คุณจะต้องเข้าสู่ระบบด้วยบัญชีที่มีสิทธิ์ของผู้ดูแลระบบ
คลิกเริ่ม> แผงควบคุม
Windows 7 และ Vista: คลิกนาฬิกาภาษาและภูมิภาค> ภูมิภาคและภาษา
Windows XP: ดับเบิ้ลคลิกที่ภูมิภาคและภาษาตัวเลือก ไอคอน
ภูมิภาคและภาษาตัวเลือกกล่องโต้ตอบปรากฏขึ้น
Windows 7: คลิกแท็บการดูแลระบบ
Windows XP และ Vista: คลิกแท็บขั้นสูง
(หากไม่มีแท็บขั้นสูงแสดงว่าคุณไม่ได้ลงชื่อเข้าใช้ด้วยสิทธิ์ระดับผู้ดูแลระบบ)
ภายใต้ส่วนภาษาสำหรับโปรแกรมที่ไม่ใช่ Unicodeให้เลือกภาษาที่ต้องการจากเมนูแบบเลื่อนลง
คลิกตกลง
ระบบจะแสดงกล่องโต้ตอบถามว่าจะใช้ไฟล์ที่มีอยู่หรือติดตั้งจากซีดีระบบปฏิบัติการ ตรวจสอบให้แน่ใจว่าคุณมีซีดีพร้อม
ทำตามคำแนะนำที่แนะนำเพื่อติดตั้งไฟล์
รีสตาร์ทคอมพิวเตอร์หลังจากการติดตั้งเสร็จสมบูรณ์
แน่นอนบน Linux JRE ยังใช้การตั้งค่าระบบเพื่อกำหนดภาษาที่จะใช้ แต่คำแนะนำในการตั้งค่าการเปลี่ยนภาษาทั่วทั้งระบบจาก distro เป็น distro
มีอีกถ้าคุณไม่ต้องการเปลี่ยนสถานที่ของระบบ แต่ JVM คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อม System (หรือผู้ใช้) JAVA_TOOL_OPTIONS
และตั้งค่าเป็น-Duser.language=en-US
หรือภาษาอื่น ๆ ที่คุณต้องการ
คุณสามารถบังคับใช้อาร์กิวเมนต์ VM สำหรับJAR
ไฟล์ด้วยรหัสต่อไปนี้:
import java.io.File;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
public class JVMArgumentEnforcer
{
private String argument;
public JVMArgumentEnforcer(String argument)
{
this.argument = argument;
}
public static long getTotalPhysicalMemory()
{
com.sun.management.OperatingSystemMXBean bean =
(com.sun.management.OperatingSystemMXBean)
java.lang.management.ManagementFactory.getOperatingSystemMXBean();
return bean.getTotalPhysicalMemorySize();
}
public static boolean isUsing64BitJavaInstallation()
{
String bitVersion = System.getProperty("sun.arch.data.model");
return bitVersion.equals("64");
}
private boolean hasTargetArgument()
{
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
List<String> inputArguments = runtimeMXBean.getInputArguments();
return inputArguments.contains(argument);
}
public void forceArgument() throws Exception
{
if (!hasTargetArgument())
{
// This won't work from IDEs
if (JARUtilities.isRunningFromJARFile())
{
// Supply the desired argument
restartApplication();
} else
{
throw new IllegalStateException("Please supply the VM argument with your IDE: " + argument);
}
}
}
private void restartApplication() throws Exception
{
String javaBinary = getJavaBinaryPath();
ArrayList<String> command = new ArrayList<>();
command.add(javaBinary);
command.add("-jar");
command.add(argument);
String currentJARFilePath = JARUtilities.getCurrentJARFilePath();
command.add(currentJARFilePath);
ProcessBuilder processBuilder = new ProcessBuilder(command);
processBuilder.start();
// Kill the current process
System.exit(0);
}
private String getJavaBinaryPath()
{
return System.getProperty("java.home")
+ File.separator + "bin"
+ File.separator + "java";
}
public static class JARUtilities
{
static boolean isRunningFromJARFile() throws URISyntaxException
{
File currentJarFile = getCurrentJARFile();
return currentJarFile.getName().endsWith(".jar");
}
static String getCurrentJARFilePath() throws URISyntaxException
{
File currentJarFile = getCurrentJARFile();
return currentJarFile.getPath();
}
private static File getCurrentJARFile() throws URISyntaxException
{
return new File(JVMArgumentEnforcer.class.getProtectionDomain().getCodeSource().getLocation().toURI());
}
}
}
มันถูกใช้ดังนี้:
JVMArgumentEnforcer jvmArgumentEnforcer = new JVMArgumentEnforcer("-Duser.language=pt-BR"); // For example
jvmArgumentEnforcer.forceArgument();
คุณสามารถทำได้:
และเพื่อจับภาพสถานที่ คุณสามารถทำได้:
private static final String LOCALE = LocaleContextHolder.getLocale().getLanguage()
+ "-" + LocaleContextHolder.getLocale().getCountry();