"Today" in current locale.
От: c-smile Канада http://terrainformatica.com
Дата: 24.07.08 17:47
Оценка:
Для имплементации <input type="calendar"> типа вот этого:

нужно вывести строку со словом "Today" в текущей locale юзера.

Есть ли у кого-нибудь идея где эту строку можно выцепить?
Для имен дней недели или месяцев в Windows есть соотв. API.
Но вот для "today" чего-то я не нашел...
Re: "Today" in current locale.
От: Cyberax Марс  
Дата: 24.07.08 17:57
Оценка: 34 (1)
Здравствуйте, c-smile, Вы писали:

CS>Есть ли у кого-нибудь идея где эту строку можно выцепить?

CS>Для имен дней недели или месяцев в Windows есть соотв. API.
CS>Но вот для "today" чего-то я не нашел...
А в Windows вообще где-нибудь такая надпись есть? Я что-то не припоминаю.

Кстати, по поводу локализации — вот есть интересный проект: https://fedorahosted.org/fuel
Sapienti sat!
Re: "Today" in current locale.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 24.07.08 18:31
Оценка: 34 (1)
Здравствуйте, c-smile, Вы писали:

Тут
http://www.microsoft.com/downloads/thankyou.aspx?familyId=25018024-2dfd-4229-9763-05f78feaf2ff&amp;displayLang=en#
только current time
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: "Today" in current locale.
От: c-smile Канада http://terrainformatica.com
Дата: 24.07.08 19:05
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>А в Windows вообще где-нибудь такая надпись есть? Я что-то не припоминаю.


См. screenshot:
http://msdn.microsoft.com/en-us/library/aa926830.aspx

C>Кстати, по поводу локализации — вот есть интересный проект: https://fedorahosted.org/fuel


Я не понял. Это планируется сделать частью OS?
Скажем некий сервис типа ::get_localized_string_for("today"); ?

Было бы хорошо.
Re[2]: "Today" in current locale.
От: c-smile Канада http://terrainformatica.com
Дата: 24.07.08 19:12
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, c-smile, Вы писали:


A>Тут

A>http://www.microsoft.com/downloads/thankyou.aspx?familyId=25018024-2dfd-4229-9763-05f78feaf2ff&amp;displayLang=en#
A>только current time
A>

Не ну так я не играю... Это что мне в свою dll вшивать? Не хочу.

В принципе у меня "решение" есть и так. Предлагается писать в CSS такое вот:
input[type="calendar"] span.today-caption { content:"Сёдни ужо"; }

для target locale. В 99% случаев кроме Today еще много чего переводить надо.
Хотелось бы out-of-box решение но видно не судьба.
"Today" in current locale.
От: Alexander G Украина  
Дата: 24.07.08 19:17
Оценка: 73 (2)
#Имя: FAQ.winapi.today.locale.hack
Здравствуйте, c-smile, Вы писали:

CS>Есть ли у кого-нибудь идея где эту строку можно выцепить?

CS>Для имен дней недели или месяцев в Windows есть соотв. API.
CS>Но вот для "today" чего-то я не нашел...

Хак:

HMODULE localizedTodayLibrary = LoadLibrary(_T("shdoclc.dll"))
LoadString(localizedTodayLibrary, 20847, today, _countof(today))
Русский военный корабль идёт ко дну!
shdoclc.dll
Re[3]: "Today" in current locale.
От: Cyberax Марс  
Дата: 24.07.08 20:36
Оценка:
Здравствуйте, c-smile, Вы писали:

C>>Кстати, по поводу локализации — вот есть интересный проект: https://fedorahosted.org/fuel

CS>Я не понял. Это планируется сделать частью OS?
CS>Скажем некий сервис типа ::get_localized_string_for("today"); ?
Примерно так. Они планируют сделать набор po-файлов, которые в Линуксе будут лежать где-нибудь в /usr/share/blahblah, а на Windows их можно с приложением запаковать. А с po-файлами уже с помощью gettext можно работать...
Sapienti sat!
Re[4]: "Today" in current locale.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 24.07.08 21:36
Оценка:
Здравствуйте, Cyberax, Вы писали:

CS>>Скажем некий сервис типа ::get_localized_string_for("today"); ?

C>Примерно так. Они планируют сделать набор po-файлов, которые в Линуксе будут лежать где-нибудь в /usr/share/blahblah, а на Windows их можно с приложением запаковать. А с po-файлами уже с помощью gettext можно работать...

Поправь меня, если я не прав, но на не английскоподобной грамматике (русской, к примеру) такие системы лажают.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: "Today" in current locale.
От: c-smile Канада http://terrainformatica.com
Дата: 24.07.08 22:58
Оценка: :)
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, c-smile, Вы писали:


CS>>Есть ли у кого-нибудь идея где эту строку можно выцепить?

CS>>Для имен дней недели или месяцев в Windows есть соотв. API.
CS>>Но вот для "today" чего-то я не нашел...

AG>Хак:


AG>
AG>HMODULE localizedTodayLibrary = LoadLibrary(_T("shdoclc.dll"))
AG>LoadString(localizedTodayLibrary, 20847, today, _countof(today))
AG>


Спасибо добрый человек. Священное число 20847 оно конечно хак но как решение пойдет.
Re[2]: "Today" in current locale.
От: lgb Канада  
Дата: 25.07.08 01:09
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Хак:


AG>
AG>HMODULE localizedTodayLibrary = LoadLibrary(_T("shdoclc.dll"))
AG>LoadString(localizedTodayLibrary, 20847, today, _countof(today))
AG>


Что-то я в Vista Home Premium эту dll не нахожу...
Re: "Today" in current locale.
От: Cyberax Марс  
Дата: 25.07.08 03:01
Оценка: 6 (1)
Здравствуйте, c-smile, Вы писали:

CS>Но вот для "today" чего-то я не нашел...

Есть такая хорошая вещь — Wine Это практически исходники Винды!

Простым поиском нашлось:
wine-1.1.1\dlls\comctl32\comctl_En.rc

STRINGTABLE DISCARDABLE
{
    IDM_TODAY    "Today:"
    IDM_GOTODAY  "Go to today"
}

wine-1.1.1\dlls\comctl32\comctl_Ru.rc
STRINGTABLE DISCARDABLE
{
    IDM_TODAY    "Сегодня:"
    IDM_GOTODAY  "Текущая дата"
}


В соответствующей DLLке в Windows (system32\comctl32.dll) PE Viewer'ом он находится (в таблице 261):
TRINGTABLE
LANGUAGE LANG_RUSSIAN, SUBLANG_NEUTRAL
{
4160, "Закрыть"
4161, "ОК"
4162, "Свойства: %s"
4163, "Сегодня:"
4164, "&К сегдняшней дате"
4165, "/.,-:"
4166, "MMMM"
4167, "MMMM yyyy"
}


Дальше уже дело техники
Sapienti sat!
Re[5]: "Today" in current locale.
От: Cyberax Марс  
Дата: 25.07.08 03:02
Оценка:
Здравствуйте, adontz, Вы писали:

C>>Примерно так. Они планируют сделать набор po-файлов, которые в Линуксе будут лежать где-нибудь в /usr/share/blahblah, а на Windows их можно с приложением запаковать. А с po-файлами уже с помощью gettext можно работать...

A>Поправь меня, если я не прав, но на не английскоподобной грамматике (русской, к примеру) такие системы лажают.
Работают. В русском проблемы только с формами множественного числа возникают (их четыре штуки), но они там решены.
Sapienti sat!
Re[2]: "Today" in current locale.
От: Вумудщзук Беларусь  
Дата: 25.07.08 07:35
Оценка: 12 (2)
S>>Но вот для "today" чего-то я не нашел...
>Есть такая хорошая вещь — Wine Это практически исходники Винды!
дык, а что мешает посмотреть, как собственно винда делает?...

там строчка тудэй для календаря грузиццо посредством
    MCLoadString(IDS_TODAY, pli->szToday, ARRAYSIZE(pli->szToday));


где

int MCLoadString(UINT uID, LPWSTR lpBuffer, int nBufferMax)
{
    return CCLoadStringEx(uID, lpBuffer, nBufferMax, GetUserDefaultLangID());
}


int CCLoadStringEx(UINT uID, LPWSTR lpBuffer, int nBufferMax, WORD wLang)
{
    return CCLoadStringExInternal(HINST_THISDLL, uID, lpBuffer, nBufferMax, wLang);
}


int CCLoadStringExInternal(HINSTANCE hInst, UINT uID, LPWSTR lpBuffer, int nBufferMax, WORD wLang)
{
    PWCHAR pwch;
    HRSRC hrsrc;
    int cwch = 0;

    if (nBufferMax <= 0) return 0;                  // sanity check

    /*
     *  String tables are broken up into "bundles" of 16 strings each.
     */

    hrsrc = FindResourceExRetry(hInst, RT_STRING,
                                (LPCTSTR)(LONG_PTR)(1 + (USHORT)uID / 16),
                                wLang);
    if (hrsrc) {
        pwch = (PWCHAR)LoadResource(hInst, hrsrc);
        if (pwch) {
            /*
             *  Now skip over the strings in the resource until we
             *  hit the one we want.  Each entry is a counted string,
             *  just like Pascal.
             */
            for (uID %= 16; uID; uID--) {
#ifndef UNIX
                pwch += *pwch + 1;
#else   // unix version has a WORD first then followed by a padding word
        // then the whole string in WCHAR (4 bytes on UNIX)
                pwch += *(WORD *)pwch + 1;
#endif
            }
#ifndef UNIX
            cwch = min(*pwch, nBufferMax - 1);
            memcpy(lpBuffer, pwch+1, cwch * sizeof(WCHAR)); /* Copy the goo */
#else   // length of the string is a WORD not WCHAR
            cwch = min(*(WORD *)pwch, nBufferMax - 1);
            memcpy(lpBuffer, pwch+1, cwch * sizeof(WCHAR)); /* Copy the goo */
#endif
        }
    }
    lpBuffer[cwch] = L'\0';                 /* Terminate the string */
    return cwch;
}


HRSRC FindResourceExRetry(HMODULE hmod, LPCTSTR lpType, LPCTSTR lpName, WORD wLang)
{
    HRSRC hrsrc = FindResourceEx(hmod, lpType, lpName, wLang);

    // if failed because we couldn't find the resouce in requested lang
    // and requested lang wasn't neutral, then try neutral.
    if (!hrsrc && wLang != MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL))
    {
        wLang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
        hrsrc = FindResourceEx(hmod, lpType, lpName, wLang);
    }


    return hrsrc;
}


при этом
#define IDS_TODAY        0x1043


а hInst — тот самый comctl32.dll
Homo sum et nihil humani a me alienum puto...
Re[3]: "Today" in current locale.
От: Alexander G Украина  
Дата: 25.07.08 08:07
Оценка:
Здравствуйте, lgb, Вы писали:

lgb>Здравствуйте, Alexander G, Вы писали:


AG>>Хак:


AG>>
AG>>HMODULE localizedTodayLibrary = LoadLibrary(_T("shdoclc.dll"))
AG>>LoadString(localizedTodayLibrary, 20847, today, _countof(today))
AG>>


lgb>Что-то я в Vista Home Premium эту dll не нахожу...


Жаль... у меня даже в 98 есть.

Ну тогда поискать другие dll, кгде эта строка есть
Русский военный корабль идёт ко дну!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.