package tc.oc.commons.core.localization;
import java.util.Locale;
import java.util.Set;
import java.util.stream.Stream;
import javax.annotation.Nullable;
import tc.oc.minecraft.api.command.CommandSender;
import tc.oc.minecraft.api.entity.Player;
public final class Locales {
public static final Locale DEFAULT_LOCALE = Locale.ENGLISH;
/**
* Attempts to retrieve the best locale for the specified {@link CommandSender}.
* If a null sender is given, the default locale is returned.
*/
public static Locale locale(@Nullable CommandSender sender) {
if (sender instanceof Player) {
return ((Player) sender).getCurrentLocale();
} else {
return DEFAULT_LOCALE;
}
}
public static boolean isDefault(Locale locale) {
return DEFAULT_LOCALE.equals(locale);
}
/**
* Return all locales from the given set that can serve as substitutes
* for the given locale, from best to worst.
*/
public static Stream<Locale> match(Locale locale, Set<Locale> available) {
final Stream.Builder<Locale> result = Stream.builder();
// Exact match
if(available.contains(locale)) {
result.add(locale);
}
// Locale has a country, we have a matching language with no country
if(!"".equals(locale.getCountry())) {
final Locale language = new Locale(locale.getLanguage());
if(available.contains(language)) {
result.add(language);
}
}
// Available locales with the same language and some other country
for(Locale a : available) {
if(!"".equals(a.getCountry()) &&
!locale.getCountry().equals(a.getCountry()) &&
locale.getLanguage().equals(a.getLanguage())) {
result.add(a);
}
}
// If the language matches the default locale, then it will already be added.
// Otherwise, add it now.
if(!locale.getLanguage().equals(DEFAULT_LOCALE.getLanguage())) {
result.add(DEFAULT_LOCALE);
}
return result.build();
}
}