/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.java.sip.communicator.plugin.defaultresourcepack;
import java.lang.reflect.*;
import java.net.*;
import java.util.*;
import net.java.sip.communicator.service.resources.*;
/**
* @author Damian Minkov
*/
public class DefaultLanguagePackImpl
implements LanguagePack
{
private static final String DEFAULT_RESOURCE_PATH
= "resources.languages.resources";
/**
* The locale used for the last resources request
*/
private Locale localeInBuffer = null;
/**
* The result of the last resources request
*/
private Map<String, String> lastResourcesAsked = null;
/**
* All language resource locales.
*/
private Vector<Locale> availableLocales = new Vector<Locale>();
/**
* Constructor.
*/
public DefaultLanguagePackImpl()
{
// Finds all the files *.properties in the path : /resources/languages.
Enumeration<?> fsEnum = DefaultResourcePackActivator.bundleContext.getBundle().
findEntries("/resources/languages", "*.properties", false);
if(fsEnum != null)
{
while (fsEnum.hasMoreElements())
{
String fileName = ((URL)fsEnum.nextElement()).getFile();
int localeIndex = fileName.indexOf('_');
if(localeIndex != -1)
{
String localeId =
fileName.substring(
localeIndex + 1,
fileName.indexOf('.', localeIndex));
availableLocales.add(
ResourceManagementServiceUtils.getLocale(localeId));
}
}
}
}
/**
* Returns a <tt>Map</tt>, containing all [key, value] pairs for this
* resource pack.
*
* @return a <tt>Map</tt>, containing all [key, value] pairs for this
* resource pack.
*/
public Map<String, String> getResources()
{
return getResources(Locale.getDefault());
}
/**
* Returns a <tt>Map</tt>, containing all [key, value] pairs for the given
* locale.
*
* @param locale The <tt>Locale</tt> we're looking for.
* @return a <tt>Map</tt>, containing all [key, value] pairs for the given
* locale.
*/
public Map<String, String> getResources(Locale locale)
{
// check if we didn't computed it at the previous call
if (locale.equals(localeInBuffer) && lastResourcesAsked != null) {
return lastResourcesAsked;
}
ResourceBundle resourceBundle
= ResourceBundle.getBundle(DEFAULT_RESOURCE_PATH, locale,
new ResourceBundle.Control(){
// work around Java's backwards compatibility
@Override
public String toBundleName(String baseName, Locale locale)
{
if (locale.equals(new Locale("he")))
{
return baseName + "_he";
}
else if (locale.equals(new Locale("yi")))
{
return baseName + "_yi";
}
else if (locale.equals(new Locale("id")))
{
return baseName + "_id";
}
return super.toBundleName(baseName, locale);
}
});
Map<String, String> resources = new Hashtable<String, String>();
this.initResources(resourceBundle, resources);
this.initPluginResources(resources, locale);
// keep it just in case of...
localeInBuffer = locale;
lastResourcesAsked = resources;
return resources;
}
/**
* Returns a Set of the keys contained only in the ResourceBundle for
* locale.
* @param locale the locale for which the keys are requested
* @return a Set of the keys contained only in the ResourceBundle for
* locale
*/
@SuppressWarnings("unchecked")
public Set<String> getResourceKeys(Locale locale)
{
try
{
Method handleKeySet = ResourceBundle.class
.getDeclaredMethod("handleKeySet");
handleKeySet.setAccessible(true);
return (Set<String>)handleKeySet.invoke(
ResourceBundle.getBundle(DEFAULT_RESOURCE_PATH, locale));
}
catch (Exception e)
{
}
return new HashSet<String>();
}
/**
* Returns the name of this resource pack.
*
* @return the name of this resource pack.
*/
public String getName()
{
return "Default Language Resources";
}
/**
* Returns the description of this resource pack.
*
* @return the description of this resource pack.
*/
public String getDescription()
{
return "Provide Jitsi default Language resource pack.";
}
/**
* Fills the given resource map with all (key,value) pairs obtained from the
* given <tt>ResourceBundle</tt>. This method will look in the properties
* files for references to other properties files and will include in the
* final map data from all referenced files.
*
* @param resourceBundle The initial <tt>ResourceBundle</tt>, corresponding
* to the "main" properties file.
* @param resources A <tt>Map</tt> that would store the data.
*/
private void initResources( ResourceBundle resourceBundle,
Map<String, String> resources)
{
Enumeration<String> colorKeys = resourceBundle.getKeys();
while (colorKeys.hasMoreElements())
{
String key = colorKeys.nextElement();
String value = resourceBundle.getString(key);
resources.put(key, value);
}
}
/**
* Finds all plugin color resources, matching the "images-*.properties"
* pattern and adds them to this resource pack.
*/
private void initPluginResources(Map<String, String> resources,
Locale locale)
{
Iterator<String> pluginProperties = DefaultResourcePackActivator
.findResourcePaths( "resources/languages",
"strings-*.properties");
while (pluginProperties.hasNext())
{
String resourceBundleName = pluginProperties.next();
if (resourceBundleName.indexOf('_') == -1)
{
ResourceBundle resourceBundle
= ResourceBundle.getBundle(
resourceBundleName.substring(
0, resourceBundleName.indexOf(".properties")),
locale);
initResources(resourceBundle, resources);
}
}
}
/**
* All the locales in the language pack.
* @return all the locales this Language pack contains.
*/
public Iterator<Locale> getAvailableLocales()
{
return availableLocales.iterator();
}
}