Browse Source

Add extension point for translations.

Keep a copy of all compile options in the dtl context to allow the
extension module to support custom options.
Andreas Stenius 11 years ago
parent
commit
ee049e7461
2 changed files with 17 additions and 10 deletions
  1. 2 1
      include/erlydtl_ext.hrl
  2. 15 9
      src/erlydtl_compiler.erl

+ 2 - 1
include/erlydtl_ext.hrl

@@ -21,7 +21,8 @@
           is_compiling_dir = false,
           extension_module = undefined,
           scanner_module = erlydtl_scanner,
-          scanned_tokens = []
+          scanned_tokens = [],
+          all_options = []
          }).
 
 -record(ast_info, {

+ 15 - 9
src/erlydtl_compiler.erl

@@ -262,6 +262,7 @@ load_code(Module, Bin, Warnings) ->
 init_context(IsCompilingDir, ParseTrail, DefDir, Module, Options) ->
     Ctx = #dtl_context{},
     Context = #dtl_context{
+                 all_options = Options,
 		  parse_trail = ParseTrail,
 		  module = Module,
 		  doc_root = proplists:get_value(doc_root, Options, DefDir),
@@ -963,22 +964,27 @@ blocktrans_ast(ArgList, Contents, Context, TreeWalker) ->
     end.
 
 translated_ast({string_literal, _, String}, Context, TreeWalker) ->
-    NewStr = unescape_string_literal(String),
-    DefaultString = case Context#dtl_context.locale of
-			none -> NewStr;
-			Locale -> erlydtl_i18n:translate(NewStr,Locale)
-		    end,
-    translated_ast2(erl_syntax:string(NewStr), erl_syntax:string(DefaultString), 
-		    #ast_info{translatable_strings = [NewStr]}, TreeWalker);
+    UnescapedStr = unescape_string_literal(String),
+    case call_extension(Context, translate_ast, [UnescapedStr, Context, TreeWalker]) of
+        undefined ->
+            DefaultString = case Context#dtl_context.locale of
+                                none -> UnescapedStr;
+                                Locale -> erlydtl_i18n:translate(UnescapedStr,Locale)
+                            end,
+            translated_ast2(erl_syntax:string(UnescapedStr), erl_syntax:string(DefaultString), 
+                            #ast_info{translatable_strings = [UnescapedStr]}, TreeWalker);
+        Translated ->
+            Translated
+    end;
 translated_ast(ValueToken, Context, TreeWalker) ->
     {{Ast, Info}, TreeWalker1} = value_ast(ValueToken, true, false, Context, TreeWalker),
     translated_ast2(Ast, Ast, Info, TreeWalker1).
 
-translated_ast2(NewStrAst, DefaultStringAst, AstInfo, TreeWalker) ->
+translated_ast2(UnescapedStrAst, DefaultStringAst, AstInfo, TreeWalker) ->
     StringLookupAst = erl_syntax:application(
 			erl_syntax:atom(erlydtl_runtime),
 			erl_syntax:atom(translate),
-			[NewStrAst, erl_syntax:variable("_TranslationFun"), DefaultStringAst]),
+			[UnescapedStrAst, erl_syntax:variable("_TranslationFun"), DefaultStringAst]),
     {{StringLookupAst, AstInfo}, TreeWalker}.
 
 						% Completely unnecessary in ErlyDTL (use {{ "{%" }} etc), but implemented for compatibility.