-- German (thanks Clad in the sky, ichbinsisyphos and marens from forums.gentoo.org) ---------------------------------------------------------------------------------------------- module FuzzyTime.German (showFuzzyTimeDe) where import {-# SOURCE #-} FuzzyTime import Prelude hiding (min) -- showFuzzyTimeDe ---------------------------------------------------------------------------------------------------------------------------------------------------------------- showFuzzyTimeDe :: FuzzyTime -> String -- FuzzyClock showFuzzyTimeDe fc@(FuzzyClock _ caps _ _ _ _ _) = capsizeDef caps (showFuzzyTimeDeHlp fc) showFuzzyTimeDe ft@(FuzzyTimer _ _) = showFuzzyTimeDeHlp ft showFuzzyTimeDeHlp :: FuzzyTime -> String showFuzzyTimeDeHlp fc@(FuzzyClock _ _ clock hour _ min style) | min == 0 = if getHour hour `elem` ["Mitternacht", "Mittag"] then getHour hour else getHour hour ++ " Uhr" | min == 15 && style == 3 = "Viertel " ++ getHour (nextFTHour fc) | min `elem` [23..29] && style >= 2 = getMin (30-min) ++ " vor halb " ++ getHour (nextFTHour fc) | min < 30 = getMin min ++ " nach " ++ getHour hour | min `elem` [31..37] && style >= 2 = getMin (min-30) ++ " nach halb " ++ getHour (nextFTHour fc) | min == 30 = "halb " ++ getHour (nextFTHour fc) | min == 45 && style == 3 = "Dreiviertel " ++ getHour (nextFTHour fc) | min > 30 = getMin (60-min) ++ " vor " ++ getHour (nextFTHour fc) | otherwise = "Oops, looks like it's " ++ show hour ++ ":" ++ show min ++ "." where getHour :: Int -> String getHour h | h `elem` [0, 24] = if style==1 then numeralDe clock else if min /=30 then "Mitternacht" else numeralDe clock | otherwise = numeralDe h getMin :: Int -> String getMin m | m `elem` [15, 45] = "Viertel" | otherwise = numeralDe m -- FuzzyTimer showFuzzyTimeDeHlp (FuzzyTimer _ mins) | mins > 0 = "in " ++ showHelper | mins == 0 = "jetzt!" | mins < 0 = "! vor " ++ showHelper ++ " !" where showHelper :: String showHelper | mm >= 90 = numeralDe hours ++ (if half then "einhalb" else "") ++ " Stunden" | mm == 75 = "einer Stunde und fünfzehn Minuten" | mm == 60 = "einer Stunde" | mm == 45 = "einer Dreiviertelstunde" | mm == 30 = "eine halbe Stunde" | mm == 15 = "einer ViertelStunde" | mm > 1 = numeralDe mm ++ " Minuten" | mm == 1 = "einer Minute" | otherwise = "Oops, it looks like there's " ++ show mins ++ " left." hours :: Int hours = round $ (fromIntegral mm :: Float) / 60 mm :: Int mm = abs mins half :: Bool half = mm `mod` 60 == 30 -- numeralDe ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- numeralDe :: Int -> String numeralDe n | n < 20 = numeralDeHelper1 n | n `mod` 10 == 0 = numeralDeHelper10 (n `div` 10) | otherwise = numeralDeHelper1 (n `mod` 10) ++ "und" ++ numeralDeHelper10 (n `div` 10) where numeralDeHelper1 :: Int -> String numeralDeHelper1 i = ["ein", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun", "zehn", "elf", "zwőlf", "dreizehn", "vierzehn", "fünfzehn", "sechzehn", "siebzehn", "achtzehn", "neunzehn"] !! (i-1) numeralDeHelper10 :: Int -> String numeralDeHelper10 i = ["zwanzig", "dreissig", "vierzig", "fünfzig"] !! (i-2)