<!DOCTYPE html>
<html ng-app="myApp">

  <head>
    <link data-require="jasmine@2.2.1" data-semver="2.2.1" rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/jasmine/2.2.1/jasmine.css" />
    <script data-require="jasmine@2.2.1" data-semver="2.2.1" src="http://cdnjs.cloudflare.com/ajax/libs/jasmine/2.2.1/jasmine.js"></script>
    <script data-require="jasmine@2.2.1" data-semver="2.2.1" src="http://cdnjs.cloudflare.com/ajax/libs/jasmine/2.2.1/jasmine-html.js"></script>
    <script data-require="jasmine@2.2.1" data-semver="2.2.1" src="http://cdnjs.cloudflare.com/ajax/libs/jasmine/2.2.1/boot.js"></script>
    <script data-require="angular.js@1.4.8" data-semver="1.4.8" src="https://code.angularjs.org/1.4.8/angular.js"></script>
    <script data-require="angular-route@1.4.8" data-semver="1.4.8" src="https://code.angularjs.org/1.4.8/angular-route.js"></script>
    <script data-require="angular-translate@2.6.0" data-semver="2.6.0" src="https://cdn.rawgit.com/angular-translate/bower-angular-translate/2.6.0/angular-translate.js"></script>
    <script data-require="angular-translate-loader-partial@2.0.1" data-semver="2.0.1" src="https://rawgit.com/PascalPrecht/bower-angular-translate-loader-partial/master/angular-translate-loader-partial.js"></script>
    <script data-require="angular-mocks@1.4.3" data-semver="1.4.3" src="https://code.angularjs.org/1.4.3/angular-mocks.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
    <script src="view1mod.js"></script>
    <script src="view2mod.js"></script>
    <script src="view1.spec.js"></script>
    <title translate="">WELCOME</title>
  </head>

  <body>
    <div ng-view=""></div>
    <a href="#/view1">{{ 'VIEW' | translate:'{ value: 1 }' }}</a>
    <br />
    <a href="#/view2">{{ 'VIEW' | translate:'{ value: 2 }' }}</a>
  </body>

</html>
// Code goes here
(function() {
  var app = angular.module('myApp', [
    'ngRoute',
    'pascalprecht.translate',
    'myApp.view1',
    'myApp.view2'
  ]);

  app.config(['$httpProvider', '$routeProvider', '$translateProvider', '$translatePartialLoaderProvider',
    function($httpProvider, $routeProvider, $translateProvider, $translatePartialLoaderProvider) {
      // default route
      $routeProvider.otherwise({
        redirectTo: '/view1'
      });

      // process translation output to ensure no malicious scripts get injected
      $translateProvider.useSanitizeValueStrategy('escape');

      $translatePartialLoaderProvider.addPart('home');
      $translateProvider.useLoader('$translatePartialLoader', {
        urlTemplate: '{part}-{lang}.json'
      });

      $translateProvider.preferredLanguage('en');
    }
  ]);
  
  app.run(function ($rootScope, $translate) {
  $rootScope.$on('$translatePartialLoaderStructureChanged', function () {
    $translate.refresh();
  });
});
})();
/* Styles go here */

<h1 translate>VIEW1TITLE</h1>
<p>{{dt}}</p>
<h1 translate>VIEW2TITLE</h1>

{
  "WELCOME":"Welcome",
  "VIEW":"View {{value}}"
}
{
  "WELCOME":"Bem-vindo",
  "VIEW":"Vista {{value}}"
}
{
  "VIEW1TITLE":"View 1 Title"
}
{
  "VIEW1TITLE":"Título da Vista 1"
}
(function() {
  var view1mod = angular.module('myApp.view1', ['ngRoute']);

  view1mod.config(['$routeProvider', '$translatePartialLoaderProvider', function($routeProvider, $translatePartialLoaderProvider) {
    $routeProvider.when('/view1', {
      templateUrl: 'view1.html',
      controller: 'View1Controller'
    });

    $translatePartialLoaderProvider.addPart('view1');
  }]);

  view1mod.controller('View1Controller', function($scope) {

    $scope.dt = new Date();

  });
})();
(function() {
  "use strict";
  
  var view2mod = angular.module('myApp.view2', ['ngRoute']);

  view2mod.config(['$routeProvider', '$translatePartialLoaderProvider', function($routeProvider, $translatePartialLoaderProvider) {
    $routeProvider.when('/view2', {
      templateUrl: 'view2.html',
      controller: 'View2Controller'
    });

    $translatePartialLoaderProvider.addPart('view2');
  }]);
  
  view2mod.controller('View2Controller', function($scope){
    
  });

})();
{
  "VIEW2TITLE":"View 2 Title"
}
{
  "VIEWTITLE":"Título da Vista 2"
}
'use strict';

describe('myApp view1 module', function() {

  beforeEach(module('myApp.view1'), function($provide, $translateProvider) {

    $provide.factory('customLoader', function($q) {
      return function() {
        var deferred = $q.defer();
        deferred.resolve({});
        return deferred.promise;
      };
    });

    $translateProvider.useLoader('customLoader');

  });

describe('view1 controller', function() {

  var scope, ctrl, $httpBackend;

  beforeEach(inject(function(_$httpBackend_, $rootScope, $controller) {
    $httpBackend = _$httpBackend_;
    scope = $rootScope.$new();
    ctrl = $controller('View1Controller', {
      $scope: scope
    });
  }));

  it('should be defined', function() {
    //spec body
    expect(ctrl).toBeDefined();
  });
});
});