Consider adding an additional layer of abstraction that shields the rest of the website from the physical structure used to represent the localized information.
For example, you could create a flat "Product" entity that would have the same structure regardless of whether it was localized or not. During query, map both tables (language-independent and localized) into that data structure:
var test =
(
from t in context.ProductLang
where t.ProductId == 5 && t.Language = "en"
select new Website.Model.Product
{
Id = t.Product.Id,
Price = t.Product.Price, // Language independent
Name = t.Name // Language dependent
}
).SingleOrDefault();
If you wrap the code in a function or interface, your calling code can easily retrieve information without having to worry about how it's represented:
var test = DataService.GetProduct(5, "en");
Updating can work the same way. The trick there is that updates become a bit more difficult since you don't necessarily know whether or not to create the language-independent record or not. That makes the Update code a bit more complex - for complete thread-safety you'd have to use a transaction with locking. You may be able to get away with an "if statement" in your EF logic if updates to localized content are infrequent.