`
iffiffj
  • 浏览: 158767 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

异常信息国际化

    博客分类:
  • WEB
阅读更多
JAVA代码
package com.ce.common.util;

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.springframework.context.MessageSourceResolvable;
import org.springframework.context.NoSuchMessageException;
import org.springframework.context.support.ResourceBundleMessageSource;

public class I18N {

	private static Map<String, I18N> i18nMap = new HashMap<String, I18N>();
	private String namespace = "default_i18n";
	private String[] basenames = new String[0];
	private ResourceBundleMessageSource resourceBundleMessageSource = null;

	public I18N() {
		i18nMap.put("default_i18n", this);
	}

	public static I18N getI18N(String namespace) {
		return i18nMap.get(namespace);
	}

	public String getNamespace() {
		return namespace;
	}

	public void setNamespace(String namespace) {
		this.namespace = namespace;
		if (i18nMap.containsKey(namespace)) {
			throw new IllegalArgumentException("duplicated namespace: "
					+ namespace);
		}
		i18nMap.put(namespace, this);
	}

	public String[] getBasenames() {
		return basenames;
	}

	public void setBasenames(String[] basenames) {
		this.basenames = basenames;
	}

	public ResourceBundleMessageSource getResourceBundleMessageSource() {
		if (resourceBundleMessageSource == null) {
			resourceBundleMessageSource = new ResourceBundleMessageSource();
			resourceBundleMessageSource.setBasenames(getBasenames());
		}
		return resourceBundleMessageSource;
	}

	public void setResourceBundleMessageSource(
			ResourceBundleMessageSource resourceBundleMessageSource) {
		this.resourceBundleMessageSource = resourceBundleMessageSource;
	}

	public String getMessage(String code, Object[] args, String defaultMessage,
			Locale locale) {
		String message = code;
		try {
			message = getResourceBundleMessageSource().getMessage(code,
					praseArgs(args, locale, this), defaultMessage, locale);
		} catch (Exception e) {
		}
		return message;
	}

	public String getMessage(String code, Locale locale)
			throws NoSuchMessageException {
		String message = code;
		try {
			message = getResourceBundleMessageSource().getMessage(code, null,
					locale);
		} catch (Exception e) {
		}
		return message;
	}

	public String getMessage(String code, Object[] args, Locale locale)
			throws NoSuchMessageException {
		String message = code;
		try {
			message = getResourceBundleMessageSource().getMessage(code,
					praseArgs(args, locale, this), locale);
		} catch (Exception e) {
		}
		return message;
	}

	public String getMessage(MessageSourceResolvable resolvable, Locale locale)
			throws NoSuchMessageException {
		return getResourceBundleMessageSource().getMessage(resolvable, locale);
	}

	private static Pattern p = Pattern.compile("\\$\\{([\\w.]+)\\}");

	private static Object[] praseArgs(Object[] args, Locale locale, I18N i18n) {
		if (args == null || args.length == 0) {
			return args;
		}
		StringBuffer sb = new StringBuffer(128);
		for (int i = 0; i < args.length; i++) {
			try {
				if (!(args[i] != null && (args[i] instanceof String))) {
					continue;
				}
				String str = (String) args[i];
				if (!(str.indexOf("${") > -1)) {
					continue;
				}
				sb.setLength(0);
				Matcher matcher = p.matcher(str);
				while (matcher.find()) {
					String replace = matcher.group();
					try {
						replace = i18n.getMessage(matcher.group(1), locale);
					} catch (Exception e) {
						e.printStackTrace();
					}
					matcher.appendReplacement(sb, replace);
				}
				matcher.appendTail(sb);
				args[i] = sb.toString();
			} catch (Exception e) {
			}
		}
		return args;
	}
}

异常信息国际化
1.在Spring配置文件中配置异常信息国际化
	<bean class="com.ce.common.util.I18N" lazy-init="false">
		<property name="namespace" value="ATMS" />
		<property name="resourceBundleMessageSource">
			<bean
				class="org.springframework.context.support.ResourceBundleMessageSource"
				lazy-init="false">
				<property name="basenames">
					<list>
						<value>i18n.atms.atms</value>
						<value>i18n.atms.messages</value>
					</list>
				</property>
			</bean>
		</property>
	</bean>

其中namespace中必需的,不同的项目其namespace需要不同,重复的namespace会出错
2.结合Action使用
	public String getMessage(HttpServletRequest request, String code,
			String defaultMessage, Object[] args) {
		return getI18N().getMessage(code, args, defaultMessage, request.getLocale());
	}

	public String getMessage(HttpServletRequest request, String code) {
		return getI18N().getMessage(code, request.getLocale());
	}

	public String getMessage(HttpServletRequest request, String code,
			Object[] args) {
		return getI18N().getMessage(code, args, request.getLocale());
	}

	public I18N getI18N() {
		return I18N.getI18N("ATMS");
	}

3.使用效果示例
error.a=添加 {0} 出错
error.b=实体B
error.c=实体C
getMessage(request, "error.a") --> 添加 {0} 出错
getMessage(request, "error.a", new Object[]{"Test"}) --> 添加 Test 出错
getMessage(request, "error.a", new Object[]{"${error.b}"}) --> 添加 实体B 出错
分享到:
评论

相关推荐

    基于i18n国际化微服务统一处理错误码

    通过结合SpringBoot框架和i18n(国际化)技术,我们可以实现错误信息的多语言支持,让错误信息能够适应不同的用户群体。 首先,让我们来深入理解SpringBoot。SpringBoot是Spring框架的一个子项目,它简化了创建独立...

    异常、信息国际化样例

    标题中的“异常、信息国际化样例”提示我们这个压缩包可能包含有关程序中错误处理(异常)和多语言支持(国际化)的示例代码或文档。描述中的“NULL”表明没有提供具体信息,但我们可以根据标签和文件名来推测内容。...

    SSM笔记-SpringMVC的数据格式化 、数据校验、错误提示、错误信息国际化、返回json

    本笔记主要关注SpringMVC中的几个关键特性:数据格式化、数据校验、错误提示、错误信息国际化以及如何返回JSON数据。 1. 数据格式化: 在SpringMVC中,数据格式化是将用户输入的数据转换为业务对象的过程。这通常...

    struts1.2 国际化

    - **错误处理**:确保国际化应用在不同语言环境下都能够正确显示错误信息,并且能够优雅地处理各种异常情况。 #### 六、总结 Struts 1.2 框架提供的国际化支持使得开发者能够轻松创建支持多语言的应用程序。通过...

    上位机Winform实现多语言国际化

    本话题聚焦于“上位机Winform实现多语言国际化”,这涉及到Windows Forms应用程序的开发,以及如何让其支持多种语言,以满足全球用户的使用需求。同时,描述中提到的“与西门子PLC通讯的代码”意味着我们还会讨论...

    .net国际化语言封装类库

    在.NET开发中,实现应用程序的国际化是一项重要的任务,它允许软件与不同地区和语言的用户进行有效交流。".NET国际化语言封装类库"是专为此目的设计的一个工具,旨在简化.NET平台上的多语言支持。这个类库使得开发者...

    struts2框架国际化

    Struts2框架中的错误和异常消息也能被国际化。在配置文件中定义全局异常处理,通过`key`属性指定资源文件中的键,如`&lt;global-exception-mappings&gt;&lt;exception key="java.lang.Throwable" result="error"/&gt;...

    5.3验证框架$国际化

    4. 在控制器中捕获验证异常,利用`MessageSource`获取国际化后的错误消息并展示给用户。 总之,Java的国际化验证是开发全球化软件的重要环节。通过合理利用验证框架和`ResourceBundle`,我们可以轻松地实现多语言...

    Struts+Hibernate+Spring(加入了struts完整的自动异常处理和国际化)源码

    在这个“Struts+Hibernate+Spring(加入了struts完整的自动异常处理和国际化)源码”中,我们将深入探讨这三个框架的集成以及自动异常处理和国际化这两个关键特性。 首先,Struts作为MVC(模型-视图-控制器)框架,...

    代码国际化

    代码国际化,也称为i18n(取"internationalization"的首字母和末尾数字,意为第18个字符之后是'n'),是软件开发中的一个重要环节,它确保程序能够适应不同语言和文化环境。在国际化的代码中,文本通常被提取出来,...

    Java 国际化操作

    6. **错误和异常消息**:在进行国际化时,错误消息也需要进行本地化。可以将错误消息放入Resource Bundle中,根据Locale动态获取。 7. **I18N框架**:有一些第三方框架如Spring的MessageSource,可以帮助简化国际化...

    ASP国际化多语言详细方案

    它支持多种功能,包括国际化(Internationalization)和本地化(Localization),这使得开发者可以创建支持多语言的应用程序,以满足全球用户的需求。本篇文章将深入探讨ASP.NET中的国际化多语言详细方案。 一、...

    我的一个SSH国际化的使用

    在本案例中,"SSH国际化"指的是使SSH服务支持多语言环境,以适应全球不同地区用户的需求。这通常涉及到配置文件的修改、语言包的安装以及相关设置的调整。 在实现SSH国际化的过程中,我们需要关注以下几个关键点: ...

    asp.net国际化实现步骤

    ASP.NET国际化的实现是开发多语言网站或应用的关键步骤,它允许您为不同的地区和语言提供定制的内容。以下是一步步实现ASP.NET国际化的详细过程: 第一步:理解基础概念 国际化(Internationalization)是指设计和...

    java技术教你如何实现国际化

    在Spring中,你可以使用`@ControllerAdvice`和`@ExceptionHandler`注解来全局处理国际化异常消息,或者使用`ModelAndView`对象在视图层传递资源包。 在Web应用程序中,Tomcat服务器和Servlet容器通常会处理HTTP请求...

    struts2国际化处理全解

    在国际化处理方面,Struts2提供了全面的支持,使得开发者能够轻松地为多语言环境的应用程序创建接口。 首先,我们需要了解什么是国际化(Internationalization)和本地化(Localization)。国际化是指设计和开发...

    Qt国际化 动态语言切换 多窗口翻译

    Qt 国际化动态语言切换多窗口翻译 在 Qt 中实现国际化是一件非常重要的事情,特别是在多语言支持方面。Qt 提供了强大的国际化机制,可以轻松地实现多语言支持。本文将详细介绍 Qt 国际化的步骤,并结合动态语言切换...

    国际工程项目投标的信息化管理.docx

    在全球化的背景下,国际工程承包市场竞争异常激烈,而正确的投标决策对于能否成功中标至关重要。信息化管理的目标是构建高效的企业信息系统,通过减少无附加值的过程、提高工作效率来增强企业的竞争力。然而,当前...

Global site tag (gtag.js) - Google Analytics