Копаене в източниците на Windows 8 Metro Weather
След като инсталирах Windows 8 (64bit + VS2011) и се запознах с новия интерфейс на Metro, първото нещо, което исках да направя, беше да превключа температурата от градуси по Фаренхайт на градуси по Целзий. Това подтикна да копаем в изходния код и след това да русифицираме приложението.

За тези, които не са гледали изграждането или не са обърнали внимание, пълният път до папката на приложението е: C:\Program Files\Applications\microsoft.weather_1.0.0.26_neutral_neutral_8wekyb3d8bbwe
Превключване от Фаренхайт към Целзий
За да превключа Фаренхайт в Целзий, трябваше да вляза в изходния код. За тези, които не са имали време да се изкачат там, просто натиснете Win + C, изберете Настройки и в панела, който се появява вдясно, натиснете Предпочитания за времето и изберете обичайния Целзий.
Стартиране на приложението във Visual Studio 2011
Добавете бутон и се абонирайте за кликвания
span class = "win-spritestates win-commandicon win-large ruicon" > обхват >
span >= "cultureText" class = "win-label" data - win - res = "textContent: ruCulture" > ru - RU span >
>( "ruCulture" ) . addEventListener ("щракване", switchCulture);
Функцията id е обвивка за document.getElementById и може да бъде намерена в currentCityControl.js. switchCulture е моята функция, която ще превключва езика за локализация, повече за това по-късно в статията.
Частична и пълна русификация
Какво означава частично? Това означава просто да промените локала на ru-RU в заявка към метеорологичния сървър и съответно да получите метеорологичен доклад на български език от сървъра. Приложението остава на своя език. А с добавянето на текстови ресурси на български, получаваме пълна русификация.
Поставих си задачата да направя бутон за превключване на локала от ru-RU на fr-FR и да запазя тази настройка, така че след рестартиранеприложението взе данни за времето на езика на запазения локал.
Във файла data.js има ред
var culture = R. getString ( "/webservice/culture" ) ;
където R от defaultHost.js R = нов Windows.ApplicationModel.Resources.ResourceLoader();
Културната променлива е зададена на текущия локал от файла с ресурси. Пиша функцията getCulture() и променям този ред на:
След това отивам на defaultHost.js и добавям култура:
WinJS. Пространство от имена. define("Време.Настройки" ,
на час: ApplicationData. текущ. Локални настройки . стойности [ "hourlydaily" ] == "h" ,
Целзий: Данни на приложението. текущ. Локални настройки . стойности [ "temp" ] == "c",
// добавете тук
култура: ApplicationData. текущ. Локални настройки . ценности ["култура"]
// След незабавно поставяне на локала
метеорологично време. настройки. култура = getCulture();
В края на defaultHost.js вмъквам моите функции
ако ( ! време. настройки . култура )
// ако вече има запазена настройка, заредете в противен случай ru-RU
var >= Windows. съхранение. ApplicationData. текущ. Локални настройки . ценности ["култура"] ;
обратно време. настройки. култура;
функция setCulture (culture1)
ако ( Времето !== недефинирано )
метеорологично време. настройки. култура = култура1;
Windows. съхранение. ApplicationData. текущ. Локални настройки . стойности["култура"] = култура1;
var >= Windows. съхранение. ApplicationData. текущ. Локални настройки . ценности ["култура"] ;
метеорологично време. настройки. култура = >;
метеорологично време. настройки. култура = "ru-RU" ;
За удобство при отстраняване на грешки добавих div за показване на информация за отстраняване на грешки в defaultHost.html и функцията deb() в defaultHost.js. Тази функция може да бъде извикана от всекиместа на скрипта и да показват всякаква информация.
var deb = документ. getElementById("debugText");
деб. вътрешен текст = наличност;
Остава да превключите локала, като запазите настройката Бутонът вече е добавен, ще му нарисувам икона. Файлът Weather_Commands_PNG_STRIP_40x.png съхранява всички икони на бутони. Отварям файла и увеличавам размера на изображението надолу, рисувам бутони за различни състояния на моя бутон. За да се покаже иконата на бутона, добавям настройка за стил към defaultHost.css
фонова позиция: 0px -280px;
бутон :активен .ruicon
позиция на фона: -80px -280px;
бутон :деактивиран .ruicon
позиция на фона: -120px -280px;
Има бутон, има иконка на него, при щракване върху бутона за абониране, остава да добавите функция:
if ( getCulture ( ) == "ru-RU" )
var culture = >( "cultureText" );
ако (Време. Настройки. култура)
култура. innerText = Времето. настройки. култура;
// незабавно презареждане на прогнозата за времето на новия език
// опит в челото - не работи - не разбрах
mainData. обновяване (вярно) . тогава ( функция ( ) < >) ;
Пускам приложението в Release, натискам бутона, задава се български локал. Спирам приложението, стартирам го отново и приложението зарежда времето на родния ми език. Зарежда между другото от weather.service.msn.com
Пълна русификация на приложението чрез ресурси
Прогнозата вече е на български, остава да се преведе интерфейса на програмата. Приложението Metro открива настройките на местния език и съответно зарежда текстови ресурси. Добавям папката strings към проекта, файла resources.resjson и папката ru-RU със същия файл в нея. Съдържание на файла:
"CurrentCitySearch" : "Търсене в моя град" ,
"CurrentCityFound" : "Моят град е намерен" ,
"GatheringInfo" : "Зареждане на последния доклад за времето" ,
"CurrentCity" : "Моят град" ,
"AddCity" : "Добавяне на град" ,
"SummaryView": "По дни",
"Hourly" : "На час" ,
"EnterCity" : "Влезте в град" ,
"AddCityError" : "Грешка при добавяне на град" ,
"MaxCities" : "Макс градове" ,
"Предпочитания" : "Настройки" , "Температура" : "Температура" ,
"UVIndex" : "UV индекс" ,
"ResultsFor" : "Данни за" ,
"PercChanceOfRain" : "вероятност за дъжд" ,
"FeelsLike" : "Чувства се като" ,
"ChanceOfRain" : "Възможност за дъжд" ,
"NetworkConnection" : "Не може да се получи прогноза. Проверете интернет." ,
"CannotRetrieveData" : "Не могат да се извлекат данни"
Пускам приложението и Weather се превръща в Weather!
Hardcore conf в C++. Каним само професионалисти.