2013-04-02 29 views
7

To pytanie zostało zadane dawno temu na serverfault, ale nie działa awnser. Mam nadzieję, że ktoś go spotkał i od tamtego czasu znalazł rozwiązanie.Wartości logiczne w lokalnym języku

Przykład:

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

wyjściowa:

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

Jak widać, tak szybko, jak można połączyć wyjście, jej zamienił się w lokalnym ciąg ('Waar' jest holenderski na true) . Potrzebuję go, aby pozostać "Prawdziwy".

Jak mogę to zmienić? Nie mam nic przeciwko umieszczaniu kodu na początku stron, ale nie mogę zmienić wszystkich instancji True w całym kodzie. Więc tworzenie funkcji jak poniżej, aby zwrócić prawidłowy ciąg nie będzie robić.

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

Czy mogę wiedzieć, jakiego wyniku oczekujesz? –

+0

Zawsze tylko prawda. Druga odpowiedź powinna brzmieć "test: prawda" –

+0

Niestety, żadna z odpowiedzi nie była poprawna lub nie rozwiązano problemu. Ale uważam, że @gpinkas włożył najwięcej wysiłku w znalezienie rozwiązania i miał pomysły, których nie mogłem od razu odrzucić. –

Odpowiedz

3

zrobić coś takiego, ale aktualnie nie ma maszynę do sprawdzenia sprawy:

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

... z innego SO pytanie, wygląda na powyższe nie działa.

Co hapopens jeśli spróbujesz to: Response.Write "test:" & CStr(True) lub Response.Write "test:" & Trim(True) z lub w/o setlocale?

+0

Bez zmian przy zmianie ustawień narodowych i/lub przy użyciu 'CStr' i' Trim' –

3

To jest podobne do łączenia ciągów w vbscript.

z vbscript language reference:..

„Ilekroć wyrazem nie jest łańcuchem, to jest konwertowany na ciąg podtypu Jeśli oba wyrażenia są Null, wynik jest również Null Jednakże jeśli tylko jedna wypowiedzi ma wartość Null, to wyrażenie jest traktowane jako ciąg znaków o zerowej długości ("") po połączeniu z innym wyrażeniem Każde wyrażenie, które jest puste, jest również traktowane jako ciąg o zerowej długości. "

+1

Oczywiście typ musi się zmienić na ciąg, aby był używany jako jeden, ale nie mówi "To zdarza się w języku Windows i nie może zmienić się". –

2

Jeśli SetLocale nie działa, to myślę, że najlepiej jest utworzyć funkcję.

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

Wtedy zamiast powiedzieć to:

Response.Write "test:" & True 

Można by powiedzieć tak:

Response.Write "test:" & TF(True) 
+1

Jak mogłeś przeczytać w pytaniu, tworzenie funkcji nie będzie działać. I na pewno wygląda trochę jak moja własna odpowiedź na http://stackoverflow.com/questions/15770025/in-asp-how-to-set-boolean-values-to-english?rq=1, która jest w pokrewnym pytaniu sekcje –

+1

Widziałem twój komentarz na to pytanie po tym, jak napisałem tutaj. I wiem, że funkcja nie jest tym, czego chciałeś, ale to może być twoja jedyna opcja. Jeśli chciałbyś zmienić wszystkie True's to Trim (True), to czy nie byłoby to tym samym, aby zmienić to na TF (True). –

+1

Nie mówisz też, dlaczego potrzebujesz angielskiej formy True & False. Jeśli jest to do drukowania do pliku do późniejszego wprowadzenia, gdzie potrzebujesz standardu, to jak używać -1 i 0. CInt (TRUE) –

3

Dziwne, nie mogę dostać mój IIS na wyjściu wartość logiczną w moim lokalnym języku nie zależy od ustawień regionalnych.

Czy znalazłeś już KB article?

Jest opis ustawienie rejestru, który może załatwić sprawę:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\OLEAUT 

nie chcę zadzierać z moim serwerze produkcyjnym, więc nie próbowałem tego jeszcze.


pierwsza odpowiedź:

Mogłabyś 'trik' VB używać własnych funkcji. Jeśli dodasz te funkcje na górze strony, VB będzie je preferować nad wbudowanymi, w tym przypadku CStr i Trim. Może to pomaga.

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 

wyjściowa:

True 
    -------------- 
    test:true 
    -------------- 
    test:true 
    -------------- 
    test:true 
+0

Zasadniczo robisz przesłonięcie. Przetestowałem to w VB (nie mam klasycznej konfiguracji ASP w moim systemie). Funkcja Trim() działała, ale funkcja CStr() dała mi błąd składni. Ale Str() również działał. –

+0

Tak, testowałem to w klasycznej ASP (IIS 7.5), nie wystąpił błąd składniowy. Z pewnością nie jest to najczystsze rozwiązanie, ale możesz z nim pracować. – gpinkas

+0

Korzystanie z Cstr i Trim było wynikiem innego awnser, który powiedział, że to rozwiązanie. Używam tylko 'True' bez jakiejkolwiek metody wokół niego.Zmiana powinna nastąpić poprzez zmianę ustawień serwera. Za pośrednictwem ASP lub bezpośrednio w IIS7 –

0

Można spróbować ustawić Response.LCID lub Session.LCID do 1033 na początku swojej stronie, ale wpływa również inne rzeczy (jak lubi daty i zmienne walucie) są wyświetlane.

1033 jest Locale Id dla US

+0

To nie działa –

+0

Jak powiedział @Tom Collins, To nie będzie żadnej pomocy.W rzeczywistości, ** a Boolean pozostaje Boolean **, * jakikolwiek język został ustawiony w systemie *. ta wartość logiczna do STRING, następnie użyty zostanie łańcuch znaków z zerem ("True", "Vrai", "Verdadero", "Wahr", ...). Jedynym rozwiązaniem jest sprawdzenie, czy zmienna binarna ma wartość True, a następnie Zwróć tekst, którego potrzebujesz: Przykład: If (MyVar = True), następnie: Response.Write "True": else: Response.Write "False": end if ' – AlexLaforge

0

Próba 2:

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

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

Response.Write "" & arr(abs(True)) & "<br />" 
Response.Write "" & arr(abs(False)) & "<br />" 
%> 
+0

To wciąż dodaje coś do wystąpień 'true' i "false", aw tym przypadku nawet więcej niż "PB (prawda)" z mojego własnego pytania. –

0

znalazłem rozwiązanie, jeśli nie przeszkadza zmiana ustawień regionalnych do Stanów Zjednoczonych jednym. Wymaga to zmiany rejestru. Zostało to przetestowane w systemie Windows 7 w wersji hiszpańskiej, a teraz daje natywne True/False zamiast Verdadero/Falso.

  1. Przejdź do HKEY_USERS/.Default/Panel sterowania/międzynarodowa i wziąć piękny obraz z telefonu w przypadku, gdy bałagan rzeczy. można również wykonać kopię zapasową kluczy rejestru, klikając „międzynarodowa”, a następnie File/Export

  2. Otwórz notatnik i wklej ten wnętrze (można alternatywnie zmienić wartości ręcznie jeden po drugim w rejestrze):

----------------- wklej to, co poniżej tej linii -------------

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"="" 
"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" 

- --------------- nie wklejaj tej linii -------------

  1. Zapisz jako angielski.reg (lub whatever.reg)

  2. Kliknij dwukrotnie.

Nie musiałem ponownie uruchamiać komputera, aby zmiany odniosły skutek.

-------- ---------- UPDATE

nie działa. Jeśli utworzę pustą stronę asp z tym: <% = isnumeric (6)%> odpowiada True (w języku angielskim), ale jak tylko połączę True w łańcuchu, Verdadero ponownie stanie się.

1

"Przyłapano mnie" także na tej "kwestii". W istocie nie jest to kwestia:

problem (przykład)

że ten sam problem, gdy przy użyciu danych logicznych w instrukcji SQL. na moim serwerze francuskiej, moja instrukcja SQL był następujący:

<% 
'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. 
%> 

wyjaśnieniami:

  • to nie ma znaczenia, jakie ustawienia regionalne są ustawione w danym systemie Windows: Nic się nie dzieje do danych źródłowych. Typ danych boolean to STILL a BOOLEAN, w języku angielskim lub francuskim, niemieckim, rosyjskim, tajskim, ... lub w dowolnym języku.
  • Faktem jest, że dane po prostu są RENOWANE jako zlokalizowane STRING (jak daty).

ROZWIĄZANIE

Po przeczytaniu wielu wątków na forach, rozwiązaniem nie jest zmiana ustawień regionalnych w systemie Windows ani zmieniając klucze rejestru, nie zmieniając Session.LCID ... rozwiązanie absolutne i tylko kodowe polega na przekonwertowaniu wartości Boolean (True | False) na liczbę całkowitą (0 | 1). Następnie ta liczba całkowita będzie bezpiecznie użyta w łańcuchu i pozostanie (0 | 1).

Oto bezpieczny sposób używać/konwersji/renderowanie wartość logiczną w formie non-miejscowego: Użyj wartość całkowitą.

<% 
'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 
%> 

Naprawdę mam nadzieję, że uratuje to Twój dzień!