Языки, национальные языки и раскладки символов на клавиатуре
Язык (language) - естественный язык, такой как английский, французский и японский. Подмножество языка (sublanguange) - вариант естественного языка, на котором говорят в определенных географических районах, типа английских подмножеств языка, на которых говорят в Великобритании и Соединенных Штатах. Прикладные программы используют значения, называемые идентификаторами языка, чтобы уникально идентифицировать языки и их подмножества.
Прикладные программы обычно используют национальные языки (locales), чтобы установить язык, на котором обрабатывать ввод и вывод данных. Настройки национального языка для клавиатуры, например, воздействует на символьные значения, сгенерированные клавиатурой. Настройки языка для дисплея или принтера воздействует на глифы (образы символа в побитовом отображении), показанные на экране или напечатанные. Прикладные программы устанавливают национального язык для клавиатуры, загружая и используя раскладки символов на клавиатуре. Они устанавливают этот язык для дисплея или принтера, выбирая шрифт, который поддерживает заданный национальный язык.
Раскладка символов на клавиатуре определяет не только физическую позицию клавиш на ней, но также обуславливает и символьные значения, создаваемые, при помощи нажатий этих клавиш. Каждая раскладка идентифицирует текущий язык ввода информации и обуславливает, какие символьные значения создавать при помощи клавиш и их комбинаций.
Каждая раскладка символов на клавиатуре имеет соответствующий дескриптор, который идентифицирует раскладку и язык. Младшее слово дескриптора - идентификатор языка. Старшее слово - дескриптор устройства, определяющего физическую раскладку, или оно равно нулю, указывая на заданную по умолчанию физическую раскладку. Пользователь может объединить любой язык ввода данных с физической раскладкой. Например, англоязычный пользователь, который очень редко работает по-французски, может установить язык ввода клавиатуры французский без изменения физической раскладки клавиатуры. Это означает, что пользователь может вводить текст на французском языке, используя знакомую английскую раскладку клавиатуры.
Обычно не предполагается, что прикладные программы будут непосредственно управлять языками ввода. Вместо этого, пользователь устанавливает комбинацию языка и раскладки, а затем переключается среди них. Когда пользователь щелкает мышью по тексту, имеющему знаки из другого языка, прикладная программа вызывает функцию ActivateKeyboardLayout, чтобы активизировать заданную по умолчанию раскладку пользователя для этого языка. Если пользователь редактирует текст на языке, которого нет в действующем списке, прикладная программа может вызывать функцию LoadKeyboardLayout с языком, чтобы получить раскладку базирующуюся на этом языке.
Функция ActivateKeyboardLayout устанавливает язык ввода для текущей задачи. Её параметр hkl может быть или дескриптор раскладки символов на клавиатуре или дополненный нулями идентификатор языка. Дескрипторы раскладки символов на клавиатуре могут быть получены из функции LoadKeyboardLayout или GetKeyboardLayoutList. Значения HKL_NEXT и HKL_PREV могут также быть использованы, чтобы выбрать следующую или предыдущую клавиатуру.
Функция GetKeyboardLayoutName извлекает данные о названии активной раскладки символов на клавиатуре для вызывающего потока. Если прикладная программа создает активную раскладку, используя функцию LoadKeyboardLayout, функция GetKeyboardLayoutName извлекает ту же самую строку, которую использовали, чтобы создать раскладку. Иначе, эта строка - первичный идентификатор языка, соответствующий национальному языку активной раскладки. Это означает, что функция не обязательно может различать между собой различные раскладки с тем же самым первичным языком, так как не может возвратить конкретную информацию о языке ввода. Тем не менее, функция GetKeyboardLayout может быть использована, чтобы установить язык ввода информации.
Функция LoadKeyboardLayout загружает раскладку символов на клавиатуре и делает её доступной пользователю. Прикладные программы могут делать раскладку активной непосредственно для текущего потока, используя значение KLF_ACTIVATE. Прикладная программа может использовать значение KLF_REORDER, чтобы переупорядочить раскладки без такой установки значения KLF_ACTIVATE. Прикладные программы должны всегда использовать значение KLF_SUBSTITUTE_OK при загрузке раскладок символов на клавиатуре, чтобы гарантировать, что выбор пользователя, если таковой имеется, обеспечится.
Для многоязычной поддержки, функция LoadKeyboardLayout предоставляет флажки KLF_NOTELLSHELL и KLF_REPLACELANG. Флажок KLF_REPLACELANG предписывает функции заменить существующую раскладку символов на клавиатуре без изменения языка. Попытка заменить существующую раскладку, используя тот же самый идентификатор языка, но без установки KLF_REPLACELANG, является ошибкой. Флажок KLF_NOTELLSHELL ограждает функцию от уведомления оболочки, когда раскладка символов на клавиатуре добавляется или заменяется. Это полезно для прикладных программ, которые прибавляют многочисленные раскладки в ряде последующих обращений. Этот флажок должен использоваться включая всех, но при последнем вызове.
Функция UnloadKeyboardLayout ограничена в том, что она не может выгрузить из системы язык ввода по умолчанию. Это гарантирует то, что пользователь всегда имеет одну раскладку, доступную для ввода текста, которая использует тот же самый набор символов, какой используется оболочкой и файловой системой.