<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>Suinasia(文法)</title>
<link>http://suin.asia/tag/%E6%96%87%E6%B3%95</link>
<description>「文法」なエントリー</description>
<language>ja</language>
<lastBuildDate>Fri, 10 Feb 2012 16:47:59 +0900</lastBuildDate>
<docs>http://backend.userland.com/rss/</docs>
<category>文法</category>
<item>
<title>gettext的な多言語対応方法での文法数の実装をPHPで考える</title>
<link>http://suin.asia/2010/03/19/treat_grammatical_number_in_php</link>
<description><![CDATA[<p>勉強がてら、gettextの<a href="http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html">ngettext()</a>関数を参考に、PHPで文法数(grammatical number)の切り替え機能を書いてみます。関数<code class="php">number()</code>を作り、に整数を入れると、数量にあった形式(0 ~ 3)を導く処理を作ります。形式は主に単数・複数・双数(dual)ですが、拡張性(新たなパターンの言語の対応)を考えて、形式には0~3の抽象的な値を割り振っておきます。例えば、0は単数形・1は複数形の場合、0は単数形・1は双数形・2は複数形の場合などがあります。</p>

<ul>
<li>0 :  形式 A</li>
<li>1 :  形式 B</li>
<li>2 :  形式 C</li>
<li>3 :  形式 D</li>
</ul>

<p>言語によって、使い分ける形式の数が異なります。少ない言語で1つの形式を、多い言語で4つの形式を使い分けます。また、形式の数が同じでも、先行する数字によって、形式の使い分け方が言語によって異なります。この点を総括すると、11パターンが考えられます。</p>

<ol>
<li>パターン1 : 形式が1つ</li>
<li>パターン2.1 : 形式が2つ » 単数形が1に使われる</li>
<li>パターン2.2 : 形式が2つ » 単数形が0と1に使われる</li>
<li>パターン3.1 : 形式が3つ » 0が特別</li>
<li>パターン3.2 : 形式が3つ » 1と2が特別</li>
<li>パターン3.3 : 形式が3つ » <code class="regex">/00$/</code>と<code class="regex">/[2-9][0-9]$/</code>が特別</li>
<li>パターン3.4 : 形式が3つ » <code class="regex">/1[2-9]$/</code>が特別</li>
<li>パターン3.5 : 形式が3つ » <code class="regex">/1$/</code>と<code class="regex">/[2-4]$/</code>が特別 (<code class="regex">/1[1-4]$/</code>以外)</li>
<li>パターン3.6 : 形式が3つ » 1と2, 3, 4が特別</li>
<li>パターン3.7 : 形式が3つ » <code class="regex">/[2-4]$/</code>が特別</li>
<li>パターン4.1 : 形式が4つ » <code class="regex">/0*[2]$/</code>と<code class="regex">/0*[3-4]$/</code>が特別</li>
</ol>

<p>それでは、以上の順にしたがって、それぞれのパターンの実装を書いていきます。もし、誤りがあれば教えてください m(_ _ )m</p>

<h3>パターン1 : 形式が1つ</h3>

<p>数の文法カテゴリがなく、ひとつの形式で表す言語です。アジア型の言語に多いです。日本人にとっては一番身近なパターンです。</p>
<dl>
<dt>対象言語</dt>
<dd>日本語・韓国語・ベトナム語・トルコ語など</dd>
</dl>

<pre class="php" name="code">
&lt;php
function number($int)
{
	return 0;
}
?&gt;
</pre>

<h3>パターン2 : 形式が2つ</h3>

<p>数を表すのに2つの形式を使い分ける言語です。ヨーロッパ型の言語の中でも西ヨーロッパに多いです。日本人にとって、このパターンも理解しやすいほうだと思います。</p>

<h4>パターン2.1 : 単数形が1に使われる</h4>

<dl>
<dt>対象言語</dt>
<dd>英語・オランダ語・ドイツ語・エストニア語・フィンランド語・ギリシャ語・イタリア語・ポルトガル語・スペイン語・エスペラント語など</dd>
</dl>

<pre class="php" name="code">
&lt;php
function number($int)
{
	if ( $int == 1 )
	{
		return 0; // 1
	}

	return 1;
}
?&gt;
</pre>

<h4>パターン2.2 : 単数形が0と1に使われる</h4>

<dl>
<dt>対象言語</dt>
<dd>フランス語・ブラジルポルトガル語など</dd>
</dl>

<pre class="php" name="code">
&lt;php
function number($int)
{
	if ( $int &lt;= 1 )
	{
		return 0;
	}

	return 1;
}
?&gt;
</pre>

<h3>パターン3 : 形式が3つ</h3>

<p>数を表すのに3つの形式を使い分ける言語です。ヨーロッパ型の言語の中でも東ヨーロッパに多いです。これらの言語の中には、単数・複数に加え、双数の概念があります。この言語では、基本的には、双数が2で、複数は3以上です。極端なことを言うと、英語などが「1, いっぱい」と数えるのに対して、「1, 2, いっぱい」という数え方をする言語ということになります。</p>
<p>また、ヨーロッパ型の言語では、1~19まで数えて20以降は数字を組み合わせるといった20進法的な面があり、そのため1~19に関わる数字が不規則になることがあるようです。</p>

<h4>パターン3.1 : 0が特別</h4>

<dl>
<dt>対象言語</dt>
<dd>ラトビア語</dd>
</dl>

<pre class="php" name="code">
&lt;php
function number($int)
{
	// 1, 21, 31, 41, 51, 61, 71, 81, 91, 
	// 101, 121, 131, 141, 151, 161, 171, 181, 191, 
	// 201, 221, 231, 241, 251, ...
	if ( $int % 10 == 1 and $int % 100 != 11 )
	{
		return 0;
	}
	// 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
	// 12, 13, 14, 15, 16, 17, 18, 19, 20, 
	// 22, 23, 24, 25, 26, 27, 28, 29, 30, ...
	elseif ( $int != 0 )
	{
		return 1;
	}

	// 0 [特別]
	return 2;
}
?&gt;
</pre>

<h4>パターン3.2 : 1と2が特別</h4>

<dl>
<dt>対象言語</dt>
<dd>アイルランド語</dd>
</dl>

<pre class="php" name="code">
&lt;?php
function number($int)
{
	// 1 [特別]
	if ( $int == 1 )
	{
		return 0;
	}
	// 2 [特別]
	elseif ( $int == 2 )
	{
		return 1;
	}

	//  0, 3, 4, 5, 6, 7, 8, 9, 
	// 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ...
	return 2;
}
?&gt;
</pre>

<h4>パターン3.3 : /00$/と/[2-9][0-9]$/が特別</h4>

<dl>
<dt>対象言語</dt>
<dd>ルーマニア語</dd>
</dl>

<p>つまり、ルーマニア語では、2から19までは形式1になります。</p>

<pre class="php" name="code">
&lt;?php 
function number($int)
{
	// 1
	if ( $int == 1 )
	{
		return 0;
	}
	// 0, 2, 3, 4, 5, 6, 7, 8, 9, 
	// 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
	// 101, 102, 103, 104, 105, 106, 107, 108, 109, 
	// 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, ...
	elseif ( $int == 0 or ( $int % 100 &gt; 0 and $int % 100 &lt; 20 ) )
	{
		return 1;
	}

	// 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,  [特別]
	// 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, ...
	// 100, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, ...
	return 2;
}
?&gt;
</pre>

<h4>パターン3.4 : /1[2-9]$/が特別</h4>

<dl>
<dt>対象言語</dt>
<dd>リトアニア語</dd>
</dl>

<p>うーん、これであってるか心配。</p>

<pre class="php" name="code">
&lt;?php
function number($int)
{
	// 1, 21, 31, 41, 51, 61, 71, 81, 91, 101, 121, ...
	if ( $int % 10 == 1 and $int % 100 != 11 )
	{
		return 0;
	}
	// 2, 3, 4, 5, 6, 7, 8, 9, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, ...
	elseif ( $int % 10 &gt;= 2 and ( $int % 100 &lt; 10 or $int % 100 &gt;= 20 ) )
	{
		return 1;
	}

	// 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, [特別]
	// 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 110,
	// 111, 112, 113, 114, 115, 116, 117, 118, 119 120, ...
	return 2;
}
?&gt;
</pre>

<h4>パターン3.5 : /1$/と/[2-4]$/が特別 (/1[1-4]$/以外)</h4>

<dl>
<dt>対象言語</dt>
<dd>クロアチア語・セルビア語・ロシア語・ウクライナ語</dd>
</dl>

<pre class="php" name="code">
&lt;?php
function number($int)
{
	// 1, 21, 31, 41, 51, 61, 71, 81, 91,  [特別]
	// 101, 121, 131, 141, 151, 161, 171, 181, 191, 
	// 201, 221, 231, 241, 251, ...
	if ( $int %10 == 1 and $int % 100 != 11 )
	{
		return 0;
	}
	// 2, 3, 4, 22, 23, 24, 32, 33, 34, 42, 43, 44,  [特別]
	// 52, 53, 54, 62, 63, 64, 72, 73, 74, 82, 83, 84, 
	// 92, 93, 94, 102, 103, 104, 122, 123, 124, ...
	elseif ( $int % 10 &gt;= 2 and $int % 10 &lt;= 4 and ( $int % 100 &lt; 10 or $int % 100 &gt;= 20 ) )
	{
		return 1;
	}

	// 0, 5, 6, 7, 8, 9, 10, 
	// 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 
	// 25, 26, 27, 28, 29, 30, 35, 36, 37, 38, 39, ...
	return 2;
}
?&gt;
</pre>

<h4>パターン3.6 : 1と2, 3, 4が特別</h4>

<dl>
<dt>対象言語</dt>
<dd>スロバキア語・チェコ語</dd>
</dl>

<pre class="php" name="code">
&lt;?php
function number($int)
{
	// 1 [特別]
	if ( $int == 1 )
	{
		return 0;
	}
	// 2, 3, 4 [特別]
	elseif ( $int &gt;= 2 and $int &lt;= 4 )
	{
		return 1;
	}

	// 0, 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, ...
	return 2;
}
?&gt;
</pre>

<h4>パターン3.7 : /[2-4]$/が特別</h4>

<dl>
<dt>対象言語</dt>
<dd>ポーランド語</dd>
</dl>

<pre class="php" name="code">
&lt;?php
function number($int)
{
	// 1
	if ( $int == 1 )
	{
		return 0;
	}
	// 2, 3, 4, 22, 23, 24, 32, 33, 34,  [特別]
	// 42, 43, 44, 52, 53, 54, 62, 63, 64, 
	// 72, 73, 74, 82, 83, 84, 92, 93, 94, ...
	elseif ( $int % 10 &gt;= 2 and $int % 10 &lt;= 4 and ( $int % 100 &lt; 10 or $int % 100 &gt;= 20 ) )
	{
		return 1;
	}

	// 0, 5, 6, 7, 8, 9, 10, 
	// 11, 12, 13, 14, 15, 16, 17, 18, 19, 
	// 20, 21, 25, 26, 27, 28, 29, 
	// 30, 31, 35, 36, 37, 38, 39, ...
	return 2;
}
?&gt;
</pre>

<h3>パターン4 : 形式が4つ</h3>

<p>数を表すのに4つの形式を使い分ける言語です。</p>

<h4>パターン4 .1 : /0*[2]$/と/0*[3-4]$/が特別</h4>

<dl>
<dt>対象言語</dt>
<dd>スロベニア語</dd>
</dl>

<pre class="php" name="code">
&lt;?php
function number($int)
{
	// 1, 101, 201, ...
	if ( $int % 100 == 1 )
	{
		return 0;
	}
	// 2, 102, 202, ... [特別]
	elseif ( $int % 100 == 2 )
	{
		return 1;

	}
	// 3, 4, 103, 104, 203, 204, ... [特別]
	elseif ( $int % 100 == 3 or $int % 100 == 4 )
	{
		return 2;
	}

	// 0, 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, ...
	return 3;
}
?&gt;
</pre>]]></description>
<pubDate>Fri, 19 Mar 2010 16:59:04 +0900</pubDate>
<guid>http://suin.asia/2010/03/19/treat_grammatical_number_in_php</guid>
<category domain="http://suin.asia/tag/PHP">PHP</category>
<category domain="http://suin.asia/tag/gettext">gettext</category>
<category domain="http://suin.asia/tag/%E6%96%87%E6%B3%95">文法</category>
</item>
<item>
<title>文法的なかたち - 漢字語の使役</title>
<link>http://suin.asia/2006/02/12/analytic_causatives_in_korean</link>
<description><![CDATA[<p>今日から学校で教わらなかった、文法的なかたちを勉強してゆこうと思います。日本語の文は日本語コーパスから無作為に選んだものを一部編集しました。韓国語の間違いなどのダメだし随時募集中(*^-゜)v</p>
<p>漢字語＋시키다</p>
<p>1.	女たちに案内させました。</p>
<p>여자들에게 안내시켰습니다.</p>
<p>2.	政府機構を大幅縮小させました。</p>
<p>정부기구를 대폭 축소시켰습니다.</p>
<p>3.	大統領は国民を失望させました。</p>
<p>대통령은 국만을 실망시켰습니다.</p>
<p>4.	椅子を投げつけて骨折させました。</p>
<p>의자를 내던져서 골절시켰습니다.</p>
<p>5.	社会を混乱させました。</p>
<p>사회를 혼란시켰습니다.</p>
<p>6.	大砲を命中させました。</p>
<p>대포를 명중시켰습니다.</p>
<p>7.	1961年に“南極条約”を成立させました。</p>
<p>1961년에 “남극조약”을 성립시켰습니다.</p>
<p>8.	人々を感動させるのでしょう。</p>
<p>사람들을 감동시키겠지요.</p>
<p>9.	自主的に思考させる新しい方法の発表です。</p>
<p>자주적이 사고시킬 새로운 방법의 발표입니다.</p>
<p>10.	ガンを発生させるケースがあります。</p>
<p>암을 발생시킬 경우가 있습니다.</p>
<p>11.	戦争を終結させることができました。</p>
<p>전쟁을 종결시킬 수가 있었습니다.</p>]]></description>
<pubDate>Sun, 12 Feb 2006 00:19:41 +0900</pubDate>
<guid>http://suin.asia/2006/02/12/analytic_causatives_in_korean</guid>
<category domain="http://suin.asia/tag/%E6%97%A5%E8%A8%98">日記</category>
<category domain="http://suin.asia/tag/%E9%9F%93%E5%9B%BD%E8%AA%9E">韓国語</category>
<category domain="http://suin.asia/tag/%E6%96%87%E6%B3%95">文法</category>
</item>
</channel>
</rss>
