anchor.diff:  %% Types
   %% ===================================================================
   
  +-type srv_id() :: term().
   -type key() :: binary().
   -type text() :: string() | binary().
   
  
positive.code: -spec handle_cast(term(), #state{}) ->
      {noreply, #state{}}.
  
  handle_cast({insert, Keys, Lang}, State) ->
      Values = [{{to_bin(Key), Lang}, to_bin(Txt)} || {Key, Txt} <- Keys],
      ets:insert(?MODULE, Values),
      {noreply, State};
  
  
negative.code: %% ===================================================================
  
  %% @doc Gets a string for english
  -spec get(srv_id(), key()) ->
      binary().
  
  get(SrvId, Key) ->
      get(SrvId, Key, <<"en">>).
  
  
  %% @doc Gets a string for any language, or use english default
  -spec get(srv_id(), key(), lang()) ->
      binary().
  
  get(SrvId, Key, Lang) ->
      Lang2 = to_bin(Lang),
      case ets:lookup(?MODULE, {SrvId, to_bin(Key), Lang2}) of
          [] when Lang2 == <<"en">> ->
              <<>>;
          [] ->
              get(SrvId, Key, <<"en">>);
          [{_, Msg}] ->
              Msg
      end.
  
  
  %% @doc Gets a string an expands parameters
  -spec get(srv_id(), key(), list(), lang()) ->
      binary().
  
  get(SrvId, Key, List, Lang) when is_list(List) ->
      case get(SrvId, Key, Lang) of
          <<>> ->
              <<>>;
          Msg ->
  