Rails ローカライズ i18n

参考記事

gem

github.com

morizyun.github.io

qiita.com

サブドメインで言語判断したので

app/controllers/application_controller.rb

before_filter :set_locale

def set_locale
  I18n.locale = extract_locale_from_subdomain
end

def extract_locale_from_subdomain
  parsed_locale = request.subdomains.first
  I18n.available_locales.include?(parsed_locale.to_sym) ? parsed_locale : I18n.default_locale
end

Rails c で  I18n.available_locales を確認

$ rails c
Running via Spring preloader in process 10001
Loading development environment (Rails 5.2.1.1)
irb(main):001:0> I18n.available_locales
=> [:en, :"es-MX", :fa, :"en-BORK", :tr, :es, :"en-NZ", :ja, :bg, :"zh-CN", :"en-US", :"de-AT", :de, :"ca-CAT", :"de-CH", :fr, :sk, :"pt-BR", :"fr-CA", :nep, :nl, :"en-UG", :"en-IND", :"en-au-ocker", :ko, :"en-MS", :"en-GB", :"zh-TW", :"fi-FI", :lv, :"fr-CH", :"en-SG", :sv, :"en-AU", :uk, :it, :"no-NO", :"en-PAK", :ee, :"en-ZA", :"da-DK", :id, :"nb-NO", :ru, :"en-CA", :pt, :vi, :he, :ca, :pl, 

日本語があったのでOK

config> application.rb

//== gemの指示に従う
 config.i18n.load_path += Dir[Rails.root.join("config", "locales", "**", "*.{rb,yml}").to_s]

//==デフォルトを英語にする。
  config.i18n.default_locale = :en

その他 config>locales>en.yml jp.yml を作成

そこに記載していく。

ja:
  devise:
    sessions:
      log_in: "ログイン"

en:
  devise:
    sessions:
      log_in: "Log_in"

Viewでの記載方法は

tというのがi18nの変数 その中に記載するだけ

 <h2><%= t('devise.sessions.log_in') %></h2>

ちなみにrubyは文字列をutf8で内部的に持っているので、このような書き方が可能。

日本だけを見ていたら、マーケットが違いすぎることに最近気づく
デフォルトは英語ですね。

wordpress エラーログ出力

.htaccessに以下の1行を追加

php_flag display_errors On

# BEGIN WordPress パーマリンク
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

//==この一行を追加
php_flag display_errors On

# END WordPress

.htaccessは再帰的にしたの階層まで適用されるので、 themeのフォルダ以下に追加すれば良い。

IfModule mod_rewrite.c 以下はWEBサーバーが、ルーティングを決めている.

ワードプレスは独自のルーティングがあるので、それを決めている所

エラーログはありがたい!

f:id:happy_teeth_ago:20190309192616p:plain

ファイルの場所

大抵は、ワードプレスをインストールしたフォルダ直下にあります。 ないときは、隠しファイルを表示してみてください。 必ずあります。

wordpress フィルターフック 調査方法

フィルターフックとは?

定義

フィルターは、WordPress が様々な種類のテキストをデータベースまたはブラウザ画面へ送信する前に、それを変更できます。プラグインは、フィルター API を利用して、指定したテキストをその時点で変更する PHP 関数を実行できます。

なんのこっちゃ? なので解説

よく考えてみよう!
Railsなどはモデルからコントローラーから自分で作成してDBとのやり取りを記述しないといけない。 でもWordPressでは?
そう、画面しか作っていないよね。
基本的にtheme の中に作成していくのでモデルとか記載していないですね。

Railsで言えば、assets(css, JavaScript) とview だけ作るイメージ。

ではルーティングはどうするの?
そう、ワードプレスがテンプレート階層という順位付けがあり、その規定に準じて、ファイル名を命名しないといけない。

それがテンプレート階層

この記事など参考にしてください。 WordPressのテンプレート階層を初心者でも分かるように解説 | lblevery

本日の本命は、フィルターフックです。

まずソースから

navメニュのクラスを削除して、表示中メニューに 'current' クラスを付与するフィルターフック

add_filter( 'nav_menu_css_class', 'remove_to_currentClass', 10, 2 );

function remove_to_currentClass( $classes, $item ) {
    $classes = array();
    if( $item -> current == true ) {
        $classes[] = 'current nav-item';
    } else {
        $classes[] = 'nav-item';
    }
    return $classes;
}

関数定義

<?php add_filter( $tag, $function_to_add, $priority, $accepted_args ); ?>

引数

$tag

$function_to_add 引数で指定した関数を登録するフィルターフックの名前。 これはワードプレスが決定しているので、自分では決めれない。基準に沿うものを探そう。

$function_to_add

フィルターが適用されたときに呼び出される関数の名前。 これは自分で命名して関数を記述する。 上記では remove_to_currentClass

$priority

フィルターフックに登録された関数の中で、この関数を実行する順序。数値が小さいほど早く実行し、同じ数値の場合は追加された順に実行する。初期値は10.優先順位が低いときは100とかにする。10刻みが利用されることが多い。

$accepted_args

関数が受け取る引数の個数。 上記の場合は2つ 自分で作った関数に引数を2つ渡している。

ここからがポイント

上記の nav_menu_css_class の定義はここ

developer.wordpress.org

apply_filters( 'nav_menu_css_class', string[] $classes, WP_Post $item, stdClass $args, int $depth )

apply_filtersは、WordPress コアの関数のなかで呼び出されているので、そのように記述されている

ざっくり言うと、これをadd_filterに置き換えて、functions.phpの中で利用する

引数は4つ

$classes  string型の配列

メニューの中の li タグに適用したいクラス string[] の配列になっているのがポイント だから配列で初期化している

$item WP_Post型

現在のメニュー item これは、ダッシュボードで登録されているメニューですね。

$args  stdクラス 

wp_nav_menu() 関数の 引数ですね。 そもそもNAVバーを表示しているときに、wp_nav_menu() を記述しているはず。 その引数です。

$depth int型

メニューアイテムの深度、paddingに利用する

もう一度書きます。

//フィルターフックは、nav_menu_css_classというワードプレスの関数。
//メニューの<li>タグにクラスを適用する関数
//自分で作った関数は emove_to_currentClass' 引数を2つもっていくよ!
add_filter( 'nav_menu_css_class', 'remove_to_currentClass', 10, 2 );

function remove_to_currentClass( $classes, $item ) {
    $classes = array();

//$item は WP_Post型だから current というプロパティを持っている。
//もし current だったらクラス名は current nav-itemを当ててね。
    if( $item -> current == true ) {
        $classes[] = 'current nav-item';

//そうでなかったら、nav-item だけ当ててね
    } else {
        $classes[] = 'nav-item';
    }
    return $classes;
}

Swift API接続注意点1 忘備録 読まないこと!

大切なものは3つ

1-リクエスト

UserRequestと 汎用的に利用できる APIRequestクラスを作成する

2-レスポンス

3-エラー処理

リクエストは表示するだけなので、値を持っていれば良い リクエストでどんなパラメータが必要か? 一覧でよければ、パラメーターは必要ない。 リクエストクラスには、どんな情報が返却されるのかわからないので、リクエストに必要な情報だけ記載すれば良い。 例 url セッション

レスポンスは、保存処理などが走るので、テーブルに応じたモデルを用意しておかなくてはいけない。 WEBのDBもモデルがUser なら struct Userなど同じ名前が望ましい。そこに記載する カラムに当てはまるようなプロパティを書いておく

リクエスト と レスポンスの構造体が必要になる

リクエストを投げる

URLRequestは httpbody というプロパティを持っている

developer.apple.com

HTTP POST要求など、要求のメッセージ本文として送信されたデータ。だそうです。

そもそもbodyとは ?

HTTPリクエストは3つの部分からなっている

1.HTTPリクエストライン(リクエストライン)

2.HTTPリクエストヘッダ(ヘッダ)

改行、空行が入る

3.HTTPリクエストメッセージボディ(メッセージボディ)

POSTのとき、受け渡すパラメーターの内容が書いてある。 GETのときは何も書いていない。 今回はログインだからBodyに書いてあるはず。

encode とは Swiftの型-> json

decodeとは json-> Swiftの型 へ変換するもの

それぞれData型で返却される

下記参照

developer.apple.com ちなみに encodeはこちら

developer.apple.com

ここのソースはわかりやすい

//まず構造体を定義 これがbody部のもととなる
struct GroceryProduct: Codable {
    var name: String
    var points: Int
    var description: String?
}

//ここで上記のインスタンスを生成
let pear = GroceryProduct(name: "Pear", points: 250, description: "A ripe pear.")

let encoder = JSONEncoder()
//これはただ、出力を読みやすくするだけ、必要ない
encoder.outputFormatting = .prettyPrinted

//encodeします。このときエラー処理が必要 try
let data = try encoder.encode(pear)
print(String(data: data, encoding: .utf8)!)

//こんな感じで、body部が出来ている。
/* Prints:
 {
   "name" : "Pear",
   "points" : 250,
   "description" : "A ripe pear."
 }
*/

jsondecodeのインスタンスを作らないと何も始まらない。

urlRequest.httpBody = try! encoder.encode(httpBody)

とすると cannot invoke ~ 呼び出せないよとエラー

stackoverflow.com

ここを見ると、ジェネリクスで作れと書いてある。よって変更する。 プロトコルのジェネリクスってどうやってかくの?

stackoverflow.com

associatedtype  を使いなさいと。

protocol GitHubRequest{
    //プロトコルでのジェネリクス
    associatedtype Response: Decodable
//ここでジェネリクスを指定
    associatedtype HTTPBody: Encodable
    //直接アクセスできないようにGetterがある
    var baseURL: URL {get}
    var path: String {get}
    var method: HTTPMethod {get}
    //URLQueryItem   URLのクエリ部分からの単一の名前と値のペア。
    var queryItems: [URLQueryItem] {get}
    
//HTTPBody型に変更
    var httpBody :HTTPBody {get}
    
}

case .post:
            let encoder = JSONEncoder()
//associatedtype HTTPBody: Encodable これによりここのエラーが消える
            urlRequest.httpBody = try! encoder.encode(httpBody)

DNSレコードの種類や文言まとめ

DNSレコードの種類や文言まとめ

Aレコード

アドレスレコードのこと

hogehoge.com IN A 192.168.22.30

このドメインのIPアドレスは192.168.22.30ですという意味
WEBブラウザなどからの問い合わせに対して、このドメインは、ここですよとDNSが、返してくれる。

CNAMEレコード

Canonical Name 正規名のこと

ドメインを別のドメインに置き換えるレコード

www.hogehoge.com IN CNAME hogehoge.com

NSレコード

ドメインが管理されるサーバー DNSを記述したもの

hogehoge.com IN NS ns01.jp

SOAレコード

ざっくり説明すると
ドメインの情報が記載されているレコードだと思えば良い。

【ドメイン名】     【クラス名】 SOA 【DNSサーバのドメイン名】 【連絡先】 (
        【シリアル番号】
        【更新チェックの間隔】
        【リトライ間隔】
        【問い合わせ諦めるぜ期間】 DNSがゾーンファイルが新しくなったかどうか確認するのを諦める時間
        【ネガティブキャッシュの有効期限】 )

digコマンド

ドメイン名からipアドレスを調査できる nslookup と同じ感じ

dig hogehoge.com

//ドメインから調査する

dig -x IPアドレス
//IPアドレスからドメインを調査する

参考サイト

https://wa3.i-3-i.info/word12285.html