2013年4月23日
Wikipedia によると定義は 国際化 (アメリカ英語: internationalization イギリス英語: internationalisation、i18n) は、ソフトウェアに技術的な変更を加えることなく多様な言語や地域に適合できるようにする、ソフトウェア設計の工程である。 地域化 (アメリカ英語: localization イギリス英語: localisation、L10N) は、地域固有の構成部品や翻訳テキストを追加することによって、ソフトウェアを特定の地域や言語に適合させる工程である。 Wikipedia: 国際化と地域化
国際化 (アメリカ英語: internationalization イギリス英語: internationalisation、i18n) は、ソフトウェアに技術的な変更を加えることなく多様な言語や地域に適合できるようにする、ソフトウェア設計の工程である。 地域化 (アメリカ英語: localization イギリス英語: localisation、L10N) は、地域固有の構成部品や翻訳テキストを追加することによって、ソフトウェアを特定の地域や言語に適合させる工程である。
国際化 (アメリカ英語: internationalization イギリス英語: internationalisation、i18n) は、ソフトウェアに技術的な変更を加えることなく多様な言語や地域に適合できるようにする、ソフトウェア設計の工程である。
地域化 (アメリカ英語: localization イギリス英語: localisation、L10N) は、地域固有の構成部品や翻訳テキストを追加することによって、ソフトウェアを特定の地域や言語に適合させる工程である。
本発表ではもう少し広く、世界的に Web アプリケーションを提供するための諸々を取り上げます。
Ridge::Plugin::I18N
ユーザーサポート
コミュニティ設計・運営
広告営業
法務
翻訳
デザイン
課金と通貨
コンテンツの言語
アルゴリズム
テキストの言語
テキスト管理
機械翻訳
数値
日付
国・地域
文字コード・フォント
ドメイン・DNS
データセンター・クラウド
ストレージ
CDN
Accept-Language:
printf (gettext ("Hello, world!\n"));
en.po
msgid "Hello, world!\n" msgstr "Hello, world!\n"
ja.po
msgid "Hello, world!\n" msgstr "こんにちは、世界。\n"
Locale::Maketext::Simple
use Locale::Maketext::Simple; print loc("Hello, World!");
sub default : Public { ... $r->res->content($r->loc('hello_world')); } <p>[% l('hello_world') %]
はてなは高い技術力を誇る会社です。効率よくなおかつ正確に翻訳作業が進行するよう、翻訳システム「Hatena::Translator (はてな翻訳)」を自社で開発し、国際化に挑みました。
.po
.mo
.pm
sprintf
Data::Dumper
NULL
$r->loc($msgid) $r->lang $r->tz ...
[%- MACRO loc(text, args1, args2, args3, args4) BLOCK; r.loc(text, args1, args2, args3, args4); END; -%]
$channel->name_for_lang($lang)
sub MyApp::Movie::to_rss_item { my $self = shift; return { title => $r->loc('movie_by_', $self->author->name), }; }
$channel->name_for_locale($r->locale); $movie->to_rss_item(locale => $r->locale); MyApp::Message->new( locale => $user->create_locale, body_template => ..., );
[%- MACRO loc(text, args1, args2, args3, args4) BLOCK; r.locale.text(text, args1, args2, args3, args4); END; -%]
いったん話は飛びますがまた後でテキストの話に戻りますwww
ja
en-GB
es-021
zh-Hant-tw
ja-JP
en-US
en
en-gb
Accept-Language: ja,en-US,en-GB
en-AU
en-au, en
en-au
Accept-Language: en-US,ja,en
en-US,ja
en-US,en,ja
hatena.ne.jp
http://fr.flipnote.hatena.com/
http://s.hatena.ne.jp/?locale.lang=en
http://developer.hatena.ne.jp/en/documents/star
[http://...:title]
http://flipnote.hatena.com/
http://es.flipnote.hatena.com/
rel=alternate
<link rel=alternate hreflang=fr href="http://fr.flipnote.hatena.com/"> <link rel=alternate hreflang=es href="http://es.flipnote.hatena.com/">
http://ja.example.com/hoge
http://example.com/ja/hoge
http://example.com/hoge.ja
http://example.com/hoge?locale.lang=ja
MultiViews
hoge.ja.html
hoge.en.html
hoge
hoge.ja
hoge.en
[%- loc_img('hoge') -%]
はこう展開される:
<img src="/images/en/hoge.png" alt="[% loc('image.hoge') %]"> <img src="/images/fr/hoge.png" alt="[% loc('image.hoge') %]">
<td width="[% loc('width1') %]">...<td width="[% loc('width2') %]">...
<link rel=stylesheet href="/css/[% locale.text_lang | html %].css">
12,345.67
12 345,67
12.345,67
12'345,67
[% n.chunk(-3).join(',') %]
[% locale.number(n) %]
April 5, 2003
2003年4月5日
12,345
1,2345
4/5/2003
Apr. 5, 2003
2013.4.3
2013年4月3日
平成25年4月3日
DateTime::Locale
<input type=date>
旧厚生事務次官宅殺傷事件に絡み、毎日新聞が11月19日付けで「事件の約6時間前にWikipediaに犯行を示唆する書き込みがあったことが分かった」などと報じたが、実際には事件後の書き込みだったことがネット上で相次いで指摘された。毎日新聞はWebサイト上から記事を削除し、おわびと訂正を掲載した。
Date
(new Date).getTimezoneOffset()
Asia/Tokyo
America/New_York
DateTime::TimeZone
Asia/Seoul
+09:00
ヤフーの表示、「タイムゾーン: GMT +09:00 韓国、日本 」となっていました。 さっき、ヤフーの登録情報を変更しようとしたら、上記になっていました。 ここは、日本ですよね?社長さんが、韓国系だから、韓国仕様なのでしょうか?
datetime
date
month_day
time
long
no_tz
html
$locale->datetime_html($dt) $locale->month_day_no_tz($dt) $locale->time_html($dt)
[% loc_date($dt) %] [% loc_datetime($dt) %]
<time datetime="2013-04-04T00:12:44Z" title="2013/4/4 9:12:44">13日前</time>
time 要素の datetime 属性を JavaScript でチェックして、「○分前」をクライアント側で書き換えたりもしている
本日と明日のハロウィンの日(10/31)限定で ... はてなスターを「はてなカボチャ」に変更します。 ... 11月1日の0時には元のスターに戻ります ...
本日と明日のハロウィンの日(10/31)限定で ... はてなスターを「はてなカボチャ」に変更します。
... 11月1日の0時には元のスターに戻ります ...
JavaScript の new Date() (= 見ている人の現地時刻) の0時まで画像を差し替えた
new Date()
*
CHARSET
UTF8MB4
BINARY
UTF8
U+10000
bdi
<ul> <li>User <bdi>jcranmer</bdi>: 12 posts. <li>User <bdi>hober</bdi>: 5 posts. <li>User <bdi>إيان</bdi>: 3 posts. </ul>
Vary: Accept-Language
Cache-Control: no-cache
タイムスタンプがエントリーによって数時間ずれて表示される問題がありました。
document.documentElement.lang
Hatena.Locale.reloadIfWrongLocale();
Number.prototype.toLocaleString() Date.prototype.toLocaleString()
Wed Dec 13 2000 10:00:00 GMT+0900 (Japan Standard Time)
window.Intl
Hatena.Locale.text('hello_world')
<script> alert('[% tloc('hello_world') | js %]'); </script>
| js
| html
U+2028
U+2029
data-*
body
<form onsubmit="return confirm(this.getAttribute('data-confirm'))" data-confirm="[% tloc('confirm') | html %]">
%1さんと%2さんがともだちになりました。
$locale->text('friendship.become_friends', $arg1, $arg2)
%1 さんの『%2』への投稿に %3 さんからコメントがつきました。
There was a reply to your comment on "%2" by %3.
アルバム(%1)に%2枚の写真
%2 photos to album "%1"
%4
%1, %2, %3 and %4 other people
$locale->text_n($msgid, $n, ...)
[% loc_n('green_star', 1) %] (1) [% loc_n('red_star', 2) %] (2)
Green Star (1) Red Stars (2)
id:%1 さんの%2プラスはあと%3日間でご利用いただけなくなります。
%3
指定した人 (id:hatena と id:hatenastaff) に公開などの条件
%1などの条件 [ 指定した人 (%1) に公開 [ %1 と %2 [ id:hatena id:hatenastaff ] ] ]
See< a href="http://s.hatena.com/"> Hatena Star Help<a>for more information.
href
title
"
[% l = BLOCK %] <a href="http://s.hatena.ne.jp/help">[% loc('star.help') %]</a> [% END %] [% loc('see_help_for_details', l) %]
class
<h1>[% hloc('qanda') %]</h1>
<img alt="[% tloc('qanda') | html %]">
$mail->title_template($locale->plain_text('qanda'));
[% l = BLOCK %] <a href="/[% user.name | html %]/">[% user.display_name | html %]</a> [% END %] [% hloc('welcome', l) %]
$locale
---- id:haiku2.theme.check チェック ---- id:haiku2.theme.simple シンプル ---- id:haiku2.theme.solid ソリッド ---- id:haiku2.theme.note ノート ---- id:haiku2.theme.wrapping ラッピング ---- id:haiku2.theme.stripe ストライプ
[% # こんにちは %] [% loc('hello_world') %]
[% 'こんにちは、世界' | loc('hello_world') %]
[% loc('こんにちは、世界') %]
hatena-translator.el
<p><msg:hello_world alt="こんにちは、世界"/> <p><button><msg:button.ok alt="OK"/></button>
.
。
[% loc('msg1') %][% loc('msg2') %]
:
user.following.title
user.following.users
mobile_help.colorstar.p1
URLにあわせつつ、空気を読もう
手順はケースバイケース、どれでもいい:
ただし沢山のテンプレートの文言をまとめて登録するのは極めて苦痛な作業なので避けたい
20130415hogefeature
update-translations.pl
%1
/entries?tags=Haiku-2010+heading
/entries?tags=110603theme
/entries.ja,en,fr
/entries.ja.pm
/entries.ja.json
/entries.ja.csv
JP
US
FR
$ perl -e 'printf "%.40f", 4.99' 4.9900000000000002131628207280300557613373
hatena.com
lang
alter table
alter
この画像は、旗、紋章、印章等といった公式の記章を表しています。このようなシンボルの使用については、多くの国で制限されています。これらの制限は、著作権の状態に関わらず適用されます。
Until 2004, the flag was used exclusively on or in front of buildings owned by the government, ministries, statutory boards and educational institutions on a year round basis. The flag could only be flown by individuals and non-governmental organisations during the month of August to mark the country's national day on 9 August.
ugomemo.hatena.ne.jp
h.hatena.com
h.hatena.ne.jp
国土交通省と東京都は20日、千代田区の国会周辺にある道路案内標識のローマ字の表記を英語に改める作業を始めた。外国人観光客らに分かりやすくするためで、「Kokkai」は「The National Diet」になる。国道沿いの標識は国交省が、都道沿いの標識は都が手掛け、年内に終える予定。
Latn
Jpan
Arab
Grek
東京都や環境省のインターネットサイトの地図で日本海の名称に韓国が主張する「東海」、沖縄県・尖閣諸島には中国名の「釣魚島群島」が併記されていたことが12日、分かった。米インターネット検索大手「グーグル」の地図ソフト「グーグルマップ」のデータを使用したためで、既に併記を削除、またはサイトを閉鎖、修正している。
(id, name, description, created)
name={"ja":"烏丸御池","en":"Karasuma-oike"}
(id, name_ja, name_en, description_ja, description_en, created)
_ja
_en
_fr
(id, created) + (ch_id, lang, name, desc)
name
description
Role::HasMultilingualColumns
http://developer.hatena.ne.jp/ja/documents/star/apis/count
http://developer.hatena.ne.jp/en/documents/star/apis/count
http://developer.hatena.ne.jp/documents/star/apis/count
http://maintenance.hatena.com/