add french translation
This commit is contained in:
parent
4b0fc12794
commit
5739af5a3f
@ -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)
|
||||
|
@ -17,6 +17,7 @@ foreach ($language in @{
|
||||
THAI="Thai";
|
||||
KOREAN="Korean";
|
||||
ITALIAN="Italian";
|
||||
FRENCH="French"
|
||||
}.GetEnumerator())
|
||||
{
|
||||
$folder = "Textractor-$($language.Value)-$version";
|
||||
|
@ -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
|
||||
|
197
text.cpp
197
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<<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;
|
||||
}();
|
||||
|
Loading…
Reference in New Issue
Block a user