<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MIKE &#187; PHP</title>
	<atom:link href="http://helios.ca/category/development/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://helios.ca</link>
	<description>Just another developer blog</description>
	<lastBuildDate>Thu, 10 Jun 2010 15:02:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>ASP.NET MVC and Localization</title>
		<link>http://helios.ca/2009/05/27/aspnet-mvc-and-localization/</link>
		<comments>http://helios.ca/2009/05/27/aspnet-mvc-and-localization/#comments</comments>
		<pubDate>Wed, 27 May 2009 20:50:15 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Developement]]></category>
		<category><![CDATA[Globalization]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Photoshop]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://helios.ca/?p=65</guid>
		<description><![CDATA[I live in Montreal &#8211; Canada, and here we have two officials languages, French and English, that&#8217;s why every website I build must be available in both languages. Building an ASP.NET MVC Website using Localization/Globalization is fairly simple and is pretty much like doing it on a plain old ASP.NET Website. We will start this [...]]]></description>
			<content:encoded><![CDATA[<p>I live in Montreal &#8211; Canada, and here we have two officials languages, French and English, that&#8217;s why every website I build must be available in both languages. Building an ASP.NET MVC Website using Localization/Globalization is fairly simple and is pretty much like doing it on a plain old ASP.NET Website.</p>
<p>We will start this example from a blanc ASP.NET MVC Website. This will be easier for you to follow. Now that you have your new ASP.NET MVC Website, create a new class and name it <strong>SetCultureAttribute.cs</strong> in a new <strong>ActionFilter</strong> directory and paste this code inside of it.</p>
<pre class="csharp" name="code">
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication1.ActionFilter
{
    public class SetCultureAttribute : FilterAttribute, IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext
            filterContext)
        {
            string cultureCode = SetCurrentLanguage(filterContext);

            if (string.IsNullOrEmpty(cultureCode)) return;

            HttpContext.Current.Response.Cookies.Add(
                new HttpCookie("Culture", cultureCode)
                {
                    HttpOnly = true,
                    Expires = DateTime.Now.AddYears(100)
                }
            );

            filterContext.HttpContext.Session["Culture"] = cultureCode;

            CultureInfo culture = new CultureInfo(cultureCode);
            System.Threading.Thread.CurrentThread.CurrentCulture =
                culture;
            System.Threading.Thread.CurrentThread.CurrentUICulture =
                culture;
        }

        public void OnActionExecuted(ActionExecutedContext filterContext)
        {

        }

        private static string GetCookieCulture(ActionExecutingContext
            filterContext, ICollection<string> Cultures)
        {
            /* Get the language in the cookie*/
            HttpCookie userCookie = filterContext.RequestContext
                                                .HttpContext
                                                .Request
                                                .Cookies["Culture"];

            if (userCookie != null)
            {
                if (!string.IsNullOrEmpty(userCookie.Value))
                {
                    if (Cultures.Contains(userCookie.Value))
                    {
                        return userCookie.Value;
                    }
                    return string.Empty;
                }
                return string.Empty;
            }
            return string.Empty;
        }

        private static string GetSessionCulture(ActionExecutingContext
            filterContext, ICollection<string> Cultures)
        {
            if (filterContext.RequestContext.HttpContext
                                               .Session["Culture"]
                                                             != null)
            {
                string SessionCulture = filterContext.RequestContext
                                                .HttpContext
                                                .Session["Culture"]
                                                .ToString();

                if (!string.IsNullOrEmpty(SessionCulture))
                {
                    return Cultures.Contains(SessionCulture)
                                 ? SessionCulture
                                 : string.Empty;
                }
                return string.Empty;
            }
            return string.Empty;
        }

        private static string GetBrowserCulture(ActionExecutingContext
            filterContext, IEnumerable<string> Cultures)
        {
            /* Gets Languages from Browser */
            IList<string> BrowserLanguages = filterContext.RequestContext
                                                         .HttpContext
                                                         .Request
                                                         .UserLanguages;

            foreach (var thisBrowserLanguage in BrowserLanguages)
            {
                foreach (var thisCultureLanguage in Cultures)
                {
                    if (thisCultureLanguage != thisBrowserLanguage)
                        continue;

                    return thisCultureLanguage;
                }
            }
            return string.Empty;
        }

        private static string SetCurrentLanguage(ActionExecutingContext
             filterContext)
        {
            IList<string> Cultures = new List<string>
            {
                "en-CA",
                "fr-CA"
            };

            string CookieValue = GetCookieCulture(
                                            filterContext,
                                            Cultures);

            if (string.IsNullOrEmpty(CookieValue))
            {
                string SessionValue = GetSessionCulture(
                                                  filterContext,
                                                  Cultures);

                if (string.IsNullOrEmpty(SessionValue))
                {
                    string BrowserCulture = GetBrowserCulture(
                                                         filterContext,
                                                         Cultures);
                    return string.IsNullOrEmpty(BrowserCulture)
                             ? "en-CA"
                             : BrowserCulture;
                }
                return SessionValue;
            }
            return CookieValue;
        }
    }
}
</pre>
<p>Once this is done, we need to tell our controllers to use this attribute, to do this we could simply go on top of every controller and decorate it with <strong>[SetCulture]</strong> attribute. The down side with this is that we want the complete site multicultural, not just a few controllers or actions. To fix this problem we&#8217;ll make a <strong>BaseController</strong> which will inherit Controller and will be inherited from all our controllers.</p>
<p>To do this, create a new directory and name it <strong>Infrastructure </strong>and then add a new class called <strong>BaseController.cs</strong> in it. This class should contain the following code:</p>
<pre class="csharp" name="code">
using System.Web.Mvc;
using MvcApplication1.ActionFilter;

namespace MvcApplication1.Infrastructure
{
    [SetCulture]
    public class BaseController : Controller
    {
         // Anything you put here will be accessible
         // in every controllers
    }
}
</pre>
<p>As I said before, we need to tell every controllers to use BaseController, so open every controllers and change the inheritance from Controller to BaseController. As of now, your website knows how to handle localization!!! </p>
<p>What we need now, is a way to switch between french and english&#8230; To do this I simply created a new ASP.NET MVC View User Controller (CultureUserControl.ascx) in Views/Shared with the following code.</p>
<pre class="csharp" name="code">
<% if (Session["Culture"].ToString() == "en-CA") {%>
    <a href="/Home/SetCulture/fr-CA">[ Français ]</a>
<% } else if (Session["Culture"].ToString() == "fr-CA") { %>
    <a href="/Home/SetCulture/en-CA">[ English ]</a>
<% } %>
</pre>
<p>Then I added it to the masterpage, right next to the Log On link.</p>
<pre class="csharp" name="code">
<div id="logindisplay">
    <% Html.RenderPartial("LogOnUserControl"); %>
    <% Html.RenderPartial("CultureUserControl"); %>
</div>
</pre>
<p>Last, but not least, add a new <strong>Global.resx</strong> and <strong>Global.fr.rex</strong> in the App_GlobalResources folder. You can start with the welcome message in About &#8211; Index and call it using <strong>Resources.Global.Welcome</strong></p>
<p><img src="http://helios.ca/wp-content/uploads/2009/05/11.jpg" alt="11" title="11" width="547" height="423" class="alignnone size-full wp-image-107" /><img src="http://helios.ca/wp-content/uploads/2009/05/21.jpg" alt="21" title="21" width="547" height="423" class="alignnone size-full wp-image-108" /></p>
<p>You can find a working example of this tutorial <a href="http://helios.ca/wp-content/uploads/2009/05/ASP.NET.MVC.and.ocalization.zip">here</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://helios.ca/2009/05/27/aspnet-mvc-and-localization/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>How To: Install PHP5 on Windows Vista</title>
		<link>http://helios.ca/2008/07/12/how-to-install-php5-on-windows-vista/</link>
		<comments>http://helios.ca/2008/07/12/how-to-install-php5-on-windows-vista/#comments</comments>
		<pubDate>Sat, 12 Jul 2008 16:16:00 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Developement]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://helios.ca/?p=34</guid>
		<description><![CDATA[How To: Install PHP5 on IIS on Windows Vista]]></description>
			<content:encoded><![CDATA[<p>A lot of people asked me how to install a web server on Windows Vista, well guess what installating PHP on IIS is now easier then ever! Here&#8217;s how to do it:</p>
<h3>Download and Install PHP</h3>
<ol>
<li>If you haven&#8217;t done it yet, download PHP from <a href="http://www.php.net/downloads.php">http://www.php.net/downloads.php</a>; I used the zip package for this tutorial.<span style="font-family: Times New Roman; font-size: 12pt;"> </span></li>
<li>Unzip the file in <em>C:\PHP</em>. You can unzip anywhere as long as there are no spaces in the path.</li>
<li>Copy <em>C:\PHP\php.ini-recommended</em> and rename it to <em>php.ini </em></li>
<li>Go to <em>Control Panel » System » Advanced Settings » Environment Variables</em>. In the <em>System Variables</em> click <em>Path</em> and then <em>Edit</em> and enter &#8220;C:\PHP; &#8220;(or &#8220;;C:\PHP&#8221; if you put it at the end).</li>
<li>Still in <em>Control Panel » System » Advanced Settings » Environment Variables » System variable</em>; Click <em>New</em>, in <em>Variable Name </em> enter &#8220;PHPRC&#8221; and in <em>Variable Value</em> enter &#8220;C:\PHP&#8221;</li>
</ol>
<p><strong>Note: </strong>Instead of doing Step 4 and 5 you could simple copy all non-php dll files to C:\Windows\System32 but It will be harder to uninstall / upgrade</p>
<h3>Configure PHP</h3>
<p>Now that PHP is installed, we need to make some modification to the configuration file (php.ini) to make sure it will work on Windows Vista.</p>
<ol>
<li>Create a Session State directory and edit php.ini to point to it. insert <em>session.save_path = &#8220;C:\PHP\SessionFolderName&#8221;</em> in php.ini</li>
<li>Modify the PHP Extensions directory. search for <em>extension_dir</em> and set its value to &#8220;C:\PHP\ext&#8221;</li>
<li>Enable extensions you plan on using. To do this simply uncomment (remove the semicolon &#8220;;&#8221;) the ones you want
<ol>
<li><strong>php_gd2.dll</strong> This will be useful if you plan on manipulating images.</li>
<li><strong>php_mysql.dll</strong><span style="font-family: Courier New; font-size: 10pt;"> </span>This one is required for MySQL functionality.</li>
</ol>
<p style="margin-left: 18pt;">There is a lot of extensions, enable whatever you need…</p>
</li>
</ol>
<h3>Configure IIS</h3>
<p>By default, IIS is not installed on Windows Vista, but is available freely… If you don&#8217;t know how to install it just follow this <a href="http://www.iis.net/default.aspx?tabid=2&amp;subtabid=25&amp;i=957">link</a>. While installing, make sure you select the ISAPI Extension component or the CGI component. You will need one of these to run PHP on the server.  Let&#8217;s teach IIS how to handle PHP files.</p>
<ol>
<li>Go to <em>Control Panel » Administrative Tools » Internet Information Services (IIS)  Manager</em></li>
<li>Click on &#8220;Handler Mappings&#8221;</li>
<li>Click on the &#8220;Add Script Map&#8221;</li>
<li>Fill the dialog box then click OK
<ol>
<li>Request Path: *.php</li>
<li>Executables: C:\PHP\php5isapi.dll</li>
<li>Name: PHP</li>
</ol>
</li>
<li>On the &#8220;Add Script Map&#8221; dialog box, click yes</li>
<li>Test it!
<ol>
<li>Just create <em>phpinfo.php</em> with <em>&lt;?php phpinfo(); ?&gt;</em> in it in <em>c:\inetpub\wwwroot </em></li>
</ol>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://helios.ca/2008/07/12/how-to-install-php5-on-windows-vista/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
