setlocalesupport.java
来自「jakarta-taglibs」· Java 代码 · 共 464 行 · 第 1/2 页
JAVA
464 行
boolean format,
Locale[] avail) {
LocalizationContext locCtxt = null;
// Get formatting locale from enclosing <fmt:bundle>
Tag parent = findAncestorWithClass(fromTag, BundleSupport.class);
if (parent != null) {
/*
* use locale from localization context established by parent
* <fmt:bundle> action, unless that locale is null
*/
locCtxt = ((BundleSupport) parent).getLocalizationContext();
if (locCtxt.getLocale() != null) {
if (format) {
setResponseLocale(pc, locCtxt.getLocale());
}
return locCtxt.getLocale();
}
}
// Use locale from default I18N localization context, unless it is null
if ((locCtxt = BundleSupport.getLocalizationContext(pc)) != null) {
if (locCtxt.getLocale() != null) {
if (format) {
setResponseLocale(pc, locCtxt.getLocale());
}
return locCtxt.getLocale();
}
}
/*
* Establish formatting locale by comparing the preferred locales
* (in order of preference) against the available formatting
* locales, and determining the best matching locale.
*/
Locale match = null;
Locale pref = getLocale(pc, Config.FMT_LOCALE);
if (pref != null) {
// Preferred locale is application-based
match = findFormattingMatch(pref, avail);
} else {
// Preferred locales are browser-based
match = findFormattingMatch(pc, avail);
}
if (match == null) {
//Use fallback locale.
pref = getLocale(pc, Config.FMT_FALLBACK_LOCALE);
if (pref != null) {
match = findFormattingMatch(pref, avail);
}
}
if (format && (match != null)) {
setResponseLocale(pc, match);
}
return match;
}
/**
* Setup the available formatting locales that will be used
* by getFormattingLocale(PageContext).
*/
static Locale[] availableFormattingLocales;
static {
Locale[] dateLocales = DateFormat.getAvailableLocales();
Locale[] numberLocales = NumberFormat.getAvailableLocales();
Vector vec = new Vector(dateLocales.length);
for (int i=0; i<dateLocales.length; i++) {
for (int j=0; j<numberLocales.length; j++) {
if (dateLocales[i].equals(numberLocales[j])) {
vec.add(dateLocales[i]);
break;
}
}
}
availableFormattingLocales = new Locale[vec.size()];
availableFormattingLocales = (Locale[])vec.toArray(availableFormattingLocales);
/*
for (int i=0; i<availableFormattingLocales.length; i++) {
System.out.println("AvailableLocale[" + i + "] " + availableFormattingLocales[i]);
}
*/
}
/*
* Returns the formatting locale to use when <fmt:message> is used
* with a locale-less localization context.
*
* @param pc The page context containing the formatting action
* @return the formatting locale to use
*/
static Locale getFormattingLocale(PageContext pc) {
/*
* Establish formatting locale by comparing the preferred locales
* (in order of preference) against the available formatting
* locales, and determining the best matching locale.
*/
Locale match = null;
Locale pref = getLocale(pc, Config.FMT_LOCALE);
if (pref != null) {
// Preferred locale is application-based
match = findFormattingMatch(pref, availableFormattingLocales);
} else {
// Preferred locales are browser-based
match = findFormattingMatch(pc, availableFormattingLocales);
}
if (match == null) {
//Use fallback locale.
pref = getLocale(pc, Config.FMT_FALLBACK_LOCALE);
if (pref != null) {
match = findFormattingMatch(pref, availableFormattingLocales);
}
}
if (match != null) {
setResponseLocale(pc, match);
}
return match;
}
/*
* Returns the locale specified by the named scoped attribute or context
* configuration parameter.
*
* <p> The named scoped attribute is searched in the page, request,
* session (if valid), and application scope(s) (in this order). If no such
* attribute exists in any of the scopes, the locale is taken from the
* named context configuration parameter.
*
* @param pageContext the page in which to search for the named scoped
* attribute or context configuration parameter
* @param name the name of the scoped attribute or context configuration
* parameter
*
* @return the locale specified by the named scoped attribute or context
* configuration parameter, or <tt>null</tt> if no scoped attribute or
* configuration parameter with the given name exists
*/
static Locale getLocale(PageContext pageContext, String name) {
Locale loc = null;
Object obj = Config.find(pageContext, name);
if (obj != null) {
if (obj instanceof Locale) {
loc = (Locale) obj;
} else {
loc = parseLocale((String) obj);
}
}
return loc;
}
//*********************************************************************
// Private utility methods
/*
* Determines the client's preferred locales from the request, and compares
* each of the locales (in order of preference) against the available
* locales in order to determine the best matching locale.
*
* @param pageContext Page containing the formatting action
* @param avail Available formatting locales
*
* @return Best matching locale, or <tt>null</tt> if no match was found
*/
private static Locale findFormattingMatch(PageContext pageContext,
Locale[] avail) {
Locale match = null;
for (Enumeration enum_ = Util.getRequestLocales((HttpServletRequest)pageContext.getRequest());
enum_.hasMoreElements(); ) {
Locale locale = (Locale)enum_.nextElement();
match = findFormattingMatch(locale, avail);
if (match != null) {
break;
}
}
return match;
}
/*
* Returns the best match between the given preferred locale and the
* given available locales.
*
* The best match is given as the first available locale that exactly
* matches the given preferred locale ("exact match"). If no exact match
* exists, the best match is given to an available locale that meets
* the following criteria (in order of priority):
* - available locale's variant is empty and exact match for both
* language and country
* - available locale's variant and country are empty, and exact match
* for language.
*
* @param pref the preferred locale
* @param avail the available formatting locales
*
* @return Available locale that best matches the given preferred locale,
* or <tt>null</tt> if no match exists
*/
private static Locale findFormattingMatch(Locale pref, Locale[] avail) {
Locale match = null;
boolean langAndCountryMatch = false;
for (int i=0; i<avail.length; i++) {
if (pref.equals(avail[i])) {
// Exact match
match = avail[i];
break;
} else if (
!"".equals(pref.getVariant()) &&
"".equals(avail[i].getVariant()) &&
pref.getLanguage().equals(avail[i].getLanguage()) &&
pref.getCountry().equals(avail[i].getCountry())) {
// Language and country match; different variant
match = avail[i];
langAndCountryMatch = true;
} else if (
!langAndCountryMatch &&
pref.getLanguage().equals(avail[i].getLanguage()) &&
("".equals(avail[i].getCountry()))) {
// Language match
if (match == null) {
match = avail[i];
}
}
}
return match;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?