add french translation

This commit is contained in:
Akash Mozumdar 2020-05-14 18:35:26 -06:00
parent 4b0fc12794
commit 5739af5a3f
4 changed files with 200 additions and 1 deletions

View File

@ -5,6 +5,7 @@ If you're on this list and want your link changed let me know.
- [DoumanAsh](https://github.com/DoumanAsh) - [DoumanAsh](https://github.com/DoumanAsh)
- [Niakr1s](https://github.com/Niakr1s) - [Niakr1s](https://github.com/Niakr1s)
- [tinyAdapter](https://github.com/tinyAdapter) - [tinyAdapter](https://github.com/tinyAdapter)
- French translation by Racky
- Spanish translation by [scese250](https://github.com/scese250) - Spanish translation by [scese250](https://github.com/scese250)
- Turkish translation by niisokusu - Turkish translation by niisokusu
- Simplified Chinese translation by [tinyAdapter](https://github.com/tinyAdapter) - Simplified Chinese translation by [tinyAdapter](https://github.com/tinyAdapter)

View File

@ -17,6 +17,7 @@ foreach ($language in @{
THAI="Thai"; THAI="Thai";
KOREAN="Korean"; KOREAN="Korean";
ITALIAN="Italian"; ITALIAN="Italian";
FRENCH="French"
}.GetEnumerator()) }.GetEnumerator())
{ {
$folder = "Textractor-$($language.Value)-$version"; $folder = "Textractor-$($language.Value)-$version";

View File

@ -25,6 +25,7 @@ Name: "pt"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl"
Name: "th"; MessagesFile: "compiler:Languages\Unofficial\Thai.isl" Name: "th"; MessagesFile: "compiler:Languages\Unofficial\Thai.isl"
Name: "ko"; MessagesFile: "compiler:Languages\Unofficial\Korean.isl" Name: "ko"; MessagesFile: "compiler:Languages\Unofficial\Korean.isl"
Name: "it"; MessagesFile: "compiler:Languages\Italian.isl" Name: "it"; MessagesFile: "compiler:Languages\Italian.isl"
Name: "fr"; MessagesFile: "compiler:Languages\French.isl"
[Files] [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-Thai-{#VERSION}\*"; DestDir: "{app}"; Languages: th; Flags: recursesubdirs ignoreversion
Source: "Builds\Textractor-Korean-{#VERSION}\*"; DestDir: "{app}"; Languages: ko; 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-Italian-{#VERSION}\*"; DestDir: "{app}"; Languages: it; Flags: recursesubdirs ignoreversion
Source: "Builds\Textractor-French-{#VERSION}\*"; DestDir: "{app}"; Languages: fr; Flags: recursesubdirs ignoreversion

197
text.cpp
View File

@ -1,4 +1,4 @@
#ifdef _WIN64 #ifdef _WIN64
#define ARCH "x64" #define ARCH "x64"
#else #else
#define ARCH "x86" #define ARCH "x86"
@ -14,6 +14,7 @@
#define THAI #define THAI
#define PORTUGUESE #define PORTUGUESE
#define KOREAN #define KOREAN
#define FRENCH
#endif #endif
const char* NATIVE_LANGUAGE = "English"; const char* NATIVE_LANGUAGE = "English";
@ -997,5 +998,199 @@ original_text의 빈공간은 무시되지만, replacement_text는 공백과 엔
(UTF-16 little endian).)"; (UTF-16 little endian).)";
#endif // KOREAN #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<<ignored|TERM|hola|TERM|Bonjour|TERM|bonjour|DEFINITION|hello|END|
Le terme et la définition peuvent inclure du texte enrichi (https://doc.qt.io/qt-5/richtext-html-subset.html) qui sera correctement formaté.
Les inflexions sont formatées comme ceci:|ROOT|1<<noun|INFLECTS TO|(\w*)s|NAME| plural|END|
Textractor vérifiera si un terme correspond à l'expression rationnelle d'inflexion et si c'est le cas, recherchera récursivement le terme racine.
Le terme racine est généré en remplaçant chaque nombre par le groupe de capture regex correspondant (0 étant remplacé par la correspondance entière).
Ce processus peut facilement entraîner des boucles infinies et / ou des débordements de pile. C'est votre travail d'éviter cela.
L'expression regex d'inflexion utilise la syntaxe unicode QRegularExpression (https://doc.qt.io/qt-5/qregularexpression.html).
Textractor affichera le terme racine final ainsi que toutes les inflexions utilisées pour arriver à ce terme racine.
Cependant, le texte d'un terme après << est ignoré lors de l'affichage. Ceci est destiné à stocker des informations sur une partie de la parole.
Ce fichier doit être encodé en UTF-8.)";
const char* SHOW_ORIGINAL = u8"Texte Original";
const char* SHOW_ORIGINAL_INFO = u8R"(Le texte d'origine ne sera pas affiché
Fonctionne uniquement si cette extension est utilisée directement après une extension de traduction)";
const char* SIZE_LOCK = u8"Verouiller la taille";
const char* OPACITY = u8"Opacité";
const char* BG_COLOR = u8"COuleur d'arrière-plan";
const char* TEXT_COLOR = u8"COuleur du texte";
const char* TEXT_OUTLINE = u8"Contour du texte";
const char* OUTLINE_COLOR = u8"Couleur du contour";
const char* OUTLINE_SIZE = u8"Taille du contour";
const char* OUTLINE_SIZE_INFO = u8"Taille en pixels (recommandé de rester en dessous de 20% de la taille de la police)";
const char* FONT = u8"Police";
const char* LUA_INTRO = u8R"(--[[
ProcessSentence est appelée chaque fois que Textractor reçoit une phrase de texte.
Phrase param: phrase reçue par Textractor (UTF-8).
Param sentenceInfo: tableau d'informations diverses sur la phrase.
Si vous retournez une chaîne, la phrase sera transformée en cette chaîne.
Si vous renvoyez zéro, la phrase ne sera pas modifiée.
Cette extension utilise plusieurs copies de l'interpréteur Lua pour la sécurité des threads.
Les modifications apportées aux variables globales à partir de ProcessSentence ne sont pas garanties de persister.
Properties in sentenceInfo:
"current select": 0 unless sentence is in the text thread currently selected by the user.
"process id": process id that the sentence is coming from. 0 for console and clipboard.
"text number": number of the current text thread. Counts up one by one as text threads are created. 0 for console, 1 for clipboard.
--]]
function ProcessSentence(sentence, sentenceInfo)
--Your code here...
end)";
const char* LOAD_LUA_SCRIPT = u8"Charger le script";
const wchar_t* LUA_ERROR = L"Erreur Lua: %s";
const char* REGEX_FILTER = u8"Filtre regex";
const char* INVALID_REGEX = u8"Regex invalide";
const char* CURRENT_FILTER = u8"En train de filtrer: %1";
const wchar_t* REPLACER_INSTRUCTIONS = LR"(Ce fichier ne fait rien lorsque l'extension "Replacer" est utilisée.
Les commandes de remplacement doivent être formatées comme:
|ORIG|original_text|BECOMES|replacement_text|END|
Tout le texte de ce fichier en dehors d'une commande de remplacement est ignoré.
Un caret (^) agit comme un caractère générique qui correspond à tout autre caractère unique.
Les espaces dans original_text sont ignorés, mais remplacement_text peut contenir des espaces, des nouvelles lignes, etc.
Ce fichier doit être encodé en Unicode (UTF-16 Little Endian).)";
const char* THREAD_LINKER = u8"Lien du thread";
const char* LINK = u8"Lien";
const char* THREAD_LINK_FROM = u8"Nombre du thread du lien depuis";
const char* THREAD_LINK_TO = u8"Nombre du thread du lien a";
const char* HEXADECIMAL = u8"Hexadecimal";
#endif // FRENCH
return 0; return 0;
}(); }();