/* * This file is part of LanternServer, licensed under the MIT License (MIT). * * Copyright (c) LanternPowered <https://www.lanternpowered.org> * Copyright (c) SpongePowered <https://www.spongepowered.org> * Copyright (c) contributors * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the Software), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package org.lanternpowered.server.text.translation; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import org.lanternpowered.api.asset.Asset; import org.lanternpowered.server.asset.ReloadListener; import org.spongepowered.api.text.translation.FixedTranslation; import org.spongepowered.api.text.translation.Translation; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Optional; import javax.annotation.Nullable; public final class CombinedTranslationManager implements TranslationManager, ReloadListener { // The primary translation manager that will be used private final List<TranslationManager> translationManagers = new ArrayList<>(); // The delegate translation manager @Nullable private volatile TranslationManager delegateTranslationManager; /** * Adds a translation manager. * * @param manager the manager */ public void addManager(TranslationManager manager) { this.translationManagers.add(manager); } /** * Adds a translation manager at the specified index. * * @param index the index * @param manager the manager */ public void addManagerAt(int index, TranslationManager manager) { index = index < 0 ? 0 : index > this.translationManagers.size() ? this.translationManagers.size() : index; this.translationManagers.add(index, manager); } /** * Sets the translation manager that the {@link #addResourceBundle} method * should be delegated to, otherwise will the first one be used. * * <p>The manager must first be added through {@link #addManager} before * you can use this method.</p> * * @param manager the manager */ public void setDelegateManager(TranslationManager manager) { checkNotNull(manager, "manager"); checkArgument(this.translationManagers.contains(manager), "manager must be added before using this method"); this.delegateTranslationManager = manager; } private TranslationManager getDelegateManager() { if (this.delegateTranslationManager != null) { return this.delegateTranslationManager; } else if (!this.translationManagers.isEmpty()) { return this.translationManagers.get(0); } return null; } @Override public void addResourceBundle(Asset asset, Locale locale) { final TranslationManager manager = this.getDelegateManager(); if (manager != null) { manager.addResourceBundle(asset, locale); } } @Override public Translation get(String key) { return this.getIfPresent(key).orElseGet(() -> { TranslationManager manager = this.getDelegateManager(); if (manager != null) { return manager.get(key); } return new FixedTranslation(key); }); } @Override public Optional<Translation> getIfPresent(String key) { Optional<Translation> optTranslation; for (TranslationManager manager : this.translationManagers) { optTranslation = manager.getIfPresent(key); if (optTranslation.isPresent()) { return optTranslation; } } return Optional.empty(); } @Override public void onReload() { this.translationManagers.stream() .filter(manager -> manager instanceof ReloadListener) .forEach(manager -> ((ReloadListener) manager).onReload()); } }