EDIT: I went through and tested this out on one of my servers. This works fine for me:
RewriteEngine On
RewriteRule ^sub-site/([a-z_]+)/([a-z0-9_-]+)$ /sub-site/index.php?locale=$1&page=$2
This gets you most of the way there, but it doesn't do the locale translation (en => en_EN), it just delivers the locale as-is to the PHP script. Using mod_rewrite, I'd recommend RewriteMap; however, if you only have access to .htaccess (like on a shared host), you can't use RewriteMap.
So then, to accomplish the locale translation, I think you'd be best off doing it on the PHP side. You could either use one of the frameworks listed below, or just do it yourself.
In case you do have access to the virtual host configuration, you'd make a text file like:
en en_EN
fr fr_FR
ca fr_CA
If that file was located at /path/to/localemap.txt, you'd have:
RewriteMap locales txt:/path/to/localemap.txt
RewriteRule ^sub-site/([a-z_]+)/([a-z0-9_-]+)$ /sub-site/index.php?locale=${locales:$1|en_EN}&page=$2
This defaults to en_EN if nothing's found in the map.
Hope that helps!
If you're just using .htaccess, then mod_rewrite will easily do what you want.
You'd probably want to look into RewriteMap for your categories or locale, although you could just grab that part of the URL and use it as a parameter directly. Here's an example to get you started:
RewriteRule /sub-site/([a-z_]+)/([a-z0-9_]+) /sub-site/index.php?locale=$1&page=$2
You'd really want to narrow down the regular expressions used to make them more specific to your supported locales and categories, but I think it's a decent starting point.
Other PHP frameworks, especially those focused on MVC, also provide similar URL routing functionality. Examples: