test for invalid language factored out to GetCultureInfoFromLanguage; no need to convert culture tolower here as only place used is in GetCacheKey (which tolowers it) and filesystem ops; changed text lookup return values to null rather than key as latter can be ambiguous when translation equals key.
Further improved concurrency of access to message cache. ConcurrentDictionary<> offers concurrent (lock free) reads whereas, I believe, Dictionary<> doesn't.
Introducing LanguageTag class
Added LanguageMatching setting; some tidying up
LanguageMatching support classes added; some tidying up; fixed build config issue where Debug build was in fact building Release config.
Added ILanguageTag interface.
Checkpoint
Refactored the session GetText method a little so single point of call to LocalizingService (in prep for multiple service class types); added call to HttpUtility.HtmlDecode to match the other overload (assuming it was omitted due to oversight).
LocalizingService class extended with new ILocalizingServiceEnhanced interface implementation for enhanced language matching. DefaultSettings class extended to allow for selection of Enhanced language matching. Original LanguageMatching algorithm now termed 'Basic' and remains the default so current users should see no change.
Rationalized ILocalizingServiceEnhanced methods.
Heads up.
Caching of UserLanguages per request; further tidying up of I18nSession.
Obviate double lookup.
Obviate double lookup.
Flagged up a couple of potential bugs, and suggested fixes, though not implemented fixes.
Some renaming and tidying up.
Some tidying up and new comments.
Some tidying up and new comments.
Some tidying up and new comments.
More tidying up of LocalizingService class. No logic changes.