Логические значения на местном языке

Этот вопрос был задан давно на serverfault, но не работает awnser. Я надеюсь, что кто-то столкнулся с этим и нашел решение с тех пор.

Пример:

<%
Response.Write True
Response.Write "<hr>"
Response.Write "test:" & True
%>

Выход:

True
--------------
test:Waar

Как видите, как только вы объединяете выходные данные, они превращаются в локальную строку («Waar» по-голландски означает «истина»). Мне нужно, чтобы он оставался «Истинным».

Как я могу это изменить? Я не возражаю против размещения некоторого кода в начале страниц, но я не могу изменить все экземпляры True во всем коде. Поэтому создание функции, как показано ниже, для возврата правильной строки не подходит.

Function PB(pVal)
  If pVal Then
    PB = "true"
  Else
    PB = "false"
  End If
End Function

person Hugo Delsing    schedule 02.04.2013    source источник
comment
Могу я узнать, какой результат вы ожидаете?   -  person Prashant Shilimkar    schedule 02.04.2013
comment
Всегда только правда. Таким образом, второй ответ должен быть test:True   -  person Hugo Delsing    schedule 02.04.2013
comment
К сожалению, ни один из ответов не был правильным и не решил проблему. Но я чувствую, что @gpinkas приложил больше всего усилий для поиска решения, и у него были некоторые идеи, которые я не мог сразу отбросить.   -  person Hugo Delsing    schedule 25.04.2013
comment
@HugoDelsing не уверен, что вы решили эту проблему, но мне пришло в голову еще одно: вы пытались использовать определенного пользователя Windows для IIS вместо IUSR? затем попробуйте изменить настройки локали этого пользователя. я не пробовал это, поэтому я не уверен, что это поможет   -  person ulluoink    schedule 08.05.2013
comment
Только что попробовал, но не работает. Текст остается на голландском языке. Хотя спасибо за старание   -  person Hugo Delsing    schedule 08.05.2013


Ответы (8)


Странно, я не могу заставить свой IIS выводить логическое значение на моем местном языке, независимо от того, какой язык установлен.

Вы уже нашли эту статью базы знаний?

Существует описание параметра реестра, который может помочь:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\OLEAUT

Я не хочу возиться с моим производственным сервером, поэтому я еще не пробовал.


ПЕРВЫЙ ОТВЕТ:

Вы можете «обмануть» VB, чтобы использовать свои собственные функции. Если вы добавите эти функции вверху страницы, VB предпочтет их встроенным функциям, в данном случае CStr и Trim. Может быть, это поможет.

    Function PB(pVal)
        If pVal Then
            PB = "true"
        Else
            PB = "false"
        End If
    End Function

    Function CStr(pVal)
        CStr = PB(pVal)
    End Function

    Function Trim(pVal)
        Trim = PB(pVal)
    End Function

Выход:

    True
    --------------
    test:true
    --------------
    test:true
    --------------
    test:true
person gpinkas    schedule 22.04.2013
comment
По сути, вы делаете переопределение. Протестировано в VB (в моей системе нет классической установки ASP). Trim() работал, но CStr() выдавал синтаксическую ошибку. Но Str() тоже работал. - person Tom Collins; 22.04.2013
comment
Да, я тестировал это в классическом ASP (IIS 7.5), синтаксической ошибки не было. Конечно, это не самое чистое решение, но вы можете с ним работать. - person gpinkas; 22.04.2013
comment
Использование Cstr и Trim было результатом другого автора, который сказал, что это решение. Я использую только True без каких-либо методов. Изменение должно заключаться в изменении некоторых настроек сервера. Либо через ASP, либо напрямую в IIS7 - person Hugo Delsing; 23.04.2013
comment
Привет, я тестировал его, но изменение локали не повлияло на значение. Изменение реестра также не дало никакого эффекта. Вероятно, потому что я вошел в систему на сервере, и настройки переопределяют поведение по умолчанию, когда никто не вошел в систему. - person Hugo Delsing; 24.04.2013
comment
Это обнадеживает, когда поведение по умолчанию описывается в MS-KB как совершенно случайное... Кстати, я также пытался установить культуру в файле web.config, и это тоже ничего не изменило. :( - person gpinkas; 25.04.2013

Я делаю что-то вроде этого, но в настоящее время у меня нет машины для проверки вашего случая:

<%
Response.Write FormatDateTime(Now) & "<br />"
oldLocale = SetLocale(1026) 'Bulgarian
Response.Write FormatDateTime(Now) & "<br />"
SetLocale oldLocale 
Response.Write FormatDateTime(Now) & "<br />"
%>

... из другого вопроса SO похоже, что вышеизложенное не работает.

Что произойдет, если вы попробуете это: Response.Write "test:" & CStr(True) или Response.Write "test:" & Trim(True) с или без SetLocale?

person G. Stoynev    schedule 02.04.2013
comment
Никаких изменений при смене локали и/или использовании CStr и Trim - person Hugo Delsing; 18.04.2013

это так же, как конкатенация строк работает в vbscript.

из справочника по языку vbscript:

«Всякий раз, когда выражение не является строкой, оно преобразуется в подтип String. Если оба выражения имеют значение Null, результат также равен Null. Однако, если только одно выражение имеет значение Null, это выражение рассматривается как строка нулевой длины («» ) при объединении с другим выражением. Любое пустое выражение также рассматривается как строка нулевой длины».

person ulluoink    schedule 18.04.2013
comment
Очевидно, что тип должен измениться на строку, чтобы использоваться как один, но он не говорит, что это происходит в языке Windows и не может быть изменено. - person Hugo Delsing; 19.04.2013

Если SetLocale не работает, я думаю, вам лучше всего создать функцию.

Function TF(B)
   If B Then
      TF = "True"
   Else
      TF = "False"
   End If
End Function

Тогда вместо того, чтобы сказать это:

Response.Write "test:" & True

Вы бы сказали так:

Response.Write "test:" & TF(True)
person Tom Collins    schedule 18.04.2013
comment
Как вы могли прочитать в вопросе, создание функции не подходит. И это очень похоже на мой собственный ответ на stackoverflow.com/questions/15770025/, который находится в разделах связанных вопросов - person Hugo Delsing; 19.04.2013
comment
Я видел ваш комментарий к этому вопросу после того, как написал здесь. И я знаю, что функция — это не то, что вам нужно, но это может быть ваш единственный вариант. Если бы вы хотели изменить все True на Trim(True), то не было бы той же работой изменить его на TF(True). - person Tom Collins; 19.04.2013
comment
Кроме того, вы не говорите, зачем вам нужна английская форма True & False. Если это для печати в файл для последующего ввода, где вам нужен стандарт, то как насчет использования -1 и 0. CInt(TRUE) - person Tom Collins; 19.04.2013

Меня тоже "зацепил" этот "вопрос". На самом деле это не проблема:

ПРОБЛЕМА (ПРИМЕР)

У меня была такая же проблема при использовании логических данных в выражении SQL. На моем французском сервере мой оператор SQL был следующим:

<%
'Set my boolean value
Dim myBoolean
myBoolean = True

'Set my SQL Statement
Dim MySQLStatement
MySQLStatement = "SELECT * FROM MyTable WHERE MyBooleanField = " & myBoolean
'=> Here, as MySQLStatement is a STRING, the boolean data was "converted/rendered" as a localized string. So that leads to this output :
'=> SELECT * FROM MyTable WHERE MyBooleanField = Vrai
'Obviously, that SQL Statement is incorrect, because the SQL Engine does NOT understand what is the "Vrai" word - It should be "True" instead.
%>

ПОЯСНЕНИЯ:

  • Неважно, какие региональные настройки установлены в вашей системе Windows: с базовыми данными ничего не происходит. Логический тип данных ВСЕ ЕЩЕ является BOOLEAN на английском, французском, немецком, русском, тайском или любом другом языке.
  • Дело в том, что данные просто ОТОБРАЖАЮТСЯ как локализованные STRING (например, даты).

РЕШЕНИЕ

После большого чтения тем на форумах решение состоит не в том, чтобы изменять региональные настройки в системе Windows, не в изменении ключей реестра, не в изменении Session.LCID, ... Абсолютное и только кодовое решение состоит в том, чтобы преобразовать Логическое значение (True|False) в целое число (0|1). Затем это целое число можно будет безопасно использовать в строке, и оно останется (0|1).

Вот безопасный способ использования/преобразования/рендеринга логического значения в нелокализованной форме: Использовать целочисленное значение.

<%
'Set my boolean value
Dim myBoolean
myBoolean = True

'Set my SQL Statement
Dim MySQLStatement
MySQLStatement = "SELECT * FROM MyTable WHERE MyBooleanField = " & BoolToInt(myBoolean)
'=> Here, as MySQLStatement is a STRING, and as the boolean data was previously "converted/rendered" as an integer, we got this correct SQL Statement :
'=> SELECT * FROM MyTable WHERE MyBooleanField = 1
'This SQL Statement is correct, as the SQL Engine DOES understand that 1 is a boolean.

'This Function Returns an INTEGER value based on a BOOLEAN value
Function BoolToInt(v)
    'INPUT:
    'v      Boolean value    

    'OUTPUT:
    'Integer (0|1)    

    Dim b_OUT
    b_OUT = v    

    'If the Input value is a "True" boolean value (in any language)
    if (b_OUT = True) then
        BoolToInt = cint(1)
    'If the Input value is a "False" boolean value (in any language)
    elseif (b_OUT = False) then
        BoolToInt = cint(0)
    end if
End Function 'BoolToInt
%>

Я действительно надеюсь, что это спасет ваш день!

person AlexLaforge    schedule 02.06.2017

Вы можете попробовать установить для Response.LCID или Session.LCID значение 1033 в начале страницы, но это также влияет на то, как отображаются другие элементы (например, даты и валютные переменные).

1033 — это идентификатор локали для США.

person Sander_P    schedule 25.04.2013
comment
Как сказал @Tom Collins, это не поможет. На самом деле логическое значение остается логическим, какой бы язык ни был установлен в системе. Как только вы преобразуете это логическое значение в STRING, будет использоваться окализованная строка (True, Vrai, Verdadero, Wahr, ...). Единственное решение — проверить, является ли логическая переменная True, а затем вернуть нужный текст. Например: If (MyVar = True) then:Response.Write "True":else:Response.Write "False":end if - person AlexLaforge; 03.06.2017

Попытка 2:

<%
arr=Array("False","True")

Response.Write True
Response.Write "<br /><br />"

Response.Write "" & arr( abs(True) ) & "<br />"
Response.Write "" & arr( abs(False) ) & "<br />"
%>
person Sander_P    schedule 25.04.2013
comment
Это все еще добавляет что-то к встречаемости true и false. И в этом случае даже больше, чем просто PB(True) из моего собственного вопроса. - person Hugo Delsing; 25.04.2013

Я нашел решение, если вы не против изменить региональные настройки на американские. Это связано с изменением реестра. Это было протестировано в Windows 7 на испанском языке, и теперь оно дает собственное значение True/False вместо Verdadero/Falso.

  1. Перейдите в раздел HKEY_USERS/.Default/Control Panel/International и сделайте хороший снимок на свой телефон, если вы что-то испортили. вы также можете сделать резервную копию ключей реестра, нажав «международный», а затем «Файл/экспорт».

  2. Откройте блокнот и вставьте это внутрь (вы также можете изменить значения вручную одно за другим в реестре):

------------------ вставьте то, что ниже этой строки -------------

Windows Registry Editor Version 5.00

[HKEY_USERS\.DEFAULT\Control Panel\International]
"Locale"="00000409"
"LocaleName"="en-US"
"s1159"=""
"s2359"=""
"sCountry"="United States"
"sCurrency"="$"
"sDate"="/"
"sDecimal"="."
"sGrouping"="3;0"
"sLanguage"="ENU"
"sList"=","
"sLongDate"="dddd, MMMM dd, yyyy"
"sMonDecimalSep"="."
"sMonGrouping"="3;0"
"sMonThousandSep"=","
"sNativeDigits"="0123456789"
"sNegativeSign"="-"
"sPositiveSign"=""
"sShortDate"="M/d/yyyy"
"sThousand"=","
"sTime"=":"
"sTimeFormat"="h:mm:ss tt"
"sShortTime"="h:mm tt"
"sYearMonth"="MMMM, yyyy"
"iCalendarType"="1"
"iCountry"="1"
"iCurrDigits"="2"
"iCurrency"="0"
"iDate"="0"
"iDigits"="2"
"NumShape"="1"
"iFirstDayOfWeek"="6"
"iFirstWeekOfYear"="0"
"iLZero"="1"
"iMeasure"="1"
"iNegCurr"="0"
"iNegNumber"="1"
"iPaperSize"="1"
"iTime"="0"
"iTimePrefix"="0"
"iTLZero"="0"

[HKEY_USERS\.DEFAULT\Control Panel\International\Geo]
"Nation"="244"

------------------ не вставляйте эту строку -------------

  1. Сохраните его как english.reg (или любой другой.reg)

  2. Дважды щелкните по нему.

Мне не пришлось перезагружать компьютер, чтобы изменения вступили в силу.

-------- ОБНОВИТЬ ----------

Не работает. Если я создаю пустую страницу asp с этим: ‹%=isnumeric(6)%>, он отвечает True (на английском языке), но как только я объединяю True в строку, он снова становится Verdadero.

person bando    schedule 01.09.2015