1. 程式人生 > >iOS 中bundle 和國際化之間的關係

iOS 中bundle 和國際化之間的關係

[[NSBundle mainBundle] pathForResource:@"someFileName" ofType:@"yourFileExtension"]; 

[YourViewController initWithNibName:"YourViewController" bundle:nil];

可是你知道這裡的bundle到底是個啥玩意呢?!

Bundle簡單地講,就是一個內部結構按照標準規則組織的特殊目錄

iOS的應用都是通過bundle進行封裝的,對應的bundle型別是Application型別,平時我們通過XCode編譯出來的Target(即我們開發的應用),其實就是一個Application型別bundle,即一個資料夾!但是Finder會把這個bundle當做一個檔案顯示給我們,其實是因為這個bundle自身也是一個package,而Mac系統會把所有的package當做一個檔案來對待,顯示給使用者,從而防止使用者誤操作導致程式檔案損壞或丟失。至於bundle和package有什麼區別,就不在這裡展開說明了,本文後面所說的bundle都會被Mac系統視為package。

現在我們已經知道了,原來我們開發的應用程式,最後都會成為一個bundle,那麼就不難理解為什麼很多資原始檔載入大多是通過bundle來進行的了,從bundle進行檔案載入實際就是通過應用自己所在的資料夾進行載入。

不過緊接著我們又會產生好幾個疑問:

1 為什麼不直接使用檔案路徑的方式來讀取資原始檔呢?

2 為什麼還會存在pathForResource:ofType:這個方法,難道說我們在開發的時候還不能確定這些檔案在哪兒嗎?

事實上,我們是可以使用檔案系統的路徑進行資原始檔的訪問的,不過當我們要進行App的國際化的時候,我們需要自己去實現不同語言、地區情況下載入對應的檔案,而在部分資原始檔公用,部分需要國際化的時候,對開發人員來講,程式碼維護起來尤為混亂。

而bundle對iOS開發者來講,最大的方便就是可以非常簡單地讓自己的應用國際化,在不同的語言不同的地區,載入不同的資原始檔,顯示不同的語言文字,而實現這些只需要我們嚴格按照bundle的要求進行資原始檔的存放即可,而不需要寫大量程式碼判斷地區語言。遵循的方法也很簡單,只需要我們建立對應的"本地化資料夾"即可,例如我們要同時讓圖片"pic.png"在中文和英文下顯示不同的內容,只需要建立兩個本地化資料夾zh.lproj和en.lproj,分別放入同名但內容不同的"pic.png"即可。

關於如何讓自己的應用國際化的具體方法,將在之後的文章進行描述。 

相關推薦

iOS bundle 國際化之間關係

[[NSBundle mainBundle] pathForResource:@"someFileName" ofType:@"yourFileExtension"];  [YourViewController initWithNibName:"YourView

UnitySpriteTexture2D之間關係

Texture2D中包含多種型別的貼圖,比如normol map,default,sprite 等等。 當我們去切割精靈產生一張或多張資源的時候,就會產生sprite,如圖上面這個object的型別就是Texture2D,下面這個object就是sprite了,我們可以看 Selectio

C++陣列指標之間關係梳理

C++中陣列和指標是兩個十分常用且關係密切的資料結構,“陣列即指標,指標即陣列”的言論一直層出不窮。從本質上講,陣列和指標是不同的,陣列是具有確定數量的元素,而指標只是一個標量值。但是,在某些情況下陣列和指標又能相互轉換。下面,將從多個角度分析陣列和指標。 1. 陣列和指標互相轉換 陣列

JavaMapSet之間關係(及Map.Entry)

1、通過查詢API文件: 2、Map.Entry是一個介面,所以不能直接例項化。 3、Map.entrySet( )返回的是一個collection集合,並且,這個collection中的元素是Map.Entry型別,如下圖所示: 4、 Map是Java中的

關於ToolbarnavigationIcontitle之間距離及展開

boolean ionic code sin block max change nav 希望 關於Toolbar中navigationIcon和title之間距離及展開 問題緣起 在進行Coolcode項目的MyclassActivity中,我發現navigationI

【spring Boot】Spring@Controller@RestController之間的區別

處理 public 不同 esp 舉例 rest control tro adding spring Boot入手的第一天,看到例子中的@RestController ............. 相同點:都是用來表示Spring某個類的是否可以接收HTTP請求 不同點:@C

iOS棧的區別

IE http sdn 改變 執行 需要 獨立 clas 類方法 https://blog.csdn.net/wallacewang_/article/details/72594977 類方法 當不需要訪問實例變量或者不改變實例狀態時,可寫成類方法。 Objec

30-python3 bytes string 之間的互相轉換

轉自:http://www.jb51.net/article/105064.htm   password = b'123456' 等價於: pw = '123456' password = pw.encode(encoding='utf-8')      前言

SpringMVC@PathVariable@RequestParam之間的區別

@PathVariable繫結URI模板變數值 @PathVariable是用來獲得請求url中的動態引數的 @PathVariable用於將請求URL中的模板變數對映到功能處理方法的引數上。//通俗來講配置url和方法的一個關係 @RequestMapping("/item/{item

javaStringdate之間的互轉

1 Java時間格式轉換大全 2 3 import java.text.*; 4 import java.util.Calendar; 5 public class VeDate { 6 /** 7 * 獲取現在時間 8 * 9 * @ret

tensorflow session() graph的關係

自己的理解 一般我們都是先建立graph ,然後在建立一個 session,將圖載入進去 最近自己在學習tensorflow過程中,發現我們將圖載入到會話裡面後,可以繼續基於載入的圖 繼續構造圖 例子 import tensorflow as tf import numpy as

iospthread_mutexdispatch_semaphore效能對比

因為自旋鎖有風險已經別踢出局不再使用,所以對比了一下pthread提供的pthread_mutex_t以及dispatch_semaphore。 測試時候特別注意debug模式和release模式,結果可能會完全不一樣。 測試方法 模擬實際使用的執行緒搶佔,分別在不同執行緒迴圈很多次

對於QtQStringchar*之間的互相轉換問題(系列二)

對於Qt,雖說對C++全部相容,但是一旦涉及到和介面的資料的互動操作,難免涉及到char*和QString的轉換問題,轉換的過程很簡單,這裡總結了一下網上提供的最簡單的一個方法: 從char*轉成QString型別: 使用fromLocal8Bit方法進行轉換: char * te

OpenCVMatIplImage之間的相互裝換(OpenCV2.0OpenCV3.0)

Mat是OpenCV和C++介面的矩陣類,IplImage是OpenCV和C語言介面的結構體。 Mat讀取顯示用的是imread、imshow等,IplImage讀取顯示用的是cvLoadImage()、cvShowImage()。 有時候會涉及到兩者之間的轉換,下面詳細見介紹一下兩者之

python學習(五):Python類super()__init__()的關係

1.單繼承時super()和__init__()實現的功能是類似的 class Base(object): def __init__(self): print 'Base create' class childA(Base): def __init__(sel

Spark RDDDataSet之間的轉換

什麼是RDD:Spark提供了一個抽象的彈性分散式資料集,是一個由叢集中各個節點以分割槽的方式排列的集合,用以支援平行計算。RDD在驅動程式呼叫hadoop的檔案系統的時候就建立(其實就是讀取檔案的時候就建立),或者通過驅動程式中scala集合轉化而來,使用者也可以用spar

【轉載】C#outref之間的區別

首先:兩者都是按地址傳遞的,使用後都將改變原來引數的數值。 其次:ref可以把引數的數值傳遞進函式,但是out是要把引數清空,就是說你無法把一個數值從out傳遞進去的,out進去後,引數的數值為空,所以你必須初始化一次。這個就是兩個的區別,或者說就像有的網友說的,ref是有進有出,out是隻出不進。

Java執行緒池submit()execute之間的區別?

一: submit()方法,可以提供Future < T > 型別的返回值。 executor()方法,無返回值。 execute無返回值 public void execute(Runnable command) { if (command == null)

NettyChannelPipelineChannelHandler的關係

ChannelPipeline為ChannelHandler鏈提供了容器,並定義了用於在該鏈上傳播入站和出站事件流的API。當Channel被建立時,它會被自動地分配到它專屬的ChannelPipeline。 ChannelHandler安裝到ChannelPipeline

iOS KVCKVO的理解用途

KVC(Key-Value Coding) KVC,即是指 NSKeyValueCoding,一個非正式的 Protocol,提供一種機制來間接訪問物件的屬性。 一個物件擁有某些屬性。比如說,一個 Man 物件有一個 name 和一個 age 屬性。以 KVC 說法,這個Man&n