1 {-# LANGUAGE FlexibleContexts #-}
2 {-# LANGUAGE FlexibleInstances #-}
3 {-# LANGUAGE MultiParamTypeClasses #-}
4 {-# LANGUAGE OverloadedStrings #-}
5 {-# LANGUAGE TupleSections #-}
6 {-# OPTIONS_GHC -fno-warn-orphans #-}
7 module Hcompta.CLI.Lang where
9 import Control.Monad (liftM)
10 import qualified Data.List
11 import Data.Maybe (catMaybes, fromMaybe)
12 import qualified Data.Text as Text
13 import Data.Text (Text)
14 import qualified Data.Text.Lazy as TL
15 import Prelude hiding (error)
16 import System.Environment (getEnvironment)
17 import System.IO.Memoize (once)
18 import qualified Text.Parsec as Parsec
19 import qualified Text.Parsec.Error as Parsec.Error
21 import Hcompta.Account (Account_Anchor)
22 import qualified Hcompta.Format.Ledger as Ledger
23 import qualified Hcompta.Format.Ledger.Write as Ledger
24 import qualified Hcompta.Format.JCC as JCC
25 import qualified Hcompta.Format.JCC.Amount as JCC.Amount
26 import qualified Hcompta.Format.JCC.Amount.Write as JCC.Amount.Write
27 import qualified Hcompta.Format.JCC.Date.Write as JCC.Date.Write
28 import qualified Hcompta.Format.JCC.Write as JCC.Write
29 import Hcompta.Date (Date)
30 import qualified Hcompta.Filter.Date.Read as Date.Read
31 import qualified Hcompta.Filter.Read as Filter.Read
32 import Hcompta.Lib.Leijen (ToDoc(..), (<>))
33 import qualified Hcompta.Lib.Leijen as W
34 import qualified Hcompta.Lib.Parsec as Lib.Parsec
35 import Hcompta.Transaction (Transaction_Anchor(..))
36 import qualified Hcompta.Unit as Unit
44 -- * Class 'Translate'
45 class Translate from to where
46 translate :: Lang -> from -> to
47 instance Translate e e where
50 -- TODO: check that this is expected behavior
51 -- and portability issues
56 fromMaybe EN $ from_Strings $
59 let short = takeWhile (/= '_') lang in
63 . Data.List.takeWhile (/= '.') ) $
65 [ Data.List.lookup "LC_ALL" env
66 , Data.List.lookup "LC_CTYPE" env
67 , Data.List.lookup "LANG" env
70 from_Strings :: [String] -> Maybe Lang
74 ("fr_FR":_) -> Just FR
76 ("en_US":_) -> Just EN
77 (_:xs) -> from_Strings xs
80 (#) :: ToDoc () a => a -> W.Doc
83 instance ToDoc () Text where
84 toDoc _ = W.strict_text
85 instance ToDoc () String where
86 toDoc _ = W.strict_text . Text.pack
87 instance ToDoc () Int where
89 instance ToDoc () Integer where
91 instance ToDoc () JCC.Unit where
92 toDoc _ = JCC.Amount.Write.unit
93 instance ToDoc () Account_Anchor where
94 toDoc _ = JCC.Write.account_anchor
95 instance ToDoc () Transaction_Anchor where
96 toDoc _ = JCC.Write.transaction_anchor
97 instance ToDoc () (JCC.Amount.Styled JCC.Amount) where
98 toDoc _ = JCC.Amount.Write.amount
99 instance ToDoc () Ledger.Unit where
100 toDoc _ = Ledger.write_unit
101 instance ToDoc () (Ledger.Amount_Styled Ledger.Amount) where
102 toDoc _ = Ledger.write_amount
103 instance ToDoc () Date where
104 toDoc _ = JCC.Date.Write.date
105 instance ToDoc Lang Date.Read.Error where
108 Date.Read.Error_year_or_day_is_missing ->
109 "l’année ou le jour est manquant·e"
110 Date.Read.Error_invalid_date (year, month, day) ->
111 "date incorrecte (année " <> (#)year <> ", mois " <> (#)month <> ", jour " <> (#)day <> ")"
112 Date.Read.Error_invalid_time_of_day (hour, minute, second) ->
113 "heure incorrecte (heure " <> (#)hour <> ", minute " <> (#)minute <> ", seconde " <> (#)second <> ")"
116 Date.Read.Error_year_or_day_is_missing ->
117 "year or day is missing"
118 Date.Read.Error_invalid_date (year, month, day) ->
119 "invalid date (year " <> (#)year <> ", month " <> (#)month <> ", day " <> (#)day <> ")"
120 Date.Read.Error_invalid_time_of_day (hour, minute, second) ->
121 "invalid time of day (hour " <> (#)hour <> ", minute " <> (#)minute <> ", second " <> (#)second <> ")"
122 instance Translate Filter.Read.Error W.Doc where
123 translate lang@FR err =
125 Filter.Read.Error_Unknown -> "erreur"
126 Filter.Read.Error_Filter_Date d -> toDoc lang d
127 Filter.Read.Error_Filter_Date_Interval (l, h) ->
128 "mauvais intervalle: (" <> toDoc () l <> ", " <> toDoc () h <> ")"
129 translate lang@EN err =
131 Filter.Read.Error_Unknown -> "error"
132 Filter.Read.Error_Filter_Date d -> toDoc lang d
133 Filter.Read.Error_Filter_Date_Interval (l, h) ->
134 "wrong interval: (" <> toDoc () l <> ", " <> toDoc () h <> ")"
138 = Account_Equilibrium
139 instance Translate Account Ledger.Account where
142 Account_Equilibrium -> Ledger.account "Equilibrium" []
145 Account_Equilibrium -> Ledger.account "Équilibre" []
149 = Comment_Equilibrium
150 instance Translate Comment Text where
153 Comment_Equilibrium -> "Equilibrium posting"
156 Comment_Equilibrium -> "Mouvement d’équilibre"
158 -- * Type 'Description'
160 = Description_Exercise Exercise_OC
166 instance Translate Description Text where
169 Description_Exercise oc ->
171 Exercise_Opening -> "Opening balance"
172 Exercise_Closing -> "Closing balance"
175 Description_Exercise oc ->
177 Exercise_Opening -> "Solde d’ouverture"
178 Exercise_Closing -> "Solde de fermeture"
182 = Error_Account_Anchor_is_not_unique Parsec.SourcePos Account_Anchor
183 | Error_Account_Anchor_unknown Parsec.SourcePos Account_Anchor
184 | Error_Failed_to_include_file FilePath
185 | Error_Failed_to_read_file FilePath
186 | Error_No_input_file_given
187 | Error_One_command_is_required
188 | Error_Option_Balance_Format
189 | Error_Option_Balance_Heritage
190 | Error_Option_Balance_Redundant
191 | Error_Option_Balance_Total
193 | Error_Option_Equilibrium
194 | Error_Option_Equilibrium_Credit
195 | Error_Option_Equilibrium_Debit
196 | Error_Option_Tags_Tree
197 | Error_Option_Verbosity
198 | Error_Transaction_Anchor_unknown Parsec.SourcePos Transaction_Anchor
199 | Error_Transaction_Anchor_is_not_unique Parsec.SourcePos Transaction_Anchor
200 | Error_Transaction_Invalid_date Integer Int Int
201 | Error_Transaction_Invalid_time_of_day Int Int Integer
202 | Error_Transaction_The_following_transaction_is_not_equilibrated_because
203 | Error_Transaction_The_following_virtual_transaction_is_not_equilibrated_because
204 | Error_Transaction_JCC_Unit_sums_up_to_the_non_null_amount JCC.Unit (JCC.Amount.Styled JCC.Amount)
205 | Error_Transaction_Ledger_Unit_sums_up_to_the_non_null_amount Ledger.Unit (Ledger.Amount_Styled Ledger.Amount)
206 | Error_Transaction_Year_or_day_is_missing
207 | Error_Unkown_command String
208 instance Translate Error W.Doc where
211 Error_Account_Anchor_is_not_unique _pos anchor -> "Account anchor is not unique: " <> (#)anchor
212 Error_Account_Anchor_unknown _pos anchor -> "Account anchor unkown: " <> (#)anchor
213 Error_Failed_to_read_file path -> "failed to read file: " <> (#)path
214 Error_Failed_to_include_file path -> "failed to include file: " <> (#)path
215 Error_No_input_file_given ->
217 [ "no input file given, please use:"
218 , "- either -i $hcompta_journal parameter"
219 , "- or HCOMPTA_JOURNAL environment variable."
221 Error_One_command_is_required -> "a COMMAND is required"
222 Error_Option_Balance_Format -> "--format option expects \"close\", \"open\", or \"table\" as argument"
223 Error_Option_Balance_Heritage -> "--heritage option expects \"yes\" or \"no\" as argument"
224 Error_Option_Balance_Redundant -> "--redundant option expects \"yes\" or \"no\" as argument"
225 Error_Option_Balance_Total -> "--total option expects \"yes\" or \"no\" as argument"
226 Error_Option_Color -> "--color option expects \"auto\" (default), \"yes\" or \"no\" as argument"
227 Error_Option_Equilibrium -> "--eq option expects an ACCOUNT"
228 Error_Option_Equilibrium_Credit -> "--eq-credit option expects an ACCOUNT"
229 Error_Option_Equilibrium_Debit -> "--eq-debit option expects an ACCOUNT"
230 Error_Option_Tags_Tree -> "--tree option expects \"yes\" or \"no\" as value"
231 Error_Option_Verbosity -> "--verbosity option expects \"error\", \"warn\", \"info\" or \"debug\" as argument"
232 Error_Transaction_Anchor_is_not_unique _pos anchor -> "Transaction anchor is not unique: " <> (#)anchor
233 Error_Transaction_Anchor_unknown _pos anchor -> "Transaction anchor unknown: " <> (#)anchor
234 Error_Transaction_Invalid_date year month dom ->
235 "invalid date (year " <> (#)year <> ", month " <> (#)month <> ", day " <> (#)dom <> ")"
236 Error_Transaction_Invalid_time_of_day hour minute second ->
237 "invalid time of day (hour " <> (#)hour <> ", minute " <> (#)minute <> ", second " <> (#)second <> ")"
238 Error_Transaction_The_following_transaction_is_not_equilibrated_because ->
239 "the following transaction is not equilibrated, because:"
240 Error_Transaction_The_following_virtual_transaction_is_not_equilibrated_because ->
241 "the following virtual transaction is not equilibrated, because:"
242 Error_Transaction_JCC_Unit_sums_up_to_the_non_null_amount unit amount ->
244 (if Text.null $ Unit.unit_text unit
246 else "unit " <> (#)unit) <>
247 " sums up to the non-null amount: " <> (#)amount
248 Error_Transaction_Ledger_Unit_sums_up_to_the_non_null_amount unit amount ->
250 (if Text.null $ Unit.unit_text unit
252 else "unit " <> (#)unit) <>
253 " sums up to the non-null amount: " <> (#)amount
254 Error_Transaction_Year_or_day_is_missing ->
255 "year or day is missing"
256 Error_Unkown_command cmd -> "unkown command: " <> (#)cmd
259 Error_Account_Anchor_is_not_unique _pos anchor -> "Ancre de Compte non-unique : " <> (#)anchor
260 Error_Account_Anchor_unknown _pos anchor -> "Ancre de Compte inconnue : " <> (#)anchor
261 Error_Failed_to_read_file path -> "échec de la lecture du fichier : " <> (#)path
262 Error_Failed_to_include_file path -> "échec à l’inclusion du fichier : " <> (#)path
263 Error_No_input_file_given ->
265 [ "aucun fichier d’entrée indiqué, veuillez utiliser :"
266 , " - soit le paramètre -i FICHIER_DE_JOURNAL,"
267 , " - soit la variable d’environnement LEDGER_FILE."
269 Error_One_command_is_required -> "une COMMANDE est requise"
270 Error_Option_Balance_Format -> "le paramètre --format s’attend à \"close\", \"open\" ou \"table\" comme argument"
271 Error_Option_Balance_Heritage -> "le paramètre --heritage s’attend à \"yes\" ou \"no\" comme argument"
272 Error_Option_Balance_Redundant -> "le paramètre --redundant s’attend à \"yes\" ou \"no\" comme argument"
273 Error_Option_Balance_Total -> "le paramètre --total s’attend à \"yes\" ou \"no\" comme argument"
274 Error_Option_Color -> "le paramètre --color s’attend à \"auto\" (défaut), \"yes\" ou \"no\" comme argument"
275 Error_Option_Equilibrium -> "le paramètre --eq s’attend à un COMPTE"
276 Error_Option_Equilibrium_Credit -> "le paramètre --eq-credit s’attend à un COMPTE"
277 Error_Option_Equilibrium_Debit -> "le paramètre --eq-debit s’attend à un COMPTE"
278 Error_Option_Tags_Tree -> "le paramètre --total s’attend à \"yes\" ou \"no\" comme argument"
279 Error_Option_Verbosity -> "le paramètre --verbosity s’attend à \"error\", \"warn\", \"info\", or \"debug\" comme argument"
280 Error_Transaction_Anchor_is_not_unique _pos anchor -> "Ancre d’Écriture non-unique : " <> (#)anchor
281 Error_Transaction_Anchor_unknown _pos anchor -> "Ancre d’Écriture inconnue : " <> (#)anchor
282 Error_Transaction_Invalid_date year month dom ->
283 "date incorrecte (année " <> (#)year <> ", mois " <> (#)month <> ", jour " <> (#)dom <> ")"
284 Error_Transaction_Invalid_time_of_day hour minute second ->
285 "heure incorrecte (heure " <> (#)hour <> ", minute " <> (#)minute <> ", seconde " <> (#)second <> ")"
286 Error_Transaction_The_following_transaction_is_not_equilibrated_because ->
287 "la transaction suivante n’est pas équilibrée, car :"
288 Error_Transaction_The_following_virtual_transaction_is_not_equilibrated_because ->
289 "la transaction virtuelle suivante n’est pas équilibrée, car :"
290 Error_Transaction_JCC_Unit_sums_up_to_the_non_null_amount unit amount ->
292 (if Text.null $ Unit.unit_text unit
295 " a le solde non-nul : " <> (#)amount
296 Error_Transaction_Ledger_Unit_sums_up_to_the_non_null_amount unit amount ->
298 (if Text.null $ Unit.unit_text unit
301 " a le solde non-nul : " <> (#)amount
302 Error_Transaction_Year_or_day_is_missing ->
303 "l’année ou le jour est manquant-e"
304 Error_Unkown_command cmd -> "commande inconnue : " <> (#)cmd
306 -- * Type 'Error_Parsec'
308 = Error_Parsec_Expect W.Doc
309 | Error_Parsec_Message String
311 | Error_Parsec_Sysunexpect String
312 | Error_Parsec_Sysunexpect_EOI
313 | Error_Parsec_Unexpect W.Doc
314 | Error_Parsec_Unknown
315 instance ToDoc Lang Error_Parsec where
318 Error_Parsec_Expect doc -> "but expect : " <> (#)doc
319 Error_Parsec_Message doc -> (#)doc
320 Error_Parsec_Or -> "or"
321 Error_Parsec_Sysunexpect doc -> "is written : " <> (#)doc
322 Error_Parsec_Sysunexpect_EOI -> "end of file unexpected"
323 Error_Parsec_Unexpect doc -> "found : " <> (#)doc
324 Error_Parsec_Unknown -> "unkown"
327 Error_Parsec_Expect doc -> "mais s’attend à : " <> (#)doc
328 Error_Parsec_Message doc -> (#)doc
329 Error_Parsec_Or -> "ou"
330 Error_Parsec_Sysunexpect doc -> "est écrit : " <> (#)doc
331 Error_Parsec_Sysunexpect_EOI -> "fin de fichier inattendue"
332 Error_Parsec_Unexpect doc -> "trouve : " <> (#)doc
333 Error_Parsec_Unknown -> "inconnu"
334 instance Translate Parsec.SourcePos W.Doc where
335 translate EN pos = do
336 let line = Parsec.sourceLine pos
337 let col = Parsec.sourceColumn pos
338 case Parsec.sourceName pos of
339 "" -> "(line " <> (#)line <> ", column " <> (#)col <> ")"
340 path -> "(line " <> (#)line <> ", column " <> (#)col <> ") in: " <> (#)path
341 translate FR pos = do
342 let line = Parsec.sourceLine pos
343 let col = Parsec.sourceColumn pos
344 case Parsec.sourceName pos of
345 "" -> "(ligne " <> (#)line <> ", colonne " <> (#)col <> ")"
346 path -> "(ligne " <> (#)line <> ", colonne " <> (#)col <> ") dans : " <> (#)path
347 instance Translate e W.Doc
348 => Translate [Lib.Parsec.Error e] W.Doc where
349 translate lang errors =
351 (flip map) errors $ (\error ->
353 Lib.Parsec.Error_At pos errs -> W.vsep $
355 , translate lang errs
357 Lib.Parsec.Error_Parser err ->
359 [ translate lang (Parsec.errorPos err)
361 (Parsec.Error.errorMessages err)
363 Lib.Parsec.Error_Custom pos err -> W.vsep $
369 showErrorMessages :: [Parsec.Error.Message] -> W.Doc
370 showErrorMessages msgs
371 | null msgs = toDoc lang $ Error_Parsec_Unknown
372 | otherwise = W.vsep $ -- clean $
373 [showSysUnExpect, showUnExpect, showExpect, showMessages]
375 (sysUnExpect,msgs1) = span ((Parsec.Error.SysUnExpect "") ==) msgs
376 (unExpect,msgs2) = span ((Parsec.Error.UnExpect "") ==) msgs1
377 (expect,messages) = span ((Parsec.Error.Expect "") ==) msgs2
379 showExpect = showMany (Just (toDoc lang . Error_Parsec_Expect)) expect
380 showUnExpect = showMany (Just (toDoc lang . Error_Parsec_Unexpect)) unExpect
382 | not (null unExpect) || null sysUnExpect = W.empty
383 | null firstMsg = toDoc lang $ Error_Parsec_Sysunexpect_EOI
384 | otherwise = toDoc lang $ Error_Parsec_Sysunexpect firstMsg
386 firstMsg = Parsec.Error.messageString (head sysUnExpect)
388 showMessages = showMany Nothing messages
391 showMany :: (Maybe (W.Doc -> W.Doc)) -> [Parsec.Error.Message] -> W.Doc
393 case clean (map Parsec.Error.messageString msgs_) of
397 Nothing -> commasOr ms
398 Just p -> p $ commasOr ms
400 commasOr :: [String] -> W.Doc
401 commasOr [] = W.empty
402 commasOr [m] = W.bold $ W.dullblack $ W.text $ TL.pack m
403 commasOr ms = commaSep (init ms)
404 <> (W.space <> toDoc lang Error_Parsec_Or <> W.space)
405 <> (W.bold $ W.dullblack $ W.text $ TL.pack $ last ms)
406 commaSep = W.intercalate (W.comma <> W.space)
407 (W.bold . W.dullblack . W.text . TL.pack)
410 clean = Data.List.nub . filter (not . null)
415 | Header_Accounts_Depth
418 | Header_Tags_Distinct
419 | Header_Transactions
420 | Header_Transactions_Date
422 instance Translate Header [Text] where
425 Header_Accounts -> ["Accounts"]
426 Header_Accounts_Depth -> ["Accounts","Depth"]
427 Header_Journals -> ["Journals"]
428 Header_Tags -> ["Tags"]
429 Header_Tags_Distinct -> ["Tags", "Distinct"]
430 Header_Transactions -> ["Transactions"]
431 Header_Transactions_Date -> ["Transactions", "Date"]
432 Header_Units -> ["Unit"]
435 Header_Accounts -> ["Comptes"]
436 Header_Accounts_Depth -> ["Comptes","Profondeur"]
437 Header_Journals -> ["Journaux"]
438 Header_Tags -> ["Tags"]
439 Header_Tags_Distinct -> ["Tags", "Distincts"]
440 Header_Transactions -> ["Écritures"]
441 Header_Transactions_Date -> ["Écritures", "Date"]
442 Header_Units -> ["Unités"]
446 = Help_Command_Balance
447 | Help_Command_General_Ledger
448 | Help_Command_Journal
449 | Help_Command_Journals
452 | Help_Option_Balance_Format
453 | Help_Option_Balance_Heritage
454 | Help_Option_Balance_Redundant
455 | Help_Option_Balance_Total
457 | Help_Option_Equilibrium
458 | Help_Option_Equilibrium_Credit
459 | Help_Option_Equilibrium_Debit
460 | Help_Option_Filter_Balance
461 | Help_Option_Filter_General_Ledger
462 | Help_Option_Filter_Posting
463 | Help_Option_Filter_Tag
464 | Help_Option_Filter_Transaction
469 | Help_Option_Overwrite
470 | Help_Option_Tags_Tree
471 | Help_Option_Verbosity
473 instance Translate Help String where
476 Help_Command_Balance -> "List final DEBITs, CREDITs and BALANCEs of ACCOUNTs"
477 Help_Command_General_Ledger -> "List DEBITs, CREDITs and BALANCEs of ACCOUNTs after each TRANSACTION"
478 Help_Command_Journal -> "List TRANSACTIONs"
479 Help_Command_Journals -> "List JOURNAL FILEs"
480 Help_Command_Stats -> "Show some statistics"
481 Help_Command_Tags -> "List TAGs"
482 Help_Option_Balance_Format -> "Select BALANCE output format"
483 Help_Option_Balance_Heritage -> "Propagate AMOUNTs to ascending ACCOUNTs"
484 Help_Option_Balance_Redundant -> "Also show ACCOUNTs with null AMOUNT or the same AMOUNTs than its descending ACCOUNT"
485 Help_Option_Balance_Total -> "Show transversal DEBIT, CREDIT, and BALANCE by UNIT"
486 Help_Option_Color -> "Colorize output"
487 Help_Option_Equilibrium -> "Specify the ACCOUNT equilibrating an opening or closing BALANCE"
488 Help_Option_Equilibrium_Credit -> "Like --eq but only when the AMOUNT is a CREDIT"
489 Help_Option_Equilibrium_Debit -> "Like --eq but only when the AMOUNT is a DEBIT"
490 Help_Option_Filter_Balance -> "Apply given FILTER_OF_BALANCE, multiple uses are joined with a logical AND"
491 Help_Option_Filter_General_Ledger -> "Apply given FILTER_OF_GENERAL_LEDGER, multiple uses are joined with a logical AND"
492 Help_Option_Filter_Posting -> "Apply given FILTER_OF_POSTING, multiple uses are joined with a logical AND"
493 Help_Option_Filter_Tag -> "Apply given FILTER_OF_TAG, multiple uses are joined with a logical AND"
494 Help_Option_Filter_Transaction -> "Apply given FILTER_OF_TRANSACTION, multiple uses are joined with a logical AND"
495 Help_Option_Help -> "Show this help"
496 Help_Option_Input -> "Read a JOURNAL from given FILE, multiple uses merge the data"
497 Help_Option_Lang -> "RFC1766 / ISO 639-1 language code (fr, en-GB, etc.)"
498 Help_Option_Output -> "Append output data to given FILE, multiple uses output to multiple FILEs"
499 Help_Option_Overwrite -> "Overwrite given FILE with output data, multiple uses overwrite to multiple FILEs"
500 Help_Option_Tags_Tree -> "Show TAGs as a tree"
501 Help_Option_Verbosity -> "Set verbosity level, or increment it when used multiple times"
502 Help_Synopsis -> "[OPTIONS] COMMAND [COMMAND_OPTIONS]"
505 Help_Command_Balance -> "Liste les DÉBITs, CRÉDITs et SOLDEs finaux des COMPTEs"
506 Help_Command_General_Ledger -> "Liste les DÉBITs, CRÉDITs et SOLDEs des COMPTEs après chaque ÉCRITURE"
507 Help_Command_Journal -> "Liste les ÉCRITUREs"
508 Help_Command_Journals -> "Liste les FICHIERs des JOURNAUX"
509 Help_Command_Stats -> "Affiche quelques statistiques"
510 Help_Command_Tags -> "Liste les TAGs"
511 Help_Option_Balance_Format -> "Sélectionne le format de BALANCE en sortie"
512 Help_Option_Balance_Heritage -> "Propage les MONTANTs aux COMPTEs ascendants"
513 Help_Option_Balance_Redundant -> "Affiche également les COMPTEs dont le MONTANT est nul ou qui ont les mêmes MONTANTs que leur COMPTE descendant"
514 Help_Option_Balance_Total -> "Affiche les SOLDEs transversaux par UNITÉ"
515 Help_Option_Color -> "Colore la sortie"
516 Help_Option_Equilibrium -> "Indique le COMPTE d’équilibre pour une BALANCE d’ouverture ou de fermeture"
517 Help_Option_Equilibrium_Credit -> "Comme --eq mais seulement lorsque le MONTANT est un CRÉDIT"
518 Help_Option_Equilibrium_Debit -> "Comme --eq mais seulement lorsque le MONTANT est un DÉBIT"
519 Help_Option_Filter_Balance -> "Applique le FILTRE_DE_BALANCE donné, un usage multiple agit comme un ET logique"
520 Help_Option_Filter_General_Ledger -> "Applique le FILTRE_DE_GRAND_LIVRE donné, un usage multiple agit comme un ET logique"
521 Help_Option_Filter_Posting -> "Applique le FILTRE_DE_MOUVEMENT donné, un usage multiple agit comme un ET logique"
522 Help_Option_Filter_Tag -> "Applique le FILTRE_DE_TAG donné, un usage multiple agit comme un ET logique"
523 Help_Option_Filter_Transaction -> "Applique le FILTRE_D’ÉCRITURE donné, un usage multiple agit comme un ET logique"
524 Help_Option_Help -> "Affiche cette aide"
525 Help_Option_Input -> "Lit un JOURNAL dans le FICHIER donné, un usage multiple fusionne les données"
526 Help_Option_Lang -> "Code de langue RFC1766 / ISO 639-1 language code (fr, en-GB, etc.)"
527 Help_Option_Output -> "Ajoute la sortie au FICHIER donné, un usage multiple écrit dans plusieurs FICHIERs"
528 Help_Option_Overwrite -> "Écrase le FICHIER donné avec la sortie, un usage multiple écrase plusieurs FICHIERs"
529 Help_Option_Tags_Tree -> "Affiche les TAGs en arborescence"
530 Help_Option_Verbosity -> "Indique le niveau de verbosité, ou l’incrémente lorsque utilisé plusieurs fois"
531 Help_Synopsis -> "[PARAMÈTRES] COMMANDE [PARAMÈTRES_DE_COMMANDE]"
536 | Section_Description
540 instance Translate Section String where
543 Section_Commands -> "COMMANDS (use COMMAND --help for help on COMMAND)"
544 Section_Description -> "DESCRIPTION"
545 Section_Syntax -> "SYNTAX"
546 Section_Options -> "OPTIONS"
549 Section_Commands -> "COMMANDES (utilisez COMMANDE --help pour une aide sur COMMANDE)"
550 Section_Description -> "DESCRIPTION"
551 Section_Syntax -> "SYNTAXE"
552 Section_Options -> "PARAMÈTRES"
562 | Title_Running_balance
563 | Title_Running_credit
564 | Title_Running_debit
565 instance Translate Title Text where
568 Title_Account -> "Account"
569 Title_Balance -> "Balance"
570 Title_Credit -> "Credit"
572 Title_Debit -> "Debit"
573 Title_Description -> "Wording"
574 Title_Running_balance -> "Running balance"
575 Title_Running_credit -> "Running credit"
576 Title_Running_debit -> "Running debit"
579 Title_Account -> "Compte"
580 Title_Balance -> "Solde"
581 Title_Credit -> "Crédit"
583 Title_Debit -> "Débit"
584 Title_Description -> "Libellé"
585 Title_Running_balance -> "Solde cumulé"
586 Title_Running_credit -> "Crédit cumulé"
587 Title_Running_debit -> "Débit cumulé"
594 | Type_Filter_Balance
595 | Type_Filter_General_Ledger
596 | Type_Filter_Posting
598 | Type_Filter_Transaction
601 instance Translate Type String where
604 Type_Account -> "ACCOUNT"
606 Type_File_Journal -> "FILE_OF_JOURNAL"
607 Type_Filter_Balance -> "FILTER_OF_BALANCE"
608 Type_Filter_General_Ledger -> "FILTER_OF_GENERAL_LEDGER"
609 Type_Filter_Posting -> "FILTER_OF_POSTING"
610 Type_Filter_Tag -> "FILTER_OF_TAG"
611 Type_Filter_Transaction -> "FILTER_OF_TRANSACTION"
612 Type_Option -> "OPTION"
615 Type_Account -> "COMPTE"
616 Type_File -> "FICHIER"
617 Type_File_Journal -> "FICHIER_DE_JOURNAL"
618 Type_Filter_Balance -> "FILTRE_DE_BALANCE"
619 Type_Filter_General_Ledger -> "FILTRE_DE_GRAND_LIVRE"
620 Type_Filter_Posting -> "FILTRE_DE_MOUVEMENT"
621 Type_Filter_Tag -> "FILTRE_DE_TAG"
622 Type_Filter_Transaction -> "FILTRE_D’ÉCRITURE"
623 Type_Option -> "PARAMÈTRE"
629 instance Translate Write W.Doc where
632 Write_Error -> "ERROR"
633 Write_Debug -> "DEBUG"
636 Write_Error -> "ERREUR"
637 Write_Debug -> "DÉBUG"