mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-10-10 02:40:59 +00:00
New: support of base localization and nib localization
This commit is contained in:
1 parent
e5b122ee61
commit
c5b250236f
6 files changed
+93
-97
No files matched your search
+14
-26
@@ -47,10 +47,11 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey";
|
||||
|
||||
@implementation CPCib : CPObject
|
||||
{
|
||||
CPData _data;
|
||||
CPBundle _bundle;
|
||||
BOOL _awakenCustomResources;
|
||||
BOOL _awakenCustomResources @accessors(property=_awakenCustomResources);
|
||||
|
||||
CPBundle _bundle;
|
||||
CPData _data;
|
||||
CPString _cibName;
|
||||
id _loadDelegate;
|
||||
}
|
||||
|
||||
@@ -60,6 +61,8 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey";
|
||||
|
||||
if (self)
|
||||
{
|
||||
_cibName = [aURL lastPathComponent];
|
||||
|
||||
_data = [CPURLConnection sendSynchronousRequest:[CPURLRequest requestWithURL:aURL] returningResponse:nil];
|
||||
|
||||
if (!_data)
|
||||
@@ -77,6 +80,8 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey";
|
||||
|
||||
if (self)
|
||||
{
|
||||
_cibName = [aURL lastPathComponent];
|
||||
|
||||
[CPURLConnection connectionWithRequest:[CPURLRequest requestWithURL:aURL] delegate:self];
|
||||
|
||||
_awakenCustomResources = YES;
|
||||
@@ -89,16 +94,7 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey";
|
||||
|
||||
- (id)initWithCibNamed:(CPString)aName bundle:(CPBundle)aBundle
|
||||
{
|
||||
if (![aName hasSuffix:@".cib"])
|
||||
aName = [aName stringByAppendingString:@".cib"];
|
||||
|
||||
// If aBundle is nil, use mainBundle, but ONLY for searching for the nib, not for resources later.
|
||||
self = [self initWithContentsOfURL:[aBundle || [CPBundle mainBundle] pathForResource:aName]];
|
||||
|
||||
if (self)
|
||||
_bundle = aBundle;
|
||||
|
||||
return self;
|
||||
return [self initWithCibNamed:aName bundle:aBundle loadDelegate:nil];
|
||||
}
|
||||
|
||||
- (id)initWithCibNamed:(CPString)aName bundle:(CPBundle)aBundle loadDelegate:(id)aLoadDelegate
|
||||
@@ -106,8 +102,10 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey";
|
||||
if (![aName hasSuffix:@".cib"])
|
||||
aName = [aName stringByAppendingString:@".cib"];
|
||||
|
||||
var bundle = aBundle || [CPBundle mainBundle];
|
||||
|
||||
// If aBundle is nil, use mainBundle, but ONLY for searching for the nib, not for resources later.
|
||||
self = [self initWithContentsOfURL:[aBundle || [CPBundle mainBundle] pathForResource:aName] loadDelegate:aLoadDelegate];
|
||||
self = [self initWithContentsOfURL:[bundle _cibPathForResource:aName] loadDelegate:aLoadDelegate];
|
||||
|
||||
if (self)
|
||||
_bundle = aBundle;
|
||||
@@ -115,16 +113,6 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey";
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)_setAwakenCustomResources:(BOOL)shouldAwakenCustomResources
|
||||
{
|
||||
_awakenCustomResources = shouldAwakenCustomResources;
|
||||
}
|
||||
|
||||
- (BOOL)_awakenCustomResources
|
||||
{
|
||||
return _awakenCustomResources;
|
||||
}
|
||||
|
||||
- (BOOL)instantiateCibWithExternalNameTable:(CPDictionary)anExternalNameTable
|
||||
{
|
||||
var bundle = _bundle,
|
||||
@@ -133,7 +121,7 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey";
|
||||
if (!bundle && owner)
|
||||
bundle = [CPBundle bundleForClass:[owner class]];
|
||||
|
||||
var unarchiver = [[_CPCibKeyedUnarchiver alloc] initForReadingWithData:_data bundle:bundle awakenCustomResources:_awakenCustomResources],
|
||||
var unarchiver = [[_CPCibKeyedUnarchiver alloc] initForReadingWithData:_data bundle:bundle awakenCustomResources:_awakenCustomResources cibName:_cibName],
|
||||
replacementClasses = [anExternalNameTable objectForKey:CPCibReplacementClasses];
|
||||
|
||||
if (replacementClasses)
|
||||
@@ -227,4 +215,4 @@ var CPCibDataFileKey = @"CPCibDataFileKey",
|
||||
[aCoder encodeObject:[_data base64] forKey:CPCibDataFileKey];
|
||||
}
|
||||
|
||||
@end
|
||||
@end
|
||||
+20
-10
@@ -26,7 +26,11 @@
|
||||
|
||||
@import "CPCib.j"
|
||||
|
||||
var CPCibOwner = @"CPCibOwner";
|
||||
var CPCibOwner = @"CPCibOwner",
|
||||
CPBundleDefaultLanguage = @"CPBundleDefaultLanguage",
|
||||
CPBundleTypeOfLocalization = @"CPBundleTypeOfLocalization",
|
||||
CPBundleBaseLocalizationType = @"CPBundleBaseLocalizationType",
|
||||
CPBundleInterfaceBuilderLocalizationType = @"CPBundleInterfaceBuilderLocalizationType";
|
||||
|
||||
@implementation CPObject (CPCibLoading)
|
||||
|
||||
@@ -45,14 +49,7 @@ var CPCibOwner = @"CPCibOwner";
|
||||
|
||||
+ (CPCib)loadCibNamed:(CPString)aName owner:(id)anOwner
|
||||
{
|
||||
if (![aName hasSuffix:@".cib"])
|
||||
aName = [aName stringByAppendingString:@".cib"];
|
||||
|
||||
// Path is based solely on anOwner:
|
||||
var bundle = anOwner ? [CPBundle bundleForClass:[anOwner class]] : [CPBundle mainBundle],
|
||||
path = [bundle pathForResource:aName];
|
||||
|
||||
return [self loadCibFile:path externalNameTable:@{ CPCibOwner: anOwner }];
|
||||
return [self loadCibNamed:aName owner:anOwner loadDelegate:nil];
|
||||
}
|
||||
|
||||
- (CPCib)loadCibFile:(CPString)aFileName externalNameTable:(CPDictionary)aNameTable
|
||||
@@ -76,7 +73,7 @@ var CPCibOwner = @"CPCibOwner";
|
||||
|
||||
// Path is based solely on anOwner:
|
||||
var bundle = anOwner ? [CPBundle bundleForClass:[anOwner class]] : [CPBundle mainBundle],
|
||||
path = [bundle pathForResource:aName];
|
||||
path = [bundle _cibPathForResource:aName];
|
||||
|
||||
return [self loadCibFile:path externalNameTable:@{ CPCibOwner: anOwner } loadDelegate:aDelegate];
|
||||
}
|
||||
@@ -91,6 +88,19 @@ var CPCibOwner = @"CPCibOwner";
|
||||
externalNameTable:aNameTable]]);
|
||||
}
|
||||
|
||||
- (CPString)_cibPathForResource:(CPString)aName
|
||||
{
|
||||
var defaultBundleLanguage = [self objectForInfoDictionaryKey:CPBundleDefaultLanguage],
|
||||
typeOfLocalization = [self objectForInfoDictionaryKey:CPBundleTypeOfLocalization];
|
||||
|
||||
if (defaultBundleLanguage && (!typeOfLocalization || typeOfLocalization == CPBundleBaseLocalizationType))
|
||||
aName = @"Base.lproj/" + aName;
|
||||
else if (defaultBundleLanguage && typeOfLocalization == CPBundleInterfaceBuilderLocalizationType)
|
||||
aName = _bundle.loadedLanguage() + ".lproj/" + aName;
|
||||
|
||||
return [self pathForResource:aName];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation _CPCibLoadDelegate : CPObject
|
||||
|
||||
@@ -21,16 +21,22 @@
|
||||
*/
|
||||
|
||||
@import <Foundation/CPKeyedUnarchiver.j>
|
||||
|
||||
@import <Foundation/CPBundle.j>
|
||||
|
||||
@implementation _CPCibKeyedUnarchiver : CPKeyedUnarchiver
|
||||
{
|
||||
CPBundle _bundle;
|
||||
BOOL _awakenCustomResources;
|
||||
CPDictionary _externalObjectsForProxyIdentifiers;
|
||||
BOOL _awakenCustomResources @accessors(getter=awakenCustomResources);
|
||||
CPBundle _bundle @accessors(getter=bundle);
|
||||
CPDictionary _externalObjectsForProxyIdentifiers @accessors(setter=setExternalObjectsForProxyIdentifiers:);
|
||||
CPString _cibName @accessors(getter=cibName);
|
||||
}
|
||||
|
||||
- (id)initForReadingWithData:(CPData)data bundle:(CPBundle)aBundle awakenCustomResources:(BOOL)shouldAwakenCustomResources
|
||||
{
|
||||
return [self initForReadingWithData:data bundle:aBundle awakenCustomResources:shouldAwakenCustomResources cibName:@""];
|
||||
}
|
||||
|
||||
- (id)initForReadingWithData:(CPData)data bundle:(CPBundle)aBundle awakenCustomResources:(BOOL)shouldAwakenCustomResources cibName:(CPString)aCibName
|
||||
{
|
||||
self = [super initForReadingWithData:data];
|
||||
|
||||
@@ -38,6 +44,7 @@
|
||||
{
|
||||
_bundle = aBundle;
|
||||
_awakenCustomResources = shouldAwakenCustomResources;
|
||||
_cibName = aCibName;
|
||||
|
||||
[self setDelegate:self];
|
||||
}
|
||||
@@ -45,21 +52,6 @@
|
||||
return self;
|
||||
}
|
||||
|
||||
- (CPBundle)bundle
|
||||
{
|
||||
return _bundle;
|
||||
}
|
||||
|
||||
- (BOOL)awakenCustomResources
|
||||
{
|
||||
return _awakenCustomResources;
|
||||
}
|
||||
|
||||
- (void)setExternalObjectsForProxyIdentifiers:(CPDictionary)externalObjectsForProxyIdentifiers
|
||||
{
|
||||
_externalObjectsForProxyIdentifiers = externalObjectsForProxyIdentifiers;
|
||||
}
|
||||
|
||||
- (id)externalObjectForProxyIdentifier:(CPString)anIdentifier
|
||||
{
|
||||
return [_externalObjectsForProxyIdentifiers objectForKey:anIdentifier];
|
||||
|
||||
@@ -21,28 +21,21 @@
|
||||
*/
|
||||
|
||||
@import <Foundation/CPString.j>
|
||||
@import <Foundation/CPCharacterSet.j>
|
||||
|
||||
@implementation _CPLocalizableString : CPString
|
||||
@implementation _CPLocalizableString : CPObject
|
||||
{
|
||||
CPString _dev @accessors(property=dev);
|
||||
CPString _key @accessors(property=key);
|
||||
}
|
||||
|
||||
- (id)init
|
||||
{
|
||||
if (self = [super init])
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
return self;
|
||||
CPString _dev @accessors(property=dev);
|
||||
CPString _key @accessors(property=key);
|
||||
CPString _value @accessors(property=value);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
var CPLocalizableStringDev = @"CPLocalizableStringDev",
|
||||
CPLocalizableStringKey = @"CPLocalizableStringKey";
|
||||
CPLocalizableStringKey = @"CPLocalizableStringKey",
|
||||
CPLocalizableStringValue = @"CPLocalizableStringValue";
|
||||
|
||||
@implementation _CPLocalizableString (CPCoding)
|
||||
|
||||
@@ -52,15 +45,18 @@ var CPLocalizableStringDev = @"CPLocalizableStringDev",
|
||||
|
||||
_dev = [aCoder decodeObjectForKey:CPLocalizableStringDev];
|
||||
_key = [aCoder decodeObjectForKey:CPLocalizableStringKey];
|
||||
_value = [aCoder decodeObjectForKey:CPLocalizableStringValue];
|
||||
|
||||
//TODO: here we should not return self but the string from CPLocalizedStringFromTable
|
||||
return self;
|
||||
var tableName = [[aCoder cibName] stringByTrimmingCharactersInSet:[CPCharacterSet characterSetWithCharactersInString:@".cib"]];
|
||||
|
||||
return [[aCoder bundle] localizedStringForKey:_key value:_value table:tableName];
|
||||
}
|
||||
|
||||
- (void)encodeWithCoder:(CPCoder)aCoder
|
||||
{
|
||||
[aCoder encodeObject:_dev forKey:CPLocalizableStringDev];
|
||||
[aCoder encodeObject:_key forKey:CPLocalizableStringKey];
|
||||
[aCoder encodeObject:_value forKey:CPLocalizableStringValue];
|
||||
}
|
||||
|
||||
@end
|
||||
+35
-26
@@ -35,6 +35,9 @@ var CFBundlesForURLStrings = { },
|
||||
CFTotalBytesLoaded = 0,
|
||||
CPApplicationSizeInBytes = 0;
|
||||
|
||||
var CPBundleDefaultBrowserLanguage = "CPBundleDefaultBrowserLanguage",
|
||||
CPBundleDefaultLanguage = "CPBundleDefaultLanguage";
|
||||
|
||||
GLOBAL(CFBundle) = function(/*CFURL|String*/ aURL)
|
||||
{
|
||||
aURL = makeAbsoluteURL(aURL).asDirectoryPathURL();
|
||||
@@ -61,6 +64,7 @@ GLOBAL(CFBundle) = function(/*CFURL|String*/ aURL)
|
||||
this._eventDispatcher = new EventDispatcher(this);
|
||||
|
||||
this._localizableStrings = [];
|
||||
this._loadedLanguage = NULL;
|
||||
}
|
||||
|
||||
DISPLAY_NAME(CFBundle);
|
||||
@@ -148,11 +152,14 @@ CFBundle.prototype.resourcesDirectoryURL = function()
|
||||
|
||||
DISPLAY_NAME(CFBundle.prototype.resourcesDirectoryURL);
|
||||
|
||||
CFBundle.prototype.resourceURL = function(/*String*/ aResourceName, /*String*/ aType, /*String*/ aSubDirectory)
|
||||
CFBundle.prototype.resourceURL = function(/*String*/ aResourceName, /*String*/ aType, /*String*/ aSubDirectory, /*String*/ localizationName)
|
||||
{
|
||||
if (aType)
|
||||
aResourceName = aResourceName + "." + aType;
|
||||
|
||||
if (localizationName)
|
||||
aResourceName = localizationName + aResourceName;
|
||||
|
||||
if (aSubDirectory)
|
||||
aResourceName = aSubDirectory + "/" + aResourceName;
|
||||
|
||||
@@ -197,6 +204,11 @@ CFBundle.prototype.infoDictionary = function()
|
||||
|
||||
DISPLAY_NAME(CFBundle.prototype.infoDictionary);
|
||||
|
||||
CFBundle.prototype.loadedLanguage = function()
|
||||
{
|
||||
return this._loadedLanguage;
|
||||
};
|
||||
|
||||
CFBundle.prototype.valueForInfoDictionaryKey = function(/*String*/ aKey)
|
||||
{
|
||||
return this._infoDictionary.valueForKey(aKey);
|
||||
@@ -321,6 +333,7 @@ CFBundle.prototype.load = function(/*BOOL*/ shouldExecute)
|
||||
if (self === CFBundle.mainBundle() && self.valueForInfoDictionaryKey("CPApplicationSize"))
|
||||
CPApplicationSizeInBytes = self.valueForInfoDictionaryKey("CPApplicationSize").valueForKey("executable") || 0;
|
||||
|
||||
loadLanguageForBundle(self);
|
||||
loadExecutableAndResources(self, shouldExecute);
|
||||
}
|
||||
|
||||
@@ -496,12 +509,12 @@ function loadSpritedImagesForBundle(/*Bundle*/ aBundle, success, failure, progre
|
||||
|
||||
function loadLocalizableStringsForBundle(/*Bundle*/ aBundle, success, failure, progress)
|
||||
{
|
||||
var language = getCurrentLanguage();
|
||||
var language = aBundle._loadedLanguage;
|
||||
|
||||
if (!language)
|
||||
return;
|
||||
|
||||
var localizableStrings = aBundle.valueForInfoDictionaryKey("CPLocalizableStrings");
|
||||
var localizableStrings = aBundle.valueForInfoDictionaryKey("CPBundleLocalizableStrings");
|
||||
|
||||
if (!localizableStrings)
|
||||
return;
|
||||
@@ -583,18 +596,29 @@ function loadLocalizableContentForFileInBundle(bundle, contentFile, tableName)
|
||||
}
|
||||
}
|
||||
|
||||
function getCurrentLanguage()
|
||||
function loadLanguageForBundle(aBundle)
|
||||
{
|
||||
if (aBundle._loadedLanguage)
|
||||
return;
|
||||
|
||||
var defaultLanguage = aBundle.valueForInfoDictionaryKey(CPBundleDefaultLanguage);
|
||||
|
||||
if (defaultLanguage != CPBundleDefaultBrowserLanguage && defaultLanguage)
|
||||
{
|
||||
aBundle._loadedLanguage = defaultLanguage;
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof navigator == "undefined")
|
||||
return null;
|
||||
return;
|
||||
|
||||
// userLanguage is an IE only property.
|
||||
var language = (typeof navigator.language !== "undefined") ? navigator.language : navigator.userLanguage;
|
||||
|
||||
if (!language)
|
||||
return null;
|
||||
return;
|
||||
|
||||
return language.substring(0, 2);
|
||||
aBundle._loadedLanguage = language.substring(0, 2);
|
||||
}
|
||||
|
||||
var CFBundleSpriteSupportListeners = [],
|
||||
@@ -841,34 +865,19 @@ CFBundle.prototype.path = function()
|
||||
return this.bundlePath.apply(this, arguments);
|
||||
};
|
||||
|
||||
CFBundle.prototype.pathForResource = function(aResource)
|
||||
CFBundle.prototype.pathForResource = function(aResource, aType, aSubDirectory, localizationName)
|
||||
{
|
||||
return this.resourceURL(aResource).absoluteString();
|
||||
return this.resourceURL(aResource, aType, aSubDirectory, localizationName).absoluteString();
|
||||
};
|
||||
|
||||
GLOBAL(CFBundleCopyLocalizedString) = function (/*Bundle*/ bundle, key, value, tableName)
|
||||
{
|
||||
return CFCopyLocalizedStringWithDefaultValue(key, tableName, bundle, value, null);
|
||||
}
|
||||
|
||||
GLOBAL(CFBundleCopyLocalizationsForPreferences) = function (locArray, prefArray)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
GLOBAL(CFBundleCopyPreferredLocalizationsFromArray) = function (locArray)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
GLOBAL(CFBundleCopyLocalizationsForURL) = function (url)
|
||||
{
|
||||
|
||||
return CFCopyLocalizedStringWithDefaultValue(key, tableName, bundle, value, "");
|
||||
}
|
||||
|
||||
GLOBAL(CFBundleCopyBundleLocalizations) = function (/*Bundle*/ aBundle)
|
||||
{
|
||||
|
||||
return [this._loadedLanguage];
|
||||
}
|
||||
|
||||
GLOBAL(CFCopyLocalizedString) = function (key, comment)
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
{
|
||||
_dev = [aCoder decodeObjectForKey:@"NSDev"];
|
||||
_key = [aCoder decodeObjectForKey:@"NSKey"];
|
||||
_value = [aCoder decodeObjectForKey:@"NS.string"];
|
||||
}
|
||||
|
||||
return self;
|
||||
|
||||
Reference in new issue
Block a user