{-# LANGUAGE LambdaCase   #-}
{-# LANGUAGE ViewPatterns #-}

{-# OPTIONS_HADDOCK prune #-}
{-# OPTIONS_GHC -fno-warn-missing-export-lists #-}

-- |
-- Module    : Aura.Languages
-- Copyright : (c) Colin Woodbury, 2012 - 2020
-- License   : GPL3
-- Maintainer: Colin Woodbury <colin@fosskers.ca>
--
-- All output strings that a user can be shown.
-- All normal restrictions on line length do not apply for this file, and this file only.

{- AURA TRANSLATORS - Thank you all
Chris "Kwpolska" Warrick                      | Polish
Denis Kasak / "stranac"                       | Croatian
Fredrik Haikarainen / Daniel Beecham          | Swedish
Lukas Niederbremer / Jonas Platte             | German
Alejandro Gómez / Sergio Conde / Max Ferrer   | Spanish
Henry Kupty / Thiago Perrotta / Wagner Amaral | Portuguese
Ma Jiehong / Fabien Dubosson                  | French
Kyrylo Silin                                  | Russian
Bob Valantin / Cristian Tentella              | Italian
Filip Brcic                                   | Serbian
"chinatsun"                                   | Norwegian
"pak tua Greg"                                | Indonesia
Kai Zhang                                     | Chinese
Onoue Takuro                                  | Japanese
Zachary "Ghosy" Matthews                      | Esperanto
Joris Blanken                                 | Dutch
-}

module Aura.Languages where

import           Aura.Colour
import qualified Aura.Languages.Fields as Fields
import           Aura.Types
import           Data.Ratio ((%))
import           Data.Text.Prettyprint.Doc
import           Data.Text.Prettyprint.Doc.Render.Terminal
import           RIO
import qualified RIO.List as L
import qualified RIO.Map as M
import qualified RIO.Map.Partial as M
import qualified RIO.Text as T

---

translators :: Map Language Text
translators = M.fromList
    [ (Polish,     "Chris Warrick")
    , (Croatian,   "Denis Kasak / \"stranac\"")
    , (Swedish,    "Fredrik Haikarainen / Daniel Beecham")
    , (German,     "Lukas Niederbremer / Jonas Platte")
    , (Spanish,    "Alejandro Gómez / Sergio Conde / Max Ferrer")
    , (Portuguese, "Henry Kupty / Thiago Perrotta / Wagner Amaral")
    , (French,     "Ma Jiehong / Fabien Dubosson")
    , (Russian,    "Kyrylo Silin / Alexey Kotlyarov")
    , (Italian,    "Bob Valantin / Cristian Tentella")
    , (Serbian,    "Filip Brcic")
    , (Norwegian,  "\"chinatsun\"")
    , (Indonesia,  "\"pak tua Greg\"")
    , (Chinese,    "Kai Zhang")
    , (Japanese,   "Onoue Takuro")
    , (Esperanto,  "Zachary Matthews")
    , (Dutch,      "Joris Blanken")
    ]

-- These need updating! Or removing...
languageNames :: Language -> Map Language T.Text
languageNames = M.fromList . zip [ Japanese, Polish, Croatian, Swedish, German, Spanish, Portuguese, French, Russian, Italian, Serbian, Norwegian, Indonesia, Chinese, Esperanto, Dutch ] . \case
    Japanese   -> [ "日本語", "ポーランド語", "クロアチア語", "スウェーデン語", "ドイツ語", "スペイン語", "ポルトガル語", "フランス語", "ロシア語", "イタリア語", "セルビア語", "ノルウェー語", "インドネシア語", "中国語", "エスペラント", "オランダ語" ]
    Polish     -> [ "Japanese", "polski", "chorwacki", "szwedzki", "niemiecki", "hiszpański", "portugalski", "francuski", "rosyjski", "", "", "", "Indonesian", "Chinese", "Esperanto", "Dutch" ]
    Croatian   -> [ "Japanese", "poljski", "hrvatski", "švedski", "njemački", "španjolski", "portugalski", "francuski", "ruski", "talijanski", "srpski", "norveški", "Indonesian", "Chinese", "Esperanto", "Dutch" ]
    Swedish    -> [ "Japanese", "Polska", "Kroatiska", "Svenska", "Tyska", "Spanska", "Portugisiska", "Franska", "Ryska", "Italienska", "Serbiska", "Norska", "Indonesian", "Chinese", "Esperanto", "Dutch" ]
    German     -> [ "Japanisch", "Polnisch", "Kroatisch", "Schwedisch", "Deutsch", "Spanisch", "Portugiesisch", "Französisch", "Russisch", "Italienisch", "Serbisch", "Norwegisch", "Indonesisch", "Chinese", "Esperanto", "Dutch" ]
    Spanish    -> [ "Japanese", "Polaco", "Croata", "Sueco", "Alemán", "Español", "Portugués", "Francés", "Ruso", "Italiano", "Serbio", "Noruego", "Indonesio", "Chinese", "Esperanto", "Dutch" ]
    Portuguese -> [ "Japonês", "Polonês", "Croata", "Sueco", "Alemão", "Espanhol", "Português", "Francês", "Russo", "Italiano", "Sérvio", "Norueguês", "Indonésio", "Chinês", "Esperanto", "Dutch" ]
    French     -> [ "Japanese", "Polonais", "Croate", "Suédois", "Allemand", "Espagnol", "Portugais", "Français", "Russe", "Italien", "Serbe", "Norvégien", "Indonesian", "Chinese", "Esperanto", "Dutch" ]
    Russian    -> [ "Японский", "Польский", "Хорватский", "Шведский", "Немецкий", "Испанский", "Португальский", "Французский", "Русский", "Итальянский", "Сербский", "Норвежский", "Индонезийский", "Китайский", "Эсперанто", "Dutch" ]
    Italian    -> [ "Giapponese", "Polacco", "Croato", "Svedese", "Tedesco", "Spagnolo", "Portoghese", "Francese", "Russo", "Italiano", "Serbo", "Norvegese", "Indonesiano", "Cinese", "Esperanto", "Dutch" ]
    Serbian    -> [ "Japanese", "Пољски", "Хрватски", "Шведски", "Немачки", "Шпански", "Португалски", "Француски", "Руски", "Италијански", "Српски", "", "Indonesian", "Chinese", "Esperanto", "Dutch" ]
    Norwegian  -> [ "Japanese", "Polsk", "Kroatisk", "Svensk", "Tysk", "Spansk", "Portugisisk", "Fransk", "Russisk", "Italiensk", "Serbisk", "Norsk", "Indonesian", "Chinese", "Esperanto", "Dutch" ]
    Indonesia  -> [ "Japanese", "Polandia", "Kroasia", "Swedia", "Jerman", "Spanyol", "Portugis", "Prancis", "Rusia", "Italia", "Serbia", "Norwegia", "Indonesian", "Chinese", "Esperanto", "Dutch" ]
    Chinese    -> [ "日语", "波兰语", "克罗地亚语", "瑞典语", "德语", "西班牙语", "葡萄牙语", "法语", "俄语", "意大利语", "塞尔维亚语", "挪威语", "印度尼西亚语", "中文", "世界语", "Dutch" ]
    Esperanto  -> [ "La japana", "La pola", "La kroata", "La sevda", "La germana", "La hispana", "La portugala", "La franca", "La rusa", "La itala", "La serba", "La norvega", "La indonezia", "La ĉina", "Esperanto", "La nederlanda" ]
    Dutch      -> [ "Japans", "Pools", "Kroatisch", "Zweeds", "Duits", "Spaans", "Portugees", "Frans", "Russisch", "Italiaans", "Servisch", "Noors", "Indonesisch", "Chinees", "Esperanto", "Nederlands" ]
    _          -> [ "Japanese", "Polish", "Croatian", "Swedish", "German", "Spanish", "Portuguese", "French", "Russian", "Italian", "Serbian", "Norwegian", "Indonesian", "Chinese", "Esperanto", "Dutch" ]

translatorMsgTitle :: Language -> Text
translatorMsgTitle = \case
    Japanese   -> "Auraの翻訳者:"
    Polish     -> "Tłumacze Aury:"
    Croatian   -> "Aura Prevoditelji:"
    Swedish    -> "Aura Översättare:"
    German     -> "Aura Übersetzer:"
    Spanish    -> "Traductores de Aura:"
    Portuguese -> "Tradutores de Aura:"
    French     -> "Traducteurs d'Aura:"
    Russian    -> "Переводчики Aura:"
    Italian    -> "Traduttori di Aura:"
    Serbian    -> "Преводиоци Аура:"
    Norwegian  -> "Aura Oversettere:"
    Indonesia  -> "Penerjemah Aura:"
    Chinese    -> "Aura 的翻译者:"
    Esperanto  -> "Tradukistoj de Aura:"
    Dutch      -> "Aura Vertalers:"
    _          -> "Aura Translators:"

translatorMsg :: Language -> [Text]
translatorMsg lang = title : names
  where title = translatorMsgTitle lang
        names = fmap snd . M.toList $
            M.mapWithKey (\l t -> formatLang (assocLang l t)) translators
        assocLang lang' translator = (translator, langNames M.! lang')
        formatLang (translator, lang') = " (" <> lang' <> ") " <> translator
        langNames = languageNames lang

-- | Make some `Text` cyan. Previous wrapped things in backticks.
bt :: Text -> Doc AnsiStyle
bt cs = cyan $ pretty cs

whitespace :: Language -> Char
whitespace Japanese = ' '  -- \12288
whitespace _        = ' '   -- \32

langFromLocale :: Text -> Language
langFromLocale = T.take 2 >>> \case
    "ja" -> Japanese
    "pl" -> Polish
    "hr" -> Croatian
    "sv" -> Swedish
    "de" -> German
    "es" -> Spanish
    "pt" -> Portuguese
    "fr" -> French
    "ru" -> Russian
    "it" -> Italian
    "sr" -> Serbian
    "nb" -> Norwegian
    "id" -> Indonesia
    "zh" -> Chinese
    "eo" -> Esperanto
    "nl" -> Dutch
    _    -> English

----------------------
-- Aura/Core functions
----------------------
-- NEEDS TRANSLATION
checkDBLock_1 :: Language -> Doc AnsiStyle
checkDBLock_1 = \case
    Japanese   -> "パッケージデータベースが閉鎖されている状態です。開放したらキーを押して続行してください。"
    Polish     -> "Baza pakietów jest zablokowana. Kiedy zostanie odblokowana naciśnij enter aby kontynuować"
    Croatian   -> "Baza paketa je zaključana. Kad se otključa, pritisnite enter da biste nastavili."
    German     -> "Die Paketdatenbank ist gesperrt. Drücken Sie Enter wenn sie entsperrt ist um fortzufahren."
    Spanish    -> "La base de datos de paquetes está bloqueada. Presiona enter cuando esté desbloqueada para continuar."
    Norwegian  -> "Pakkedatabasen er låst. Trykk enter når den er åpnet for å fortsette."
    French     -> "La base de données des paquets est bloquée. Appuyez sur enter pour continuer."
    Portuguese -> "Banco de dados de pacote travado. Aperte 'enter' quando estiver destravado para poder continuar."
    Russian    -> "База данных пакетов заблокирована. Нажмите \"Ввод\", когда она разблокируется, чтобы продолжить."
    Italian    -> "Non è stato possibile accedere alla banca dati dei pacchetti. Per continuare premere invio quando sarà di nuovo disponibile."
    Chinese    -> "包数据库已锁定。请在解锁后按下回车以继续。"
    Swedish    -> "Paketdatabasen är låst. Klicka på enter när den är upplåst."
    Esperanto  -> "La datumbazo de pakaĵoj estas ŝlosita. Premu enen-klavo kiam la datumbazo estas malŝlosita por daŭrigi"
    Dutch      -> "De pakket databank is vergrendelt. Druk op enter wanneer het ontgrendelt is."
    _          -> "The package database is locked. Press enter when it's unlocked to continue."

trueRoot_3 :: Language -> Doc AnsiStyle
trueRoot_3 = \case
    Japanese   -> "「root」としてパッケージを作成するのは「makepkg v4.2」で不可能になりました。"
    German     -> "Seit makepkg v4.2 ist es nicht mehr möglich als root zu bauen."
    Spanish    -> "Desde makepkg v4.2 no es posible compilar paquetes como root."
    Portuguese -> "A partir da versão v4.2 de makepkg, não é mais possível compilar como root."
    Russian    -> "С версии makepkg v4.2 сборка от имени root более невозможна."
    Italian    -> "A partire dalla versione 4.2 di makepkg non è più possibile compilare come root."
    Chinese    -> "自从 makepkg v4.2 以后,就不能以根用户身份构建软件了。"
    Swedish    -> "I makepkg v4.2 och uppåt är det inte tillåtet att bygga som root."
    Esperanto  -> "Depost makepkg v4.2, konstruanto ĉefuzante ne eblas."
    Dutch      -> "Vanaf makepkg v4.2 is het niet langer mogelijk om als root te bouwen."
    _          -> "As of makepkg v4.2, building as root is no longer possible."

mustBeRoot_1 :: Language -> Doc AnsiStyle
mustBeRoot_1 = let sudo = bt "sudo" in \case
    Japanese   -> sudo <> "を使わないとそれができない!"
    Polish     -> "Musisz użyć " <> sudo <> ", żeby to zrobić."
    Croatian   -> "Morate koristiti" <> sudo <> "za ovu radnju."
    Swedish    -> "Du måste använda " <> sudo <> " för det."
    German     -> "Sie müssen dafür " <> sudo <> " benutzen."
    Spanish    -> "Tienes que utilizar " <> sudo <> " para eso."
    Portuguese -> "Utilize " <> sudo <> " para isso."
    French     -> "Vous devez utiliser " <> sudo <> " pour ça."
    Russian    -> "Необходимо использовать " <> sudo <> " для этого."
    Italian    -> "Per eseguire questa operazione è necessario utilizzare " <> sudo <> "."
    Serbian    -> "Морате да користите " <> sudo <> " за ову радњу."
    Norwegian  -> "Du må bruke " <> sudo <> " for det."
    Indonesia  -> "Anda harus menggunakan " <> sudo <> " untuk melakukannya."
    Chinese    -> "除非是根用户,否则不能执行此操作。"
    Esperanto  -> "Vi ne povas fari ĉi tiun operacion, sen " <> sudo <> "."
    Dutch      -> "U kunt deze operatie niet uitvoeren zonder " <> sudo <> " te gebruiken."
    _          -> "You cannot perform this operation without using sudo."

-----------------------
-- Aura/Build functions
-----------------------
buildPackages_1 :: PkgName -> Language -> Doc AnsiStyle
buildPackages_1 (bt . pnName -> p) = \case
    Japanese   -> p <> "を作成中・・・"
    Polish     -> "Budowanie " <> p <> "..."
    Croatian   -> "Gradim " <> p <> "..."
    Swedish    -> "Bygger paket " <> p <> "..."
    German     -> "Baue Paket " <> p <> "..."
    Spanish    -> "Compilando " <> p <> "..."
    Portuguese -> "Compilando " <> p <> "..."
    French     -> "Compilation de " <> p <> "..."
    Russian    -> "Сборка " <> p <> "..."
    Italian    -> "Compilazione di " <> p <> "..."
    Serbian    -> "Градим " <> p <> "..."
    Norwegian  -> "Bygger " <> p <> "..."
    Indonesia  -> "Membangun " <> p <> "..."
    Chinese    -> p <> " 正在构建中..."
    Esperanto  -> "Muntanta " <> p <> "..."
    Dutch      -> "Pakket " <> p <> " aan het bouwen..."
    _          -> "Building " <> p <> "..."

buildFail_5 :: Language -> Doc AnsiStyle
buildFail_5 = \case
    Japanese   -> "パッケージ作成に失敗しました。"
    Polish     -> "Budowanie nie powiodło się."
    Croatian   -> "Izgradnja nije uspjela."
    Swedish    -> "Gick inte att bygga paket."
    German     -> "Bauen fehlgeschlagen."
    Spanish    -> "La compilación falló."
    Portuguese -> "Falha na compilação."
    French     -> "Compilation échouée."
    Russian    -> "Сборка не удалась."
    Italian    -> "Compilazione fallita."
    Serbian    -> "Изградња пакета није успела."
    Norwegian  -> "Bygging feilet."
    Indonesia  -> "Proses gagal."
    Chinese    -> "构建失败。"
    Esperanto  -> "Muntado paneis"
    Dutch      -> "Bouwen is mislukt."
    _          -> "Building failed."

-- NEEDS TRANSLATION
buildFail_6 :: Language -> Doc AnsiStyle
buildFail_6 = \case
    Japanese   -> "それでも続行しますか?"
    Polish     -> "Czy mimo to chcesz kontynuować?"
    Croatian   -> "Želite li svejedno nastaviti?"
    German     -> "Möchten Sie trotzdem fortfahren?"
    Spanish    -> "¿Deseas continuar de todas formas?"
    Norwegian  -> "Vil du fortsette likevel?"
    Italian    -> "Procedere comunque?"
    Portuguese -> "Gostaria de continuar mesmo assim?"
    French     -> "Voulez-vous tout de même continuer ?"
    Russian    -> "Продолжить, несмотря ни на что?"
    Indonesia  -> "Apakah anda tetap ingin melanjutkan?"
    Chinese    -> "你仍然希望继续吗?"
    Swedish    -> "Vill du fortsätta ändå?"
    Esperanto  -> "Ĉu vi volas daŭrigi?"
    Dutch      -> "Wilt U toch doorgaan?"
    _          -> "Would you like to continue anyway?"

-- NEEDS TRANSLATION
buildFail_7 :: PkgName -> Language -> Doc AnsiStyle
buildFail_7 (bt . pnName -> p) = \case
    Japanese   -> p <> "のビルドスクリプトを収得できませんでした。"
    Polish     -> "Nie udało się pozyskać skryptów budowania dla " <> p <> "."
    German     -> "Herunterladen der Build-Skripte für " <> p <> " fehlgeschlagen."
    Spanish    -> "No se han podido obtener los scripts de compilación de " <> p <> "."
    Portuguese -> "Falha ao obter scripts de compilação para " <> p <> "."
    Indonesia  -> "Gagal mendapatkan skrip untuk " <> p <> "."
    Russian    -> "Не удалось получить сценарии сборки для " <> p <> "."
    Italian    -> "Non è stato possibile ottenere gli script di compilazione per " <> p <> "."
    Chinese    -> "无法获得 " <> p <> " 的构建脚本。"
    Swedish    -> "Kunde inte hämta byggskript för " <> p <> "."
    Esperanto  -> "Paneis akiri muntaj skriptoj de " <> p <> "."
    Dutch      -> "Verkrijgen van bouw scripten mislukt voor " <> p <> "."
    _          -> "Failed to obtain build scripts for " <> p <> "."

buildFail_8 :: Language -> Doc AnsiStyle
buildFail_8 = \case
    Japanese   -> "makepkgは失敗しました。"
    Spanish    -> "Ocurrió un error al ejecutar makepkg"
    Portuguese -> "Ocorreu um erro ao executar makepkg"
    Russian    -> "Произошла ошибка makepkg."
    Italian    -> "C'è stato un errore nell'esecuzione di makepkg."
    Esperanto  -> "Paneo de makepkg okazis."
    Dutch      -> "Er is een fout opgetreden in makepkg."
    _          -> "There was a makepkg failure."

buildFail_9 :: Language -> Doc AnsiStyle
buildFail_9 = \case
  Spanish   -> "Error al detectar todos los archivo de paquete (*.pkg.tar.xz)."
  Italian   -> "Non è stato possibile trovare nessun archivio risultante dalla compilazione del pacchetto (*.pkg.tar.xz)."
  Esperanto -> "Paneis detekti ĉiujn dosierojn de pakaĵoj (*.pkg.tar.xz)."
  Dutch     -> "Detecteren van built package files mislukt (*.pkg.tar.xz)."
  _         -> "Failed to detect any built package files (*.pkg.tar.xz)."

buildFail_10 :: Language -> Doc AnsiStyle
buildFail_10 = \case
  Spanish   -> "Los paquetes no se pudieron construir."
  Italian   -> "Non è stato possibile compilare i pacchetti."
  Esperanto -> "Ĉiuj pakaĵoj paneis munti."
  Dutch     -> "Het bouwen van alle pakketten is mislukt."
  _         -> "Every package failed to build."

buildFail_11 :: Language -> Doc AnsiStyle
buildFail_11 = \case
  Japanese   -> "作成は失敗しました。エラーを見ますか?"
  Spanish    -> "Construcción fallida. ¿Te gustaría ver el error?"
  Italian    -> "La compilazione è fallita. Visionare l'errore?"
  Esperanto  -> "Muntado paneis. Ĉu vi volas vidi la eraron?"
  Dutch      -> "Bouwen mislukt. Wilt U de fouten zien?"
  _          -> "Building failed. Would you like to see the error?"

------------------------------
-- Aura/Dependencies functions
------------------------------
-- NEEDS UPDATE TO MATCH NEW ENGLISH
getRealPkgConflicts_1 :: PkgName -> PkgName -> Text -> Text -> Language -> Doc AnsiStyle
getRealPkgConflicts_1 (bt . pnName -> prnt) (bt . pnName -> p) (bt -> r) (bt -> d) = \case
    Japanese   -> "パッケージ" <> p <> "はバージョン" <> d <> "を要するが" <> "一番最新のバージョンは" <> r <> "。"
    Polish     -> "Zależność " <> p <> " powinna być w wersji " <> d <> ", ale najnowsza wersja to " <> r <> "."
    Croatian   -> "Zavisnost " <> p <> " zahtjeva verziju " <> d <> ", a najnovija dostupna verzija je " <> r <> "."
    Swedish    -> "Beroendepaketet " <> p <> " kräver version " <> d <> " men den senaste versionen är " <> r <> "."
    German     -> "Die Abhängigkeit " <> p <> " verlangt Version " <> d <> ", aber die neuste Version ist " <> r <> "."
    Spanish    -> "La dependencia " <> p <> " requiere la versión " <> d <> " pero la versión más reciente es " <> r <> "."
    Portuguese -> "A dependência " <> p <> " exige a versão " <> d <> " mas a versão mais recente é " <> r <> "."
    French     -> p <> " est une dépendance nécessitant la version " <> d <> ", mais la plus récente est la version " <> r <> "."
    Russian    -> "Зависимость " <> p <> " требует версию " <> d <> ", однако самой последней версией является " <> r <> "."
    Italian    -> p <> "è una dipendenza che necessita della versione " <> d <> ", ma la più recente è la " <> r <> "."
    Serbian    -> "Зависност " <> p <> " захтева верзију " <> d <> ", али најновија верзија је " <> r <> "."
    Norwegian  -> "Avhengigheten " <> p <> " krever versjon " <> d <>", men den nyeste versjonen er " <> r <> "."
    Indonesia  -> "Dependensi " <> p <> " meminta versi " <> d <> " namun versi paling baru adalah " <> r <> "."
    Chinese    -> "依赖 " <> p <> " 需要版本 " <> d <> ",但是最新的版本是 " <> r <> "。"
    Esperanto  -> "La pakaĵo, " <> prnt <> ", dependas de versio " <> d <> " de " <> p <> ", sed la plej nova versio estas " <> r <> "."
    Dutch      -> "Het pakket " <> prnt <> ", hangt af van versie " <> d <> " van " <> p <> ", maar de meest recente versie is " <> r <> "."
    _          -> "The package " <> prnt <> " depends on version " <> d <> " of " <> p <> ", but the most recent version is " <> r <> "."

getRealPkgConflicts_2 :: PkgName -> Language -> Doc AnsiStyle
getRealPkgConflicts_2 (bt . pnName -> p) = \case
  Japanese   -> p <> "は無視されるパッケージ!`pacman.conf`を参考に。"
  Polish     -> p <> " jest ignorowany! Sprawdź plik `pacman.conf`."
  Croatian   -> p <> " je ignoriran paket! Provjerite svoj `pacman.conf`."
  Swedish    -> p <> " är ett ignorerat paket! Kolla din `pacman.conf`-fil."
  German     -> p <> " ist ein ignoriertes Paket! Siehe /etc/pacman.conf."
  Spanish    -> "¡" <> p <> " es un paquete ignorado! Revisa tu fichero `pacman.conf`."
  Portuguese -> p <> " é um pacote ignorado conforme configuração em `pacman.conf`!"
  French     -> "Le paquet " <> p <> " est ignoré. Vous devriez jeter un œil à votre `pacman.conf`."
  Russian    -> "Пакет " <> p <> " игнорируется! Проверьте ваш файл `pacman.conf`."
  Italian    -> p <> " è marcato come pacchetto ignorato all'interno del file `pacman.conf`."
  Serbian    -> "Пакет " <> p <> " је игнорисан! Видите ваш фајл „pacman.conf“."
  Norwegian  -> p <> " er en ignorert pakke! Sjekk din `pacman.conf`-fil."
  Indonesia  -> p <> " merupakan paket yang diabaikan! Lihat `pacman.conf` anda."
  Chinese    -> p <> " 是一个被忽略的包!请查看你的 `pacman.conf` 文件。"
  Esperanto  -> p <> " estas malatenta pakaĵo! Vidu vian `pacman.conf` dosieron."
  Dutch      -> p <> " is een genegeerd pakket! Bekijk uw `pacman.conf` file."
  _          -> p <> " is an ignored package! See your `pacman.conf` file."

missingPkg_2 :: [DepError] -> Language -> Doc AnsiStyle
missingPkg_2 ps l = vsep $ map (depError l) ps

depError :: Language -> DepError -> Doc AnsiStyle
depError _ (VerConflict s) = s
depError _ (Ignored s)     = s
depError l (NonExistant (PkgName s) (PkgName par)) = case l of
  Spanish    -> "La dependencia " <> bt s <> " no pudo ser encontrada."
  Portuguese -> "A dependência " <> bt s <> " não foi encontrada."
  Russian    -> "Зависимость " <> bt s <> " не найдена."
  Italian    -> "Non è stato possibile trovare la dipendenza " <> bt s <> "."
  Esperanto  -> "La dependeco " <> bt s <> " de " <> bt par <> " ne povis troviĝi."
  Dutch      -> "Het afhankelijkheid " <> bt s <> "kan niet worden gevonden."
  _          -> "The dependency " <> bt s <> " of " <> bt par <> " couldn't be found."
depError l (BrokenProvides (PkgName pkg) (Provides (PkgName pro)) (PkgName n)) = case l of
  Spanish    -> "El paquete " <> bt pkg <> " necesita " <> bt n <> " que proporciona " <> bt pro <> "."
  Russian    -> "Пакету " <> bt pkg <> " требуется " <> bt n <> ", предоставляющий " <> bt pro <> "."
  Esperanto  -> "La pakaĵo, " <> bt pkg <> " bezonas " <> bt n <> ", kiu donas " <> bt pro <> "."
  Italian    -> "Il pacchetto " <> bt pkg <> " ha bisogno di " <> bt n <> ", che rende disponibile " <> bt pro <> "."
  Dutch      -> "Het pakket" <> bt pkg <> " heeft " <> bt n <> " nodig, die " <> bt pro <> " biedt."
  _          -> "The package " <> bt pkg <> " needs " <> bt n <> ", which provides " <> bt pro <> "."

missingPkg_3 :: Language -> Doc AnsiStyle
missingPkg_3 = \case
  Spanish    -> "Se produjo un error al reorganizar el gráfico de dependencia. Si ves esto, algo está muy mal."
  Esperanto  -> "Eraro okazis kiam reorganizi la grafeo de dependeco. Io estas erarega."
  Italian    -> "C'è stato un errore nella riorganizzazione della gerarchia delle dipendenze. Se vedi questo messaggio, qualcosa è andato davvero storto."
  Dutch      -> "Er is een fout opgetreden bij het reorganizeren van de afhankelijkheidsgrafiek. Als U dit ziet, is er iets heel erg mis."
  _          -> "There was an error reorganizing the dependency graph. If you see this, something is very wrong."

missingPkg_4 :: [NonEmpty PkgName] -> Language -> Doc AnsiStyle
missingPkg_4 pns = \case
  Spanish    -> vsep $ "Se detectaron los siguientes ciclos de dependencia:" : pns'
  Italian    -> vsep $ "Sono stati individuati i seguenti cicli di dipendenza:" : pns'
  Dutch      -> vsep $ "The volgende afhankelijkheidscycli zijn gedetecteerd:" : pns'
  _ -> vsep $ "The following dependency cycles were detected:" : pns'
  where
    pns' :: [Doc ann]
    pns' = map (hsep . map pretty . L.intersperse "=>" . map pnName . toList) pns

missingPkg_5 :: PkgName -> Language -> Doc AnsiStyle
missingPkg_5 (PkgName p) = \case
  Italian   -> bt p <> " non esiste."
  Dutch     -> bt p <> " bestaat niet."
  _         -> bt p <> " does not exist."

-----------------
-- aura functions
-----------------
displayOutputLanguages_1 :: Language -> Doc AnsiStyle
displayOutputLanguages_1 = \case
    Japanese   -> "aura は下記の言語に対応しています:"
    Polish     -> "Następujące języki są dostępne:"
    Croatian   -> "Dostupni su sljedeći jezici:"
    Swedish    -> "Följande språk är tillängliga:"
    German     -> "Die folgenden Sprachen sind verfügbar:"
    Spanish    -> "Los siguientes idiomas están disponibles:"
    Portuguese -> "Os seguintes idiomas estão disponíveis:"
    French     -> "Les langues suivantes sont disponibles :"
    Russian    -> "Доступны следующие языки:"
    Italian    -> "Sono disponibili le seguenti lingue:"
    Serbian    -> "Доступни су следећи језици:"
    Norwegian  -> "Følgende språk er tilgjengelig:"
    Indonesia  -> "Berikut ini adalah bahasa yang tersedia:"
    Chinese    -> "以下语言是可用的:"
    Esperanto  -> "La sekvaj lingvo estas disponebla:"
    Dutch      -> "De volgende talen zijn beschikbaar:"
    _          -> "The following languages are available:"

----------------------------
-- Aura/Commands/A functions
----------------------------
-- NEEDS TRANSLATION
auraCheck_1 :: Language -> Doc AnsiStyle
auraCheck_1 = \case
    Japanese   -> "Aura が更新されています。Auraだけ先に更新しますか?"
    Polish     -> "Dostępna jest nowa wersja Aura. Czy chcesz ją najpierw aktualizować?"
    Croatian   -> "Dostupna je nova verzija Aura. Želite li prvo ažurirati?"
    German     -> "Ein Update für aura ist verfügbar. Dies zuerst aktualisieren?"
    Spanish    -> "Hay una actualización de aura disponible. ¿Deseas actualizar aura primero?"
    Norwegian  -> "En Aura-oppdatering er tilgjengelig. Oppdater den først?"
    Portuguese -> "Uma atualização para Aura está disponível. Deseja atualizar antes?"
    French     -> "Une mise à jour d'Aura est disponible. Voulez-vous la mettre à jour en premier ?"
    Russian    -> "Доступно обновление Aura. Обновить сперва её?"
    Italian    -> "È disponibile un nuovo aggiornamento per Aura. Eseguirlo subito?"
    Indonesia  -> "Pemutakhiran aura tersedia. Mutakhirkan aura dulu?"
    Chinese    -> "Aura 可以升级。先升级 aura?"
    Swedish    -> "Det finns en uppdatering tillgänglig till Aura. Vill du uppdatera Aura först?"
    Esperanto  -> "Ĝisdatigo de Aura estas disponebla. Ĉu ĝisdatigas ĝin?"
    Dutch      -> "Aura update beschikbaar. Eerst updaten?"
    _          -> "Aura update available. Update it first?"

install_2 :: Language -> Doc AnsiStyle
install_2 = \case
    Japanese   -> "適切なパッケージを入力してください。"
    Polish     -> "Nie podano prawidłowych pakietów."
    Croatian   -> "Nije specificiran nijedan ispravan paket."
    Swedish    -> "Inga giltiga paket valda."
    German     -> "Keine gültigen Pakete angegeben."
    Spanish    -> "No se ha especificado ningún paquete válido."
    Portuguese -> "Nenhum pacote válido foi especificado."
    French     -> "Aucun paquet valide n'a été spécifié."
    Russian    -> "Валидные пакеты не указаны."
    Italian    -> "Nessun pacchetto valido specificato."
    Serbian    -> "Ниједан исправан пакет није специфициран."
    Norwegian  -> "Ingen gyldige pakker er valgte."
    Indonesia  -> "Tidak ada paket valid yang dispesifikkan."
    Chinese    -> "没有指定有效的包。"
    Esperanto  -> "Ne validajn pakaĵojn specifis"
    Dutch      -> "Geen geldige pakketen gespecificeerd."
    _          -> "No valid packages specified."

install_3 :: Language -> Doc AnsiStyle
install_3 = \case
    Japanese   -> "続行しますか?"
    Polish     -> "Kontynuować?"
    Croatian   -> "Nastaviti?"
    Swedish    -> "Fortsätta?"
    German     -> "Fortsetzen?"
    Spanish    -> "¿Continuar?"
    Portuguese -> "Continuar?"
    French     -> "Continuer ?"
    Russian    -> "Продолжить?"
    Italian    -> "Continuare?"
    Serbian    -> "Наставити?"
    Norwegian  -> "Fortsett?"
    Indonesia  -> "Lanjut?"
    Chinese    -> "继续?"
    Esperanto  -> "Ĉu daŭrigi?"
    Dutch      -> "Doorgaan?"
    _          -> "Continue?"

install_4 :: Language -> Doc AnsiStyle
install_4 = \case
    Japanese   -> "続行は意図的に阻止されました。"
    Polish     -> "Instalacja została przerwana przez użytkownika."
    Croatian   -> "Instalacija prekinuta od strane korisnika."
    Swedish    -> "Installationen avbröts manuellt."
    German     -> "Installation durch Benutzer abgebrochen."
    Spanish    -> "Instalación abortada manualmente."
    Portuguese -> "Instalação cancelada manualmente."
    French     -> "Installation manuelle annulée."
    Russian    -> "Пользователь прервал установку."
    Italian    -> "Installazione manuale interrotta."
    Serbian    -> "Инсталација је ручно прекинута."
    Norwegian  -> "Installasjonen ble avbrutt manuelt."
    Indonesia  -> "Instalasi dibatalkan secara paksa."
    Chinese    -> "手动安装已中止。"
    Esperanto  -> "Instalon ĉesigi permane"
    Dutch      -> "Installatie handmatig afgebroken."
    _          -> "Installation manually aborted."

install_5 :: Language -> Doc AnsiStyle
install_5 = \case
    Japanese   -> "従属パッケージを確認中・・・"
    Polish     -> "Ustalanie zależności..."
    Croatian   -> "Određivanje zavisnosti..."
    Swedish    -> "Avgör beroenden..."
    German     -> "Bestimme Abhängigkeiten..."
    Spanish    -> "Determinando dependencias..."
    Portuguese -> "Determinando as dependências..."
    French     -> "Détermination des dépendances en cours…"
    Russian    -> "Определение зависимостей..."
    Italian    -> "Determinazione delle dipendenze..."
    Serbian    -> "Утврђивање зависности..."
    Norwegian  -> "Bestemmer avhengigheter..."
    Indonesia  -> "Menentukan dependensi..."
    Chinese    -> "确定依赖中..."
    Esperanto  -> "Difinas dependecojn..."
    Dutch      -> "Afhankelijkheden aan het bepalen..."
    _          -> "Determining dependencies..."

-- 2014 December  7 @ 14:45 - NEEDS TRANSLATIONS
confirmIgnored_1 :: PkgName -> Language -> Doc AnsiStyle
confirmIgnored_1 (bt . pnName -> p) = \case
    Japanese   -> p <> "は無視されるはずのパッケージです。それでも続行しますか?"
    Polish     -> p <> " jest oznaczony jako ignorowany. Zainstalować mimo tego?"
    Spanish    -> p <> " está marcado como ignorado. ¿Deseas instalarlo de todas formas?"
    Portuguese -> p <> " está marcado como Ignorado. Deseja instalar mesmo assim?"
    Russian    -> p <> " отмечен как игнорируемый. Всё равно установить?"
    Italian    -> p <> " è marcato come pacchetto ignorato. Installarlo comunque?"
    Chinese    -> p <> " 已被标记为忽略。仍然安装?"
    Swedish    -> p <> " är markerad som ignorerad. Vill du installera ändå?"
    Esperanto  -> p <> " estas markita kiel malatenta. Ĉu instali?"
    Dutch      -> p <> " is gemarkeerd als genegeerd. Toch installeren?"
    _          -> p <> " is marked as Ignored. Install anyway?"

-- NEEDS UPDATE TO REFLECT CHANGED ENGLISH
reportNonPackages_1 :: Language -> Doc AnsiStyle
reportNonPackages_1 = \case
    Japanese   -> "下記はAURパッケージではありません:"
    Polish     -> "To nie są pakiety:"
    Croatian   -> "Ovo nisu AUR paketi:"
    Swedish    -> "Följande är inte paket:"
    German     -> "Folgende sind keine AUR-Pakete:"
    Spanish    -> "Los siguientes paquetes no son de AUR:"
    Portuguese -> "Os seguintes não são pacotes AUR:"
    French     -> "Les éléments suivants ne sont pas des paquets AUR :"
    Russian    -> "Ниже указано то, что не является пакетами AUR:"
    Italian    -> "I seguenti pacchetti non fanno parte dell'AUR:"
    Serbian    -> "Ово нису пакети:"
    Norwegian  -> "Det følgende er ikke AUR-pakker:"
    Indonesia  -> "Paket berikut ini bukan merupakan paket AUR:"
    Chinese    -> "以下软件不是 AUR 包:"
    Esperanto  -> "La sekvaj ne estas pakaĵoj de la AUR:"
    Dutch      -> "De volgende pakketten zijn geen AUR pakketten:"
    _          -> "The following are not AUR packages:"

-- NEEDS TRANSLATION
reportUnneededPackages_1 :: Language -> Doc AnsiStyle
reportUnneededPackages_1 = \case
    Japanese   -> "下記のパッケージは既にインストールされています:"
    Polish     -> "Następujące pakiety zostały już zainstalowane:"
    Portuguese -> "Os seguintes pacotes já estão instalados:"
    Russian    -> "Следующие пакеты уже установлены:"
    Italian    -> "I seguenti pacchetti sono già stati installati:"
    German     -> "Die folgenden Pakete sind bereits installiert:"
    Spanish    -> "Los siguientes paquetes ya están instalados:"
    Chinese    -> "以下包已被安装:"
    Swedish    -> "Följande paket är redan installerade:"
    Esperanto  -> "La sekvaj pakaĵoj jam instaliĝas:"
    Dutch      -> "The volgende pakketten zijn al geinstalleerd:"
    _          -> "The following packages are already installed:"

reportPkgsToInstall_1 :: Language -> Doc AnsiStyle
reportPkgsToInstall_1 = \case
    Japanese   -> "Pacmanの従属パッケージ:"
    Polish     -> "Zależności z repozytoriów:"
    Croatian   -> "Zavisnosti iz repozitorija:"
    Swedish    -> "Beroenden ifrån lager:"
    German     -> "Abhängigkeiten in den Paketquellen:"
    Spanish    -> "Dependencias del repositorio:"
    Portuguese -> "Dependências no repositório:"
    French     -> "Dépendances du dépôt :"
    Russian    -> "Зависимости из репозитория:"
    Italian    -> "Dipendenze del repository:"
    Serbian    -> "Зависности из ризница:"
    Norwegian  -> "Avhengigheter fra depotet:"
    Indonesia  -> "Dependensi dari repositori:"
    Chinese    -> "仓库依赖:"
    Esperanto  -> "Dependecoj de deponejo:"
    Dutch      -> "Repository afhankelijkheden:"
    _          -> "Repository dependencies:"

-- NEEDS AN UPDATE
reportPkgsToInstall_2 :: Language -> Doc AnsiStyle
reportPkgsToInstall_2 = \case
    Japanese   -> "AURのパッケージ:"
    Polish     -> "AUR Pakiety:"
    Croatian   -> "AUR Paketi:"
    German     -> "AUR Pakete:"
    Spanish    -> "AUR Paquetes:"
    Norwegian  -> "AUR Pakker:"
    Italian    -> "AUR Pacchetti:"
    Portuguese -> "AUR Pacotes:"
    French     -> "AUR Paquets :"
    Russian    -> "AUR Пакеты:"
    Indonesia  -> "AUR Paket:"
    Chinese    -> "AUR 包:"
    Swedish    -> "AUR Paket:"
    Esperanto  -> "Pakaĵoj de AUR:"
    Dutch      -> "AUR Pakketten:"
    _          -> "AUR Packages:"

reportPkgsToInstall_3 :: Language -> Doc AnsiStyle
reportPkgsToInstall_3 = \case
    Japanese   -> "AURの従属パッケージ:"
    Polish     -> "Zależności z AUR:"
    Croatian   -> "Zavisnosti iz AUR-a:"
    Swedish    -> "Beroenden ifrån AUR:"
    German     -> "Abhängigkeiten im AUR:"
    Spanish    -> "Dependencias en AUR:"
    Portuguese -> "Dependências no AUR:"
    French     -> "Dépendances AUR\xa0:"
    Russian    -> "Зависимости из AUR:"
    Italian    -> "Dipendenze nell'AUR:"
    Serbian    -> "Зависности из AUR-а:"
    Norwegian  -> "Avhengigheter fra AUR:"
    Esperanto  -> "Dependencoj de AUR:"
    Dutch      -> "AUR-afhankelijkheden:"
    _          -> "AUR dependencies:"

-- NEEDS TRANSLATION
reportPkgbuildDiffs_1 :: PkgName -> Language -> Doc AnsiStyle
reportPkgbuildDiffs_1 (bt . pnName -> p) = \case
    Japanese   -> p <> "のPKGBUILDはまだ保存されていません。"
    Polish     -> p <> " nie ma jeszcze przechowywanego pliku PKGBUILD."
    Croatian   -> p <> " još nema pohranjen PKGBUILD."
    German     -> p <> " hat noch keinen gespeicherten PKGBUILD."
    Spanish    -> p <> " no tiene un PKGBUILD almacenado aún."
    Portuguese -> p <> " não possui PKGBUILD."
    French     -> p <> " n'a pas encore de PKGBUILD enregistré."
    Russian    -> "У " <> p <> " ещё нет сохраненного PKGBUILD."
    Italian    -> p <> " non ci sono ancora PKGBUILD salvati"
    Serbian    -> p <> " још нема похрањен PKGBUILD."
    Norwegian  -> p <> " har ingen PKGBUILD ennå."
    Indonesia  -> p <> " tidak mempunyai PKGBUILD yang tersimpan untuk saat ini."
    Chinese    -> p <> " 还没有保存的 PKGBUILD。"
    Swedish    -> p <> " har ännu ingen PKGBUILD."
    Esperanto  -> p <> " ne havas PKGBUILD jam."
    Dutch      -> p <> " heeft nog geen opgeslagen PKGBUILD."
    _          -> p <> " has no stored PKGBUILD yet."

-- NEEDS TRANSLATION
reportPkgbuildDiffs_3 :: PkgName -> Language -> Doc AnsiStyle
reportPkgbuildDiffs_3 (bt . pnName -> p) = \case
    Japanese   -> p <> "のPKGBUILD変更報告:"
    Polish     -> "Zmiany w PKGBUILD dla " <> p <> ":"
    Croatian   -> "Promjene u PKGBUILD-u za " <> p <> ":"
    German     -> "PKGBUILD-Änderungen von " <> p <> ":"
    Spanish    -> "Cambios en el PKGBUILD de " <> p <> ":"
    Portuguese -> "Mudanças no PKGBUILD de " <> p <> ":"
    Russian    -> "Изменения, вносимые " <> p <> " PKGBUILD:"
    French     -> "Changements du PKGBUILD de " <> p <> " :"
    Italian    -> "Cambiamenti nel PKGBUILD del pacchetto " <> p <>":"
    Serbian    -> "Промене PKGBUILD-a за " <> p <> ":"
    Norwegian  -> p <> "'s endringer i PKGBUILD:"
    Indonesia  -> "Perubahan PKGBUILD " <> p <> ":"
    Chinese    -> p <> " 的 PKGBUILD 变化:"
    Swedish    -> "Förändringar i PKGBUILD för " <> p <> ":"
    Esperanto  -> p <> " PKGBUILD ŝanĝoj:"
    Dutch      -> p <> " PKGBUILD aanpassingen:"
    _          -> p <> " PKGBUILD changes:"

-- NEEDS TRANSLATION
reportPkgsToUpgrade_1 :: Language -> Doc AnsiStyle
reportPkgsToUpgrade_1 = \case
    Japanese   -> "アップグレードするAURパッケージ:"
    Polish     -> "Pakiety z AUR do zaktualizowania:"
    Croatian   -> "AUR paketi za nadogradnju:"
    Swedish    -> "AUR-paket att uppgradera:"
    German     -> "Zu aktualisierendes AUR-Paket:"
    Spanish    -> "Paquetes de AUR a actualizar:"
    Portuguese -> "Pacotes do AUR para atualizar:"
    French     -> "Paquets AUR à mettre à jour :"
    Russian    -> "Пакеты AUR, готовые для обновления:"
    Italian    -> "Pacchetti dell'AUR da aggiornare:"
    Serbian    -> "Пакети из AUR-а за надоградњу:"
    Norwegian  -> "AUR-pakker å oppgradere:"
    Indonesia  -> "Paket AUR yang akan ditingkatkan:"
    Chinese    -> "要升级的 AUR 包:"
    Esperanto  -> "Pakaĵoj de AUR ĝisdatigi:"
    Dutch      -> "AUR-Pakketten om te upgraden:"
    _          -> "AUR Packages to upgrade:"

-- NEEDS UPDATING
reportBadDowngradePkgs_1 :: Language -> Doc AnsiStyle
reportBadDowngradePkgs_1 = \case
    Japanese   -> "このパッケージはキャッシュには入っていないので、ダウングレードできません。"
    Polish     -> "Poniższe pakeity nie są zainstalowane, i nie mogą być zainstalowane w starszej wersji:"
    Croatian   -> "Sljedeći paketi nisu instalirani te se stoga ne mogu vratiti na stare verzije:"
    Swedish    -> "Följande paket är inte installerade, och kan därför inte bli nergraderade:"
    German     -> "Folgende Pakete sind in keiner Version im Cache und können daher nicht gedowngradet werden:"
    Spanish    -> "Los siguientes paquetes no tienen versiones en la caché, por lo que no se pueden bajar a versiones anteriores:"
    Portuguese -> "Os seguintes pacotes não possuem versões no cache, logo não podem retornar a uma versão anterior:"
    French     -> "Aucune version des paquets suivants n'est présente dans le cache ; ils ne peuvent pas être mis à niveau à une version antérieure :"
    Russian    -> "Следующих пакетов нет в кэше. Следовательно, они не могут быть откачены к старой версии:"
    Italian    -> "Nessuna versione dei seguenti pacchetti è disponibile nella cache, perciò non è possibile riportarli ad una versione precedente:"
    Serbian    -> "Следећи пакети нису ни инсталирани, те се не могу вратити на старију верзију:"
    Norwegian  -> "Følgende pakker har ingen versjoner i cache, og kan derfor ikke bli nedgradert:"
    Indonesia  -> "Berikut ini tidak mempunyai versi pada cache, sehingga tidak akan diturunkan:"
    Chinese    -> "以下包在缓存中没有版本,所以无法被降级:"
    Esperanto  -> "La sekvaj pakaĵoj havas ne kaŝmemorigitajn versiojn, do ĝi ne povas malpromociigi:"
    Dutch      -> "De volgende pakketten hebben geen versie in de cache, en kunnen dus niet gedowngrade worden."
    _          -> "The following have no versions in the cache, and thus can’t be downgraded:"

reportBadDowngradePkgs_2 :: PkgName -> Language -> Doc AnsiStyle
reportBadDowngradePkgs_2 (PkgName p) = \case
  Spanish     -> pretty p <+> "no tiene una versión en la caché."
  Italian     -> pretty p <+> "non ha alcuna versione nella cache."
  Dutch       -> pretty p <+> "heeft geen versie in de cache."
  _ -> pretty p <+> "has no version in the cache."

upgradeAURPkgs_1 :: Language -> Doc AnsiStyle
upgradeAURPkgs_1 = \case
    Japanese   -> "パッケージ情報をダウンロード中・・・"
    Polish     -> "Pobieranie informacji o pakietach..."
    Croatian   -> "Preuzimanje podataka o paketima..."
    Swedish    -> "Hämtar paketinformation..."
    German     -> "Rufe Paketinformationen ab..."
    Spanish    -> "Obteniendo información de los paquetes..."
    Portuguese -> "Obtendo informação dos pacotes..."
    French     -> "Obtention des informations des paquets en cours…"
    Russian    -> "Сборка информации о пакетах..."
    Italian    -> "Ottenimento di informazioni sui pacchetti..."
    Serbian    -> "Преузимање информација о пакетима..."
    Norwegian  -> "Henter pakkeinformasjon..."
    Indonesia  -> "Mengambil informasi paket..."
    Chinese    -> "正在获取包信息..."
    Esperanto  -> "Venigas informacion de pakaĵoj..."
    Dutch      -> "Pakket informatie aan het ophalen..."
    _          -> "Fetching package information..."

upgradeAURPkgs_2 :: Language -> Doc AnsiStyle
upgradeAURPkgs_2 = \case
    Japanese   -> "バージョンを比較中・・・"
    Polish     -> "Porównywanie wersji pakietów..."
    Croatian   -> "Uspoređivanje verzija paketa..."
    Swedish    -> "Jämför paket-versioner..."
    German     -> "Vergleiche Paketversionen..."
    Spanish    -> "Comparando versiones de los paquetes..."
    Portuguese -> "Comparando versões dos pacotes..."
    French     -> "Comparaison des versions des paquets en cours…"
    Russian    -> "Сравнение версий пакетов..."
    Italian    -> "Esecuzione di un confronto fra le versioni dei pacchetti..."
    Serbian    -> "Упоређивање верзија пакета..."
    Norwegian  -> "Sammenligner pakkeversjoner..."
    Indonesia  -> "Membandingkan versi paket..."
    Chinese    -> "正在比较包的版本..."
    Esperanto  -> "Komparas versiojn de pakaĵoj..."
    Dutch      -> "Pakket versies aan het vergelijken..."
    _          -> "Comparing package versions..."

upgradeAURPkgs_3 :: Language -> Doc AnsiStyle
upgradeAURPkgs_3 = \case
    Japanese   -> "アップグレードは必要ありません。"
    Polish     -> "Nie jest wymagana aktualizacja pakietów z AUR."
    Croatian   -> "Svi AUR paketi su ažurirani."
    Swedish    -> "Inga AUR-paketsuppgraderingar behövs."
    German     -> "Keine Aktualisierungen für AUR-Paket notwendig."
    Spanish    -> "No es necesario actualizar paquetes de AUR."
    Portuguese -> "Nenhum pacote do AUR precisa de atualização."
    French     -> "Aucune mise à jour de paquet AUR n'est nécessaire."
    Russian    -> "Обновление пакетов из AUR не требуется."
    Italian    -> "Nessun pacchetto dell'AUR necessita di aggiornamenti."
    Serbian    -> "Ажурирање пакета из AUR-а није потребно."
    Norwegian  -> "Ingen pakkeoppgradering fra AUR nødvendig."
    Indonesia  -> "Tidak ada peningkatan AUR yang dibutuhkan."
    Chinese    -> "没有需要升级的 AUR 包。"
    Esperanto  -> "Ne ĝisdatigoj de pakaĵoj de AUR necesas."
    Dutch      -> "Geen AUR-pakket upgrades vereist."
    _          -> "No AUR package upgrades necessary."

removeMakeDepsAfter_1 :: Language -> Doc AnsiStyle
removeMakeDepsAfter_1 = \case
    Japanese   -> "あと片付け。必要ないパッケージを削除:"
    Polish     -> "Usuwanie niepotrzebnych zależności potrzebnych do budowy..."
    Croatian   -> "Uklanjanje nepotrebnih zavisnosti vezanih uz izgradnju..."
    Swedish    -> "Tar bort obehövda beroenden för `make`..."
    German     -> "Entferne nicht benötigte make-Abhängigkeiten..."
    Spanish    -> "Removiendo dependencias `make` innecesarias..."
    Portuguese -> "Removendo dependências `make` desnecessárias..."
    French     -> "Suppression des dépendances inutiles…"
    Russian    -> "Удаление ненужных зависимостей make..."
    Italian    -> "Rimozione delle dipendenze utilizzate per la compilazione..."
    Serbian    -> "Уклањање непотребних зависности за изградњу..."
    Norwegian  -> "Fjerner unødvendige make-avhengigheter..."
    Indonesia  -> "Menghapus dependensi `make` yang tidak dibutuhkan..."
    Chinese    -> "移除不需要的 make 依赖..."
    Esperanto  -> "Forigas nenecesajn dependecojn de make..."
    Dutch      -> "Onnodige make afhankelijkheden aan het verwijderen..."
    _          -> "Removing unneeded make dependencies..."

----------------------------
-- Aura/Commands/B functions
----------------------------
-- NEEDS TRANSLATION
cleanStates_2 :: Int -> Language -> Doc AnsiStyle
cleanStates_2 n@(bt . tshow -> s) = \case
    Japanese   -> s <> "個のパッケージ状態記録だけが残される。その他削除?"
    Polish     -> s <> " stan pakietów zostanie zachowany. Usunąć resztę?"
    Croatian   -> s <> " stanja paketa će biti zadržano. Ukloniti ostatak?"
    German     -> s <> " Paketzustände werden behalten. Den Rest entfernen?"
    Spanish    -> "El estado del paquete" <> s <> " se mantendrá. ¿Deseas eliminar el resto?"
    Serbian    -> s <> " стања пакета ће бити сачувано. Уклонити остатак?"
    Norwegian  -> s <> " pakketilstander vil bli beholdt. Vil du fjerne resten?"
    Italian    -> "Lo stato del pacchetto" <> s <> " sarà mantenuto. Rimuovere il resto?"
    Portuguese -> s <> " estados de pacotes serão mantidos. Remover o resto?"
    French     -> s <> " états des paquets vont être conservés. Supprimer le reste ?"
    Russian    -> s <> pluralRussian " состояние пакетов будет оставлено." " состояния пакетов будут оставлены." " состояний пакетов будет оставлено." n <> " Удалить оставшиеся?"
    Indonesia  -> s <> " paket akan tetap sama. Hapus yang lainnya?"
    Chinese    -> s <> " 个包的状态将会保留。删除其它的?"
    Swedish    -> s <> " paket kommer att bevaras. Ta bort resten?"
    Esperanto  -> s <> " statoj de pakaĵoj teniĝas. Ĉu forigi la ceteron?"
    Dutch      -> s <> " pakketstatussen worden behouden. De rest verwijderen?"
    _          -> s <> " package states will be kept. Remove the rest?"

-- NEEDS TRANSLATION
cleanStates_3 :: Language -> Doc AnsiStyle
cleanStates_3 = \case
    Japanese   -> "何も削除しないで終了します。"
    Polish     -> "Żaden stan pakietu nie został usunięty."
    Croatian   -> "Nijedno stanje paketa nije uklonjeno."
    German     -> "Keine Paketzustände wurden entfernt."
    Spanish    -> "No se han eliminado estados de los paquetes."
    Serbian    -> "Ниједно стање пакета није уклоњено."
    Norwegian  -> "Ingen pakketilstander ble fjernet."
    Italian    -> "Nessuno stato dei pacchetti è stato rimosso."
    Portuguese -> "Nenhum estado de pacote será removido."
    French     -> "Aucun état des paquets n'a été supprimé."
    Russian    -> "Состояния пакетов отались нетронутыми."
    Indonesia  -> "Tidak ada paket yang dihapus."
    Chinese    -> "没有删除任何包。"
    Swedish    -> "Inga paket togs bort."
    Esperanto  -> "Ne statojn de pakaĵoj forigis."
    Dutch      -> "Geen pakketstatussen verwijderd."
    _          -> "No package states were removed."

cleanStates_4 :: Int -> Language -> Doc AnsiStyle
cleanStates_4 n = \case
  Japanese  -> "現在のパッケージ状態記録:" <> pretty n <> "個。"
  Spanish   -> "Actualmente tiene " <+> pretty n <+> "estados de paquetes guardados."
  Russian   -> "У вас сейчас " <+> pretty n <+> pluralRussian " сохраненное состояние пакета" " сохраненных состояний пакета" " сохраненных состояний пакетов." n
  Italian   -> "Al momento ci sono" <+> pretty n <+> "stati di pacchetti salvati."
  Esperanto -> "Vi havas " <+> pretty n <+> " konservajn statojn de pakaĵoj."
  Dutch     -> "U heeft momenteel" <+> pretty n <+> "opgeslagen pakketstatussen."
  _         -> "You currently have" <+> pretty n <+> "saved package states."

cleanStates_5 :: Text -> Language -> Doc AnsiStyle
cleanStates_5 t = \case
  Japanese  -> "一番最近に保存されたのは:" <> pretty t
  Spanish   -> "Guardado recientemente:" <+> pretty t
  Russian   -> "Последнее сохраненное:" <+> pretty t
  Italian   -> "Salvato più recentemente:" <+> pretty t
  Esperanto -> "Lastaj konservaj:" <+> pretty t
  Dutch     -> "Meest recent opgeslagen:" <+> pretty t
  _         -> "Most recently saved:" <+> pretty t

cleanStates_6 :: Int -> Language -> Doc AnsiStyle
cleanStates_6 n = \case
  Spanish   -> pretty n <+> "de estos están anclados y no se eliminarán."
  Italian   -> pretty n <+> "di questi sono stati fissati, perciò non saranno rimossi."
  Dutch     -> pretty n <+> "hiervan zijn vastgezet, en worden niet verwijderd."
  _         -> pretty n <+> "of these are pinned, and won't be removed."

readState_1 :: Language -> Doc AnsiStyle
readState_1 = \case
    Spanish    -> "Ese archivo de estado no se pudo analizar. ¿Es un archivo JSON válido?"
    Portuguese -> "O arquivo de estado não pôde ser interpretado. É um arquivo JSON válido?"
    Russian    -> "Это состояние не распознано. Это корректный JSON?"
    Italian    -> "Non è stato possibile analizzare il file di stato. E' correttamente formattato in JSON?"
    Esperanto  -> "Tiu statdosiero paneis sintake analizi. Ĉu ĝi estas valida JSON?"
    Dutch      -> "Dat statusbestand kon niet worden geparseerd. Is het legale JSON?"
    _          -> "That state file failed to parse. Is it legal JSON?"

----------------------------
-- Aura/Commands/C functions
----------------------------
getDowngradeChoice_1 :: PkgName -> Language -> Doc AnsiStyle
getDowngradeChoice_1 (bt . pnName -> p) = \case
    Japanese   -> p <> "はどのバージョンにしますか?"
    Polish     -> "Którą wersję pakietu " <> p <> " zainstalować?"
    Croatian   -> "Koju verziju paketa " <> p <> " želite?"
    Swedish    -> "Vilken version av " <> p <> " vill du ha?"
    German     -> "Welche Version von " <> p <> " möchten Sie haben?"
    Spanish    -> "¿Qué versión de " <> p <> " deseas?"
    Portuguese -> "Qual versão de " <> p <> " deseja?"
    French     -> "Quelle version de " <> p <> " voulez-vous ?"
    Russian    -> "Какую версию " <> p <> " вы хотите?"
    Italian    -> "Quale versione di " <> p <> " preferisci?"
    Serbian    -> "Коју верзију " <> p <> "-а желите?"
    Norwegian  -> "Hvilken versjon av " <> p <> " vil du ha?"
    Indonesia  -> "Versi dari paket " <> p <> " mana yang anda inginkan?"
    Chinese    -> "你希望安装 " <> p <> " 的哪个版本?"
    Esperanto  -> "Kiu versio de " <> p <> " vi volas?"
    Dutch      -> "Welke versie van " <> p <> " wil je?"
    _          -> "What version of " <> p <> " do you want?"

backupCache_3 :: Language -> Doc AnsiStyle
backupCache_3 = \case
    Japanese   -> "バックアップ先は存在しません。"
    Polish     -> "Lokalizacja kopii zapasowych nie istnieje."
    Croatian   -> "Lokacija sigurnosne kopije ne postoji."
    Swedish    -> "Specifierad backup-plats finns inte."
    German     -> "Der Sicherungsort existiert nicht."
    Spanish    -> "La localización para copia de seguridad no existe."
    Portuguese -> "Localização do backup não existe."
    French     -> "Le chemin des copies de sauvegarde spécifié n'existe pas."
    Russian    -> "Путь к бэкапу не существует."
    Italian    -> "La locazione di backup non esiste."
    Serbian    -> "Путања ка бекапу не постоји."
    Norwegian  -> "Spesifisert backup-plass finnes ikke."
    Indonesia  -> "Lokasi `backup` tidak ada."
    Chinese    -> "备份位置不存在。"
    Esperanto  -> "La savkopia loko ne ekzistas."
    Dutch      -> "De back-up lokatie bestaat niet."
    _          -> "The backup location does not exist."

backupCache_4 :: FilePath -> Language -> Doc AnsiStyle
backupCache_4 (bt . T.pack -> dir) = \case
    Japanese   -> "キャッシュのバックアップ先:" <> dir
    Polish     -> "Tworzenie kopii zapasowej pamięci podręcznej w " <> dir
    Croatian   -> "Stvaram sigurnosnu kopiju u " <> dir
    Swedish    -> "Tar backup på cache-filer till " <> dir
    German     -> "Sichere Cache in " <> dir
    Spanish    -> "Haciendo una copia de seguridad de la caché en " <> dir
    Portuguese -> "Backup do cache sendo feito em " <> dir
    French     -> "Copie de sauvegarde dans " <> dir <> "."
    Russian    -> "Бэкап создается в директории " <> dir
    Italian    -> "Eseguo un backup della cache in " <> dir
    Serbian    -> "Бекапујем кеш у " <> dir
    Norwegian  -> "Tar backup på cache til " <> dir
    Indonesia  -> "Melakukan `backup` pada direktori " <> dir
    Chinese    -> "正在将缓存备份到 " <> dir
    Esperanto  -> "Enarkivigas la kaŝdosieron al " <> dir
    Dutch      -> "Back-up van cache aan het maken naar " <> dir
    _          -> "Backing up cache to " <> dir

backupCache_5 :: Int -> Language -> Doc AnsiStyle
backupCache_5 (bt . tshow -> n) = \case
    Japanese   -> "パッケージのファイル数:" <> n
    Polish     -> "Pliki będące częścią\xa0kopii zapasowej: " <> n
    Croatian   -> "Datoteke koje su dio sigurnosne kopije: " <> n
    Swedish    -> "Paket-filer att ta backup på: " <> n
    German     -> "Zu sichernde Paketdateien: " <> n
    Spanish    -> "Ficheros de paquetes de los que se hará copia de seguridad: " <> n
    Portuguese -> "Arquivos de pacotes para backup: " <> n
    French     -> "Copie de sauvegarde des fichiers de paquets suivants : " <> n
    Russian    -> "Файлы пакета для бэкапа: " <> n
    Italian    -> "Archivi dei pacchetti per cui sarà eseguito un backup: " <> n
    Serbian    -> "Датотеке за бекап: " <> n
    Norwegian  -> "Pakker som blir tatt backup på: " <> n
    Indonesia  -> "Jumlah paket yang di-`backup`: " <> n
    Chinese    -> "将要备份的包文件:" <> n
    Esperanto  -> "La dosierojn de la pakaĵoj enarkivigi: " <> n
    Dutch      -> "Pakketbestanden om te back-uppen: " <> n
    _          -> "Package files to backup: " <> n

backupCache_6 :: Language -> Doc AnsiStyle
backupCache_6 = \case
    Japanese   -> "バックアップを実行しますか?"
    Polish     -> "Kontynuować tworzenie kopii zapasowej?"
    Croatian   -> "Nastavi sa stvaranjem sigurnosne kopije?"
    Swedish    -> "Fortsätt med backup?"
    German     -> "Sicherung fortsetzen?"
    Spanish    -> "¿Proceder con la copia de seguridad?"
    Portuguese -> "Proceder com o backup?"
    French     -> "Procéder à la copie de sauvegarde ?"
    Russian    -> "Продолжить создание бэкапа?"
    Italian    -> "Procedere con il backup?"
    Serbian    -> "Наставити бекаповање?"
    Norwegian  -> "Fortsett med backup?"
    Indonesia  -> "Lanjutkan dengan `backup`?"
    Chinese    -> "开始备份?"
    Esperanto  -> "Ĉu daŭrigu enarkivigi?"
    Dutch      -> "Doorgaan met back-up?"
    _          -> "Proceed with backup?"

backupCache_7 :: Language -> Doc AnsiStyle
backupCache_7 = \case
    Japanese   -> "バックアップは意図的に阻止されました。"
    Polish     -> "Tworzenie kopii zapasowej zostało przerwane przez użytkownika."
    Croatian   -> "Stvaranje sigurnosne kopije prekinuto od strane korisnika."
    Swedish    -> "Backup avbröts manuellt."
    German     -> "Backup durch Benutzer abgebrochen."
    Spanish    -> "Copia de seguridad abortada manualmente."
    Portuguese -> "Backup cancelado manualmente."
    French     -> "Copie de sauvegarde manuelle annulée."
    Russian    -> "Создание бэкапа прервано пользователем."
    Italian    -> "Backup interrotto manualmente."
    Serbian    -> "Бекаповање је ручно прекинуто."
    Norwegian  -> "Backup ble avbrutt manuelt."
    Indonesia  -> "Proses `backup` dibatalkan secara paksa."
    Chinese    -> "手动备份已中止。"
    Esperanto  -> "Enarkivigadon ĉesigis permane."
    Dutch      -> "Back-up handmatig afgebroken."
    _          -> "Backup manually aborted."

backupCache_8 :: Language -> Doc AnsiStyle
backupCache_8 = \case
    Japanese   -> "バックアップ中。数分かかるかもしれません。"
    Polish     -> "Tworzenie kopii zapasowej. To może potrwać kilka minut..."
    Croatian   -> "Stvaranje sigurnosne kopije. Ovo može potrajati nekoliko minuta..."
    Swedish    -> "Tar backup. Det här kan ta ett tag..."
    German     -> "Sichere. Dies kann einige Minuten dauern..."
    Spanish    -> "Haciendo copia de seguridad. Esto puede tardar unos minutos..."
    Portuguese -> "Efetuando backup. Isso pode levar alguns minutos..."
    French     -> "Copie de sauvegarde en cours. Ceci peut prendre quelques minutes…"
    Russian    -> "Создается бэкап. Это может занять пару минут..."
    Italian    -> "Esecuzione del backup in corso. Potrebbe volerci qualche minuto..."
    Serbian    -> "Бекапујем. Ово може да потраје пар минута..."
    Norwegian  -> "Tar backup. Dette kan ta en stund..."
    Indonesia  -> "Melakukan `backup`. Proses ini akan berjalan untuk beberapa menit..."
    Chinese    -> "正在备份中。可能需要几分钟的时间..."
    Esperanto  -> "Enarkiviganta. Ĉi tiu eble daŭros dum kelkaj tagoj..."
    Dutch      -> "Aan het back-uppen. Dit kan een aantal minuten duren..."
    _          -> "Backing up. This may take a few minutes..."

copyAndNotify_1 :: Int -> Language -> Doc AnsiStyle
copyAndNotify_1 (cyan . pretty -> n) = \case
    Japanese   -> "#[" <> n <> "]をコピー中・・・"
    Polish     -> "Kopiowanie #[" <> n <> "]"
    Croatian   -> "Kopiranje #[" <> n <> "]"
    Swedish    -> "Kopierar #[" <> n <> "]"
    German     -> "Kopiere #[" <> n <> "]"
    Spanish    -> "Copiando #[" <> n <> "]"
    Portuguese -> "Copiando #[" <> n <> "]"
    French     -> "Copie de #[" <> n <> "]"
    Russian    -> "Копируется #[" <> n <> "]"
    Italian    -> "Copiando #[" <>n <> "]"
    Serbian    -> "Копирам #[" <> n <> "]"
    Norwegian  -> "Kopierer #[" <> n <> "]"
    Indonesia  -> "Menyalin #[" <> n <> "]"
    Chinese    -> "正在复制 #[" <> n <> "]"
    Esperanto  -> "Kopianta #[" <> n <> "]"
    Dutch      -> "Kopiëren #[" <> n <> "]"
    _          -> "Copying #[" <> n <> "]"

cleanCache_2 :: Language -> Doc AnsiStyle
cleanCache_2 = \case
    Japanese   -> "パッケージ・キャッシュは完全に削除されます。"
    Polish     -> "To usunie WSZYSTKIE pakiety z pamięci podręcznej."
    Croatian   -> "Ovo će izbrisati CIJELI cache paketa."
    Swedish    -> "Detta kommer ta bort HELA paket-cachen."
    German     -> "Dies wird den GESAMTEN Paketcache leeren."
    Spanish    -> "Esto eliminará POR COMPLETO la caché de paquetes."
    Portuguese -> "Isso removerá TODOS OS PACOTES do cache."
    French     -> "Ceci va supprimer la TOTALITÉ du cache des paquets."
    Russian    -> "Это действие ВСЕЦЕЛО уничтожит кэш пакетов."
    Italian    -> "Questa operazione cancellerà l'INTERA cache dei pacchetti."
    Serbian    -> "Ово ће избрисати ЦЕО кеш пакета."
    Norwegian  -> "Dette vil slette HELE pakke-cachen."
    Indonesia  -> "Akan menghapus SEMUA `cache` paket"
    Chinese    -> "这将会删除全部的包缓存。"
    Esperanto  -> "Ĉi tiu forigos la TUTAN kaŝmemoron de pakaĵoj."
    Dutch      -> "Hiermee wordt de GEHELE pakketcache verwijderd."
    _          -> "This will delete the ENTIRE package cache."

cleanCache_3 :: Word -> Language -> Doc AnsiStyle
cleanCache_3 n@(bt . tshow -> s) = \case
    Japanese   -> "パッケージ・ファイルは" <> s <> "個保存されます。"
    Polish     -> s <> " wersji każdego pakietu zostanie zachowane."
    Croatian   -> s <> " zadnjih verzija svakog paketa će biti zadržano."
    Swedish    -> s <> " av varje paketfil kommer att sparas."
    German     -> s <> " jeder Paketdatei wird behalten."
    Spanish    -> "Se mantendrán " <> s <> " ficheros de cada paquete."
    Portuguese -> s <> " arquivos de cada pacote serão mantidos."
    French     -> s <> " fichiers de chaque paquet sera conservé."
    Russian    -> s <> pluralRussian " версия каждого пакета будет нетронута." " версии каждого пакета будут нетронуты." " версий каждого пакета будут нетронуты." n
    Italian    -> "Saranno mantenuti " <> s <> " file di ciascun pacchetto."
    Serbian    -> s <> " верзије сваког од пакета ће бити сачуване."
    Norwegian  -> s <> " av hver pakkefil blir beholdt."
    Indonesia  -> s <> " berkas dari tiap paket akan disimpan."
    Chinese    -> "每个包文件将会保存 " <> s <> " 个版本。"
    Esperanto  -> s <> " de ĉiu dosiero de pakaĵo teniĝos."
    Dutch      -> s <> " van elk pakketbestand wordt bewaard."
    _          -> s <> " of each package file will be kept."

cleanCache_4 :: Language -> Doc AnsiStyle
cleanCache_4 = \case
    Japanese   -> "残りは全部削除されます。承知していますか?"
    Polish     -> "Wszystko inne zostanie usunięte. Na pewno?"
    Croatian   -> "Ostali paketi će biti izbrisani. Jeste li sigurni?"
    Swedish    -> "Resten kommer att tas bort. Är det OK?"
    German     -> "Der Rest wird gelöscht. Ist das OK?"
    Spanish    -> "El resto se eliminarán. ¿De acuerdo?"
    Portuguese -> "O resto será removido. OK?"
    French     -> "Le reste sera supprimé. Êtes-vous d'accord ?"
    Russian    -> "Всё остальное будет удалено. Годится?"
    Italian    -> "Il resto sarà rimosso. Continuare?"
    Serbian    -> "Остатак ће бити избрисан. Да ли је то у реду?"
    Norwegian  -> "Resten vil bli slettet. Er det OK?"
    Indonesia  -> "Selainnya akan dihapus. Ikhlas kan?"
    Chinese    -> "其余的将会被删除。确定?"
    Esperanto  -> "La cetero foriĝos. Ĉu bone?"
    Dutch      -> "De rest wordt verwijderd. OK?"
    _          -> "The rest will be deleted. Okay?"

cleanCache_5 :: Language -> Doc AnsiStyle
cleanCache_5 = \case
    Japanese   -> "削除の続行は意図的に阻止されました。"
    Polish     -> "Czyszczenie pamięci podręcznej zostało przerwane przez użytkownika."
    Croatian   -> "Čišćenje cache-a paketa prekinuto od strane korisnika."
    Swedish    -> "Cache-rensning avbröts manuellt."
    German     -> "Leeren des Caches durch Benutzer abgebrochen."
    Spanish    -> "Limpieza de la caché abortada manualmente."
    Portuguese -> "Limpeza do cache cancelada manualmente."
    French     -> "Le nettoyage du cache a été arrêté manuellement."
    Russian    -> "Очистка кэша прервана пользователем."
    Italian    -> "La pulizia della cache è stata interrotta manualmente."
    Serbian    -> "Чишћење кеша је ручно прекинуто."
    Norwegian  -> "Cache-rensing ble avbrutt manuelt."
    Indonesia  -> "Pembersihan `cache` dibatalkan secara paksa."
    Chinese    -> "手动清理缓存已中止。"
    Esperanto  -> "Puriganta Kaŝmemoro ĉesis permane."
    Dutch      -> "Cachereiniging handmatig afgebroken."
    _          -> "Cache cleaning manually aborted."

cleanCache_6 :: Language -> Doc AnsiStyle
cleanCache_6 = \case
    Japanese   -> "パッケージ・キャッシュを掃除中・・・"
    Polish     -> "Czyszczenie pamięci podręcznej..."
    Croatian   -> "Čišćenje cache-a paketa..."
    Swedish    -> "Rensar paket-cache..."
    German     -> "Leere Paketcache..."
    Spanish    -> "Limpiando la caché de paquetes..."
    Portuguese -> "Limpando cache de pacotes..."
    French     -> "Nettoyage du cache des paquets…"
    Russian    -> "Очистка кэша пакета..."
    Italian    -> "Pulizia della cache dei pacchetti..."
    Serbian    -> "Чишћење кеша..."
    Norwegian  -> "Renser pakke-cache..."
    Indonesia  -> "Membersihkan `cache` paket..."
    Chinese    -> "正在清理包缓存..."
    Esperanto  -> "Purigas Kaŝmemoron de pakaĵoj..."
    Dutch      -> "Pakketcache aan het reinigen..."
    _          -> "Cleaning package cache..."

cleanCache_7 :: Word -> Word -> Language -> Doc AnsiStyle
cleanCache_7 (bt . tshow -> ps) (bt . tshow -> bytes) = \case
  _ -> "The cache contains " <> ps <> " packages, consuming " <> bytes <> " megabytes."

cleanCache_8 :: Word -> Language -> Doc AnsiStyle
cleanCache_8 (bt . tshow -> bytes) = \case
  _ -> bytes <> " megabytes freed."

-- NEEDS TRANSLATION
cleanNotSaved_1 :: Language -> Doc AnsiStyle
cleanNotSaved_1 = \case
    Japanese   -> "不要パッケージファイルを確認・・・"
    Polish     -> "Określanie niepotrzebnych plków pakietów"
    Croatian   -> "Pronalazim nepotrebne datoteke paketa..."
    German     -> "Bestimme nicht benötigte Paketdateien..."
    Spanish    -> "Determinando ficheros de paquetes innecesarios..."
    Norwegian  -> "Finner unødige pakkefiler..."
    Italian    -> "Inviduazione dei pacchetti non più necessari..."
    Portuguese -> "Determinando pacotes não necessários..."
    French     -> "Détermination des fichiers de paquet inutiles…"
    Russian    -> "Вычисляются ненужные файлы пакетов..."
    Indonesia  -> "Menentukan berkas paket yang tidak dibutuhkan..."
    Chinese    -> "正在确定不需要的包文件..."
    Swedish    -> "Beräknar onödiga paketfiler..."
    Esperanto  -> "Decidas nebezonajn dosierojn de pakaĵoj..."
    Dutch      -> "Overbodige pakketbestanden aan het vaststellen..."
    _          -> "Determining unneeded package files..."

-- NEEDS TRANSLATION
cleanNotSaved_2 :: Int -> Language -> Doc AnsiStyle
cleanNotSaved_2 n@(cyan . pretty -> s) = \case
    Japanese   -> "「" <> s <> "」の不要パッケージファイルがあります。削除しますか?"
    Polish     -> s <> " niepotrzebnych plików zostało znalezionych. Usunąć?"
    Croatian   -> s <> " nepotrebnih datoteka pronađeno. Obrisati?"
    German     -> s <> " nicht benötigte Paketdateien gefunden. Löschen?"
    Spanish    -> s <> " ficheros innecesarios de paquetes encontrados. ¿Deseas eliminarlos?"
    Norwegian  -> s <> " unødige pakkefiler funnet. Vil du slette?"
    Italian    -> "Sono stati trovati " <> s <> " file non necessari per i pacchetti. Cancellarli?"
    Portuguese -> s <> " pacotes não necessários encontrados. Removê-los?"
    French     -> s <> " paquets inutiles trouvés. Les supprimer ?"
    Russian    -> pluralRussian ("Обнаружен " <> s <> " ненужный файл пакета.") ("Обнаружены " <> s <> " ненужных файла пакетов.") ("Обнаружено " <> s <> " ненужных файлов пакетов.") n <> " Удалить?"
    Indonesia  -> s <> " berkas paket yang tidak dibutuhkan ditemukan. Hapus?"
    Chinese    -> "发现了 " <> s <> " 个不需要的包文件。是否删除?"
    Swedish    -> s <> " oanvända paket hittades. Ta bort?"
    Esperanto  -> s <> " nebezonajn dosierojn de pakaĵoj trovis. Ĉu forigi"
    Dutch      -> s <> " overbodige pakketbestanden gevonden. Verwijderen?"
    _          -> s <> " unneeded package files found. Delete?"

----------------------------
-- Aura/Commands/L functions
----------------------------
logLookUpFields :: Language -> [Text]
logLookUpFields = sequence [ Fields.package
                           , Fields.firstInstall
                           , Fields.upgrades
                           , Fields.recentActions ]

reportNotInLog_1 :: Language -> Doc AnsiStyle
reportNotInLog_1 = \case
    Japanese   -> "logファイルには出ていない:"
    Polish     -> "Tych pakietów nie ma w dzienniku:"
    Croatian   -> "Ovih paketa nema u dnevniku:"
    Swedish    -> "Dessa har inte framkommit i loggfiler:"
    German     -> "Diese sind nicht in der Logdatei aufgetaucht:"
    Spanish    -> "Estos no aparecen en el fichero log:"
    Portuguese -> "Os seguintes não apareceram no arquivo de log:"
    French     -> "Ceci n'apparaît pas des les journaux (log) :"
    Russian    -> "Следующих пакетов нет в лог-файле:"
    Italian    -> "Questi non sono apparsi nel file di log:"
    Serbian    -> "Ови пакети се не спомињу у дневнику:"
    Norwegian  -> "Følgende har ikke vist seg i loggen:"
    Indonesia  -> "Tidak terlihat pada berkas log:"
    Chinese    -> "这些没有在日志文件中出现:"
    Esperanto  -> "Ĉi tiuj ne enestis la protokolajn dosierojn:"
    Dutch      -> "Deze zijn niet verschenen in het logbestand:"
    _          -> "These have not appeared in the log file:"

-------------------------------
-- Aura/AUR functions
-------------------------------

-- https://github.com/fosskers/aura/issues/498
connectFailure_1 :: Language -> Doc AnsiStyle
connectFailure_1 = \case
  Spanish -> "No se pudo contactar con el AUR. ¿Tienes conexión a internet?"
  Italian -> "Non è stato possibile contattare l'AUR. Il computer è connesso ad internet?"
  Dutch   -> "Contact opnemen met de AUR mislukt. Heeft U een internet connectie?"
  _       -> "Failed to contact the AUR. Do you have an internet connection?"

miscAURFailure_1 :: Language -> Doc AnsiStyle
miscAURFailure_1 = \case
  Italian   -> "C'è stato un errore sconosciuto nel contattare l'AUR."
  Dutch     -> "Contact opnemen met de AUR is op een onbekende manier mislukt."
  _         -> "Contacting the AUR failed in some unknown way."

miscAURFailure_3 :: Language -> Doc AnsiStyle
miscAURFailure_3 = \case
  _ -> "The JSON returned from the AUR server could not be decoded."

infoFields :: Language -> [Text]
infoFields = sequence [ Fields.repository
                      , Fields.name
                      , Fields.version
                      , Fields.aurStatus
                      , Fields.maintainer
                      , Fields.projectUrl
                      , Fields.aurUrl
                      , Fields.license
                      , Fields.dependsOn
                      , Fields.buildDeps
                      , Fields.votes
                      , Fields.popularity
                      , Fields.description
                      ]

outOfDateMsg :: Maybe Int -> Language -> Doc AnsiStyle
outOfDateMsg (Just _) = red . \case
    Japanese   -> "AURで要更新!"
    Polish     -> "Nieaktualny!"
    Croatian   -> "Zastarjelo!"
    Swedish    -> "Utdaterad!"
    German     -> "Veraltet!"
    Spanish    -> "¡Desactualizado!"
    Portuguese -> "Desatualizado!"
    French     -> "Périmé !"
    Russian    -> "Устарел!"
    Italian    -> "Non aggiornato all'ultima versione!"
    Serbian    -> "Застарео!"
    Norwegian  -> "Utdatert!"
    Indonesia  -> "Ketinggalan Zaman!"
    Chinese    -> "过期!"
    Esperanto  -> "Neĝisdata!"
    Dutch      -> "Verouderd!"
    _          -> "Out of Date!"
outOfDateMsg Nothing = green . \case
    Japanese   -> "最新"
    Polish     -> "Aktualny"
    Croatian   -> "Ažurirano"
    Swedish    -> "Aktuell"
    German     -> "Aktuell"
    Spanish    -> "Actualizado"
    Portuguese -> "Atualizado"
    French     -> "À jour"
    Russian    -> "Новейший"
    Italian    -> "Aggiornato all'ultima versione"
    Serbian    -> "Ажуран"
    Norwegian  -> "Oppdatert"
    Indonesia  -> "Mutakhir"
    Chinese    -> "最新"
    Esperanto  -> "Ĝisdata"
    Dutch      -> "Up-to-date"
    _          -> "Up to Date"

-- NEEDS TRANSLATION
orphanedMsg :: Maybe Text -> Language -> Doc AnsiStyle
orphanedMsg (Just m) = const (pretty m)
orphanedMsg Nothing = red . \case
    Japanese   -> "孤児です!"
    Polish     -> "Osierocony!"
    Croatian   -> "Nema roditelja!"
    German     -> "Verwaist!"
    Spanish    -> "¡Huérfano!"
    Norwegian  -> "Foreldreløs!"
    Portuguese -> "Órfão!"
    French     -> "Abandonné !"
    Russian    -> "Осиротевший!"
    Italian    -> "Orfano!"
    Indonesia  -> "Tak dipelihara!"
    Chinese    -> "孤包!"
    Swedish    -> "Föräldralös!"
    Esperanto  -> "Orfita!"
    Dutch      -> "Verweest!"
    _          -> "Orphaned!"

-----------------------
-- Aura/State functions
-----------------------
-- NEEDS TRANSLATION
saveState_1 :: Language -> Doc AnsiStyle
saveState_1 = \case
    Japanese   -> "パッケージ状態の保存完了。"
    Polish     -> "Zachowano stan pakietów"
    Croatian   -> "Stanje paketa spremljeno."
    German     -> "Paketzustand gesichert."
    Spanish    -> "Estado del paquete salvado."
    Serbian    -> "Сачувано стање пакета."
    Norwegian  -> "Lagret pakketilstand."
    Italian    -> "Stato del pacchetto salvato."
    Portuguese -> "Estado de pacote salvo."
    French     -> "État des paquets sauvegardé."
    Russian    -> "Состояние пакетов сохранено."
    Indonesia  -> "Kondisi paket tersimpan."
    Chinese    -> "已保存包状态。"
    Swedish    -> "Det lokala pakettillståndet har sparats."
    Esperanto  -> "Konservita stato de pakaĵo."
    Dutch      -> "Pakketstatus opgeslagen."
    _          -> "Saved package state."

-- NEEDS TRANSLATION
restoreState_1 :: Language -> Doc AnsiStyle
restoreState_1 = \case
    Japanese   -> "対象バージョンがないパッケージ:"
    Polish     -> "Starsze wersje nie są dostępne dla:"
    Croatian   -> "Tražene stare verzije nisu dostupne za:"
    German     -> "Gewünschte Downgrade-Versionen nicht verfügbar für:"
    Spanish    -> "Versiones anteriores no disponibles para:"
    Serbian    -> "Захтеване старе верзије нису доступне за:"
    Norwegian  -> "De spesifiserte nedgraderingsversjonene er ikke tilgjengelig for:"
    Italian    -> "Non sono disponibili versioni precedenti a cui tornare per:"
    Portuguese -> "Versões anteriores requisitadas não disponívels para:"
    French     -> "Version antérieure requise non disponible pour :"
    Russian    -> "Запрошенные версии для отката не доступны для:"
    Indonesia  -> "Versi yang diturunkan tidak tersedia untuk: "
    Chinese    -> "请求的降级版本对以下包不可用:"
    Swedish    -> "Den begärda nedgraderingen finns inte tillgänglig för:"
    Esperanto  -> "Petitajn malpromociajn versiojn ne estas disponebla de:"
    Dutch      -> "Verzochtte downgrade versies niet beschikbaar voor:"
    _          -> "Requested downgrade versions not available for:"

restoreState_2 :: Language -> Doc AnsiStyle
restoreState_2 = \case
    Japanese   -> "保存されたパッケージ状態がない。作るには「-B」を。"
    Spanish    -> "No hay estados guardados para ser restaurados. (Utilice -B para guardar el estado actual)"
    Portuguese -> "Nenhum estado disponível para ser recuperado. (Utilize -B para salvar o estado atual)"
    Russian    -> "Нет сохраненных состояний для восстановления. (Используйте -B для сохранения текущего состояния)"
    Italian    -> "Nessuno stato precedente a cui tornare. (Usa -B per salvare lo stato attuale)"
    Chinese    -> "没有要恢复的已保存状态。(使用 -B 保存当前状态)"
    Swedish    -> "Inga sparade tillstånd att återhämta. (Använd -B för att spara det nuvarande tillståndet)"
    Esperanto  -> "Ne konservitaj statoj restaŭros. (Uzu -B konservi la aktualan staton)"
    Dutch      -> "Er zijn geen opgeslagen statussen om te herstellen. (Gebruik -B om de huidige staat op te slaan)"
    _          -> "No saved states to be restored. (Use -B to save the current state)"

-- NEEDS TRANSLATION
reinstallAndRemove_1 :: Language -> Doc AnsiStyle
reinstallAndRemove_1 = \case
    Japanese   -> "パッケージを変更する必要はありません。"
    Polish     -> "Żaden pakiet nie wymaga zmian"
    Croatian   -> "Nema paketa kojima su potrebne izmjene."
    German     -> "Keine Pakete brauchen Änderungen."
    Spanish    -> "Ningún paquete necesita cambios."
    Serbian    -> "Ниједан пакет не захтева измене."
    Norwegian  -> "Ingen pakker trenger forandring."
    Italian    -> "Nessun pacchetto necessita di cambiamenti."
    Portuguese -> "Nenhum pacote requer alteração."
    French     -> "Aucun paquet n'a besoin de changement."
    Russian    -> "Пакеты не нуждаются в изменениях."
    Indonesia  -> "Tidak ada paket yang diubah."
    Chinese    -> "没有包需要改变。"
    Swedish    -> "Inga paket behöver ändras."
    Esperanto  -> "Ne pakaĵoj devas ŝanĝiĝi."
    Dutch      -> "Er zijn geen pakketten die wijzigingen nodig hebben."
    _          -> "No packages need changing."

--------------------------------------
-- Aura/Settings/BadPackages functions
--------------------------------------
whoIsBuildUser_1 :: Language -> Doc AnsiStyle
whoIsBuildUser_1 = \case
    Spanish    -> "No se puede determinar el usuario que ejecutará la compilación."
    Portuguese -> "Não foi possível determinal o usuário que executará a compilação."
    Russian    -> "Не удается определить, от имени какого пользователя производить сборку."
    Italian    -> "Non è stato possibile determinare l'utente che eseguirà la compilazione."
    Esperanto  -> "Ne povas decidi, per kiu konto de uzanto munti."
    Dutch      -> "Kan niet bepalen met welk gebruikers account te bouwen."
    _          -> "Can't determine which user account to build with."

------------------------
-- Aura/Pacman functions
------------------------
-- NEEDS TRANSLATION
pacmanFailure_1 :: Language -> Doc AnsiStyle
pacmanFailure_1 = \case
    Japanese   -> "入力を確認して下さい。"
    Polish     -> "Sprawdź swoje dane wejściowe"
    Croatian   -> "Molim vas, provjerite svoj unos."
    German     -> "Bitte überprüfen Sie Ihre Eingabe."
    Spanish    -> "Por favor comprueba los datos proporcionados."
    Serbian    -> "Молим Вас, проверите ваш унос."
    Norwegian  -> "Vennligst sjekk din oppføring."
    Italian    -> "Verificare ciò che è stato immesso come input."
    Portuguese -> "Por favor, verifique os dados informados."
    French     -> "Merci de vérifier les donnés entrées."
    Russian    -> "Пожалуйста, проверьте ваши введенные данные."
    Indonesia  -> "Mohon periksa masukan anda."
    Chinese    -> "请检查你的输入。"
    Swedish    -> "Var god dubbelkolla indata."
    Esperanto  -> "Bonvolu kontroli vian enigon."
    Dutch      -> "Controleer alstublieft uw input."
    _          -> "Please check your input."

confParsing_1 :: Language -> Doc AnsiStyle
confParsing_1 = \case
    Spanish    -> "No fue posible analizar su archivo pacman.conf."
    Portuguese -> "Não foi possível interpretar o arquivo pacman.conf ."
    Russian    -> "Не удается распознать формат вашего файла pacman.conf."
    Italian    -> "Non è stato possibile analizzare il file pacman.conf."
    Esperanto  -> "Ne kapablas sintaske analizi vian dosieron, pacman.conf."
    Dutch      -> "Niet in staat om uw pacman.conf bestand te parseren."
    _          -> "Unable to parse your pacman.conf file."

provides_1 :: PkgName -> Language -> Doc AnsiStyle
provides_1 (bt . pnName -> pro) = \case
    Spanish    -> pro <+> "se requiere como una dependencia, que es proporcionada por múltiples paquetes. Por favor, seleccione uno:"
    Italian    -> pro <+> "è richiesto come dipendenza; si trova in molteplici pacchetti. Selezionarne uno:"
    Dutch      -> pro <+> "is vereist als afhankelijkheid, die wordt geleverd door meerdere pakketten. Selecteer er alstublieft een:"
    _          -> pro <+> "is required as a dependency, which is provided by multiple packages. Please select one:"

----------------------------------
-- Aura/Pkgbuild/Editing functions
----------------------------------
hotEdit_1 :: PkgName -> Language -> Doc AnsiStyle
hotEdit_1 (bt . pnName -> p) = \case
    Japanese   -> p <> "のPKGBUILDを編成しますか?"
    Polish     -> "Czy chcesz edytować PKGBUILD " <> p <> "?"
    Croatian   -> "Želite li izmjeniti PKGBUILD " <> p <> "?"
    Swedish    -> "Vill du ändra PKGBUILD-filen ifrån " <> p <> "?"
    German     -> "Möchten Sie die PKGBUILD-Datei für " <> p <> " bearbeiten?"
    Spanish    -> "¿Deseas editar el PKGBUILD de " <> p <> "?"
    Portuguese -> "Deseja editar o PKGBUILD de " <> p <> "?"
    French     -> "Voulez-vous éditer le PKGBUILD de " <> p <> " ?"
    Russian    -> "Отредактировать PKGBUILD пакета " <> p <> "?"
    Italian    -> "Modificare il PKGBUILD di " <> p <> "?"
    Serbian    -> "Желите ли да измените PKGBUILD за " <> p <> "?"
    Norwegian  -> "Vil du endre PKGBUILD for " <> p <> "?"
    Indonesia  -> "Apakah anda ingin menyunting PKGBUILD untuk paket " <> p <> "?"
    Chinese    -> "你希望编辑 " <> p <> " 的 PKGBUILD 文件吗?"
    Esperanto  -> "Ĉu vi volas redakti la PKGBUILD de " <> p <> "?"
    Dutch      -> "Wilt u het PKGBUILD-bestand van " <> p <> " bewerken?"
    _          -> "Would you like to edit the PKGBUILD of " <> p <> "?"

------------------------------
-- Pkgbuild Security functions
------------------------------
security_1 :: PkgName -> Language -> Doc AnsiStyle
security_1 (PkgName p) = \case
  Spanish   -> "El PKGBUILD de" <+> bt p <+> "era demasiado complejo de analizar - puede estar ofuscando código malicioso."
  Italian   -> "Il PKGBUILD di" <+> bt p <+> "è troppo complesso per essere analizzato - è possibile che stia offuscando codice malevolo."
  Dutch     -> "Het PKGBUILD-bestand van" <+> bt p <+> " was te complex om te parseren - het kan schadelijke code versluieren."
  _ -> "The PKGBUILD of" <+> bt p <+> "was too complex to parse - it may be obfuscating malicious code."

security_2 :: Text -> Language -> Doc AnsiStyle
security_2 (bt -> t) = \case
  Spanish   -> t <+> "se puede usar para descargar scripts arbitrarios que este PKGBUILD no rastrea."
  Italian   -> t <+> "può essere usato per scaricare script arbitrari non tracciati da questo PKGBUILD."
  Dutch     -> t <+> "kan gebruikt worden om willekeurige scripten te downloaden die niet worden bijgehouden door dit PKGBUILD-bestand."
  _ -> t <+> "can be used to download arbitrary scripts that aren't tracked by this PKGBUILD."

security_3 :: Text -> Language -> Doc AnsiStyle
security_3 (bt -> t) = \case
  Spanish   -> t <+> "se puede usar para ejecutar código arbitrario que este PKGBUILD no rastrea."
  Italian   -> t <+> "può essere usato per eseguire codice arbitrario non tracciato da questo PKGBUILD."
  Dutch     -> t <+> "kan gebruikt worden om willekeurige code uit te voeren die niet worden bijgehouden door dit PKGBUILD-bestand."
  _ -> t <+> "can be used to execute arbitrary code not tracked by this PKGBUILD."

security_4 :: Text -> Language -> Doc AnsiStyle
security_4 (bt -> t) = \case
  Spanish   -> t <+> "indica que alguien puede estar intentando obtener acceso de root a su máquina."
  Italian   -> t <+> "indica che forse qualcuno sta cercando di ottenere accesso alla tua macchina come root."
  Dutch     -> t <+> "geeft aan dat iemand mogelijk root-toegang to uw machine probeert te krijgen."
  _ -> t <+> "indicates that someone may be trying to gain root access to your machine."

security_5 :: PkgName -> Language -> Doc AnsiStyle
security_5 (PkgName p) = \case
  Spanish   -> "ADVERTENCIA: El PKGBUILD de" <+> bt p <+> "contiene expresiones bash en la lista negra."
  Italian   -> "ATTENZIONE: Il PKGBUILD di" <+> bt p <+> "contiene espressioni bash presenti nella lista nera."
  Dutch     -> "WAARSCHUWING: De PKGBUILD van" <+> bt p <+> "bevat bash uitdrukkingen die op de zwarte lijst staan."
  _ -> "WARNING: The PKGBUILD of" <+> bt p <+> "contains blacklisted bash expressions."

security_6 :: Language -> Doc AnsiStyle
security_6 = \case
  Spanish   -> "¿Desea salir del proceso de compilación?"
  Italian   -> "Terminare la compilazione?"
  Dutch     -> "Wilt u het bouw process stoppen?"
  _ -> "Do you wish to quit the build process?"

security_7 :: Language -> Doc AnsiStyle
security_7 = \case
  Spanish   -> "Se canceló el procesamiento posterior para evitar el código bash potencialmente malicioso."
  Italian   -> "Non saranno eseguite altre operazioni al fine di evitare l'esecuzione di codice bash potenzialmente malevolo."
  Dutch     -> "Verdere verwerking geannuleerd om het uitvoeren van potentieel schadelijke bash-code te voorkomen."
  _ -> "Cancelled further processing to avoid potentially malicious bash code."

security_8 :: Text -> Language -> Doc AnsiStyle
security_8 (bt -> t) = \case
  Spanish   -> t <+> "es un comando bash integrado en los campos de la matriz del PKGBUILD."
  Italian   -> t <+> "è un comando bash presente all'interno degli array del tuo PKGBUILD."
  Dutch     -> t <+> "is een bash-opdracht die is opgenomen in uw PKGBUILD-arrayvelden."
  _ -> t <+> "is a bash command inlined in your PKGBUILD array fields."

security_9 :: Text -> Language -> Doc AnsiStyle
security_9 (bt -> t) = \case
  Spanish   -> t <+> "es algo extraño para tener en sus campos de matriz. ¿Es seguro?"
  Italian   -> t <+> "è una cosa strana da trovare all'interno degli array. E' sicura?"
  Dutch     -> t <+> "is een vreemd ding om in uw arrayvelden te hebben. Is het veilig?"
  _ -> t <+> "is a strange thing to have in your array fields. Is it safe?"

security_10 :: Text -> Language -> Doc AnsiStyle
security_10 (bt -> t) = \case
  Spanish   -> t <+> "implica que alguien estaba tratando de ser astuto con las variables para ocultar comandos maliciosos."
  Italian   -> t <+> "implica che qualcuno stava trafficando con le variabili per nascondere comandi malevoli."
  Dutch     -> t <+> "impliceert dat iemand slim probeerde om te gaan met variabelen om schadelijke opdrachten te verbergen."
  _ -> t <+> "implies that someone was trying to be clever with variables to hide malicious commands."

-----------------------
-- Aura/Utils functions
-----------------------
yesNoMessage :: Language -> Doc ann
yesNoMessage = \case
    Polish     -> "[T/n]"
    Croatian   -> "[D/n]"
    German     -> "[J/n]"
    Spanish    -> "[S/n]"
    Norwegian  -> "[J/n]"
    Italian    -> "[S/n]"
    Portuguese -> "[S/n]"
    French     -> "[O/n]"
    Russian    -> "[Д/н]"
    Esperanto  -> "[J/n]"
    Dutch      -> "[J/n]"
    _          -> "[Y/n]"

yesPattern :: Language -> [T.Text]
yesPattern lang = map T.toCaseFold $ case lang of
    Polish     -> ["t", "tak"]
    Croatian   -> ["d", "da"]
    German     -> ["j", "ja"]
    Spanish    -> ["s", "si"]
    Norwegian  -> ["j", "ja"]
    Italian    -> ["s", "si"]
    Portuguese -> ["s", "sim"]
    French     -> ["o", "oui"]
    Russian    -> ["д", "да"]
    Esperanto  -> ["j", "jes"]
    Dutch      -> ["j", "ja"]
    _          -> ["y", "yes"]

----------------------
-- Pluralization rules
----------------------
pluralRussian :: Integral n => a -> a -> a -> n -> a
pluralRussian singular plural1 plural2 n | n % 10 == 1 && n % 100 /= 11 = singular
                                         | n % 10 `elem` [2, 3, 4] = plural1
                                         | otherwise = plural2