aboutsummaryrefslogtreecommitdiffstats
path: root/t/i18n.t
blob: 3337f1a7f936335115670a4c8ce941ab1be98b27 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
use strict;
use warnings;

use Test::More;

use HTTP::Headers;
use Sort::Key qw(keysort);
use POSIX 'strcoll';

use FixMyStreet;
use mySociety::Locale;

# check that the mo files have been generated
die "You need to run 'commonlib/bin/gettext-makemo --quiet FixMyStreet' "
  . "to generate the *.mo files needed."
  unless -e FixMyStreet->path_to(
    'locale/cy_GB.UTF-8/LC_MESSAGES/FixMyStreet-EmptyHomes.mo');

# Test the language negotiation works
my $lang = mySociety::Locale::negotiate_language(
    'en-gb,English,en_GB|cy,Cymraeg,cy_GB|es,Spanish,es_ES',
    undef,
    HTTP::Headers->new(
        Accept_Language => 'es,en-gb;q=0.6,en;q=0.4'
    )
);
is $lang, 'es', 'Language negotiation works okay';

# Example strings
my $english = "Please enter a valid email";
my $welsh   = "Cofnodwch gyfeiriad e-bost dilys";

# set english as the language
mySociety::Locale::negotiate_language(    #
    'en-gb,English,en_GB|cy,Cymraeg,cy_GB', 'en_GB'
);

mySociety::Locale::gettext_domain( 'FixMyStreet-EmptyHomes', 1 );
mySociety::Locale::change();
is _($english), $english, "english to english";

# set to welsh and check for translation
mySociety::Locale::change('cy');
is _($english), $welsh, "english to welsh";

# check that being in a deep directory does not confuse the code
chdir FixMyStreet->path_to('t/app/controller') . '';
mySociety::Locale::gettext_domain( 'FixMyStreet-EmptyHomes', 1,
    FixMyStreet->path_to('locale')->stringify );
mySociety::Locale::change('cy');
is _($english), $welsh, "english to welsh (deep directory)";

# test that sorting works as expected in the right circumstances...
my @random_sorted  = qw( Å Z Ø A );
my @EN_sorted      = qw( A Å Ø Z );
my @NO_sorted      = qw( A Z Ø Å );
my @default_sorted = qw( A Z Å Ø );

{

    mySociety::Locale::negotiate_language(    #
        'en-gb,English,en_GB|cy,Cymraeg,cy_GB', 'en_GB'
    );
    mySociety::Locale::change();

    no locale;

    is_deeply( [ sort @random_sorted ],
        \@default_sorted, "sort correctly with no locale" );

    is_deeply( [ keysort { $_ } @random_sorted ],
        \@default_sorted, "keysort correctly with no locale" );

    # Note - this obeys the locale
    is_deeply( [ sort { strcoll( $a, $b ) } @random_sorted ],
        \@EN_sorted, "sort strcoll correctly with no locale (to 'en_GB')" );
}

{
    mySociety::Locale::negotiate_language(    #
        'en-gb,English,en_GB|cy,Cymraeg,cy_GB', 'en_GB'
    );
    mySociety::Locale::change();
    use locale;

    is_deeply( [ sort @random_sorted ],
        \@EN_sorted, "sort correctly with use locale 'en_GB'" );

    # is_deeply( [ keysort { $_ } @random_sorted ],
    #     \@EN_sorted, "keysort correctly with use locale 'en_GB'" );

    is_deeply( [ sort { strcoll( $a, $b ) } @random_sorted ],
        \@EN_sorted, "sort strcoll correctly with use locale 'en_GB'" );
}

{
    mySociety::Locale::negotiate_language(    #
        'nb-no,Norwegian,nb_NO', 'nb_NO'
    );
    mySociety::Locale::change();
    use locale;

    is_deeply( [ sort @random_sorted ],
        \@NO_sorted, "sort correctly with use locale 'nb_NO'" );

    # is_deeply( [ keysort { $_ } @random_sorted ],
    #     \@NO_sorted, "keysort correctly with use locale 'nb_NO'" );

    is_deeply( [ sort { strcoll( $a, $b ) } @random_sorted ],
        \@NO_sorted, "sort strcoll correctly with use locale 'nb_NO'" );
}

subtest "check that code is only called once by in_gb_locale" => sub {

    my $scalar_counter = 0;
    my $out = mySociety::Locale::in_gb_locale { $scalar_counter++ };
    is $scalar_counter, 1, "code called once in scalar context";

    my $list_counter = 0;
    my @out = mySociety::Locale::in_gb_locale { $list_counter++ };
    is $list_counter, 1, "code called once in list context";

};

done_testing();