#ifdef _WIN64 #define ARCH "x64" #else #define ARCH "x86" #endif #if 0 #define TURKISH #define SPANISH #define SIMPLIFIED_CHINESE #define RUSSIAN #define INDONESIAN #define ITALIAN #define THAI #define PORTUGUESE #define KOREAN #define FRENCH #endif // If you are updating a previous translation see https://github.com/Artikash/Textractor/issues/313 const char* NATIVE_LANGUAGE = "English"; const char* ATTACH = u8"Attach to game"; const char* LAUNCH = u8"Launch game"; const char* CONFIG = u8"Configure game"; const char* DETACH = u8"Detach from game"; const char* FORGET = u8"Forget game"; const char* ADD_HOOK = u8"Add hook"; const char* REMOVE_HOOKS = u8"Remove hook(s)"; const char* SAVE_HOOKS = u8"Save hook(s)"; const char* SEARCH_FOR_HOOKS = u8"Search for hooks"; const char* SETTINGS = u8"Settings"; const char* EXTENSIONS = u8"Extensions"; const char* SELECT_PROCESS = u8"Select process"; const char* ATTACH_INFO = u8R"(If you don't see the process you want to attach, try running with admin rights You can also type in the process ID)"; const char* SELECT_PROCESS_INFO = u8"If you manually type in the process file name, please use the absolute path"; const char* FROM_COMPUTER = u8"Select from computer"; const char* PROCESSES = u8"Processes (*.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"Save settings"; const char* EXTEN_WINDOW_INSTRUCTIONS = u8R"(Right click the list to add or remove extensions Drag and drop extensions within the list to reorder them (Extensions are used from top to bottom: order DOES matter))"; const char* ADD_EXTENSION = u8"Add extension"; const char* REMOVE_EXTENSION = u8"Remove extension"; const char* INVALID_EXTENSION = u8"%1 is an invalid extension"; const char* CONFIRM_EXTENSION_OVERWRITE = u8"Another version of this extension already exists, do you want to delete and overwrite it?"; const char* EXTENSION_WRITE_ERROR = u8"Failed to save extension"; const char* USE_JP_LOCALE = u8"Emulate japanese locale?"; const char* FAILED_TO_CREATE_CONFIG_FILE = u8"Failed to create config file \"%1\""; const char* HOOK_SEARCH_UNSTABLE_WARNING = u8"Searching for hooks is unstable! Be prepared for your game to crash!"; const char* HOOK_SEARCH_STARTING_VIEW_CONSOLE = u8"Initializing hook search - please check console for further instructions"; const char* SEARCH_CJK = u8"Search for Chinese/Japanese/Korean"; const char* SEARCH_PATTERN = u8"Search pattern (hex byte array)"; const char* SEARCH_DURATION = u8"Search duration (ms)"; const char* SEARCH_MODULE = u8"Search within module"; const char* PATTERN_OFFSET = u8"Offset from pattern start"; const char* MAX_HOOK_SEARCH_RECORDS = u8"Search result cap"; const char* MIN_ADDRESS = u8"Minimum address (hex)"; const char* MAX_ADDRESS = u8"Maximum address (hex)"; const char* STRING_OFFSET = u8"String offset (hex)"; const char* HOOK_SEARCH_FILTER = u8"Results must match this regex"; const char* TEXT = u8"Text"; const char* CODEPAGE = u8"Codepage"; const char* SEARCH_FOR_TEXT = u8"Search for specific text"; const char* START_HOOK_SEARCH = u8"Start hook search"; const char* SAVE_SEARCH_RESULTS = u8"Save search results"; const char* TEXT_FILES = u8"Text (*.txt)"; const char* DOUBLE_CLICK_TO_REMOVE_HOOK = u8"Double click a hook to remove it"; const char* FILTER_REPETITION = u8"Filter repetition"; const char* AUTO_ATTACH = u8"Auto attach"; const char* ATTACH_SAVED_ONLY = u8"Auto attach (saved only)"; const char* SHOW_SYSTEM_PROCESSES = u8"Show system processes"; const char* DEFAULT_CODEPAGE = u8"Default codepage"; const char* FLUSH_DELAY = u8"Flush delay"; const char* MAX_BUFFER_SIZE = u8"Max buffer size"; const char* MAX_HISTORY_SIZE = u8"Max history size"; const char* CONFIG_JP_LOCALE = u8"Launch with JP locale"; const wchar_t* CONSOLE = L"Console"; const wchar_t* CLIPBOARD = L"Clipboard"; const wchar_t* ABOUT = L"Textractor " ARCH L" v" VERSION LR"( made by Artikash (email: akashmozumdar@gmail.com) Project homepage: https://github.com/Artikash/Textractor Tutorial video: https://tinyurl.com/textractor-tutorial FAQ: https://github.com/Artikash/Textractor/wiki/FAQ Please contact Artikash with any problems, feature requests, or questions relating to Textractor You can do so via the project homepage (issues section) or via email Source code available under GPLv3 at project homepage If you like this project, please tell everyone about it! It's time to put AGTH down :))"; 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"Update available: download it from https://github.com/Artikash/Textractor/releases"; const wchar_t* ALREADY_INJECTED = L"Textractor: already injected"; const wchar_t* NEED_32_BIT = L"Textractor: architecture mismatch: only Textractor x86 can inject this process"; const wchar_t* NEED_64_BIT = L"Textractor: architecture mismatch: only Textractor x64 can inject this process"; const wchar_t* INJECT_FAILED = L"Textractor: couldn't inject"; const wchar_t* LAUNCH_FAILED = L"Textractor: couldn't launch"; const wchar_t* INVALID_CODE = L"Textractor: invalid code"; const wchar_t* INVALID_CODEPAGE = L"Textractor: couldn't convert text (invalid codepage?)"; const char* PIPE_CONNECTED = u8"Textractor: pipe connected"; const char* INSERTING_HOOK = u8"Textractor: inserting hook: %s"; const char* REMOVING_HOOK = u8"Textractor: removing hook: %s"; const char* HOOK_FAILED = u8"Textractor: failed to insert hook"; const char* TOO_MANY_HOOKS = u8"Textractor: too many hooks: can't insert"; const char* HOOK_SEARCH_STARTING = u8"Textractor: starting hook search"; const char* HOOK_SEARCH_INITIALIZING = u8"Textractor: initializing hook search (%f%%)"; const char* NOT_ENOUGH_TEXT = u8"Textractor: not enough text to search accurately"; const char* HOOK_SEARCH_INITIALIZED = u8"Textractor: initialized hook search with %zd hooks"; const char* MAKE_GAME_PROCESS_TEXT = u8"Textractor: please click around in the game to force it to process text during the next %d seconds"; const char* HOOK_SEARCH_FINISHED = u8"Textractor: hook search finished, %d results found"; const char* OUT_OF_RECORDS_RETRY = u8"Textractor: out of search records, please retry if results are poor (default record count increased)"; const char* FUNC_MISSING = u8"Textractor: function not present"; const char* MODULE_MISSING = u8"Textractor: module not present"; const char* GARBAGE_MEMORY = u8"Textractor: memory constantly changing, useless to read"; const char* SEND_ERROR = u8"Textractor: Send ERROR (likely an unstable/incorrect H-code)"; const char* READ_ERROR = u8"Textractor: Reader ERROR (likely an incorrect R-code)"; const char* HIJACK_ERROR = u8"Textractor: Hijack ERROR"; const char* COULD_NOT_FIND = u8"Textractor: could not find text"; const char* TRANSLATE_TO = u8"Translate to"; const char* TRANSLATE_FROM = u8"Translate from"; const char* FILTER_GARBAGE = u8"Filter garbage characters"; const char* TRANSLATE_SELECTED_THREAD_ONLY = u8"Translate selected text thread only"; const char* RATE_LIMIT_ALL_THREADS = u8"Use rate limiter"; const char* RATE_LIMIT_SELECTED_THREAD = u8"Rate limit selected text thread"; const char* USE_TRANS_CACHE = u8"Use translation cache"; const char* MAX_TRANSLATIONS_IN_TIMESPAN = u8"Max translation requests in timespan"; const char* TIMESPAN = u8"Timespan (ms)"; const wchar_t* TOO_MANY_TRANS_REQUESTS = L"Rate limit exceeded: refuse to make more translation requests"; const wchar_t* TRANSLATION_ERROR = L"Error while translating"; const char* USE_PREV_SENTENCE_CONTEXT = u8"Use previous sentence as context"; const char* API_KEY = u8"API key"; const char* CHROME_LOCATION = u8"Google Chrome file location"; const char* START_DEVTOOLS = u8"Start DevTools"; const char* STOP_DEVTOOLS = u8"Stop DevTools"; const char* HEADLESS_MODE = u8"Headless mode"; const char* DEVTOOLS_STATUS = u8"DevTools status"; const char* AUTO_START = u8"Start automatically"; const wchar_t* ERROR_START_CHROME = L"failed to start Chrome or to connect to it"; const char* EXTRA_WINDOW_INFO = u8R"(Right click to change settings Click and drag on window edges to move, or the bottom right corner to resize)"; const char* MAX_SENTENCE_SIZE = u8"Max sentence size"; const char* TOPMOST = u8"Always on top"; const char* DICTIONARY = u8"Dictionary"; const char* DICTIONARY_INSTRUCTIONS = u8R"(This file is used only for the "Dictionary" feature of the Extra Window extension. It uses a custom format specific to Textractor and is not meant to be written manually. You should look for a dictionary in this format online (https://github.com/Artikash/Textractor-Dictionaries/releases is a good place to start). Alternatively, if you're a programmer, you can write a script to convert a dictionary from another format with the info below. Once you have a dictionary, to look up some text in Extra Window, hover over it. You can scroll through all the matching definitions. Definitions are formatted like this:|TERM|Hola<