From af0959ff7bdc93598759efb18403e6d66ddc19ec Mon Sep 17 00:00:00 2001 From: Abel Fokkinga Date: Fri, 9 Nov 2012 19:39:17 +0100 Subject: [PATCH] Version 0.1. Conjugation kinda working from the testing screen --- Espagram.xcodeproj/project.pbxproj | 30 +- .../UserInterfaceState.xcuserstate | Bin 37857 -> 59668 bytes Espagram/ConjugatedVerbTableView.h | 13 + Espagram/ConjugatedVerbTableView.m | 31 + Espagram/Conjugator.h | 9 +- .../EspagramConjugationTableViewController.h | 30 + .../EspagramConjugationTableViewController.m | 118 ++++ Espagram/EspagramMainTableViewController.h | 13 + Espagram/EspagramMainTableViewController.m | 158 +++++ Espagram/EspagramMainViewController.h | 15 - Espagram/EspagramMainViewController.m | 83 --- Espagram/EspagramTestViewController.h | 6 +- Espagram/EspagramTestViewController.m | 17 +- Espagram/GrammarTestViewController.h | 10 +- Espagram/GrammarTestViewController.m | 32 +- Espagram/SpanishConjugator.h | 1 + Espagram/SpanishConjugator.m | 130 +++- Espagram/Tense.h | 17 + Espagram/Tense.m | 73 ++ Espagram/en.lproj/MainStoryboard.storyboard | 631 +++++++++++------- 20 files changed, 1023 insertions(+), 394 deletions(-) create mode 100644 Espagram/ConjugatedVerbTableView.h create mode 100644 Espagram/ConjugatedVerbTableView.m create mode 100644 Espagram/EspagramConjugationTableViewController.h create mode 100644 Espagram/EspagramConjugationTableViewController.m create mode 100644 Espagram/EspagramMainTableViewController.h create mode 100644 Espagram/EspagramMainTableViewController.m delete mode 100644 Espagram/EspagramMainViewController.h delete mode 100644 Espagram/EspagramMainViewController.m create mode 100644 Espagram/Tense.h create mode 100644 Espagram/Tense.m diff --git a/Espagram.xcodeproj/project.pbxproj b/Espagram.xcodeproj/project.pbxproj index ddb25aa..d397e00 100644 --- a/Espagram.xcodeproj/project.pbxproj +++ b/Espagram.xcodeproj/project.pbxproj @@ -15,10 +15,11 @@ B506EC7315EBF67500566A27 /* EspagramAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B506EC7215EBF67500566A27 /* EspagramAppDelegate.m */; }; B506EC7615EBF67500566A27 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B506EC7415EBF67500566A27 /* MainStoryboard.storyboard */; }; B506EC7915EBF67500566A27 /* EspagramViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B506EC7815EBF67500566A27 /* EspagramViewController.m */; }; - B506EC8415EC005B00566A27 /* EspagramMainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B506EC8315EC005B00566A27 /* EspagramMainViewController.m */; }; B506ECA515EE898700566A27 /* SpanishConjugator.m in Sources */ = {isa = PBXBuildFile; fileRef = B506ECA415EE898700566A27 /* SpanishConjugator.m */; }; B512F63B164BEC6000DA031E /* EspagramTestViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B512F63A164BEC6000DA031E /* EspagramTestViewController.m */; }; - B512F63E164BEC8E00DA031E /* EspagramTestView.m in Sources */ = {isa = PBXBuildFile; fileRef = B512F63D164BEC8E00DA031E /* EspagramTestView.m */; }; + B512F64A164C2A2700DA031E /* Tense.m in Sources */ = {isa = PBXBuildFile; fileRef = B512F649164C2A2700DA031E /* Tense.m */; }; + B512F658164D1A0C00DA031E /* EspagramConjugationTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B512F657164D1A0C00DA031E /* EspagramConjugationTableViewController.m */; }; + B512F670164D60DB00DA031E /* EspagramMainTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B512F66F164D60DB00DA031E /* EspagramMainTableViewController.m */; }; B5EFD38C162CA69F00C6E2EB /* GrammarTestViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B5EFD38B162CA69F00C6E2EB /* GrammarTestViewController.m */; }; B5EFD392162CB18000C6E2EB /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = B5EFD391162CB18000C6E2EB /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ @@ -37,14 +38,16 @@ B506EC7515EBF67500566A27 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard.storyboard; sourceTree = ""; }; B506EC7715EBF67500566A27 /* EspagramViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EspagramViewController.h; sourceTree = ""; }; B506EC7815EBF67500566A27 /* EspagramViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EspagramViewController.m; sourceTree = ""; }; - B506EC8215EC005B00566A27 /* EspagramMainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EspagramMainViewController.h; sourceTree = ""; }; - B506EC8315EC005B00566A27 /* EspagramMainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EspagramMainViewController.m; sourceTree = ""; }; B506ECA315EE898700566A27 /* SpanishConjugator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpanishConjugator.h; sourceTree = ""; }; B506ECA415EE898700566A27 /* SpanishConjugator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SpanishConjugator.m; sourceTree = ""; }; B512F639164BEC6000DA031E /* EspagramTestViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EspagramTestViewController.h; sourceTree = ""; }; B512F63A164BEC6000DA031E /* EspagramTestViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EspagramTestViewController.m; sourceTree = ""; }; - B512F63C164BEC8E00DA031E /* EspagramTestView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EspagramTestView.h; sourceTree = ""; }; - B512F63D164BEC8E00DA031E /* EspagramTestView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EspagramTestView.m; sourceTree = ""; }; + B512F648164C2A2700DA031E /* Tense.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tense.h; sourceTree = ""; }; + B512F649164C2A2700DA031E /* Tense.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Tense.m; sourceTree = ""; }; + B512F656164D1A0C00DA031E /* EspagramConjugationTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EspagramConjugationTableViewController.h; sourceTree = ""; }; + B512F657164D1A0C00DA031E /* EspagramConjugationTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EspagramConjugationTableViewController.m; sourceTree = ""; }; + B512F66E164D60DB00DA031E /* EspagramMainTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EspagramMainTableViewController.h; sourceTree = ""; }; + B512F66F164D60DB00DA031E /* EspagramMainTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EspagramMainTableViewController.m; sourceTree = ""; }; B58F57661635D27E00CED51B /* Conjugator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Conjugator.h; sourceTree = ""; }; B58F576D16387BE600CED51B /* NSMutableArray_Shuffling.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = NSMutableArray_Shuffling.h; path = Espagram/NSMutableArray_Shuffling.h; sourceTree = ""; }; B5EFD38A162CA69F00C6E2EB /* GrammarTestViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GrammarTestViewController.h; sourceTree = ""; }; @@ -100,18 +103,20 @@ children = ( B506EC7115EBF67500566A27 /* EspagramAppDelegate.h */, B506EC7415EBF67500566A27 /* MainStoryboard.storyboard */, - B512F63C164BEC8E00DA031E /* EspagramTestView.h */, - B512F63D164BEC8E00DA031E /* EspagramTestView.m */, + B512F66E164D60DB00DA031E /* EspagramMainTableViewController.h */, + B512F66F164D60DB00DA031E /* EspagramMainTableViewController.m */, + B512F656164D1A0C00DA031E /* EspagramConjugationTableViewController.h */, + B512F657164D1A0C00DA031E /* EspagramConjugationTableViewController.m */, B512F639164BEC6000DA031E /* EspagramTestViewController.h */, B512F63A164BEC6000DA031E /* EspagramTestViewController.m */, + B512F648164C2A2700DA031E /* Tense.h */, + B512F649164C2A2700DA031E /* Tense.m */, B506EC7215EBF67500566A27 /* EspagramAppDelegate.m */, B5EFD38A162CA69F00C6E2EB /* GrammarTestViewController.h */, B5EFD38B162CA69F00C6E2EB /* GrammarTestViewController.m */, B506ECA315EE898700566A27 /* SpanishConjugator.h */, B506ECA415EE898700566A27 /* SpanishConjugator.m */, B58F57661635D27E00CED51B /* Conjugator.h */, - B506EC8215EC005B00566A27 /* EspagramMainViewController.h */, - B506EC8315EC005B00566A27 /* EspagramMainViewController.m */, B506EC7715EBF67500566A27 /* EspagramViewController.h */, B506EC7815EBF67500566A27 /* EspagramViewController.m */, B506EC6915EBF67500566A27 /* Supporting Files */, @@ -198,11 +203,12 @@ B506EC6F15EBF67500566A27 /* main.m in Sources */, B506EC7315EBF67500566A27 /* EspagramAppDelegate.m in Sources */, B506EC7915EBF67500566A27 /* EspagramViewController.m in Sources */, - B506EC8415EC005B00566A27 /* EspagramMainViewController.m in Sources */, B506ECA515EE898700566A27 /* SpanishConjugator.m in Sources */, B5EFD38C162CA69F00C6E2EB /* GrammarTestViewController.m in Sources */, B512F63B164BEC6000DA031E /* EspagramTestViewController.m in Sources */, - B512F63E164BEC8E00DA031E /* EspagramTestView.m in Sources */, + B512F64A164C2A2700DA031E /* Tense.m in Sources */, + B512F658164D1A0C00DA031E /* EspagramConjugationTableViewController.m in Sources */, + B512F670164D60DB00DA031E /* EspagramMainTableViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Espagram.xcodeproj/project.xcworkspace/xcuserdata/abel.xcuserdatad/UserInterfaceState.xcuserstate b/Espagram.xcodeproj/project.xcworkspace/xcuserdata/abel.xcuserdatad/UserInterfaceState.xcuserstate index 5829115cd1694077a7ee6357b285138e70134395..29a515806af0322be3b048844dfb4bc12027c77f 100644 GIT binary patch literal 59668 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 VL;u!&?Gh9J + +@interface ConjugatedVerbTableView : UITableView + +@end diff --git a/Espagram/ConjugatedVerbTableView.m b/Espagram/ConjugatedVerbTableView.m new file mode 100644 index 0000000..a5a43b6 --- /dev/null +++ b/Espagram/ConjugatedVerbTableView.m @@ -0,0 +1,31 @@ +// +// ConjugatedVerbTableView.m +// Espagram +// +// Created by Abel Fokkinga on 11/8/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import "ConjugatedVerbTableView.h" + +@implementation ConjugatedVerbTableView + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + // Initialization code + } + return self; +} + +/* +// Only override drawRect: if you perform custom drawing. +// An empty implementation adversely affects performance during animation. +- (void)drawRect:(CGRect)rect +{ + // Drawing code +} +*/ + +@end diff --git a/Espagram/Conjugator.h b/Espagram/Conjugator.h index 1309c5d..1acb3e1 100644 --- a/Espagram/Conjugator.h +++ b/Espagram/Conjugator.h @@ -7,9 +7,16 @@ // #import +#import "Tense.h" @protocol Conjugator -- (NSString *) conjugateVerb:(NSString *) verb inPerson:(NSString *) person andTense:(NSString *) tense; + +- (NSDictionary *) persons; +- (NSArray *) personsKeys; + +- (NSString *) conjugateVerb:(NSString *) verb inPerson:(NSString *) person andTense:(Tense *) tense; + +- (NSString *) description; @end diff --git a/Espagram/EspagramConjugationTableViewController.h b/Espagram/EspagramConjugationTableViewController.h new file mode 100644 index 0000000..da5254b --- /dev/null +++ b/Espagram/EspagramConjugationTableViewController.h @@ -0,0 +1,30 @@ +// +// EspagramConjugationTableViewController.h +// Espagram +// +// Created by Abel Fokkinga on 11/9/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import +#import "Conjugator.h" + +@class EspagramConjugationTableViewController; + +@protocol EspagramConjugationTableView + +@property (strong, nonatomic) id conjugator; +@property (strong, nonatomic) Tense *tense; +@property (strong, nonatomic) NSString* verb; + +@end + +@interface EspagramConjugationTableViewController : UITableViewController + +@property (weak, nonatomic) IBOutlet UITextField *verbInput; + +@property (nonatomic, strong) id dataSource; + +- (void) reloadData; + +@end diff --git a/Espagram/EspagramConjugationTableViewController.m b/Espagram/EspagramConjugationTableViewController.m new file mode 100644 index 0000000..c370050 --- /dev/null +++ b/Espagram/EspagramConjugationTableViewController.m @@ -0,0 +1,118 @@ +// +// EspagramConjugationTableViewController.m +// Espagram +// +// Created by Abel Fokkinga on 11/9/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import "EspagramConjugationTableViewController.h" +#import "Conjugator.h" + +@interface EspagramConjugationTableViewController () +@end + +@implementation EspagramConjugationTableViewController + +@synthesize dataSource = _dataSource; + +- (void) dataSource:(id ) dataSource { + _dataSource = dataSource; + [self reloadData]; +} + +- (IBAction)verbEntered:(id)sender { + [self.view resignFirstResponder]; +} + +- (id)initWithStyle:(UITableViewStyle)style +{ + self = [super initWithStyle:style]; + if (self) { + // Custom initialization + } + return self; +} + +- (void) reloadData { + if (_dataSource) { + NSLog(@"language %@", [self.dataSource.conjugator description]); + NSLog(@"persons %d", self.dataSource.conjugator.persons.count); + [self.tableView reloadData]; + } else NSLog(@"Datasource is nil"); +} + + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +#pragma mark - Table view data source + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + return 1; +} + + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + // Return the number of rows in the section. + return [[[self.dataSource conjugator] persons] count]; +} + +- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section +{ + NSString *sectionName; + switch (section) + { + case 0: + sectionName = self.dataSource.verb; + break; + default: + sectionName = @""; + break; + } + return sectionName; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + static NSString *CellIdentifier = @"ConjugatedVerbPerson"; + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; + + if (cell == nil) { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; + } + + + NSString * person = [[self.dataSource.conjugator personsKeys] objectAtIndex:indexPath.row]; + cell.textLabel.text = [self.dataSource.conjugator.persons objectForKey:person]; + cell.detailTextLabel.text = [self.dataSource.conjugator conjugateVerb:self.dataSource.verb inPerson:person andTense:self.dataSource.tense]; + + return cell; +} + +- (void)viewDidLoad +{ + [self.tableView reloadData]; +} + + + +#pragma mark - Table view delegate + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + // Navigation logic may go here. Create and push another view controller. + /* + <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil]; + // ... + // Pass the selected object to the new view controller. + [self.navigationController pushViewController:detailViewController animated:YES]; + */ +} + +@end diff --git a/Espagram/EspagramMainTableViewController.h b/Espagram/EspagramMainTableViewController.h new file mode 100644 index 0000000..3e040d4 --- /dev/null +++ b/Espagram/EspagramMainTableViewController.h @@ -0,0 +1,13 @@ +// +// EspagramMainTableViewController.h +// Espagram +// +// Created by Abel Fokkinga on 11/9/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import + +@interface EspagramMainTableViewController : UITableViewController + +@end diff --git a/Espagram/EspagramMainTableViewController.m b/Espagram/EspagramMainTableViewController.m new file mode 100644 index 0000000..219f00a --- /dev/null +++ b/Espagram/EspagramMainTableViewController.m @@ -0,0 +1,158 @@ +// +// EspagramMainTableViewController.m +// Espagram +// +// Created by Abel Fokkinga on 11/9/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import "EspagramMainTableViewController.h" +#import "SpanishConjugator.h" +#import "EspagramTestViewController.h" + +@interface EspagramMainTableViewController () +@property (nonatomic, strong) NSString *language, *displayTitle; +@property (nonatomic, strong) Tense * tense; +@end + +@implementation EspagramMainTableViewController + +@synthesize language = _language; +@synthesize tense = _tense; +@synthesize displayTitle = _displayTitle; + +- (id)initWithStyle:(UITableViewStyle)style +{ + self = [super initWithStyle:style]; + if (self) { + // Custom initialization + } + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + // Uncomment the following line to preserve selection between presentations. + // self.clearsSelectionOnViewWillAppear = NO; + + // Uncomment the following line to display an Edit button in the navigation bar for this view controller. + // self.navigationItem.rightBarButtonItem = self.editButtonItem; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +# pragma mark - Espagram setters and getters + +- (id ) getLanguage { + if ( [@"Spanish" isEqualToString:_language] ) { + return [[SpanishConjugator alloc] init]; + } else return nil; +} + +- (Tense *) tense { + if ( _tense == nil ) _tense =[[Tense alloc] init]; + return _tense; +} + +- (void) testVerbsWithLanguage:(NSString *)language andTense:(NSString *)tense; +{ + self.language = language; + self.tense = [[Tense alloc] init]; + self.tense.tense = tense; + self.displayTitle = [self.tense getTenseInLanguage:@"Spanish"]; + [self performSegueWithIdentifier:@"Testing" sender:self]; +} + + + +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + + if ( [segue.identifier isEqualToString:@"Testing"]) { + EspagramTestViewController * dest = segue.destinationViewController; + dest.title = self.displayTitle; + dest.conjugator= [self getLanguage]; + dest.tense =self.tense; + + } +} + +#pragma mark - Table view data source + + +/* +// Override to support conditional editing of the table view. +- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath +{ + // Return NO if you do not want the specified item to be editable. + return YES; +} +*/ + +/* +// Override to support editing the table view. +- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath +{ + if (editingStyle == UITableViewCellEditingStyleDelete) { + // Delete the row from the data source + [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; + } + else if (editingStyle == UITableViewCellEditingStyleInsert) { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } +} +*/ + +/* +// Override to support rearranging the table view. +- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath +{ +} +*/ + +/* +// Override to support conditional rearranging of the table view. +- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath +{ + // Return NO if you do not want the item to be re-orderable. + return YES; +} +*/ + +#pragma mark - Table view delegate + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + NSString * selectedTense = [tableView cellForRowAtIndexPath:indexPath].textLabel.text; + NSLog(@"Selected tense: %@", selectedTense); + + if ( [selectedTense isEqualToString:@"Presente de indicativo"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"SIMPLE_PRESENT"]; + } else if ( [selectedTense isEqualToString:@"Indefinido"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"SIMPLE_PAST"]; + } else if ( [selectedTense isEqualToString:@"Imperfecto"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"IMPERFECT"]; + } else if ( [selectedTense isEqualToString:@"Futuro"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"FUTURE"]; + } else if ( [selectedTense isEqualToString:@"Pretérito Perfecto"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"PRESENT_PERFECT"]; + } else if ( [selectedTense isEqualToString:@"Pluscuamperfecto"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"PAST_PERFECT"]; + } else if ( [selectedTense isEqualToString:@"Futuro Perfecto"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"FUTURE_PERFECT"]; + } else if ( [selectedTense isEqualToString:@"Condicional"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"CONDITIONAL"]; + } else if ( [selectedTense isEqualToString:@"Condicional Perfect"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"CONDITIONAL_PERFECT"]; + } else if ( [selectedTense isEqualToString:@"Gerundio"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"GERUND"]; + } + +} + +@end diff --git a/Espagram/EspagramMainViewController.h b/Espagram/EspagramMainViewController.h deleted file mode 100644 index 0fecea3..0000000 --- a/Espagram/EspagramMainViewController.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// EspagramMainViewController.h -// Espagram -// -// Created by Abel Fokkinga on 8/27/12. -// Copyright (c) 2012 Abel Fokkinga. All rights reserved. -// - -#import - -@interface EspagramMainViewController : UIViewController - -- (IBAction)testTense:(UIButton *)sender; - -@end diff --git a/Espagram/EspagramMainViewController.m b/Espagram/EspagramMainViewController.m deleted file mode 100644 index 63dad48..0000000 --- a/Espagram/EspagramMainViewController.m +++ /dev/null @@ -1,83 +0,0 @@ -// -// EspagramMainViewController.m -// Espagram -// -// Created by Abel Fokkinga on 8/27/12. -// Copyright (c) 2012 Abel Fokkinga. All rights reserved. -// - -#import "EspagramMainViewController.h" -#import "GrammarTestViewController.h" -#import "SpanishConjugator.h" - -@interface EspagramMainViewController () -@property (nonatomic, strong) NSString *language, *tense, *displayTitle; -@end - -@implementation EspagramMainViewController - -@synthesize language = _language; -@synthesize tense = _tense; -@synthesize displayTitle = _displayTitle; - -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil -{ - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - // Custom initialization - } - return self; -} - -- (id ) getLanguage { - if ( [@"Spanish" isEqualToString:_language] ) { - return [[SpanishConjugator alloc] init]; - } else return nil; -} - - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - return YES; -} - -- (void) testVerbsWithLanguage:(NSString *)language andTense:(NSString *)tense andTitle:(NSString *) title; -{ - self.language = language; - self.tense = tense; - self.displayTitle = title; - [self performSegueWithIdentifier:@"Testing" sender:self]; -} - -- (IBAction)testTense:(UIButton *)sender -{ - - if ( [sender.titleLabel.text isEqualToString:@"Presente"] ) { - [self testVerbsWithLanguage: @"Spanish" andTense:@"SIMPLE_PRESENT" andTitle:sender.titleLabel.text]; - } else if ( [sender.titleLabel.text isEqualToString:@"Pretérito"] ) { - [self testVerbsWithLanguage: @"Spanish" andTense:@"SIMPLE_PAST" andTitle:sender.titleLabel.text]; - } else if ( [sender.titleLabel.text isEqualToString:@"Imperfecto"] ) { - [self testVerbsWithLanguage: @"Spanish" andTense:@"IMPERFECT" andTitle:sender.titleLabel.text]; - } else if ( [sender.titleLabel.text isEqualToString:@"Futuro"] ) { - [self testVerbsWithLanguage: @"Spanish" andTense:@"FUTURE" andTitle:sender.titleLabel.text]; - } else if ( [sender.titleLabel.text isEqualToString:@"Perfecto"] ) { - [self testVerbsWithLanguage: @"Spanish" andTense:@"PRESENT_PERFECT" andTitle:sender.titleLabel.text]; - } else if ( [sender.titleLabel.text isEqualToString:@"Pluscuamperfecto"] ) { - [self testVerbsWithLanguage: @"Spanish" andTense:@"PAST_PERFECT" andTitle:sender.titleLabel.text]; - } else if ( [sender.titleLabel.text isEqualToString:@"Futuro Perfecto"] ) { - [self testVerbsWithLanguage: @"Spanish" andTense:@"FUTURE_PERFECT" andTitle:sender.titleLabel.text]; - } - -} - - -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - - if ( [segue.identifier isEqualToString:@"Testing"]) { - [segue.destinationViewController setTitle:self.displayTitle]; - [segue.destinationViewController setConjugator:[self getLanguage]]; - [segue.destinationViewController setTense:self.tense]; - } -} - -@end \ No newline at end of file diff --git a/Espagram/EspagramTestViewController.h b/Espagram/EspagramTestViewController.h index 6ae192a..4447f92 100644 --- a/Espagram/EspagramTestViewController.h +++ b/Espagram/EspagramTestViewController.h @@ -8,10 +8,10 @@ #import #import "Conjugator.h" +#import "EspagramConjugationTableViewController.h" -@interface EspagramTestViewController : UIViewController +@interface EspagramTestViewController : UIViewController -@property (nonatomic, strong) id conjugator; -@property (nonatomic, strong) NSString * tense; +@property (weak, nonatomic) IBOutlet UITextField *verbInput; @end diff --git a/Espagram/EspagramTestViewController.m b/Espagram/EspagramTestViewController.m index 32f2df1..aeb7745 100644 --- a/Espagram/EspagramTestViewController.m +++ b/Espagram/EspagramTestViewController.m @@ -7,7 +7,6 @@ // #import "EspagramTestViewController.h" -#import "GrammarTestViewController.h" @interface EspagramTestViewController () @@ -16,6 +15,18 @@ @implementation EspagramTestViewController @synthesize conjugator = _conjugator; +@synthesize tense = _tense; +@synthesize verb = _verb; +@synthesize verbInput; + +- (NSString *) verb { + if ( self.verbInput.text) + _verb = self.verbInput.text; + return _verb; +} +- (IBAction)EditingDidEnd:(UITextField *)sender { + [self resignFirstResponder]; +} - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { @@ -42,8 +53,8 @@ - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ( [segue.identifier isEqualToString:@"Conjugate"]) { - [segue.destinationViewController setConjugator:self.conjugator]; - [segue.destinationViewController setTense:self.tense]; + [segue.destinationViewController setDataSource:self]; + [segue.destinationViewController setTitle:[self.tense getTenseInLanguage:[self.conjugator description]]]; } } diff --git a/Espagram/GrammarTestViewController.h b/Espagram/GrammarTestViewController.h index 72421c8..1319009 100644 --- a/Espagram/GrammarTestViewController.h +++ b/Espagram/GrammarTestViewController.h @@ -8,16 +8,14 @@ #import #import "Conjugator.h" +#import "EspagramConjugationTableViewController.h" @class GrammarTestViewController; -@interface GrammarTestViewController : UIViewController +@interface GrammarTestViewController : UIViewController -@property (weak, nonatomic) IBOutlet UITextField *verbInput; +@property (weak, nonatomic) UITextField *verbInput; -@property (weak, nonatomic) IBOutlet id conjugator; -@property (weak, nonatomic) IBOutlet NSString *tense; - -@property (weak, nonatomic) IBOutlet UILabel *tenseLabel; +@property (weak, nonatomic) IBOutlet UIView *conjugatedVerbTable; @end diff --git a/Espagram/GrammarTestViewController.m b/Espagram/GrammarTestViewController.m index 86a6cbf..d1441a9 100644 --- a/Espagram/GrammarTestViewController.m +++ b/Espagram/GrammarTestViewController.m @@ -7,7 +7,6 @@ // #import "GrammarTestViewController.h" -#import "Conjugator.h" @implementation GrammarTestViewController @@ -15,6 +14,8 @@ @synthesize conjugator = _conjugator; @synthesize verbInput = _verbInput; @synthesize tense = _tense; +@synthesize verb = _verb; +@synthesize conjugatedVerbTable = _conjugatedVerbTable; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil @@ -26,28 +27,33 @@ return self; } -- (IBAction)verbEntered:(id *)sender { - [self resignFirstResponder]; +- (IBAction)verbEntered:(id)sender { + self.verb = self.verbInput.text; + [self.view resignFirstResponder]; } -- (void) setTense:(NSString *)tense { - NSLog(@"New tense: %@",tense); - if ( ![tense isEqualToString:_tense] ) { - NSLog(@"Setting tense: %@",tense); - _tense = tense; - self.tenseLabel.text = tense; - } - +- (void) verb:(NSString *) verb { + _verb = verb; + if ( ! [_verb isEqualToString:self.verbInput.text]) + self.verbInput.text = _verb; } -- (IBAction)conjugateButtonPressed { -// self.conjugatedVerbDisplay.text = [self.conjugator conjugateVerb:self.verbInput.text inPerson:[self getSelectedPerson] andTense:[self getSelectedTense] ]; +- (void) setup{ + NSLog([self.conjugator description]); + NSLog(@"Persons %d", [[[self conjugator] persons] count]); +} + +- (void) awakeFromNib +{ + [self setup]; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. + + [self setup]; } - (void)didReceiveMemoryWarning diff --git a/Espagram/SpanishConjugator.h b/Espagram/SpanishConjugator.h index 9844eeb..cc828d7 100644 --- a/Espagram/SpanishConjugator.h +++ b/Espagram/SpanishConjugator.h @@ -12,4 +12,5 @@ @interface SpanishConjugator : NSObject + @end diff --git a/Espagram/SpanishConjugator.m b/Espagram/SpanishConjugator.m index 71a4dee..8cc89bc 100644 --- a/Espagram/SpanishConjugator.m +++ b/Espagram/SpanishConjugator.m @@ -14,6 +14,7 @@ *simplePresentOtoUEstemChangersArray, *simplePresentEtoIstemChangersArray; +@property (nonatomic,strong) NSDictionary *persons; @end @@ -22,6 +23,26 @@ @synthesize simplePresentEtoIEstemChangersArray = _simplePresentEtoIEstemChangersArray; @synthesize simplePresentOtoUEstemChangersArray = _simplePresentOtoUEstemChangersArray; @synthesize simplePresentEtoIstemChangersArray = _simplePresentEtoIstemChangersArray; +@synthesize persons = _persons; + + +- (NSString *) description +{ + return @"Spanish"; +} + + +- (NSArray *) personsKeys{ + return [[NSArray alloc] initWithObjects:@"FIRST_PERSON_SINGULAR",@"SECOND_PERSON_SINGULAR",@"THIRD_PERSON_SINGULAR", @"FIRST_PERSON_PLURAL",@"SECOND_PERSON_PLURAL",@"THIRD_PERSON_PLURAL", nil]; +} + +- (NSDictionary *) persons { + if (_persons == nil) { + _persons = [[NSDictionary alloc] initWithObjects:[[NSArray alloc] + initWithObjects:@"yo",@"tú",@"él",@"nosotros", @"vosotros", @"ellos", nil] forKeys:[[NSArray alloc] initWithArray:self.personsKeys]]; + } + return [_persons copy]; +} - (NSArray *) simplePresentEtoIEstemChangersArray{ if (_simplePresentEtoIEstemChangersArray == nil) @@ -196,8 +217,6 @@ NSString * verbStem = [self getSimplePresentStemVerb:verb inPerson:person]; NSString * verbExit = [self getExit:verb]; - // very irregular - if ( [verb isEqualToString:@"haber"] ) return @"hay"; // other types of first person changes if ( [person isEqualToString:@"FIRST_PERSON_SINGULAR"]) { @@ -212,6 +231,7 @@ if ( [verb isEqualToString:@"ser"] ) return @"soy"; if ( [verb isEqualToString:@"ir"] ) return @"voy"; if ( [verb isEqualToString:@"oler"] ) return @"huelo"; + if ( [verb isEqualToString:@"haber"] ) return @"he"; return [verbStem stringByAppendingString:@"o"]; } @@ -220,6 +240,7 @@ if ( [verb isEqualToString:@"ser"] ) return @"eres"; if ( [verb isEqualToString:@"ir"] ) return @"vas"; if ( [verb isEqualToString:@"oler"] ) return @"hueles"; + if ( [verb isEqualToString:@"haber"] ) return @"has"; if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"as"]; else return [verbStem stringByAppendingString:@"es"]; @@ -229,6 +250,7 @@ if ( [verb isEqualToString:@"ser"] ) return @"es"; if ( [verb isEqualToString:@"ir"] ) return @"va"; if ( [verb isEqualToString:@"oler"] ) return @"huele"; + if ( [verb isEqualToString:@"haber"] ) return @"ha"; if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"a"]; else return [verbStem stringByAppendingString:@"e"]; @@ -237,6 +259,7 @@ if ( [verb isEqualToString:@"estar"] ) return @"estamos"; if ( [verb isEqualToString:@"ser"] ) return @"somos"; if ( [verb isEqualToString:@"ir"] ) return @"vamos"; + if ( [verb isEqualToString:@"haber"] ) return @"hemos"; if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"amos"]; if ( [@"er" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"emos"]; @@ -246,6 +269,7 @@ if ( [verb isEqualToString:@"estar"] ) return @"estáis"; if ( [verb isEqualToString:@"ser"] ) return @"sois"; if ( [verb isEqualToString:@"ir"] ) return @"vais"; + if ( [verb isEqualToString:@"haber"] ) return @"habéis"; if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"áis"]; if ( [@"er" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"éis"]; @@ -256,6 +280,7 @@ if ( [verb isEqualToString:@"ser"] ) return @"son"; if ( [verb isEqualToString:@"ir"] ) return @"van"; if ( [verb isEqualToString:@"oler"] ) return @"huelen"; + if ( [verb isEqualToString:@"haber"] ) return @"han"; if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"an"]; else return [verbStem stringByAppendingString:@"en"]; @@ -321,7 +346,7 @@ if ( [verb isEqualToString:@"ir"] || [verb isEqualToString:@"ser"] ) return @"fuiste"; if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"aste"]; - else [verbStem stringByAppendingString:@"iste"]; + else return [verbStem stringByAppendingString:@"iste"]; } if ( [person isEqualToString:@"THIRD_PERSON_SINGULAR"]) { @@ -329,8 +354,8 @@ if ( [verb isEqualToString:@"dar"]) return @"dio"; if ( [verb isEqualToString:@"ir"] || [verb isEqualToString:@"ser"] ) return @"fue"; - if ( [[verbStem substringFromIndex:[verb length] - 1] isEqualToString:@"e"] || - [[verbStem substringFromIndex:[verb length] - 1] isEqualToString:@"i"]) + if ( [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"e"] || + [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"i"]) // If the stem of an -er or -ir ends in a vowel, the -i of the 3rd person changes to y return [verbStem stringByAppendingString:@"yó"]; @@ -380,7 +405,7 @@ if ( [verb isEqualToString:@"ir"] || [verb isEqualToString:@"ser"] ) return @"fueron"; if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"aron"]; - else if ([[verbStem substringFromIndex:[verb length] - 1] isEqualToString:@"j"]) return [verbStem stringByAppendingString:@"eron"]; + else if ([[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"j"]) return [verbStem stringByAppendingString:@"eron"]; else return [verbStem stringByAppendingString:@"ieron"]; } @@ -491,8 +516,33 @@ if ( [person isEqualToString:@"THIRD_PERSON_PLURAL"]) return [verbStem stringByAppendingString:@"án"]; - return verb; + return verb; +} + +- (NSString *) conjugateConditionalVerb:(NSString *) verb inPerson:(NSString *) person { + NSString * verbStem = [self getFutureStem:verb]; + + // regular + if ( [person isEqualToString:@"FIRST_PERSON_SINGULAR"]) + return [verbStem stringByAppendingString:@"ía"]; + + if ( [person isEqualToString:@"SECOND_PERSON_SINGULAR"]) + return [verbStem stringByAppendingString:@"ías"]; + + if ( [person isEqualToString:@"THIRD_PERSON_SINGULAR"]) + return [verbStem stringByAppendingString:@"ía"]; + + if ( [person isEqualToString:@"FIRST_PERSON_PLURAL"]) + return [verbStem stringByAppendingString:@"íamos"]; + + if ( [person isEqualToString:@"SECOND_PERSON_PLURAL"]) + return [verbStem stringByAppendingString:@"íais"]; + + if ( [person isEqualToString:@"THIRD_PERSON_PLURAL"]) + return [verbStem stringByAppendingString:@"ían"]; + + return verb; } - (NSString *) conjugatePerfectVerb:(NSString *) verb { @@ -549,24 +599,72 @@ } -- (NSString *) conjugateVerb:(NSString *) verb inPerson:(NSString *) person andTense:(NSString *) tense { +// el condicional perfecto +- (NSString *) conjugateConditionalPerfectVerb:(NSString *) verb inPerson:(NSString *) person { + + // Future of haber + Perfect tense + return [[[self conjugateConditionalVerb:@"haber" inPerson:person] stringByAppendingString:@" "] stringByAppendingString:[self conjugatePerfectVerb:verb]]; +} + +- (NSString *) conjugateGerundVerb:(NSString *) verb inPerson:(NSString *) person { + + NSString * verbStem = [self getStem:verb]; + NSString * verbExit = [self getExit:verb]; + + // Irregular + if ( [verb isEqualToString:@"ir"]) return @"yendo"; + + if ( [[verbStem substringFromIndex:[verb length] - 1] isEqualToString:@"a"] || + [[verbStem substringFromIndex:[verb length] - 1] isEqualToString:@"e"] || + [[verbStem substringFromIndex:[verb length] - 1] isEqualToString:@"i"]) + // If the stem of an -er or -ir ends in a vowel, the -i of the 3rd person changes to y + return [verbStem stringByAppendingString:@"yendo"]; + + if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] ) { + // Verb changes stem from e to i + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e"] withString:@"i"]; + } + + if ( [[self simplePresentOtoUEstemChangersArray] containsObject:verb] ) { + // Verb changes stem from o to u + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"o"] withString:@"u"]; + } + if ( [[self simplePresentEtoIstemChangersArray] containsObject:verb] ) { + // Verb changes stem from e to i + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e"] withString:@"i"]; + } + + // Regular + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"ando"]; + else return [verbStem stringByAppendingString:@"iendo"]; + + return verb; +} + +- (NSString *) conjugateVerb:(NSString *) verb inPerson:(NSString *) person andTense:(Tense *) tense { - if ( [tense isEqualToString:@"SIMPLE_PRESENT"]) + if ( [tense.tense isEqualToString:@"SIMPLE_PRESENT"]) return [self conjugateSimplePresentVerb:verb inPerson:person]; - else if ( [tense isEqualToString:@"SIMPLE_PAST"]) + else if ( [tense.tense isEqualToString:@"SIMPLE_PAST"]) return [self conjugateSimplePastVerb:verb inPerson:person]; - else if ( [tense isEqualToString:@"IMPERFECT"]) + else if ( [tense.tense isEqualToString:@"IMPERFECT"]) return [self conjugateImperfectVerb:verb inPerson:person]; - else if ( [tense isEqualToString:@"FUTURE"]) + else if ( [tense.tense isEqualToString:@"FUTURE"]) return [self conjugateFutureVerb:verb inPerson:person]; - else if ( [tense isEqualToString:@"PERFECT"]) + else if ( [tense.tense isEqualToString:@"PERFECT"]) return [self conjugatePerfectVerb:verb]; - else if ( [tense isEqualToString:@"PRESENT_PERFECT"]) + else if ( [tense.tense isEqualToString:@"PRESENT_PERFECT"]) return [self conjugatePresentPerfectVerb:verb inPerson:person]; - else if ( [tense isEqualToString:@"PAST_PERFECT"]) // Pluscuamperfecto + else if ( [tense.tense isEqualToString:@"PAST_PERFECT"]) // Pluscuamperfecto return [self conjugatePastPerfectVerb:verb inPerson:person]; - else if ( [tense isEqualToString:@"FUTURE_PERFECT"]) + else if ( [tense.tense isEqualToString:@"FUTURE_PERFECT"]) return [self conjugateFuturePerfectVerb:verb inPerson:person]; + else if ( [tense.tense isEqualToString:@"CONDITIONAL_PERFECT"]) + return [self conjugateConditionalPerfectVerb:verb inPerson:person]; + else if ( [tense.tense isEqualToString:@"CONDITIONAL"]) + return [self conjugateConditionalVerb:verb inPerson:person]; + else if ( [tense.tense isEqualToString:@"GERUND"]) + return [self conjugateGerundVerb:verb inPerson:person]; else return @"Invalid tense"; diff --git a/Espagram/Tense.h b/Espagram/Tense.h new file mode 100644 index 0000000..253aa4a --- /dev/null +++ b/Espagram/Tense.h @@ -0,0 +1,17 @@ +// +// Tense.h +// Espagram +// +// Created by Abel Fokkinga on 11/8/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import + +@interface Tense : NSObject + +@property (nonatomic, strong) NSString * tense; + +- (NSString *) getTenseInLanguage:(NSString *)language; + +@end diff --git a/Espagram/Tense.m b/Espagram/Tense.m new file mode 100644 index 0000000..6ba3e53 --- /dev/null +++ b/Espagram/Tense.m @@ -0,0 +1,73 @@ +// +// Tense.m +// Espagram +// +// Created by Abel Fokkinga on 11/8/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import "Tense.h" + +@interface Tense() +@property (nonatomic, strong) NSDictionary * text; +@end + +@implementation Tense + +@synthesize tense = _tense; +@synthesize text = _text; + +- (void) tense:(NSString *)t { + if ( ![t isEqualToString:_tense]){ + _tense = t; + // reset dictionary + NSLog(@"Resetting tense"); + self.text = nil; + } +} + +- (NSDictionary *) text { + if ( !_text) { + if ( [self.tense isEqualToString:@"SIMPLE_PRESENT"]) + _text = [[NSDictionary alloc] initWithObjects:[[NSArray alloc] + initWithObjects:@"Presente",@"Simple present",@"Onvoltooid tegenwoordige tijd",nil] forKeys:[[NSArray alloc] initWithObjects:@"Spanish",@"English",@"Dutch", nil]]; + if ( [self.tense isEqualToString:@"SIMPLE_PAST"]) + _text = [[NSDictionary alloc] initWithObjects:[[NSArray alloc] + initWithObjects:@"Indefinido",@"Simple past",@"Verleden tijd",nil] forKeys:[[NSArray alloc] initWithObjects:@"Spanish",@"English",@"Dutch", nil]]; + if ( [self.tense isEqualToString:@"IMPERFECT"]) + _text = [[NSDictionary alloc] initWithObjects:[[NSArray alloc] + initWithObjects:@"Imperfecto",@"Imperfect",@"Onvoltooid verleden tijd",nil] forKeys:[[NSArray alloc] initWithObjects:@"Spanish",@"English",@"Dutch", nil]]; + if ( [self.tense isEqualToString:@"FUTURE"]) + _text = [[NSDictionary alloc] initWithObjects:[[NSArray alloc] + initWithObjects:@"Futuro",@"Future",@"Toekomstige tijd",nil] forKeys:[[NSArray alloc] initWithObjects:@"Spanish",@"English",@"Dutch", nil]]; + if ( [self.tense isEqualToString:@"PRESENT_PERFECT"]) + _text = [[NSDictionary alloc] initWithObjects:[[NSArray alloc] + initWithObjects:@"Perfecto",@"Present perfect",@"Pretérito perfecto",nil] forKeys:[[NSArray alloc] initWithObjects:@"Spanish",@"English",@"Dutch", nil]]; + if ( [self.tense isEqualToString:@"PAST_PERFECT"]) + _text = [[NSDictionary alloc] initWithObjects:[[NSArray alloc] + initWithObjects:@"Pluscuamperfecto",@"Past perfect",@"Pretérito pluscuamperfecto",nil] forKeys:[[NSArray alloc] initWithObjects:@"Spanish",@"English",@"Dutch", nil]]; + if ( [self.tense isEqualToString:@"FUTURE_PERFECT"]) + _text = [[NSDictionary alloc] initWithObjects:[[NSArray alloc] + initWithObjects:@"Futuro perfecto",@"Future perfect",@"Pretérito pluscuamperfecto",nil] forKeys:[[NSArray alloc] initWithObjects:@"Spanish",@"English",@"Dutch", nil]]; + if ( [self.tense isEqualToString:@"CONDITIONAL"]) + _text = [[NSDictionary alloc] initWithObjects:[[NSArray alloc] + initWithObjects:@"Condicional",@"Conditional",@"Voorwaardelijke wijs",nil] forKeys:[[NSArray alloc] initWithObjects:@"Spanish",@"English",@"Dutch", nil]]; + if ( [self.tense isEqualToString:@"GERUND"]) + _text = [[NSDictionary alloc] initWithObjects:[[NSArray alloc] + initWithObjects:@"Gerundio",@"Gerund",@"Tegenwoordig deelwoord",nil] forKeys:[[NSArray alloc] initWithObjects:@"Spanish",@"English",@"Dutch", nil]]; + if ( [self.tense isEqualToString:@"IMPERATIVE"]) + _text = [[NSDictionary alloc] initWithObjects:[[NSArray alloc] + initWithObjects:@"Imperativo",@"Imperative",@"Gebiedende wijs",nil] forKeys:[[NSArray alloc] initWithObjects:@"Spanish",@"English",@"Dutch", nil]]; + } + + return _text; +} + +- (NSString *) getTenseInLanguage:(NSString *)language { + return [self.text objectForKey:language]; +} + + + + +@end diff --git a/Espagram/en.lproj/MainStoryboard.storyboard b/Espagram/en.lproj/MainStoryboard.storyboard index bedbca3..33c0989 100644 --- a/Espagram/en.lproj/MainStoryboard.storyboard +++ b/Espagram/en.lproj/MainStoryboard.storyboard @@ -4,284 +4,412 @@ - - + + - - + + - - - - - - - - - - - - - - - - - - - - + + + + + + + - + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + - + - + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -294,14 +422,33 @@ - + - + + + + + + + + + + + + + + + + + + + +