public static MvcHtmlString TranslateByCulture(this HtmlHelper helper, Expression <Func <object> > model, Type customAttribute, CultureInfo culture, params object[] formatArguments)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            if (customAttribute == null)
            {
                throw new ArgumentNullException(nameof(customAttribute));
            }

            if (culture == null)
            {
                throw new ArgumentNullException(nameof(culture));
            }

            if (!typeof(Attribute).IsAssignableFrom(customAttribute))
            {
                throw new ArgumentException($"Given type `{customAttribute.FullName}` is not of type `System.Attribute`");
            }

            var resourceKey = ResourceKeyBuilder.BuildResourceKey(ExpressionHelper.GetFullMemberName(model), customAttribute);

            return(new MvcHtmlString(LocalizationProvider.Current.GetStringByCulture(resourceKey, culture, formatArguments)));
        }
 /// <summary>
 /// Creates new localization provider with all the required settings and services injected.
 /// </summary>
 /// <param name="keyBuilder">Key builder (with help of <paramref name="expressionHelper"/> this dependency will help to translate from lambda expression to resource key as string).</param>
 /// <param name="expressionHelper">Can walk lambda expressions and return string representation of the expression.</param>
 /// <param name="fallbackCollection">Collection of fallback language settings.</param>
 /// <param name="queryExecutor">Small utility robot to help with queries.</param>
 public LocalizationProvider(
     ResourceKeyBuilder keyBuilder,
     ExpressionHelper expressionHelper,
     FallbackLanguagesCollection fallbackCollection,
     IQueryExecutor queryExecutor)
 {
     _keyBuilder         = keyBuilder;
     _expressionHelper   = expressionHelper;
     _fallbackCollection = fallbackCollection;
     _queryExecutor      = queryExecutor;
 }
        /// <summary>
        /// Translates the specified enum with some formatting arguments (if needed).
        /// </summary>
        /// <param name="target">The enum to translate.</param>
        /// <param name="culture">The culture.</param>
        /// <param name="formatArguments">The format arguments.</param>
        /// <returns>Translated enum values</returns>
        /// <exception cref="ArgumentNullException">
        /// target
        /// or
        /// culture
        /// </exception>
        public static string TranslateByCulture(this Enum target, CultureInfo culture, params object[] formatArguments)
        {
            if (target == null)
            {
                throw new ArgumentNullException(nameof(target));
            }
            if (culture == null)
            {
                throw new ArgumentNullException(nameof(culture));
            }

            var resourceKey = ResourceKeyBuilder.BuildResourceKey(target.GetType(), target.ToString());

            return(LocalizationProvider.Current.GetStringByCulture(resourceKey, culture, formatArguments));
        }
        public static MvcHtmlString TranslateForByCulture <TModel, TValue>(this HtmlHelper <TModel> html,
                                                                           Expression <Func <TModel, TValue> > expression,
                                                                           Type customAttribute,
                                                                           CultureInfo culture,
                                                                           params object[] formatArguments)
        {
            if (customAttribute == null)
            {
                throw new ArgumentNullException(nameof(customAttribute));
            }

            if (culture == null)
            {
                throw new ArgumentNullException(nameof(culture));
            }

            if (!typeof(Attribute).IsAssignableFrom(customAttribute))
            {
                throw new ArgumentException($"Given type `{customAttribute.FullName}` is not of type `System.Attribute`");
            }

            var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);

            var pi = metadata.ContainerType.GetProperty(metadata.PropertyName);

            if (pi != null)
            {
                if (pi.GetCustomAttribute(customAttribute) == null)
                {
                    return(MvcHtmlString.Empty);
                }
            }

            return(new MvcHtmlString(LocalizationProvider.Current.GetStringByCulture(ResourceKeyBuilder.BuildResourceKey(metadata.ContainerType,
                                                                                                                         metadata.PropertyName,
                                                                                                                         customAttribute),
                                                                                     culture,
                                                                                     formatArguments)));
        }
        internal static string GetFullMemberName(Expression <Func <object> > memberSelector)
        {
            var memberStack = WalkExpression(memberSelector);

            return(ResourceKeyBuilder.BuildResourceKey(memberStack.Pop(), memberStack));
        }