                  action=MultiOption,
                  type=str.lower,
                  nargs="+",
                  choices=[str(idx) for idx in range(len(_GPUS))],
                  group="Global Options",
                  help="R|Exclude GPUs from use by Faceswap. Select the number(s) which correspond "
                       "to any GPU(s) that you do not wish to be made available to Faceswap. "
                       "Selecting all GPUs here will force Faceswap into CPU mode."
                       "\nL|{}".format(" \nL|".join(_GPUS))))
          global_args.append(dict(
              opts=("-C", "--configfile"),
              action=FileFullPaths,
              filetypes="ini",
              type=str,
 
</s> remove             group="Global Options",
            help="Optionally overide the saved config with the path to a custom config file."))
 </s> add             group=_("Global Options"),
            help=_("Optionally overide the saved config with the path to a custom config file."))) </s> remove             help="R|Choose which action you want to perform. NB: All actions require an "
                 "alignments file (-a) to be passed in."
                 "\nL|'draw': Draw landmarks on frames in the selected folder/video. A subfolder "
                 "will be created within the frames folder to hold the output.{0}"
                 "\nL|'extract': Re-extract faces from the source frames/video based on alignment "
                 "data. This is a lot quicker than re-detecting faces. Can pass in the '-een' "
                 "(--extract-every-n) parameter to only extract every nth frame.{1}"
                 "\nL|'missing-alignments': Identify frames that do not exist in the alignments "
                 "file.{2}{0}"
                 "\nL|'missing-frames': Identify frames in the alignments file that do not appear "
                 "within the frames folder/video.{2}{0}"
                 "\nL|'multi-faces': Identify where multiple faces exist within the alignments "
                 "file.{2}{4}"
                 "\nL|'no-faces': Identify frames that exist within the alignment file but no "
                 "faces were detected.{2}{0}"
                 "\nL|'remove-faces': Remove deleted faces from an alignments file. The original "
                 "alignments file will be backed up.{3}"
                 "\nL|'rename' - Rename faces to correspond with their parent frame and position "
                 "index in the alignments file (i.e. how they are named after running extract).{3}"
                 "\nL|'sort': Re-index the alignments from left to right. For alignments with "
                 "multiple faces this will ensure that the left-most face is at index 0."
                 "\nL|'spatial': Perform spatial and temporal filtering to smooth alignments "
                 "(EXPERIMENTAL!)".format(frames_dir, frames_and_faces_dir, output_opts, faces_dir,
                                          frames_or_faces_dir)))
 </s> add             help=_("R|Choose which action you want to perform. NB: All actions require an "
                   "alignments file (-a) to be passed in."
                   "\nL|'draw': Draw landmarks on frames in the selected folder/video. A "
                   "subfolder will be created within the frames folder to hold the output.{0}"
                   "\nL|'extract': Re-extract faces from the source frames/video based on "
                   "alignment data. This is a lot quicker than re-detecting faces. Can pass in "
                   "the '-een' (--extract-every-n) parameter to only extract every nth frame.{1}"
                   "\nL|'missing-alignments': Identify frames that do not exist in the alignments "
                   "file.{2}{0}"
                   "\nL|'missing-frames': Identify frames in the alignments file that do not "
                   "appear within the frames folder/video.{2}{0}"
                   "\nL|'multi-faces': Identify where multiple faces exist within the alignments "
                   "file.{2}{4}"
                   "\nL|'no-faces': Identify frames that exist within the alignment file but no "
                   "faces were detected.{2}{0}"
                   "\nL|'remove-faces': Remove deleted faces from an alignments file. The "
                   "original alignments file will be backed up.{3}"
                   "\nL|'rename' - Rename faces to correspond with their parent frame and "
                   "position index in the alignments file (i.e. how they are named after running "
                   "extract).{3}"
                   "\nL|'sort': Re-index the alignments from left to right. For alignments with "
                   "multiple faces this will ensure that the left-most face is at index 0."
                   "\nL|'spatial': Perform spatial and temporal filtering to smooth alignments "
                   "(EXPERIMENTAL!)").format(frames_dir, frames_and_faces_dir, output_opts,
                                             faces_dir, frames_or_faces_dir))) </s> remove             group="Face Processing",
            help="Optionally filter out people who you do not wish to process by passing in an "
                 "image of that person. Should be a front portrait with a single person in the "
                 "image. Multiple images can be added space separated. NB: Using face filter "
                 "will significantly decrease extraction speed and its accuracy cannot be "
                 "guaranteed."))
 </s> add             group=_("Face Processing"),
            help=_("Optionally filter out people who you do not wish to process by passing in an "
                   "image of that person. Should be a front portrait with a single person in the "
                   "image. Multiple images can be added space separated. NB: Using face filter "
                   "will significantly decrease extraction speed and its accuracy cannot be "
                   "guaranteed."))) </s> remove             group="Face Processing",
            help="Optionally filter out people who you do not wish to process by passing in an "
                 "image of that person. Should be a front portrait with a single person in the "
                 "image. Multiple images can be added space separated. NB: Using face filter "
                 "will significantly decrease extraction speed and its accuracy cannot be "
                 "guaranteed."))
 </s> add             group=_("Face Processing"),
            help=_("Optionally filter out people who you do not wish to process by passing in an "
                   "image of that person. Should be a front portrait with a single person in the "
                   "image. Multiple images can be added space separated. NB: Using face filter "
                   "will significantly decrease extraction speed and its accuracy cannot be "
                   "guaranteed."))) </s> remove             group="Plugins",
            help="R|Aligner to use."
                 "\nL|cv2-dnn: A CPU only landmark detector. Faster, less resource intensive, "
                 "but less accurate. Only use this if not using a GPU and time is important."
                 "\nL|fan: Best aligner. Fast on GPU, slow on CPU."))
 </s> add             group=_("Plugins"),
            help=_("R|Aligner to use."
                   "\nL|cv2-dnn: A CPU only landmark detector. Faster, less resource intensive, "
                   "but less accurate. Only use this if not using a GPU and time is important."
                   "\nL|fan: Best aligner. Fast on GPU, slow on CPU.")))
                group=_("Global Options"),
                help=_("R|Exclude GPUs from use by Faceswap. Select the number(s) which "
                       "correspond to any GPU(s) that you do not wish to be made available to "
                       "Faceswap. Selecting all GPUs here will force Faceswap into CPU mode."
                       "\nL|{}").format(" \nL|".join(_GPUS))))
                  action=MultiOption,
                  type=str.lower,
                  nargs="+",
                  choices=[str(idx) for idx in range(len(_GPUS))],
                group=_("Global Options"),
                help=_("R|Exclude GPUs from use by Faceswap. Select the number(s) which "
                       "correspond to any GPU(s) that you do not wish to be made available to "
                       "Faceswap. Selecting all GPUs here will force Faceswap into CPU mode."
                       "\nL|{}").format(" \nL|".join(_GPUS))))
                group=_("Global Options"),
                help=_("R|Exclude GPUs from use by Faceswap. Select the number(s) which "
                       "correspond to any GPU(s) that you do not wish to be made available to "
                       "Faceswap. Selecting all GPUs here will force Faceswap into CPU mode."
                       "\nL|{}").format(" \nL|".join(_GPUS))))
                group=_("Global Options"),
                help=_("R|Exclude GPUs from use by Faceswap. Select the number(s) which "
                       "correspond to any GPU(s) that you do not wish to be made available to "
                       "Faceswap. Selecting all GPUs here will force Faceswap into CPU mode."
                       "\nL|{}").format(" \nL|".join(_GPUS))))
                group=_("Global Options"),
                help=_("R|Exclude GPUs from use by Faceswap. Select the number(s) which "
                       "correspond to any GPU(s) that you do not wish to be made available to "
                       "Faceswap. Selecting all GPUs here will force Faceswap into CPU mode."
                       "\nL|{}").format(" \nL|".join(_GPUS))))
                group=_("Global Options"),
                help=_("R|Exclude GPUs from use by Faceswap. Select the number(s) which "
                       "correspond to any GPU(s) that you do not wish to be made available to "
                       "Faceswap. Selecting all GPUs here will force Faceswap into CPU mode."
                       "\nL|{}").format(" \nL|".join(_GPUS))))
          global_args.append(dict(
              opts=("-C", "--configfile"),
              action=FileFullPaths,
              filetypes="ini",
              type=str,
keep keep keep keep replace replace replace replace replace keep keep keep keep keep
 Add Locale support for cli arguments 
lib/cli/args.py