66
66
<div class="nocov"><span class="num"><pre> 44</pre></span><pre> def __mod__(self, other):</pre></div>
67
67
<div class="nocov"><span class="num"><pre> 45</pre></span><pre> return self.eval() % other</pre></div>
68
68
<div class="skip"><span class="num"><pre> 46</pre></span><pre></pre></div>
69
<div class="skip"><span class="num"><pre> 47</pre></span><pre></pre></div>
70
<div class="nocov"><span class="num"><pre> 48</pre></span><pre>def lazify(func):</pre></div>
71
<div class="nocov"><span class="num"><pre> 49</pre></span><pre> """Decorator to return a lazy-evaluated version of the original"""</pre></div>
72
<div class="nocov"><span class="num"><pre> 50</pre></span><pre> def newfunc(*args, **kwargs):</pre></div>
73
<div class="nocov"><span class="num"><pre> 51</pre></span><pre> return LazyString(func, *args, **kwargs)</pre></div>
74
<div class="nocov"><span class="num"><pre> 52</pre></span><pre> newfunc.__name__ = 'lazy_%s' % func.__name__</pre></div>
75
<div class="nocov"><span class="num"><pre> 53</pre></span><pre> newfunc.__doc__ = 'Lazy-evaluated version of the %s function\n\n%s' % \</pre></div>
76
<div class="nocov"><span class="num"><pre> 54</pre></span><pre> (func.__name__, func.__doc__)</pre></div>
77
<div class="nocov"><span class="num"><pre> 55</pre></span><pre> return newfunc</pre></div>
78
<div class="skip"><span class="num"><pre> 56</pre></span><pre></pre></div>
79
<div class="skip"><span class="num"><pre> 57</pre></span><pre></pre></div>
80
<div class="nocov"><span class="num"><pre> 58</pre></span><pre>def gettext_noop(value):</pre></div>
81
<div class="nocov"><span class="num"><pre> 59</pre></span><pre> """Mark a string for translation without translating it. Returns</pre></div>
82
<div class="nocov"><span class="num"><pre> 60</pre></span><pre> value.</pre></div>
83
<div class="skip"><span class="num"><pre> 61</pre></span><pre></pre></div>
84
<div class="nocov"><span class="num"><pre> 62</pre></span><pre> Used for global strings, e.g.::</pre></div>
85
<div class="skip"><span class="num"><pre> 63</pre></span><pre></pre></div>
86
<div class="nocov"><span class="num"><pre> 64</pre></span><pre> foo = N_('Hello')</pre></div>
87
<div class="skip"><span class="num"><pre> 65</pre></span><pre></pre></div>
88
<div class="nocov"><span class="num"><pre> 66</pre></span><pre> class Bar:</pre></div>
89
<div class="nocov"><span class="num"><pre> 67</pre></span><pre> def __init__(self):</pre></div>
90
<div class="nocov"><span class="num"><pre> 68</pre></span><pre> self.local_foo = _(foo)</pre></div>
91
<div class="skip"><span class="num"><pre> 69</pre></span><pre></pre></div>
92
<div class="nocov"><span class="num"><pre> 70</pre></span><pre> h.set_lang('fr')</pre></div>
93
<div class="nocov"><span class="num"><pre> 71</pre></span><pre> assert Bar().local_foo == 'Bonjour'</pre></div>
94
<div class="nocov"><span class="num"><pre> 72</pre></span><pre> h.set_lang('es')</pre></div>
95
<div class="nocov"><span class="num"><pre> 73</pre></span><pre> assert Bar().local_foo == 'Hola'</pre></div>
96
<div class="nocov"><span class="num"><pre> 74</pre></span><pre> assert foo == 'Hello'</pre></div>
97
<div class="skip"><span class="num"><pre> 75</pre></span><pre></pre></div>
98
<div class="nocov"><span class="num"><pre> 76</pre></span><pre> """</pre></div>
99
<div class="nocov"><span class="num"><pre> 77</pre></span><pre> return value</pre></div>
100
<div class="nocov"><span class="num"><pre> 78</pre></span><pre>N_ = gettext_noop</pre></div>
101
<div class="skip"><span class="num"><pre> 79</pre></span><pre></pre></div>
102
<div class="skip"><span class="num"><pre> 80</pre></span><pre></pre></div>
103
<div class="nocov"><span class="num"><pre> 81</pre></span><pre>def gettext(value):</pre></div>
104
<div class="nocov"><span class="num"><pre> 82</pre></span><pre> """Mark a string for translation. Returns the localized string of</pre></div>
105
<div class="nocov"><span class="num"><pre> 83</pre></span><pre> value.</pre></div>
106
<div class="skip"><span class="num"><pre> 84</pre></span><pre></pre></div>
107
<div class="nocov"><span class="num"><pre> 85</pre></span><pre> Mark a string to be localized as follows::</pre></div>
108
<div class="skip"><span class="num"><pre> 86</pre></span><pre></pre></div>
109
<div class="nocov"><span class="num"><pre> 87</pre></span><pre> gettext('This should be in lots of languages')</pre></div>
110
<div class="skip"><span class="num"><pre> 88</pre></span><pre></pre></div>
111
<div class="nocov"><span class="num"><pre> 89</pre></span><pre> """</pre></div>
112
<div class="nocov"><span class="num"><pre> 90</pre></span><pre> return pylons.translator.gettext(value)</pre></div>
113
<div class="nocov"><span class="num"><pre> 91</pre></span><pre>lazy_gettext = lazify(gettext)</pre></div>
114
<div class="skip"><span class="num"><pre> 92</pre></span><pre></pre></div>
115
<div class="skip"><span class="num"><pre> 93</pre></span><pre></pre></div>
116
<div class="nocov"><span class="num"><pre> 94</pre></span><pre>def ugettext(value):</pre></div>
117
<div class="nocov"><span class="num"><pre> 95</pre></span><pre> """Mark a string for translation. Returns the localized unicode</pre></div>
118
<div class="nocov"><span class="num"><pre> 96</pre></span><pre> string of value.</pre></div>
119
<div class="skip"><span class="num"><pre> 97</pre></span><pre></pre></div>
120
<div class="nocov"><span class="num"><pre> 98</pre></span><pre> Mark a string to be localized as follows::</pre></div>
121
<div class="skip"><span class="num"><pre> 99</pre></span><pre></pre></div>
122
<div class="nocov"><span class="num"><pre>100</pre></span><pre> _('This should be in lots of languages')</pre></div>
123
<div class="skip"><span class="num"><pre>101</pre></span><pre> </pre></div>
124
<div class="nocov"><span class="num"><pre>102</pre></span><pre> """</pre></div>
125
<div class="cov"><span class="num"><pre>103</pre></span><pre> return pylons.translator.ugettext(value)</pre></div>
126
<div class="nocov"><span class="num"><pre>104</pre></span><pre>_ = ugettext</pre></div>
127
<div class="nocov"><span class="num"><pre>105</pre></span><pre>lazy_ugettext = lazify(ugettext)</pre></div>
128
<div class="skip"><span class="num"><pre>106</pre></span><pre></pre></div>
129
<div class="skip"><span class="num"><pre>107</pre></span><pre></pre></div>
130
<div class="nocov"><span class="num"><pre>108</pre></span><pre>def ngettext(singular, plural, n):</pre></div>
131
<div class="nocov"><span class="num"><pre>109</pre></span><pre> """Mark a string for translation. Returns the localized string of</pre></div>
132
<div class="nocov"><span class="num"><pre>110</pre></span><pre> the pluralized value.</pre></div>
133
<div class="skip"><span class="num"><pre>111</pre></span><pre></pre></div>
134
<div class="nocov"><span class="num"><pre>112</pre></span><pre> This does a plural-forms lookup of a message id. ``singular`` is</pre></div>
135
<div class="nocov"><span class="num"><pre>113</pre></span><pre> used as the message id for purposes of lookup in the catalog, while</pre></div>
136
<div class="nocov"><span class="num"><pre>114</pre></span><pre> ``n`` is used to determine which plural form to use. The returned</pre></div>
137
<div class="nocov"><span class="num"><pre>115</pre></span><pre> message is a string.</pre></div>
138
<div class="skip"><span class="num"><pre>116</pre></span><pre></pre></div>
139
<div class="nocov"><span class="num"><pre>117</pre></span><pre> Mark a string to be localized as follows::</pre></div>
140
<div class="skip"><span class="num"><pre>118</pre></span><pre></pre></div>
141
<div class="nocov"><span class="num"><pre>119</pre></span><pre> ngettext('There is %(num)d file here', 'There are %(num)d files here',</pre></div>
142
<div class="nocov"><span class="num"><pre>120</pre></span><pre> n) % {'num': n}</pre></div>
69
<div class="nocov"><span class="num"><pre> 47</pre></span><pre> def format(self, other):</pre></div>
70
<div class="nocov"><span class="num"><pre> 48</pre></span><pre> return self.eval().format(other)</pre></div>
71
<div class="skip"><span class="num"><pre> 49</pre></span><pre></pre></div>
72
<div class="skip"><span class="num"><pre> 50</pre></span><pre></pre></div>
73
<div class="nocov"><span class="num"><pre> 51</pre></span><pre>def lazify(func):</pre></div>
74
<div class="nocov"><span class="num"><pre> 52</pre></span><pre> """Decorator to return a lazy-evaluated version of the original"""</pre></div>
75
<div class="nocov"><span class="num"><pre> 53</pre></span><pre> def newfunc(*args, **kwargs):</pre></div>
76
<div class="nocov"><span class="num"><pre> 54</pre></span><pre> return LazyString(func, *args, **kwargs)</pre></div>
77
<div class="nocov"><span class="num"><pre> 55</pre></span><pre> newfunc.__name__ = 'lazy_%s' % func.__name__</pre></div>
78
<div class="nocov"><span class="num"><pre> 56</pre></span><pre> newfunc.__doc__ = 'Lazy-evaluated version of the %s function\n\n%s' % \</pre></div>
79
<div class="nocov"><span class="num"><pre> 57</pre></span><pre> (func.__name__, func.__doc__)</pre></div>
80
<div class="nocov"><span class="num"><pre> 58</pre></span><pre> return newfunc</pre></div>
81
<div class="skip"><span class="num"><pre> 59</pre></span><pre></pre></div>
82
<div class="skip"><span class="num"><pre> 60</pre></span><pre></pre></div>
83
<div class="nocov"><span class="num"><pre> 61</pre></span><pre>def gettext_noop(value):</pre></div>
84
<div class="nocov"><span class="num"><pre> 62</pre></span><pre> """Mark a string for translation without translating it. Returns</pre></div>
85
<div class="nocov"><span class="num"><pre> 63</pre></span><pre> value.</pre></div>
86
<div class="skip"><span class="num"><pre> 64</pre></span><pre></pre></div>
87
<div class="nocov"><span class="num"><pre> 65</pre></span><pre> Used for global strings, e.g.::</pre></div>
88
<div class="skip"><span class="num"><pre> 66</pre></span><pre></pre></div>
89
<div class="nocov"><span class="num"><pre> 67</pre></span><pre> foo = N_('Hello')</pre></div>
90
<div class="skip"><span class="num"><pre> 68</pre></span><pre></pre></div>
91
<div class="nocov"><span class="num"><pre> 69</pre></span><pre> class Bar:</pre></div>
92
<div class="nocov"><span class="num"><pre> 70</pre></span><pre> def __init__(self):</pre></div>
93
<div class="nocov"><span class="num"><pre> 71</pre></span><pre> self.local_foo = _(foo)</pre></div>
94
<div class="skip"><span class="num"><pre> 72</pre></span><pre></pre></div>
95
<div class="nocov"><span class="num"><pre> 73</pre></span><pre> h.set_lang('fr')</pre></div>
96
<div class="nocov"><span class="num"><pre> 74</pre></span><pre> assert Bar().local_foo == 'Bonjour'</pre></div>
97
<div class="nocov"><span class="num"><pre> 75</pre></span><pre> h.set_lang('es')</pre></div>
98
<div class="nocov"><span class="num"><pre> 76</pre></span><pre> assert Bar().local_foo == 'Hola'</pre></div>
99
<div class="nocov"><span class="num"><pre> 77</pre></span><pre> assert foo == 'Hello'</pre></div>
100
<div class="skip"><span class="num"><pre> 78</pre></span><pre></pre></div>
101
<div class="nocov"><span class="num"><pre> 79</pre></span><pre> """</pre></div>
102
<div class="nocov"><span class="num"><pre> 80</pre></span><pre> return value</pre></div>
103
<div class="nocov"><span class="num"><pre> 81</pre></span><pre>N_ = gettext_noop</pre></div>
104
<div class="skip"><span class="num"><pre> 82</pre></span><pre></pre></div>
105
<div class="skip"><span class="num"><pre> 83</pre></span><pre></pre></div>
106
<div class="nocov"><span class="num"><pre> 84</pre></span><pre>def gettext(value):</pre></div>
107
<div class="nocov"><span class="num"><pre> 85</pre></span><pre> """Mark a string for translation. Returns the localized string of</pre></div>
108
<div class="nocov"><span class="num"><pre> 86</pre></span><pre> value.</pre></div>
109
<div class="skip"><span class="num"><pre> 87</pre></span><pre></pre></div>
110
<div class="nocov"><span class="num"><pre> 88</pre></span><pre> Mark a string to be localized as follows::</pre></div>
111
<div class="skip"><span class="num"><pre> 89</pre></span><pre></pre></div>
112
<div class="nocov"><span class="num"><pre> 90</pre></span><pre> gettext('This should be in lots of languages')</pre></div>
113
<div class="skip"><span class="num"><pre> 91</pre></span><pre></pre></div>
114
<div class="nocov"><span class="num"><pre> 92</pre></span><pre> """</pre></div>
115
<div class="nocov"><span class="num"><pre> 93</pre></span><pre> return pylons.translator.gettext(value)</pre></div>
116
<div class="nocov"><span class="num"><pre> 94</pre></span><pre>lazy_gettext = lazify(gettext)</pre></div>
117
<div class="skip"><span class="num"><pre> 95</pre></span><pre></pre></div>
118
<div class="skip"><span class="num"><pre> 96</pre></span><pre></pre></div>
119
<div class="nocov"><span class="num"><pre> 97</pre></span><pre>def ugettext(value):</pre></div>
120
<div class="nocov"><span class="num"><pre> 98</pre></span><pre> """Mark a string for translation. Returns the localized unicode</pre></div>
121
<div class="nocov"><span class="num"><pre> 99</pre></span><pre> string of value.</pre></div>
122
<div class="skip"><span class="num"><pre>100</pre></span><pre></pre></div>
123
<div class="nocov"><span class="num"><pre>101</pre></span><pre> Mark a string to be localized as follows::</pre></div>
124
<div class="skip"><span class="num"><pre>102</pre></span><pre></pre></div>
125
<div class="nocov"><span class="num"><pre>103</pre></span><pre> _('This should be in lots of languages')</pre></div>
126
<div class="skip"><span class="num"><pre>104</pre></span><pre> </pre></div>
127
<div class="nocov"><span class="num"><pre>105</pre></span><pre> """</pre></div>
128
<div class="cov"><span class="num"><pre>106</pre></span><pre> return pylons.translator.ugettext(value)</pre></div>
129
<div class="nocov"><span class="num"><pre>107</pre></span><pre>_ = ugettext</pre></div>
130
<div class="nocov"><span class="num"><pre>108</pre></span><pre>lazy_ugettext = lazify(ugettext)</pre></div>
131
<div class="skip"><span class="num"><pre>109</pre></span><pre></pre></div>
132
<div class="skip"><span class="num"><pre>110</pre></span><pre></pre></div>
133
<div class="nocov"><span class="num"><pre>111</pre></span><pre>def ngettext(singular, plural, n):</pre></div>
134
<div class="nocov"><span class="num"><pre>112</pre></span><pre> """Mark a string for translation. Returns the localized string of</pre></div>
135
<div class="nocov"><span class="num"><pre>113</pre></span><pre> the pluralized value.</pre></div>
136
<div class="skip"><span class="num"><pre>114</pre></span><pre></pre></div>
137
<div class="nocov"><span class="num"><pre>115</pre></span><pre> This does a plural-forms lookup of a message id. ``singular`` is</pre></div>
138
<div class="nocov"><span class="num"><pre>116</pre></span><pre> used as the message id for purposes of lookup in the catalog, while</pre></div>
139
<div class="nocov"><span class="num"><pre>117</pre></span><pre> ``n`` is used to determine which plural form to use. The returned</pre></div>
140
<div class="nocov"><span class="num"><pre>118</pre></span><pre> message is a string.</pre></div>
141
<div class="skip"><span class="num"><pre>119</pre></span><pre></pre></div>
142
<div class="nocov"><span class="num"><pre>120</pre></span><pre> Mark a string to be localized as follows::</pre></div>
143
143
<div class="skip"><span class="num"><pre>121</pre></span><pre></pre></div>
144
<div class="nocov"><span class="num"><pre>122</pre></span><pre> """</pre></div>
145
<div class="nocov"><span class="num"><pre>123</pre></span><pre> return pylons.translator.ngettext(singular, plural, n)</pre></div>
146
<div class="nocov"><span class="num"><pre>124</pre></span><pre>lazy_ngettext = lazify(ngettext)</pre></div>
147
<div class="skip"><span class="num"><pre>125</pre></span><pre></pre></div>
148
<div class="skip"><span class="num"><pre>126</pre></span><pre></pre></div>
149
<div class="nocov"><span class="num"><pre>127</pre></span><pre>def ungettext(singular, plural, n):</pre></div>
150
<div class="nocov"><span class="num"><pre>128</pre></span><pre> """Mark a string for translation. Returns the localized unicode</pre></div>
151
<div class="nocov"><span class="num"><pre>129</pre></span><pre> string of the pluralized value.</pre></div>
152
<div class="skip"><span class="num"><pre>130</pre></span><pre></pre></div>
153
<div class="nocov"><span class="num"><pre>131</pre></span><pre> This does a plural-forms lookup of a message id. ``singular`` is</pre></div>
154
<div class="nocov"><span class="num"><pre>132</pre></span><pre> used as the message id for purposes of lookup in the catalog, while</pre></div>
155
<div class="nocov"><span class="num"><pre>133</pre></span><pre> ``n`` is used to determine which plural form to use. The returned</pre></div>
156
<div class="nocov"><span class="num"><pre>134</pre></span><pre> message is a Unicode string.</pre></div>
157
<div class="skip"><span class="num"><pre>135</pre></span><pre></pre></div>
158
<div class="nocov"><span class="num"><pre>136</pre></span><pre> Mark a string to be localized as follows::</pre></div>
159
<div class="skip"><span class="num"><pre>137</pre></span><pre></pre></div>
160
<div class="nocov"><span class="num"><pre>138</pre></span><pre> ungettext('There is %(num)d file here', 'There are %(num)d files here',</pre></div>
161
<div class="nocov"><span class="num"><pre>139</pre></span><pre> n) % {'num': n}</pre></div>
144
<div class="nocov"><span class="num"><pre>122</pre></span><pre> ngettext('There is %(num)d file here', 'There are %(num)d files here',</pre></div>
145
<div class="nocov"><span class="num"><pre>123</pre></span><pre> n) % {'num': n}</pre></div>
146
<div class="skip"><span class="num"><pre>124</pre></span><pre></pre></div>
147
<div class="nocov"><span class="num"><pre>125</pre></span><pre> """</pre></div>
148
<div class="nocov"><span class="num"><pre>126</pre></span><pre> return pylons.translator.ngettext(singular, plural, n)</pre></div>
149
<div class="nocov"><span class="num"><pre>127</pre></span><pre>lazy_ngettext = lazify(ngettext)</pre></div>
150
<div class="skip"><span class="num"><pre>128</pre></span><pre></pre></div>
151
<div class="skip"><span class="num"><pre>129</pre></span><pre></pre></div>
152
<div class="nocov"><span class="num"><pre>130</pre></span><pre>def ungettext(singular, plural, n):</pre></div>
153
<div class="nocov"><span class="num"><pre>131</pre></span><pre> """Mark a string for translation. Returns the localized unicode</pre></div>
154
<div class="nocov"><span class="num"><pre>132</pre></span><pre> string of the pluralized value.</pre></div>
155
<div class="skip"><span class="num"><pre>133</pre></span><pre></pre></div>
156
<div class="nocov"><span class="num"><pre>134</pre></span><pre> This does a plural-forms lookup of a message id. ``singular`` is</pre></div>
157
<div class="nocov"><span class="num"><pre>135</pre></span><pre> used as the message id for purposes of lookup in the catalog, while</pre></div>
158
<div class="nocov"><span class="num"><pre>136</pre></span><pre> ``n`` is used to determine which plural form to use. The returned</pre></div>
159
<div class="nocov"><span class="num"><pre>137</pre></span><pre> message is a Unicode string.</pre></div>
160
<div class="skip"><span class="num"><pre>138</pre></span><pre></pre></div>
161
<div class="nocov"><span class="num"><pre>139</pre></span><pre> Mark a string to be localized as follows::</pre></div>
162
162
<div class="skip"><span class="num"><pre>140</pre></span><pre></pre></div>
163
<div class="nocov"><span class="num"><pre>141</pre></span><pre> """</pre></div>
164
<div class="nocov"><span class="num"><pre>142</pre></span><pre> return pylons.translator.ungettext(singular, plural, n)</pre></div>
165
<div class="nocov"><span class="num"><pre>143</pre></span><pre>lazy_ungettext = lazify(ungettext)</pre></div>
166
<div class="skip"><span class="num"><pre>144</pre></span><pre></pre></div>
167
<div class="skip"><span class="num"><pre>145</pre></span><pre></pre></div>
168
<div class="nocov"><span class="num"><pre>146</pre></span><pre>def _get_translator(lang, **kwargs):</pre></div>
169
<div class="nocov"><span class="num"><pre>147</pre></span><pre> """Utility method to get a valid translator object from a language</pre></div>
170
<div class="nocov"><span class="num"><pre>148</pre></span><pre> name"""</pre></div>
171
<div class="cov"><span class="num"><pre>149</pre></span><pre> if not lang:</pre></div>
172
<div class="cov"><span class="num"><pre>150</pre></span><pre> return NullTranslations()</pre></div>
173
<div class="cov"><span class="num"><pre>151</pre></span><pre> if 'pylons_config' in kwargs:</pre></div>
174
<div class="nocov"><span class="num"><pre>152</pre></span><pre> conf = kwargs.pop('pylons_config')</pre></div>
175
<div class="cov"><span class="num"><pre>153</pre></span><pre> else:</pre></div>
176
<div class="cov"><span class="num"><pre>154</pre></span><pre> conf = pylons.config.current_conf()</pre></div>
177
<div class="cov"><span class="num"><pre>155</pre></span><pre> localedir = os.path.join(conf['pylons.paths']['root'], 'i18n')</pre></div>
178
<div class="cov"><span class="num"><pre>156</pre></span><pre> if not isinstance(lang, list):</pre></div>
179
<div class="cov"><span class="num"><pre>157</pre></span><pre> lang = [lang]</pre></div>
180
<div class="cov"><span class="num"><pre>158</pre></span><pre> try:</pre></div>
181
<div class="cov"><span class="num"><pre>159</pre></span><pre> translator = translation(conf['pylons.package'], localedir,</pre></div>
182
<div class="cov"><span class="num"><pre>160</pre></span><pre> languages=lang, **kwargs)</pre></div>
183
<div class="cov"><span class="num"><pre>161</pre></span><pre> except IOError, ioe:</pre></div>
184
<div class="cov"><span class="num"><pre>162</pre></span><pre> raise LanguageError('IOError: %s' % ioe)</pre></div>
185
<div class="cov"><span class="num"><pre>163</pre></span><pre> translator.pylons_lang = lang</pre></div>
186
<div class="cov"><span class="num"><pre>164</pre></span><pre> return translator</pre></div>
187
<div class="skip"><span class="num"><pre>165</pre></span><pre></pre></div>
188
<div class="skip"><span class="num"><pre>166</pre></span><pre></pre></div>
189
<div class="nocov"><span class="num"><pre>167</pre></span><pre>def set_lang(lang, **kwargs):</pre></div>
190
<div class="nocov"><span class="num"><pre>168</pre></span><pre> """Set the current language used for translations.</pre></div>
163
<div class="nocov"><span class="num"><pre>141</pre></span><pre> ungettext('There is %(num)d file here', 'There are %(num)d files here',</pre></div>
164
<div class="nocov"><span class="num"><pre>142</pre></span><pre> n) % {'num': n}</pre></div>
165
<div class="skip"><span class="num"><pre>143</pre></span><pre></pre></div>
166
<div class="nocov"><span class="num"><pre>144</pre></span><pre> """</pre></div>
167
<div class="nocov"><span class="num"><pre>145</pre></span><pre> return pylons.translator.ungettext(singular, plural, n)</pre></div>
168
<div class="nocov"><span class="num"><pre>146</pre></span><pre>lazy_ungettext = lazify(ungettext)</pre></div>
169
<div class="skip"><span class="num"><pre>147</pre></span><pre></pre></div>
170
<div class="skip"><span class="num"><pre>148</pre></span><pre></pre></div>
171
<div class="nocov"><span class="num"><pre>149</pre></span><pre>def _get_translator(lang, **kwargs):</pre></div>
172
<div class="nocov"><span class="num"><pre>150</pre></span><pre> """Utility method to get a valid translator object from a language</pre></div>
173
<div class="nocov"><span class="num"><pre>151</pre></span><pre> name"""</pre></div>
174
<div class="cov"><span class="num"><pre>152</pre></span><pre> if not lang:</pre></div>
175
<div class="cov"><span class="num"><pre>153</pre></span><pre> return NullTranslations()</pre></div>
176
<div class="cov"><span class="num"><pre>154</pre></span><pre> if 'pylons_config' in kwargs:</pre></div>
177
<div class="nocov"><span class="num"><pre>155</pre></span><pre> conf = kwargs.pop('pylons_config')</pre></div>
178
<div class="cov"><span class="num"><pre>156</pre></span><pre> else:</pre></div>
179
<div class="cov"><span class="num"><pre>157</pre></span><pre> conf = pylons.config.current_conf()</pre></div>
180
<div class="cov"><span class="num"><pre>158</pre></span><pre> localedir = os.path.join(conf['pylons.paths']['root'], 'i18n')</pre></div>
181
<div class="cov"><span class="num"><pre>159</pre></span><pre> if not isinstance(lang, list):</pre></div>
182
<div class="cov"><span class="num"><pre>160</pre></span><pre> lang = [lang]</pre></div>
183
<div class="cov"><span class="num"><pre>161</pre></span><pre> try:</pre></div>
184
<div class="cov"><span class="num"><pre>162</pre></span><pre> translator = translation(conf['pylons.package'], localedir,</pre></div>
185
<div class="cov"><span class="num"><pre>163</pre></span><pre> languages=lang, **kwargs)</pre></div>
186
<div class="cov"><span class="num"><pre>164</pre></span><pre> except IOError, ioe:</pre></div>
187
<div class="cov"><span class="num"><pre>165</pre></span><pre> raise LanguageError('IOError: %s' % ioe)</pre></div>
188
<div class="cov"><span class="num"><pre>166</pre></span><pre> translator.pylons_lang = lang</pre></div>
189
<div class="cov"><span class="num"><pre>167</pre></span><pre> return translator</pre></div>
190
<div class="skip"><span class="num"><pre>168</pre></span><pre></pre></div>
191
191
<div class="skip"><span class="num"><pre>169</pre></span><pre></pre></div>
192
<div class="nocov"><span class="num"><pre>170</pre></span><pre> ``lang`` should be a string or a list of strings. If a list of</pre></div>
193
<div class="nocov"><span class="num"><pre>171</pre></span><pre> strings, the first language is set as the main and the subsequent</pre></div>
194
<div class="nocov"><span class="num"><pre>172</pre></span><pre> languages are added as fallbacks.</pre></div>
195
<div class="nocov"><span class="num"><pre>173</pre></span><pre> """</pre></div>
196
<div class="cov"><span class="num"><pre>174</pre></span><pre> translator = _get_translator(lang, **kwargs)</pre></div>
197
<div class="cov"><span class="num"><pre>175</pre></span><pre> environ = pylons.request.environ</pre></div>
198
<div class="cov"><span class="num"><pre>176</pre></span><pre> environ['pylons.pylons'].translator = translator</pre></div>
199
<div class="cov"><span class="num"><pre>177</pre></span><pre> if 'paste.registry' in environ:</pre></div>
200
<div class="cov"><span class="num"><pre>178</pre></span><pre> environ['paste.registry'].replace(pylons.translator, translator)</pre></div>
201
<div class="skip"><span class="num"><pre>179</pre></span><pre></pre></div>
202
<div class="skip"><span class="num"><pre>180</pre></span><pre></pre></div>
203
<div class="nocov"><span class="num"><pre>181</pre></span><pre>def get_lang():</pre></div>
204
<div class="nocov"><span class="num"><pre>182</pre></span><pre> """Return the current i18n language used"""</pre></div>
205
<div class="cov"><span class="num"><pre>183</pre></span><pre> return getattr(pylons.translator, 'pylons_lang', None)</pre></div>
206
<div class="skip"><span class="num"><pre>184</pre></span><pre></pre></div>
207
<div class="skip"><span class="num"><pre>185</pre></span><pre></pre></div>
208
<div class="nocov"><span class="num"><pre>186</pre></span><pre>def add_fallback(lang, **kwargs):</pre></div>
209
<div class="nocov"><span class="num"><pre>187</pre></span><pre> """Add a fallback language from which words not matched in other</pre></div>
210
<div class="nocov"><span class="num"><pre>188</pre></span><pre> languages will be translated to.</pre></div>
211
<div class="skip"><span class="num"><pre>189</pre></span><pre></pre></div>
212
<div class="nocov"><span class="num"><pre>190</pre></span><pre> This fallback will be associated with the currently selected</pre></div>
213
<div class="nocov"><span class="num"><pre>191</pre></span><pre> language -- that is, resetting the language via set_lang() resets</pre></div>
214
<div class="nocov"><span class="num"><pre>192</pre></span><pre> the current fallbacks.</pre></div>
215
<div class="skip"><span class="num"><pre>193</pre></span><pre></pre></div>
216
<div class="nocov"><span class="num"><pre>194</pre></span><pre> This function can be called multiple times to add multiple</pre></div>
217
<div class="nocov"><span class="num"><pre>195</pre></span><pre> fallbacks.</pre></div>
218
<div class="nocov"><span class="num"><pre>196</pre></span><pre> """</pre></div>
219
<div class="nocov"><span class="num"><pre>197</pre></span><pre> return pylons.translator.add_fallback(_get_translator(lang, **kwargs))</pre></div>
220
<div class="skip"><span class="num"><pre>198</pre></span><pre></pre></div>
192
<div class="nocov"><span class="num"><pre>170</pre></span><pre>def set_lang(lang, **kwargs):</pre></div>
193
<div class="nocov"><span class="num"><pre>171</pre></span><pre> """Set the current language used for translations.</pre></div>
194
<div class="skip"><span class="num"><pre>172</pre></span><pre></pre></div>
195
<div class="nocov"><span class="num"><pre>173</pre></span><pre> ``lang`` should be a string or a list of strings. If a list of</pre></div>
196
<div class="nocov"><span class="num"><pre>174</pre></span><pre> strings, the first language is set as the main and the subsequent</pre></div>
197
<div class="nocov"><span class="num"><pre>175</pre></span><pre> languages are added as fallbacks.</pre></div>
198
<div class="nocov"><span class="num"><pre>176</pre></span><pre> """</pre></div>
199
<div class="cov"><span class="num"><pre>177</pre></span><pre> translator = _get_translator(lang, **kwargs)</pre></div>
200
<div class="cov"><span class="num"><pre>178</pre></span><pre> environ = pylons.request.environ</pre></div>
201
<div class="cov"><span class="num"><pre>179</pre></span><pre> environ['pylons.pylons'].translator = translator</pre></div>
202
<div class="cov"><span class="num"><pre>180</pre></span><pre> if 'paste.registry' in environ:</pre></div>
203
<div class="cov"><span class="num"><pre>181</pre></span><pre> environ['paste.registry'].replace(pylons.translator, translator)</pre></div>
204
<div class="skip"><span class="num"><pre>182</pre></span><pre></pre></div>
205
<div class="skip"><span class="num"><pre>183</pre></span><pre></pre></div>
206
<div class="nocov"><span class="num"><pre>184</pre></span><pre>def get_lang():</pre></div>
207
<div class="nocov"><span class="num"><pre>185</pre></span><pre> """Return the current i18n language used"""</pre></div>
208
<div class="cov"><span class="num"><pre>186</pre></span><pre> return getattr(pylons.translator, 'pylons_lang', None)</pre></div>
209
<div class="skip"><span class="num"><pre>187</pre></span><pre></pre></div>
210
<div class="skip"><span class="num"><pre>188</pre></span><pre></pre></div>
211
<div class="nocov"><span class="num"><pre>189</pre></span><pre>def add_fallback(lang, **kwargs):</pre></div>
212
<div class="nocov"><span class="num"><pre>190</pre></span><pre> """Add a fallback language from which words not matched in other</pre></div>
213
<div class="nocov"><span class="num"><pre>191</pre></span><pre> languages will be translated to.</pre></div>
214
<div class="skip"><span class="num"><pre>192</pre></span><pre></pre></div>
215
<div class="nocov"><span class="num"><pre>193</pre></span><pre> This fallback will be associated with the currently selected</pre></div>
216
<div class="nocov"><span class="num"><pre>194</pre></span><pre> language -- that is, resetting the language via set_lang() resets</pre></div>
217
<div class="nocov"><span class="num"><pre>195</pre></span><pre> the current fallbacks.</pre></div>
218
<div class="skip"><span class="num"><pre>196</pre></span><pre></pre></div>
219
<div class="nocov"><span class="num"><pre>197</pre></span><pre> This function can be called multiple times to add multiple</pre></div>
220
<div class="nocov"><span class="num"><pre>198</pre></span><pre> fallbacks.</pre></div>
221
<div class="nocov"><span class="num"><pre>199</pre></span><pre> """</pre></div>
222
<div class="nocov"><span class="num"><pre>200</pre></span><pre> return pylons.translator.add_fallback(_get_translator(lang, **kwargs))</pre></div>
223
<div class="skip"><span class="num"><pre>201</pre></span><pre></pre></div>