рдмреЗрд╢рдХ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╡рд┐рд╖рдп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рджреГрд╖реНрдЯрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рд╡рд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рдж рдХреЗ рдЪрд░рдг рдореЗрдВ рдПрдХ .NET рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ WebForms рдореЗрдВ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдгрд╛рд▓реАред рдЕрдВрдХ рдкрд░:
1. рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╛рд╕: рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдкрд░ рдиреНрдпреВрдирддрдо рдзреНрдпрд╛рдиред
2. рд╡рд┐рдХрд╛рд╕ рдкреВрд░рд╛ рдХрд░рдирд╛: рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рд╕рдордпред
рдФрд░ рдлрд┐рд░ рднреА рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕рд░рд▓ рдерд╛ред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдзрд┐ рд╣реЛрдЧреА, рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХреБрдЫ рдкрд╛рда, рдпрд╛ рдПрдХ рдХреБрдВрдЬреА + рдкрд╛рда рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╡рд┐рдзрд┐, рдмрджрд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рдПрдЧреА рдпрд╛ рдЬреЛ рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рднреА рд╣реЛрдЧреА рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рдзрд┐ рдХреА рдЦреЛрдЬ рдореЗрдВ * .cs , * .aspx , * .ascx рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреА рд╣реИ, рд╡рд╣рд╛рдВ рд╕реЗ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдФрд░ рдкрд╛рда рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИ, рд▓рдЧрддрд╛ рд╣реИ рдпрд╛ рдпреЗ рдЧреНрд░рдВрде рдФрд░ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рд╣реИрдВред рдлрд┐рд░ рд╣рдо Google рдЕрдиреБрд╡рд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрдо рд╕реЗ рдХрдо рдЦрд░рд╛рдм рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдирдП рдЧреНрд░рдВрдереЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдЧрд╛ред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЕрдиреБрд╡рд╛рдж рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рд╕рд╣реЗрдЬреЗрдВред рд╣реЛ рдЧрдпрд╛ред
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рд╕рдорд╛рди, рдпрд╛ рд╢рд╛рдпрдж рдмреЗрд╣рддрд░ рддрдВрддреНрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЪрдврд╝рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдореЗрдЧрд╛ рднрд╛рд░реА рджреЗрдЦрд╛ рдФрд░ рд╕рдорд╛рдзрд╛рди рднреА рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ред
рддреЛ, рдЪрд▓реЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЗрдВред рдЪрд▓реЛ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, ExpressionBuilder-a рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП:
public static class L
{
private static readonly Regex KeyRepairRegex = new Regex( "[^\\w\\d]" , RegexOptions.Compiled);
public static string Run( string value )
{
var key = GenerateKey( value );
var localized = Resources.ResourceManager.GetString(key);
return string .IsNullOrEmpty(localized) ? value : localized;
}
public static string Run( string key, string value )
{
var localized = Resources.ResourceManager.GetString(key);
return string .IsNullOrEmpty(localized) ? value : localized;
}
public static string Run( string key, string value , params object [] format)
{
var localized = Run(key, value );
if (format != null && format.Length > 0)
{
try
{
localized = string .Format(localized, format);
}
catch
{
}
}
return localized;
}
private static string GenerateKey( string value )
{
if ( string .IsNullOrEmpty( value )) return value ;
value = value .Length > 23 ? value .Substring(0, 23) + "__" : value ;
value = KeyRepairRegex.Replace( value , "_" );
if ( char .IsUpper( value [0])) value = "_" + value ;
value = value .ToLowerInvariant();
return value ;
}
}
рдЕрдм, рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
<%= L.Run( "Hello, Mr.Everybody" ) %>
L рд╡рд░реНрдЧ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдирд╛рдо рд╕реНрдерд╛рди рдкрд░ рд╕реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рддрд╛рдХрд┐ рдЗрд╕реЗ * .ascx рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЖрдпрд╛рдд рди рдХрд░рдирд╛ рдкрдбрд╝реЗред
<%@ Import Namespace = "Example.Namespace" %>
рдпрд╣рд╛рдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг GenerateKey рддрд░реАрдХрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдмрд┐рдирд╛ рдХреБрдВрдЬреА рдХреЗ рдХреЗрд╡рд▓ рдкрд╛рда рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡рд┐рдзрд┐ рдПрдХ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧреА рдФрд░ рд╣рдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рдЗрд╕ рдХреБрдВрдЬреА рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗред рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рдХреБрдВрдЬреА рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдХреНрд╖рд░ [a-z0-9_] рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рд╣рдорд╛рд░реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЪрд╛рдмрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧреАред рдЕрдм рд╣рдо ExpressionBuilder рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдкреВрд░реА рдпреЛрдЬрдирд╛ рдХрд╛ рдПрдХ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЗрд╕ рдмрд┐рд▓реНрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?
рд╕рд░реНрд╡рд░ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди <% =%> рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди <% #%> рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмрд┐рдВрдж рд╡рд┐рдзрд┐ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ ExpressionBuilder рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдПрдХ рд╡рд░реНрдЧ рдЪрд╛рд╣рд┐рдПред
public class LExpressionBuilder: ExpressionBuilder
{
public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
{
var thisType = new CodeTypeReferenceExpression(GetType());
var expression = new CodePrimitiveExpression(entry.Expression.Trim());
const string evaluationMethod = "Localize" ;
return new CodeMethodInvokeExpression(thisType, evaluationMethod, new CodeExpression[] { expression });
}
public static string Localize( string expression)
{
return L.Run(expression);
}
public override object EvaluateExpression( object target, BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
{
return Localize(entry.Expression);
}
public override bool SupportsEvaluate
{
get { return true ; }
}
}
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
<input typ= 'submit' id= 'btnSubmit' runat= 'server' value = "<%$ L:A people free to choose will always choose peace %>" />
рдкрд╣рд▓рд╛ рднрд╛рдЧ рддреИрдпрд╛рд░ рд╣реИред рд╣рдо рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп WinForms рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИред
рдХрдХреНрд╖рд╛ рдЪрд╛рд░реНрдЯ
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЖрд░реЗрдЦ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрдб рдмрд╣реБрдд рд╕реАрдзреЗ рдЖрдЧреЗ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдмрд╛рдд рд╕рд░рд▓ рд╣реИред рд╣рдо рдЙрд╕ рд╕рдорд╛рдзрд╛рди рдпрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕реЗрдЯрд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕рдВрд╕рд╛рдзрди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдФрд░ ... рдЪрд▓реЛ рдЪрд▓реЗрдВ! рд╕рдорд╛рдзрд╛рди рд╡рд░реНрдЧ рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛ред CodeParser рдЕрдиреБрд╡рд╛рдж рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рд╕рднреА рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рд▓реЛрдб рдХрд░реЗрдЧрд╛ рдФрд░ рдпрд╣ рд╕рдм GridView рдореЗрдВ рджрд┐рдЦрд╛рдПрдЧрд╛ред рдЕрдм рдЖрдк рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдпрд╛ Google рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдореВрд▓ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХреБрдЫ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, xml рдореЗрдВ рдмрдЪрдд рдХрд░рдирд╛ред
рдЕрд╕реЗрдВрдмрд▓рд╛ рддреЛрдбрд╝рдлреЛрдбрд╝ (рдкрдВрдЬреАрдХрд░рдг рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ)
рдпрд╣ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджрдмрд╛рдЬреА рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ, рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░: "рдпрджрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ", рддреЛ рдореИрдВ рдЧреБрд░реБ рд╕реЗ рдХрдбрд╝рд╛рдИ рд╕реЗ рдиреНрдпрд╛рдп рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдЕрд▓реНрдлрд╛ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд▓рд╛ рд╕рдХрддрд╛ рд╣реВрдВред
рдЖрдк рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
CodeParser рдлрд╛рдЗрд▓реЛрдВ рд╕реЗ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдлрд╛рдбрд╝рдХрд░ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЪреВрдБрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рд╢реБрд░реВ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдиреИрдиреЛрд╕реЗрдХреЗрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдмрд╛рдж рдореЗрдВ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рддрд╛рд░реЛрдВ рдХреА рдЪрд╛рдмреА рдбрд╛рд▓рдиреА рдЪрд╛рд╣рд┐рдПред
рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рднреА, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЪрд╛рд▓рд╛рдХреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рдЖрд▓реЛрдЪрдирд╛ рдпрд╛ рд╕реБрдЭрд╛рд╡ рдХреЛ рд╕реБрдирдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
* Source code was highlighted with Source Code Highlighter .