Jan Henning Thorsen

NAME

Locale::Maketext::From::Strings - Parse Apple .strings files

VERSION

0.03

SYNOPSIS

  use Locale::Maketext::From::Strings;

  my $strings = Locale::Maketext::From::Strings->new(
                  path => '/path/to/strings',
                  namespace => 'MyApp::I18N',
                  out_dir => 'lib',
                );

  $strings->load; # in memory
  $strings->generate; # to disk

DESCRIPTION

This module will parse .strings file used in the Apple world and generate in memory perl-packages used by the Locale::Maketext module.

Formatting rules

This module can parse most of the formatting mentioned here: http://blog.lingohub.com/developers/2013/03/i18n-resource-file-formats-ios-strings-files/.

  • Key-value pairs are delimited with the equal character (=), and terminated by a semicolon (;).

  • Keys and values are surrounded by double quotes (").

  • Place-holders look can be: %.2f, %d, %1$s:

      qr{\%[\d|\.]*\$*\d*[dsf]\b}
  • Comments start at the beginning of the line and span the whole line.

  • Multi-line comments are enclosed in /* */.

  • Single-line comments start with double slashes (//).

  • The specification says it expect UTF-16LE encoding by default, but this module expect UTF-8 instead.

    NOTE! This might change in future release. Pass "encoding" to constructor if you want to be sure about the value.

Example file

This could be the content of "i18n/en.strings":

  /* comments in .strings files
  can be multi line,
  single line */
  // or combination of the two
  "hello_user" = "Hello %1$s";

  "Sample data" = "sample %s %d %.3f data";

  // keys and values can be spread to multiple lines
  "welcome_message" = "Welcome back,
  we have missed you";

TIP! Adding the default value on the left side (instead of hello_user and welcome_message) works better with Locale::Maketext since it will use that as fallback if translation is missing.

ATTRIBUTES

encoding

Holds the encoding used when reading the .strings files. Defaults to "UTF-8".

namespace

Package name of where to "generate" or "load" code into. Default to the caller namespace.

out_dir

Directory to where files should be written to. Defaults to "lib".

path

Path to ".strings" files. Defaults to "i18n".

METHODS

new

  $self = Locale::Maketext::From::Strings->new(%attributes);
  $self = Locale::Maketext::From::Strings->new($attributes);

Object constructor.

generate

  Locale::Maketext::From::Strings->generate($namespace);
  $self->generate;

This method will write the I18N code to disk. Use this when the "load" time goes up.

NOTE! This method does not check for existing files - they will be overwritte without warning.

Example one-liners:

  $ perl -MLocale::Maketext::From::Strings=generate -e1 MyApp::I18N
  $ perl -Ilib -E'say +(require MyApp::I18N)->get_handle(shift)->maketext(@ARGV);' en "some key" ...

load

  Locale::Maketext::From::Strings->load($path);
  $self->load;

Will parse language.strings files from "path" and generage in-memory packages in the given "namespace".

Example Mojolicious app:

  package MyApp;
  use Locale::Maketext::From::Strings;
  use base 'Mojolicious';

  sub startup {
    my $self = sihft;
    my $default_lang = 'en';

    Locale::Maketext::From::Strings->load($self->home->rel_dir('i18n'));

    $self->helper(l => sub {
      my $c = shift;
      $c->stash->{i18n} ||= MyApp::I18N->get_handle($c->session('lang'), $default_lang);
      $c->stash->{i18n}->maketext(@_);
    });
  }

See also Mojolicious::Plugin::I18N.

parse

  $data = $self->parse($file);

Will parse $file and store the key value pairs in $data.

import

See "generate" for example one-liner.

COPYRIGHT

This program is free software, you can redistribute it and/or modify it under the terms of the Artistic License version 2.0.

AUTHOR

Jan Henning Thorsen - jhthorsen@cpan.org