001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.commons.cli2.resource; 018 019import java.text.MessageFormat; 020 021import java.util.Locale; 022import java.util.MissingResourceException; 023import java.util.ResourceBundle; 024 025/** 026 * A utility class used to provide internationalisation support. 027 * 028 * @author John Keyes 029 */ 030public class ResourceHelper { 031 /** system property */ 032 private static final String PROP_LOCALE = "org.apache.commons.cli2.resource.bundle"; 033 034 /** default package name */ 035 private static final String DEFAULT_BUNDLE = 036 "org.apache.commons.cli2.resource.CLIMessageBundle_en_US"; 037 private static ResourceHelper helper; 038 039 /** resource bundle */ 040 private ResourceBundle bundle; 041 042 private String prop; 043 044 /** 045 * Create a new ResourceHelper for the current locale. 046 */ 047 private ResourceHelper() { 048 String bundleName = System.getProperty(PROP_LOCALE); 049 050 if (bundleName == null) { 051 bundleName = DEFAULT_BUNDLE; 052 } 053 054 this.prop = bundleName; 055 056 int firstUnderscore = bundleName.indexOf('_'); 057 int secondUnderscore = bundleName.indexOf('_', firstUnderscore + 1); 058 059 Locale locale; 060 if (firstUnderscore != -1) { 061 String language = bundleName.substring(firstUnderscore + 1, secondUnderscore); 062 String country = bundleName.substring(secondUnderscore + 1); 063 locale = new Locale(language, country); 064 } 065 else { 066 locale = Locale.getDefault(); 067 } 068 // initialize the bundle 069 try { 070 bundle = ResourceBundle.getBundle(bundleName, locale); 071 } catch (MissingResourceException exp) { 072 bundle = ResourceBundle.getBundle(DEFAULT_BUNDLE, locale); 073 } 074 } 075 076 public String getBundleName() { 077 return this.prop; 078 } 079 080 /** 081 * Gets the ResourceHelper appropriate to the current locale. 082 * @return a ResourceHelper 083 */ 084 public static ResourceHelper getResourceHelper() { 085 String bundleName = System.getProperty(PROP_LOCALE); 086 if (helper == null || !helper.getBundleName().equals(bundleName)) { 087 helper = new ResourceHelper(); 088 } 089 090 return helper; 091 } 092 093 /** 094 * Returns the message for the specified key. 095 * 096 * @param key the unique identifier of the message 097 * @return String the formatted String 098 */ 099 public String getMessage(final String key) { 100 return getMessage(key, new Object[] { }); 101 } 102 103 /** 104 * Returns the message for the specified key and argument. 105 * 106 * @param key the unique identifier of the message 107 * @param value the argument value 108 * @return String the formatted String 109 */ 110 public String getMessage(final String key, 111 final Object value) { 112 return getMessage(key, new Object[] { value }); 113 } 114 115 /** 116 * Returns the message for the specified key and arguments. 117 * 118 * @param key the unique identifier of the message 119 * @param value1 an argument value 120 * @param value2 an argument value 121 * @return String the formatted String 122 */ 123 public String getMessage(final String key, 124 final Object value1, 125 final Object value2) { 126 return getMessage(key, new Object[] { value1, value2 }); 127 } 128 129 /** 130 * Returns the message for the specified key and arguments. 131 * 132 * @param key the unique identifier of the message 133 * @param value1 an argument value 134 * @param value2 an argument value 135 * @param value3 an argument value 136 * 137 * @return String the formatted String 138 */ 139 public String getMessage(final String key, 140 final Object value1, 141 final Object value2, 142 final Object value3) { 143 return getMessage(key, new Object[] { value1, value2, value3 }); 144 } 145 146 /** 147 * Returns the message for the specified key and arguments. 148 * 149 * @param key the unique identifier of the message 150 * @param values argument values 151 * @return String the formatted String 152 */ 153 public String getMessage(final String key, 154 final Object[] values) { 155 final String msgFormatStr = bundle.getString(key); 156 final MessageFormat msgFormat = new MessageFormat(msgFormatStr); 157 158 return msgFormat.format(values); 159 } 160}