diff --git a/CREDITS.md b/CREDITS.md index 44eb01b..5427730 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -5,6 +5,7 @@ If you're on this list and want your link changed let me know. - [DoumanAsh](https://github.com/DoumanAsh) - [Niakr1s](https://github.com/Niakr1s) - [tinyAdapter](https://github.com/tinyAdapter) +- French translation by Racky - Spanish translation by [scese250](https://github.com/scese250) - Turkish translation by niisokusu - Simplified Chinese translation by [tinyAdapter](https://github.com/tinyAdapter) diff --git a/deploy.ps1 b/deploy.ps1 index 3fffc01..c6a6a4a 100644 --- a/deploy.ps1 +++ b/deploy.ps1 @@ -17,6 +17,7 @@ foreach ($language in @{ THAI="Thai"; KOREAN="Korean"; ITALIAN="Italian"; + FRENCH="French" }.GetEnumerator()) { $folder = "Textractor-$($language.Value)-$version"; diff --git a/installer.iss b/installer.iss index b5a9512..d6d0901 100644 --- a/installer.iss +++ b/installer.iss @@ -25,6 +25,7 @@ Name: "pt"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl" Name: "th"; MessagesFile: "compiler:Languages\Unofficial\Thai.isl" Name: "ko"; MessagesFile: "compiler:Languages\Unofficial\Korean.isl" Name: "it"; MessagesFile: "compiler:Languages\Italian.isl" +Name: "fr"; MessagesFile: "compiler:Languages\French.isl" [Files] @@ -39,3 +40,4 @@ Source: "Builds\Textractor-Portuguese-{#VERSION}\*"; DestDir: "{app}"; Languages Source: "Builds\Textractor-Thai-{#VERSION}\*"; DestDir: "{app}"; Languages: th; Flags: recursesubdirs ignoreversion Source: "Builds\Textractor-Korean-{#VERSION}\*"; DestDir: "{app}"; Languages: ko; Flags: recursesubdirs ignoreversion Source: "Builds\Textractor-Italian-{#VERSION}\*"; DestDir: "{app}"; Languages: it; Flags: recursesubdirs ignoreversion +Source: "Builds\Textractor-French-{#VERSION}\*"; DestDir: "{app}"; Languages: fr; Flags: recursesubdirs ignoreversion diff --git a/text.cpp b/text.cpp index f9deaf3..d55ed80 100644 --- a/text.cpp +++ b/text.cpp @@ -1,4 +1,4 @@ -#ifdef _WIN64 +#ifdef _WIN64 #define ARCH "x64" #else #define ARCH "x86" @@ -14,6 +14,7 @@ #define THAI #define PORTUGUESE #define KOREAN +#define FRENCH #endif const char* NATIVE_LANGUAGE = "English"; @@ -997,5 +998,199 @@ original_text의 빈공간은 무시되지만, replacement_text는 공백과 엔 이 파일은 유니코드로 저장되어야만 함 (UTF-16 little endian).)"; #endif // KOREAN +#ifdef FRENCH + const char* NATIVE_LANGUAGE = "French"; + const char* ATTACH = u8"Attacher le jeu"; + const char* LAUNCH = u8"Lancer le jeu"; + const char* GAME_CONFIG = u8"Configure le jeu"; + const char* DETACH = u8"Detacher du jeu"; + const char* FORGET = u8"Oublier le jeu"; + const char* ADD_HOOK = u8"Ajouter un hook"; + const char* REMOVE_HOOKS = u8"Enlever un hook(s)"; + const char* SAVE_HOOKS = u8"Sauvegarder un hook(s)"; + const char* SEARCH_FOR_HOOKS = u8"Rechercher des hooks"; + const char* SETTINGS = u8"Paramètres"; + const char* EXTENSIONS = u8"Extensions"; + const char* SELECT_PROCESS = u8"Selectionner le processus"; + const char* ATTACH_INFO = u8R"(Si vous ne voyez pas le processus que vous souhaitez joindre, essayez de l'exécuter avec les droits d'administrateur +Vous pouvez également saisir l'ID de processus)"; + const char* SELECT_PROCESS_INFO = u8"Si vous saisissez manuellement le nom du fichier de processus, veuillez utiliser le chemin exact"; + const char* FROM_COMPUTER = u8"Selectionner depuis l'ordinateur"; + const char* PROCESSES = u8"Processus (*.exe)"; + const char* CODE_INFODUMP = u8R"(Enter read code +R{S|Q|V|M}[null_length<][codepage#]@addr +OR +Enter hook code +H{A|B|W|H|S|Q|V|M}[F][null_length<][N][codepage#][padding+]data_offset[*deref_offset][:split_offset[*deref_offset]]@addr[:module[:func]] +All numbers except codepage/null_length in hexadecimal +Default codepage is 932 (Shift-JIS) but this can be changed in settings +A/B: codepage char little/big endian +W: UTF-16 char +H: Two hex bytes +S/Q/V/M: codepage/UTF-16/UTF-8/hex string +F: treat strings as full lines of text +N: don't use context +null_length: length of null terminator used for string +padding: length of padding data before string (C struct { int64_t size; char string[500]; } needs padding = 8) +Negatives for data_offset/split_offset refer to registers +-4 for EAX, -8 for ECX, -C for EDX, -10 for EBX, -14 for ESP, -18 for EBP, -1C for ESI, -20 for EDI +-C for RAX, -14 for RBX, -1C for RCX, -24 for RDX, and so on for RSP, RBP, RSI, RDI, R8-R15 +* means dereference pointer+deref_offset)"; + const char* SAVE_SETTINGS = u8"Sauvergarder les paramètres"; + const char* EXTEN_WINDOW_INSTRUCTIONS = u8R"(Pour ajouter une extension, cliquez avec le bouton droit sur la liste des extensions +Vous pouvez également faire glisser et déposer le fichier d'extension depuis votre ordinateur +Pour réorganiser les extensions, faites-les glisser et déposez-les dans la liste +(Les extensions sont utilisées de haut en bas: l'ordre est IMPORTANT) +Pour supprimer une extension, sélectionnez-la et appuyez sur supprimer)"; + const char* ADD_EXTENSION = u8"Ajouter une extension"; + const char* INVALID_EXTENSION = u8"%1 C'est une extension invalide"; + const char* CONFIRM_EXTENSION_OVERWRITE = u8"Une autre version de cette extension existe déjà. Voulez-vous la supprimer et la remplacer?"; + const char* EXTENSION_WRITE_ERROR = u8"Impossible d'enregistrer l'extension"; + const char* USE_JP_LOCALE = u8"Émuler les paramètres régionaux japonais?"; + const char* FAILED_TO_CREATE_CONFIG_FILE = u8"Impossible de créer le fichier de configuration \"%1\""; + const char* HOOK_SEARCH_UNSTABLE_WARNING = u8"La recherche de crochets est instable! Soyez prêt à ce que votre jeu plante!"; + const char* SEARCH_CJK = u8"Recher pour Chinois/Japonais/Coréen"; + const char* SEARCH_PATTERN = u8"Modèle de recherche (tableau d'octets hexadécimaux)"; + const char* SEARCH_DURATION = u8"Durée de la recherche(ms)"; + const char* SEARCH_MODULE = u8"Recherche sans module"; + const char* PATTERN_OFFSET = u8"Décalage par rapport au début du modèle"; + const char* MAX_HOOK_SEARCH_RECORDS = u8"Limite du résultat de la recherche"; + const char* MIN_ADDRESS = u8"Minimum d'adresses (hex)"; + const char* MAX_ADDRESS = u8"Maximum d'adresses (hex)"; + const char* STRING_OFFSET = u8"Décalage de la chaîne (hex)"; + const char* HOOK_SEARCH_FILTER = u8"Results must match this regex"; + const char* TEXT = u8"Texte"; + const char* CODEPAGE = u8"Code de page"; + const char* SEARCH_FOR_TEXT = u8"Rechercher un texte spécifique"; + const char* START_HOOK_SEARCH = u8"Lancer la recherche de hook"; + const char* SAVE_SEARCH_RESULTS = u8"Sauvergarder les résultats de la recherche"; + const char* TEXT_FILES = u8"Texte (*.txt)"; + const char* DOUBLE_CLICK_TO_REMOVE_HOOK = u8"Double click un hook pour l'enlever"; + const char* FILTER_REPETITION = u8"Répétition de filtre"; + const char* AUTO_ATTACH = u8"Attachement Automatique"; + const char* ATTACH_SAVED_ONLY = u8"Attachement Automatique(Sauvergardé seulement)"; + const char* SHOW_SYSTEM_PROCESSES = u8"Montrer les processus système"; + const char* DEFAULT_CODEPAGE = u8"Page de code de base"; + const char* FLUSH_DELAY = u8"Retard de vidage"; + const char* MAX_BUFFER_SIZE = u8"Taille maximale du tampon"; + const char* MAX_HISTORY_SIZE = u8"Taille d'historique maximale"; + const char* CONFIG_JP_LOCALE = u8"Lancement avec les paramètres régionaux JP"; + const wchar_t* CONSOLE = L"Console"; + const wchar_t* CLIPBOARD = L"Presse-papier"; + const wchar_t* ABOUT = L"Textractor " ARCH L" v" VERSION LR"( Fait par moi: Artikash (email: akashmozumdar@gmail.com) +Page d'acceuil du projet: https://github.com/Artikash/Textractor +Vidéo tuto: https://tinyurl.com/textractor-tutorial +FAQ: https://github.com/Artikash/Textractor/wiki/FAQ +Veuillez me contacter pour tout problème, demande de fonctionnalité ou question concernant Textractor +Vous pouvez le faire via la page d'accueil du projet (section problèmes) ou par e-mail +Code source disponible sous GPLv3 sur la page d'accueil du projet +Si vous aimez ce projet, parlez-en à tout le monde :))"; + const wchar_t* CL_OPTIONS = LR"(usage: Textractor [-p{process id|"process name"}]... +example: Textractor -p4466 -p"My Game.exe" tries to inject processes with id 4466 or with name My Game.exe)"; + const wchar_t* UPDATE_AVAILABLE = L"Mise à jour disponible: téléchargez-la depuis https://github.com/Artikash/Textractor/releases"; + const wchar_t* ALREADY_INJECTED = L"Textractor: déjà injecté"; + const wchar_t* NEED_32_BIT = L"Textractor: incompatibilité d'architecture: seul Textractor x86 peut injecter ce processus"; + const wchar_t* NEED_64_BIT = L"Textractor: incompatibilité d'architecture: seul Textractor x64 peut injecter ce processus"; + const wchar_t* INJECT_FAILED = L"Textractor: ne peut pas injecter"; + const wchar_t* LAUNCH_FAILED = L"Textractor: ne peut pas lancer"; + const wchar_t* INVALID_CODE = L"Textractor: code invalide"; + const wchar_t* INVALID_CODEPAGE = L"Textractor: impossible de convertir le texte (page de code non valide?)"; + const char* PIPE_CONNECTED = u8"Textractor: tuyau connecté"; + const char* INSERTING_HOOK = u8"Textractor: insertion du hook: %s"; + const char* REMOVING_HOOK = u8"Textractor: enlève le hook: %s"; + const char* HOOK_FAILED = u8"Textractor: n'a pas réussi à insérer un hook"; + const char* TOO_MANY_HOOKS = u8"Textractor: trop de hooks: impossible d'insérer"; + const char* STARTING_SEARCH = u8"Textractor: démarrage de la recherche"; + const char* NOT_ENOUGH_TEXT = u8"Textractor: pas assez de texte pour effectuer une recherche précise"; + const char* HOOK_SEARCH_INITIALIZED = u8"Textractor: la recherche a été initialisé avec %zd hooks"; + const char* MAKE_GAME_PROCESS_TEXT = u8"Textractor: veuillez cliquer dans le jeu pour le forcer à traiter le texte lors de la prochaine %d seconds"; + const char* HOOK_SEARCH_FINISHED = u8"Textractor: la recherche du hook est finie, %d results found"; + const char* OUT_OF_RECORDS_RETRY = u8"Textractor: hors des enregistrements de recherche, veuillez réessayer si les résultats sont médiocres (le nombre d'enregistrements par défaut a augmenté)"; + const char* FUNC_MISSING = u8"Textractor: function non présente"; + const char* MODULE_MISSING = u8"Textractor: module non présente"; + const char* GARBAGE_MEMORY = u8"Textractor: mémoire en constante évolution, inutile à lire"; + const char* SEND_ERROR = u8"Textractor: envoyer ERREUR (comme un H-code instable/incorrect)"; + const char* READ_ERROR = u8"Textractor: Lire ERREUR (comme un R-code incorrect)"; + const char* HIJACK_ERROR = u8"Textractor: ERREUR Hijack"; + const char* COULD_NOT_FIND = u8"Textractor: ne peut pas trouver le texte"; + const char* TRANSLATE_TO = u8"Traduire à"; + const char* TRANSLATE_SELECTED_THREAD_ONLY = u8"Traduire uniquement le thread sélectionné"; + const char* RATE_LIMIT_ALL_THREADS = u8"Taux limite tout les threads de texte"; + const char* RATE_LIMIT_SELECTED_THREAD = u8"Limite de débit du thread de texte sélectionné"; + const char* USE_TRANS_CACHE = u8"Utiliser le cache de traduction"; + const char* RATE_LIMIT_TOKEN_COUNT = u8"Nombre de tokens du limiteur de débit"; + const char* RATE_LIMIT_TOKEN_RESTORE_DELAY = u8"Délai de restauration du token du limiteur de débit (ms)"; + const wchar_t* TOO_MANY_TRANS_REQUESTS = L"Limite de taux dépassée: refus de faire plus de demande de traduction"; + const wchar_t* TRANSLATION_ERROR = L"Une erreur est survenue pendant la traduction"; + const char* USE_PREV_SENTENCE_CONTEXT = u8"Utiliser la phrase précédente comme contexte"; + const char* API_KEY = u8"API key"; + const char* EXTRA_WINDOW_INFO = u8R"(Clic droit pour modifier les paramètres +Cliquez et faites glisser sur les bords de la fenêtre pour vous déplacer ou dans le coin inférieur droit pour redimensionner)"; + const char* SENTENCE_TOO_BIG = u8"Phrase trop grande pour être affichée"; + const char* MAX_SENTENCE_SIZE = u8"Taille maximale de la phrase"; + const char* TOPMOST = u8"Toujours au dessus"; + const char* DICTIONARY = u8"Dictionnaire"; + const char* DICTIONARY_INSTRUCTIONS = u8R"(Ce fichier est utilisé uniquement pour la fonction "Dictionnaire" de l'extension Extra Window. +Il utilise un format personnalisé spécifique à Textractor et n'est pas destiné à être écrit manuellement. +Vous devriez rechercher un dictionnaire dans ce format en ligne (https://github.com/Artikash/Textractor-Dictionaries/releases est un bon point de dépar). +Alternativement, si vous êtes programmeur, vous pouvez écrire un script pour convertir un dictionnaire d'un autre format avec les informations ci-dessous. +Une fois que vous avez un dictionnaire, pour rechercher du texte dans Extra Window, survolez-le. Vous pouvez faire défiler toutes les définitions correspondantes. +Les definitions sont formattés comme ceci:|TERM|Hola<