package de.weltraumschaf.speakingurl;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * Language specific characters translations
 *
 * @author Sascha Droste <pid@posteo.net>
 * @author Sven Strittmatter <weltraumschaf@googlemail.com>
 */
final class LanguageCharacterMapper {

    /**
     * Default language.
     */
    private static final Language DEFAULT = Language.ENGLISH;
    /**
     * Holds the mapping.
     */
    private static final Map<Language, Map<String, String>> MAPPING = new HashMap<>();

    static {
        MAPPING.put(Language.ENGLISH, Collections.<String, String>emptyMap());

        final Map<String, String> swedish = new HashMap<>();
        swedish.put("ä", "a");
        swedish.put("Ä", "A");

        MAPPING.put(Language.SWEDISH, Collections.unmodifiableMap(swedish));
    }

    boolean knowsCharacter(final Language lang, final String ch) {
        if (MAPPING.containsKey(lang)) {
            return MAPPING.get(lang).containsKey(ch);
        }

        return MAPPING.get(DEFAULT).containsKey(ch);
    }

    String mapCharacter(final Language lang, final String ch) {
        if (knowsCharacter(lang, ch)) {
            return MAPPING.get(lang).get(ch);
        }

        throw new IllegalArgumentException(String.format("Unknown character '%s' for language %s!", ch, lang));
    }

}

@@ -159,17 +159,18 @@
 slations
+.
 %0A
-
  *%0A * @a
@@ -839,24 +839,404 @@
 h));%0A    %7D%0A%0A
+    /**%0A     * Input validator.%0A     */%0A    private final Validator validator = new Validator();%0A%0A    /**%0A     * Tells if there is a mapping for a particular language.%0A     *%0A     * @param lang must not be %7B@code null%7D%0A     * @param ch you want to map, must not be %7B@code null%7D or empty%0A     * @return %7B@code true%7D if the given character has a mapping, else %7B@code false%7D%0A     */%0A
     boolean 
@@ -1282,32 +1282,79 @@
 al String ch) %7B%0A
+        validator.notNull(lang, %22validator%22);%0A%0A
         if (MAPP
@@ -1499,24 +1499,434 @@
 ch);%0A    %7D%0A%0A
+    /**%0A     * Maps given character for a particular language.%0A     * %3Cp%3E%0A     * Throws an %7B@link IllegalArgumentException%7D if %7B@link #knowsCharacter(de.weltraumschaf.speakingurl.Language,%0A     * java.lang.String)  there is no mapping%7D.%0A     * %3C/p%3E%0A     *%0A     * @param lang must not be %7B@code null%7D%0A     * @param ch you want to map, must not be %7B@code null%7D or empty%0A     * @return never %7B@code null%7D%0A     */%0A
     String m

Add missing doc and validation.