(a.k.a. LS) file -- one per language. For MUI to find resources, a MUI file must be in the same directory as its associated LN file and be named the same as the LN file plus ".LCID.mui". For example, for LN file my-lib.dll, the MUI file for en-US would be named my-lib.dll.0409.mui. String resources are coded as string table like so: LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL STRINGTABLE BEGIN 1 L"message text" END Resource Retrieval Several win32 functions that read application resources are MUI-enabled, including LoadString, FormatMessage, and LoadImage. Each function attempts to read a resource for a language as selected by global language preferences, from application resources or associated MUI files (co-located with LN file and following naming convention). Each uses the global language preferences to choose a language that is available. If loading the resource for the first preferred language fails either because the MUI file does not exist or the resource does not exist in the MUI file, the function will try the next preferred language and so on until all preferences have been tried. If load fails for all preferred languages, then tries the LN file. The most commonly used function is LoadString which loads strings from a string-table resource. Example using LoadString: wchar_t* resourceCharArray; int resourceLength = ::LoadStringW(_moduleHandle, resourceId, (LPWSTR)&resourceCharArray, 0); if (!resourceLength) throw std::runtime_error("Unable to find resource."); std::wstring text; text.append(resourceCharArray, resourceLength); This retrieves the address of the resource text character buffer which is not guaranteed to be null terminated. Then, this copies the characters to a std::string and its c_str() method is guaranteed to be null terminated. Therefore, there is no need to append a null. Another option is to have LoadString copy the string to a passed buffer, but that requires using a fixed-length buffer which has downsides like usually allocating more than needed or truncation if too short. Oddly, MS documentation for LoadString does not mention its interaction with MUI -- use of language preference. FormatMessage is also MUI-enabled. Its function reference page describes its interaction with the user's language preference when parameter dwLanguageId is passed as 0. But FormatMessage reads from a message table, not a string table and as Raymond Chen says, "nobody actually uses message tables". Non-Resource Storage and Retrieval MS documentation recommends storing UI assets as resources since MUI fully supports retrieving from this storage, but it notes that MUI supports any other file format, such as XML, JSON or flat