#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, 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* 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* SENTENCE_TOO_LARGE_TO_TRANS = L"Sentence too large to translate"; 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* HIDE_CHROME = u8"Hide Chrome window"; 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<